mongoid 3.1.6 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +479 -8
- data/README.md +10 -7
- data/lib/config/locales/en.yml +34 -20
- data/lib/mongoid.rb +10 -76
- data/lib/mongoid/atomic.rb +3 -14
- data/lib/mongoid/atomic/paths/embedded.rb +0 -30
- data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
- data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
- data/lib/mongoid/atomic/paths/root.rb +0 -13
- data/lib/mongoid/attributes.rb +65 -101
- data/lib/mongoid/attributes/dynamic.rb +154 -0
- data/lib/mongoid/attributes/nested.rb +82 -0
- data/lib/mongoid/attributes/processing.rb +13 -66
- data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
- data/lib/mongoid/composable.rb +105 -0
- data/lib/mongoid/config.rb +3 -9
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/contextual.rb +2 -0
- data/lib/mongoid/contextual/aggregable/memory.rb +2 -2
- data/lib/mongoid/contextual/aggregable/mongo.rb +7 -9
- data/lib/mongoid/contextual/atomic.rb +53 -53
- data/lib/mongoid/contextual/geo_near.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +4 -2
- data/lib/mongoid/contextual/memory.rb +23 -11
- data/lib/mongoid/contextual/mongo.rb +75 -57
- data/lib/mongoid/contextual/none.rb +90 -0
- data/lib/mongoid/contextual/text_search.rb +178 -0
- data/lib/mongoid/copyable.rb +2 -3
- data/lib/mongoid/criteria.rb +39 -34
- data/lib/mongoid/criteria/#findable.rb# +141 -0
- data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
- data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
- data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
- data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
- data/lib/mongoid/criteria/permission.rb +70 -0
- data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
- data/lib/mongoid/document.rb +39 -24
- data/lib/mongoid/errors.rb +4 -1
- data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
- data/lib/mongoid/errors/document_not_found.rb +2 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
- data/lib/mongoid/errors/invalid_value.rb +16 -0
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/errors/readonly_document.rb +24 -0
- data/lib/mongoid/extensions.rb +15 -7
- data/lib/mongoid/extensions/array.rb +3 -3
- data/lib/mongoid/extensions/big_decimal.rb +1 -1
- data/lib/mongoid/extensions/boolean.rb +15 -17
- data/lib/mongoid/extensions/date.rb +1 -1
- data/lib/mongoid/extensions/date_time.rb +3 -3
- data/lib/mongoid/extensions/float.rb +2 -1
- data/lib/mongoid/extensions/hash.rb +3 -3
- data/lib/mongoid/extensions/integer.rb +1 -1
- data/lib/mongoid/extensions/object.rb +7 -7
- data/lib/mongoid/extensions/object_id.rb +5 -5
- data/lib/mongoid/extensions/range.rb +9 -3
- data/lib/mongoid/extensions/regexp.rb +1 -1
- data/lib/mongoid/extensions/set.rb +1 -1
- data/lib/mongoid/extensions/string.rb +6 -18
- data/lib/mongoid/extensions/symbol.rb +1 -1
- data/lib/mongoid/extensions/time.rb +3 -3
- data/lib/mongoid/extensions/time_with_zone.rb +1 -1
- data/lib/mongoid/factory.rb +8 -6
- data/lib/mongoid/fields.rb +41 -8
- data/lib/mongoid/fields/foreign_key.rb +3 -3
- data/lib/mongoid/fields/localized.rb +1 -1
- data/lib/mongoid/fields/standard.rb +5 -17
- data/lib/mongoid/fields/validators/macro.rb +15 -5
- data/lib/mongoid/{finders.rb → findable.rb} +35 -7
- data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
- data/lib/mongoid/indexable/specification.rb +104 -0
- data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
- data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
- data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
- data/lib/mongoid/log_subscriber.rb +55 -0
- data/lib/mongoid/matchable.rb +152 -0
- data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/ne.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
- data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
- data/lib/mongoid/persistable.rb +216 -0
- data/lib/mongoid/persistable/creatable.rb +189 -0
- data/lib/mongoid/persistable/deletable.rb +149 -0
- data/lib/mongoid/persistable/destroyable.rb +60 -0
- data/lib/mongoid/persistable/incrementable.rb +36 -0
- data/lib/mongoid/persistable/logical.rb +38 -0
- data/lib/mongoid/persistable/poppable.rb +39 -0
- data/lib/mongoid/persistable/pullable.rb +55 -0
- data/lib/mongoid/persistable/pushable.rb +62 -0
- data/lib/mongoid/persistable/renamable.rb +35 -0
- data/lib/mongoid/persistable/savable.rb +52 -0
- data/lib/mongoid/persistable/settable.rb +33 -0
- data/lib/mongoid/persistable/unsettable.rb +36 -0
- data/lib/mongoid/persistable/updatable.rb +153 -0
- data/lib/mongoid/persistable/upsertable.rb +55 -0
- data/lib/mongoid/positional.rb +71 -0
- data/lib/mongoid/query_cache.rb +255 -0
- data/lib/mongoid/railtie.rb +34 -60
- data/lib/mongoid/railties/database.rake +9 -25
- data/lib/mongoid/relations.rb +11 -25
- data/lib/mongoid/relations/accessors.rb +15 -51
- data/lib/mongoid/relations/auto_save.rb +15 -36
- data/lib/mongoid/relations/binding.rb +2 -25
- data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
- data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
- data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -2
- data/lib/mongoid/relations/builder.rb +1 -1
- data/lib/mongoid/relations/builders.rb +2 -2
- data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -6
- data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
- data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
- data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
- data/lib/mongoid/relations/cascading.rb +3 -5
- data/lib/mongoid/relations/constraint.rb +1 -1
- data/lib/mongoid/relations/conversions.rb +1 -1
- data/lib/mongoid/relations/counter_cache.rb +39 -15
- data/lib/mongoid/relations/eager.rb +46 -0
- data/lib/mongoid/relations/eager/base.rb +149 -0
- data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
- data/lib/mongoid/relations/eager/has_many.rb +38 -0
- data/lib/mongoid/relations/eager/has_one.rb +30 -0
- data/lib/mongoid/relations/embedded/batchable.rb +4 -5
- data/lib/mongoid/relations/embedded/in.rb +4 -4
- data/lib/mongoid/relations/embedded/many.rb +14 -32
- data/lib/mongoid/relations/embedded/one.rb +1 -1
- data/lib/mongoid/relations/macros.rb +3 -4
- data/lib/mongoid/relations/many.rb +51 -31
- data/lib/mongoid/relations/marshalable.rb +3 -3
- data/lib/mongoid/relations/metadata.rb +14 -79
- data/lib/mongoid/relations/nested_builder.rb +2 -2
- data/lib/mongoid/relations/one.rb +1 -1
- data/lib/mongoid/relations/options.rb +1 -0
- data/lib/mongoid/relations/polymorphic.rb +0 -1
- data/lib/mongoid/relations/proxy.rb +21 -41
- data/lib/mongoid/relations/referenced/in.rb +4 -20
- data/lib/mongoid/relations/referenced/many.rb +22 -35
- data/lib/mongoid/relations/referenced/many_to_many.rb +19 -42
- data/lib/mongoid/relations/referenced/one.rb +6 -25
- data/lib/mongoid/relations/synchronization.rb +4 -4
- data/lib/mongoid/relations/targets/enumerable.rb +10 -10
- data/lib/mongoid/relations/touchable.rb +34 -1
- data/lib/mongoid/{reloading.rb → reloadable.rb} +7 -5
- data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
- data/lib/mongoid/selectable.rb +59 -0
- data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
- data/lib/mongoid/sessions.rb +37 -345
- data/lib/mongoid/sessions/factory.rb +2 -0
- data/lib/mongoid/sessions/options.rb +185 -0
- data/lib/mongoid/sessions/storage_options.rb +140 -0
- data/lib/mongoid/sessions/thread_options.rb +19 -0
- data/lib/mongoid/sessions/validators/storage.rb +16 -3
- data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
- data/lib/mongoid/{state.rb → stateful.rb} +13 -1
- data/lib/mongoid/support/query_counter.rb +23 -0
- data/lib/mongoid/tasks/database.rake +31 -0
- data/lib/mongoid/tasks/database.rb +107 -0
- data/lib/mongoid/threaded.rb +26 -172
- data/lib/mongoid/threaded/lifecycle.rb +0 -28
- data/lib/mongoid/timestamps/updated/short.rb +2 -2
- data/lib/mongoid/{hierarchy.rb → traversable.rb} +15 -7
- data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
- data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
- data/lib/mongoid/{validations → validatable}/format.rb +1 -1
- data/lib/mongoid/{validations → validatable}/length.rb +1 -1
- data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
- data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
- data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
- data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
- data/lib/mongoid/{validations → validatable}/uniqueness.rb +25 -21
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +46 -25
- data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
- data/lib/rails/generators/mongoid_generator.rb +3 -40
- data/lib/rails/mongoid.rb +0 -122
- data/lib/support/ruby_version.rb +1 -1
- data/spec/app/models/account.rb +2 -6
- data/spec/app/models/acolyte.rb +2 -1
- data/spec/app/models/actor.rb +0 -1
- data/spec/app/models/address.rb +8 -3
- data/spec/app/models/animal.rb +1 -1
- data/spec/app/models/appointment.rb +3 -3
- data/spec/app/models/article.rb +1 -4
- data/spec/app/models/audio.rb +5 -0
- data/spec/app/models/author.rb +0 -2
- data/spec/app/models/band.rb +3 -2
- data/spec/app/models/bar.rb +1 -0
- data/spec/app/models/book.rb +1 -0
- data/spec/app/models/building.rb +0 -2
- data/spec/app/models/building_address.rb +0 -2
- data/spec/app/models/bus.rb +1 -1
- data/spec/app/models/canvas.rb +1 -1
- data/spec/app/models/contextable_item.rb +5 -0
- data/spec/app/models/contractor.rb +0 -2
- data/spec/app/models/country_code.rb +1 -1
- data/spec/app/models/definition.rb +2 -2
- data/spec/app/models/dog.rb +1 -1
- data/spec/app/models/draft.rb +9 -0
- data/spec/app/models/dragon.rb +4 -0
- data/spec/app/models/drug.rb +1 -3
- data/spec/app/models/dungeon.rb +4 -0
- data/spec/app/models/edit.rb +5 -0
- data/spec/app/models/even.rb +7 -0
- data/spec/app/models/event.rb +1 -1
- data/spec/app/models/filesystem.rb +1 -0
- data/spec/app/models/fish.rb +0 -1
- data/spec/app/models/fruits.rb +6 -0
- data/spec/app/models/game.rb +0 -2
- data/spec/app/models/house.rb +1 -3
- data/spec/app/models/id_key.rb +6 -0
- data/spec/app/models/item.rb +1 -5
- data/spec/app/models/jar.rb +1 -1
- data/spec/app/models/label.rb +4 -4
- data/spec/app/models/line_item.rb +1 -1
- data/spec/app/models/login.rb +1 -1
- data/spec/app/models/message.rb +8 -0
- data/spec/app/models/movie.rb +1 -0
- data/spec/app/models/name.rb +3 -3
- data/spec/app/models/note.rb +3 -1
- data/spec/app/models/odd.rb +7 -0
- data/spec/app/models/oscar.rb +1 -1
- data/spec/app/models/parent_doc.rb +1 -1
- data/spec/app/models/person.rb +16 -10
- data/spec/app/models/phone.rb +1 -3
- data/spec/app/models/player.rb +3 -3
- data/spec/app/models/post.rb +5 -3
- data/spec/app/models/preference.rb +1 -1
- data/spec/app/models/quiz.rb +0 -3
- data/spec/app/models/record.rb +10 -5
- data/spec/app/models/registry.rb +1 -1
- data/spec/app/models/server.rb +1 -1
- data/spec/app/models/service.rb +3 -3
- data/spec/app/models/sound.rb +5 -0
- data/spec/app/models/symptom.rb +1 -1
- data/spec/app/models/template.rb +1 -1
- data/spec/app/models/title.rb +0 -1
- data/spec/app/models/track.rb +5 -5
- data/spec/app/models/tree.rb +3 -3
- data/spec/app/models/video.rb +1 -5
- data/spec/app/models/wiki_page.rb +2 -5
- data/spec/app/models/word.rb +3 -0
- data/spec/app/models/word_origin.rb +1 -1
- data/spec/config/mongoid.yml +7 -8
- data/spec/helpers.rb +18 -0
- data/spec/mongoid/#atomic_spec.rb# +365 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
- data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
- data/spec/mongoid/atomic/paths_spec.rb +19 -19
- data/spec/mongoid/atomic_spec.rb +19 -19
- data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +474 -592
- data/spec/mongoid/attributes/readonly_spec.rb +58 -18
- data/spec/mongoid/attributes_spec.rb +349 -434
- data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
- data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
- data/spec/mongoid/config/environment_spec.rb +3 -3
- data/spec/mongoid/config/options_spec.rb +6 -6
- data/spec/mongoid/config_spec.rb +24 -48
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +78 -38
- data/spec/mongoid/contextual/atomic_spec.rb +60 -56
- data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
- data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
- data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
- data/spec/mongoid/contextual/memory_spec.rb +156 -94
- data/spec/mongoid/contextual/mongo_spec.rb +238 -150
- data/spec/mongoid/contextual/none_spec.rb +127 -0
- data/spec/mongoid/contextual/text_search_spec.rb +209 -0
- data/spec/mongoid/copyable_spec.rb +56 -68
- data/spec/mongoid/criteria/findable_spec.rb +991 -0
- data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
- data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +1252 -0
- data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
- data/spec/mongoid/criteria_spec.rb +715 -2421
- data/spec/mongoid/document_spec.rb +171 -121
- data/spec/mongoid/equality_spec.rb +22 -22
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
- data/spec/mongoid/errors/callback_spec.rb +3 -3
- data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
- data/spec/mongoid/errors/eager_load_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
- data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
- data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
- data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
- data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
- data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
- data/spec/mongoid/errors/no_parent_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
- data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
- data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
- data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
- data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
- data/spec/mongoid/errors/validations_spec.rb +7 -7
- data/spec/mongoid/extensions/array_spec.rb +61 -61
- data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
- data/spec/mongoid/extensions/binary_spec.rb +12 -12
- data/spec/mongoid/extensions/boolean_spec.rb +18 -18
- data/spec/mongoid/extensions/date_spec.rb +13 -13
- data/spec/mongoid/extensions/date_time_spec.rb +8 -8
- data/spec/mongoid/extensions/false_class_spec.rb +5 -5
- data/spec/mongoid/extensions/float_spec.rb +29 -15
- data/spec/mongoid/extensions/hash_spec.rb +29 -29
- data/spec/mongoid/extensions/integer_spec.rb +15 -15
- data/spec/mongoid/extensions/module_spec.rb +2 -2
- data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/extensions/object_id_spec.rb +134 -134
- data/spec/mongoid/extensions/object_spec.rb +26 -26
- data/spec/mongoid/extensions/range_spec.rb +61 -12
- data/spec/mongoid/extensions/regexp_spec.rb +4 -4
- data/spec/mongoid/extensions/set_spec.rb +4 -4
- data/spec/mongoid/extensions/string_spec.rb +35 -46
- data/spec/mongoid/extensions/symbol_spec.rb +9 -9
- data/spec/mongoid/extensions/time_spec.rb +49 -49
- data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
- data/spec/mongoid/extensions/true_class_spec.rb +5 -5
- data/spec/mongoid/extensions_spec.rb +29 -0
- data/spec/mongoid/factory_spec.rb +15 -15
- data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
- data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
- data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
- data/spec/mongoid/fields/localized_spec.rb +38 -23
- data/spec/mongoid/fields/standard_spec.rb +12 -12
- data/spec/mongoid/fields_spec.rb +263 -217
- data/spec/mongoid/findable_spec.rb +509 -0
- data/spec/mongoid/indexable/specification_spec.rb +102 -0
- data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
- data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
- data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
- data/spec/mongoid/log_subscriber_spec.rb +75 -0
- data/spec/mongoid/loggable_spec.rb +1 -1
- data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
- data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
- data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
- data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
- data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
- data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
- data/spec/mongoid/matchable/in_spec.rb +49 -0
- data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
- data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
- data/spec/mongoid/matchable/ne_spec.rb +46 -0
- data/spec/mongoid/matchable/nin_spec.rb +48 -0
- data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
- data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
- data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
- data/spec/mongoid/persistable/creatable_spec.rb +553 -0
- data/spec/mongoid/persistable/deletable_spec.rb +218 -0
- data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
- data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
- data/spec/mongoid/persistable/logical_spec.rb +143 -0
- data/spec/mongoid/persistable/poppable_spec.rb +115 -0
- data/spec/mongoid/persistable/pullable_spec.rb +228 -0
- data/spec/mongoid/persistable/pushable_spec.rb +258 -0
- data/spec/mongoid/persistable/renamable_spec.rb +135 -0
- data/spec/mongoid/persistable/savable_spec.rb +498 -0
- data/spec/mongoid/persistable/settable_spec.rb +162 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
- data/spec/mongoid/persistable/updatable_spec.rb +558 -0
- data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
- data/spec/mongoid/persistable_spec.rb +206 -0
- data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +14 -19
- data/spec/mongoid/query_cache_spec.rb +263 -0
- data/spec/mongoid/railties/document_spec.rb +2 -2
- data/spec/mongoid/relations/accessors_spec.rb +53 -145
- data/spec/mongoid/relations/auto_save_spec.rb +37 -17
- data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
- data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
- data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
- data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
- data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
- data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
- data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
- data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
- data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
- data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
- data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
- data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
- data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
- data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
- data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
- data/spec/mongoid/relations/builders_spec.rb +21 -21
- data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
- data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
- data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
- data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
- data/spec/mongoid/relations/cascading_spec.rb +16 -16
- data/spec/mongoid/relations/constraint_spec.rb +8 -7
- data/spec/mongoid/relations/conversions_spec.rb +16 -14
- data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
- data/spec/mongoid/relations/cyclic_spec.rb +18 -18
- data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
- data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
- data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
- data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
- data/spec/mongoid/relations/eager_spec.rb +228 -0
- data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
- data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
- data/spec/mongoid/relations/embedded/many_spec.rb +467 -372
- data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
- data/spec/mongoid/relations/macros_spec.rb +108 -102
- data/spec/mongoid/relations/metadata_spec.rb +180 -255
- data/spec/mongoid/relations/options_spec.rb +1 -1
- data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
- data/spec/mongoid/relations/proxy_spec.rb +2 -2
- data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
- data/spec/mongoid/relations/referenced/many_spec.rb +587 -527
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +401 -424
- data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
- data/spec/mongoid/relations/reflections_spec.rb +6 -6
- data/spec/mongoid/relations/synchronization_spec.rb +46 -50
- data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
- data/spec/mongoid/relations/touchable_spec.rb +333 -0
- data/spec/mongoid/relations_spec.rb +16 -15
- data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +38 -55
- data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
- data/spec/mongoid/selectable_spec.rb +134 -0
- data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
- data/spec/mongoid/sessions/factory_spec.rb +49 -28
- data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
- data/spec/mongoid/sessions/options_spec.rb +108 -0
- data/spec/mongoid/sessions_spec.rb +319 -178
- data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
- data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
- data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
- data/spec/mongoid/tasks/database_spec.rb +160 -0
- data/spec/mongoid/threaded_spec.rb +17 -70
- data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
- data/spec/mongoid/timestamps/created_spec.rb +5 -5
- data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
- data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
- data/spec/mongoid/timestamps/updated_spec.rb +9 -13
- data/spec/mongoid/timestamps_spec.rb +9 -13
- data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
- data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
- data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
- data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
- data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
- data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
- data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
- data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
- data/spec/mongoid_spec.rb +8 -8
- data/spec/rails/mongoid_spec.rb +19 -335
- data/spec/spec_helper.rb +31 -13
- metadata +303 -283
- data/lib/mongoid/atomic/positionable.rb +0 -73
- data/lib/mongoid/components.rb +0 -92
- data/lib/mongoid/config/inflections.rb +0 -6
- data/lib/mongoid/contextual/eager.rb +0 -158
- data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
- data/lib/mongoid/identity_map.rb +0 -163
- data/lib/mongoid/json.rb +0 -16
- data/lib/mongoid/matchers.rb +0 -32
- data/lib/mongoid/matchers/strategies.rb +0 -97
- data/lib/mongoid/multi_parameter_attributes.rb +0 -105
- data/lib/mongoid/nested_attributes.rb +0 -78
- data/lib/mongoid/observer.rb +0 -192
- data/lib/mongoid/paranoia.rb +0 -136
- data/lib/mongoid/persistence.rb +0 -357
- data/lib/mongoid/persistence/atomic.rb +0 -231
- data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
- data/lib/mongoid/persistence/atomic/bit.rb +0 -35
- data/lib/mongoid/persistence/atomic/inc.rb +0 -45
- data/lib/mongoid/persistence/atomic/operation.rb +0 -154
- data/lib/mongoid/persistence/atomic/pop.rb +0 -32
- data/lib/mongoid/persistence/atomic/pull.rb +0 -32
- data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
- data/lib/mongoid/persistence/atomic/push.rb +0 -25
- data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
- data/lib/mongoid/persistence/atomic/rename.rb +0 -30
- data/lib/mongoid/persistence/atomic/sets.rb +0 -28
- data/lib/mongoid/persistence/atomic/unset.rb +0 -27
- data/lib/mongoid/persistence/deletion.rb +0 -31
- data/lib/mongoid/persistence/insertion.rb +0 -38
- data/lib/mongoid/persistence/modification.rb +0 -35
- data/lib/mongoid/persistence/operations.rb +0 -214
- data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
- data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
- data/lib/mongoid/persistence/operations/insert.rb +0 -34
- data/lib/mongoid/persistence/operations/remove.rb +0 -33
- data/lib/mongoid/persistence/operations/update.rb +0 -59
- data/lib/mongoid/persistence/operations/upsert.rb +0 -28
- data/lib/mongoid/persistence/upsertion.rb +0 -31
- data/lib/mongoid/unit_of_work.rb +0 -61
- data/lib/mongoid/versioning.rb +0 -217
- data/lib/rack/mongoid.rb +0 -2
- data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
- data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
- data/spec/app/models/actor_observer.rb +0 -15
- data/spec/app/models/callback_recorder.rb +0 -25
- data/spec/app/models/paranoid_phone.rb +0 -25
- data/spec/app/models/paranoid_post.rb +0 -36
- data/spec/app/models/phone_observer.rb +0 -6
- data/spec/mongoid/attributes/processing_spec.rb +0 -149
- data/spec/mongoid/criterion/destructive_spec.rb +0 -101
- data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
- data/spec/mongoid/criterion/modification_spec.rb +0 -402
- data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
- data/spec/mongoid/finders_spec.rb +0 -321
- data/spec/mongoid/identity_map_spec.rb +0 -564
- data/spec/mongoid/json_spec.rb +0 -33
- data/spec/mongoid/matchers/in_spec.rb +0 -25
- data/spec/mongoid/matchers/ne_spec.rb +0 -25
- data/spec/mongoid/matchers/nin_spec.rb +0 -25
- data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
- data/spec/mongoid/observer_spec.rb +0 -290
- data/spec/mongoid/paranoia_spec.rb +0 -759
- data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
- data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
- data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
- data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
- data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
- data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
- data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
- data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
- data/spec/mongoid/persistence/atomic_spec.rb +0 -216
- data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
- data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
- data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
- data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
- data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
- data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
- data/spec/mongoid/persistence/operations_spec.rb +0 -313
- data/spec/mongoid/persistence_spec.rb +0 -2279
- data/spec/mongoid/unit_of_work_spec.rb +0 -196
- data/spec/mongoid/versioning_spec.rb +0 -540
- data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
data/lib/mongoid/copyable.rb
CHANGED
@@ -6,7 +6,7 @@ module Mongoid
|
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
8
|
# Clone or dup the current +Document+. This will return all attributes with
|
9
|
-
# the exception of the document's id
|
9
|
+
# the exception of the document's id, and will reset all the
|
10
10
|
# instance variables.
|
11
11
|
#
|
12
12
|
# This clone also includes embedded documents.
|
@@ -22,7 +22,7 @@ module Mongoid
|
|
22
22
|
# _id and id field in the document would cause problems with Mongoid
|
23
23
|
# elsewhere.
|
24
24
|
attrs = clone_document.except("_id", "id")
|
25
|
-
self.class.new(attrs
|
25
|
+
self.class.new(attrs)
|
26
26
|
end
|
27
27
|
alias :dup :clone
|
28
28
|
|
@@ -40,7 +40,6 @@ module Mongoid
|
|
40
40
|
# @since 3.0.22
|
41
41
|
def clone_document
|
42
42
|
attrs = as_document.__deep_copy__
|
43
|
-
attrs["version"] = 1 if attrs.delete("versions")
|
44
43
|
process_localized_attributes(attrs)
|
45
44
|
attrs
|
46
45
|
end
|
data/lib/mongoid/criteria.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require "mongoid/
|
3
|
-
require "mongoid/
|
4
|
-
require "mongoid/
|
5
|
-
require "mongoid/
|
6
|
-
require "mongoid/
|
2
|
+
require "mongoid/criteria/findable"
|
3
|
+
require "mongoid/criteria/inspectable"
|
4
|
+
require "mongoid/criteria/marshalable"
|
5
|
+
require "mongoid/criteria/modifiable"
|
6
|
+
require "mongoid/criteria/scopable"
|
7
|
+
require "mongoid/sessions/options"
|
7
8
|
|
8
9
|
module Mongoid
|
9
10
|
|
@@ -17,11 +18,12 @@ module Mongoid
|
|
17
18
|
include Enumerable
|
18
19
|
include Contextual
|
19
20
|
include Origin::Queryable
|
20
|
-
include
|
21
|
-
include
|
22
|
-
include
|
23
|
-
include
|
24
|
-
include
|
21
|
+
include Findable
|
22
|
+
include Inspectable
|
23
|
+
include Marshalable
|
24
|
+
include Modifiable
|
25
|
+
include Scopable
|
26
|
+
include Sessions::Options
|
25
27
|
|
26
28
|
# Static array used to check with method missing - we only need to ever
|
27
29
|
# instantiate once.
|
@@ -29,7 +31,7 @@ module Mongoid
|
|
29
31
|
# @since 4.0.0
|
30
32
|
CHECK = []
|
31
33
|
|
32
|
-
attr_accessor :embedded, :klass
|
34
|
+
attr_accessor :embedded, :klass, :parent_document, :metadata
|
33
35
|
|
34
36
|
# Returns true if the supplied +Enumerable+ or +Criteria+ is equal to the results
|
35
37
|
# of this +Criteria+ or the criteria itself.
|
@@ -197,9 +199,6 @@ module Mongoid
|
|
197
199
|
# into the identity map who's ids match based on the extra query for the
|
198
200
|
# ids.
|
199
201
|
#
|
200
|
-
# @note This will only work if Mongoid's identity map is enabled. To do
|
201
|
-
# so set identity_map_enabled: true in your mongoid.yml
|
202
|
-
#
|
203
202
|
# @note This will work for embedded relations that reference another
|
204
203
|
# collection via belongs_to as well.
|
205
204
|
#
|
@@ -298,6 +297,31 @@ module Mongoid
|
|
298
297
|
self
|
299
298
|
end
|
300
299
|
|
300
|
+
# Returns a criteria that will always contain zero results and never hits
|
301
|
+
# the database.
|
302
|
+
#
|
303
|
+
# @example Return a none criteria.
|
304
|
+
# criteria.none
|
305
|
+
#
|
306
|
+
# @return [ Criteria ] The none criteria.
|
307
|
+
#
|
308
|
+
# @since 4.0.0
|
309
|
+
def none
|
310
|
+
@none = true and self
|
311
|
+
end
|
312
|
+
|
313
|
+
# Is the criteria an empty but chainable criteria?
|
314
|
+
#
|
315
|
+
# @example Is the criteria a none criteria?
|
316
|
+
# criteria.empty_and_chainable?
|
317
|
+
#
|
318
|
+
# @return [ true, false ] If the criteria is a none.
|
319
|
+
#
|
320
|
+
# @since 4.0.0
|
321
|
+
def empty_and_chainable?
|
322
|
+
!!@none
|
323
|
+
end
|
324
|
+
|
301
325
|
# Overriden to include _type in the fields.
|
302
326
|
#
|
303
327
|
# @example Limit the fields returned from the database.
|
@@ -396,25 +420,6 @@ module Mongoid
|
|
396
420
|
super
|
397
421
|
end
|
398
422
|
|
399
|
-
# Tell the next persistance operation to query from a specific collection,
|
400
|
-
# database or session.
|
401
|
-
#
|
402
|
-
# @example Send the criteria to another collection.
|
403
|
-
# Band.where(name: "Depeche Mode").with(collection: "artists")
|
404
|
-
#
|
405
|
-
# @param [ Hash ] options The storage options.
|
406
|
-
#
|
407
|
-
# @option options [ String, Symbol ] :collection The collection name.
|
408
|
-
# @option options [ String, Symbol ] :database The database name.
|
409
|
-
# @option options [ String, Symbol ] :session The session name.
|
410
|
-
#
|
411
|
-
# @return [ Criteria ] The criteria.
|
412
|
-
#
|
413
|
-
# @since 3.0.0
|
414
|
-
def with(options)
|
415
|
-
Threaded.set_persistence_options(klass, options)
|
416
|
-
self
|
417
|
-
end
|
418
423
|
|
419
424
|
# Get a version of this criteria without the options.
|
420
425
|
#
|
@@ -445,7 +450,7 @@ module Mongoid
|
|
445
450
|
#
|
446
451
|
# @since 3.1.0
|
447
452
|
def for_js(javascript, scope = {})
|
448
|
-
js_query(
|
453
|
+
js_query(BSON::CodeWithScope.new(javascript, scope))
|
449
454
|
end
|
450
455
|
|
451
456
|
private
|
@@ -0,0 +1,141 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
class Criteria
|
4
|
+
module Findable
|
5
|
+
|
6
|
+
# Execute the criteria or raise an error if no documents found.
|
7
|
+
#
|
8
|
+
# @example Execute or raise
|
9
|
+
# criteria.execute_or_raise(id)
|
10
|
+
#
|
11
|
+
# @param [ Object ] args The arguments passed.
|
12
|
+
#
|
13
|
+
# @raise [ Errors::DocumentNotFound ] If nothing returned.
|
14
|
+
#
|
15
|
+
# @return [ Document, Array<Document> ] The document(s).
|
16
|
+
#
|
17
|
+
# @since 2.0.0
|
18
|
+
def execute_or_raise(ids, multi)
|
19
|
+
result = multiple_from_db(ids)
|
20
|
+
check_for_missing_documents!(result, ids)
|
21
|
+
multi ? result : result.first
|
22
|
+
end
|
23
|
+
|
24
|
+
# Find the matchind document(s) in the criteria for the provided ids.
|
25
|
+
#
|
26
|
+
# @example Find by an id.
|
27
|
+
# criteria.find(BSON::ObjectId.new)
|
28
|
+
#
|
29
|
+
# @example Find by multiple ids.
|
30
|
+
# criteria.find([ BSON::ObjectId.new, BSON::ObjectId.new ])
|
31
|
+
#
|
32
|
+
# @param [ Array<BSON::ObjectId> ] args The ids to search for.
|
33
|
+
#
|
34
|
+
# @return [ Array<Document>, Document ] The matching document(s).
|
35
|
+
#
|
36
|
+
# @since 1.0.0
|
37
|
+
def find(*args)
|
38
|
+
ids = args.__find_args__
|
39
|
+
raise_invalid if ids.any?(&:nil?)
|
40
|
+
p "YOOO"
|
41
|
+
p ids
|
42
|
+
for_ids(ids).execute_or_raise(ids, args.multi_arged?)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Adds a criterion to the +Criteria+ that specifies an id that must be matched.
|
46
|
+
#
|
47
|
+
# @example Add a single id criteria.
|
48
|
+
# criteria.for_ids([ 1 ])
|
49
|
+
#
|
50
|
+
# @example Add multiple id criteria.
|
51
|
+
# criteria.for_ids([ 1, 2 ])
|
52
|
+
#
|
53
|
+
# @param [ Array ] ids The array of ids.
|
54
|
+
#
|
55
|
+
# @return [ Criteria ] The cloned criteria.
|
56
|
+
def for_ids(ids)
|
57
|
+
ids = mongoize_ids(ids)
|
58
|
+
if ids.size > 1
|
59
|
+
send(id_finder, { _id: { "$in" => ids }})
|
60
|
+
else
|
61
|
+
send(id_finder, { _id: ids.first })
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Get the documents from the identity map, and if not found hit the
|
66
|
+
# database.
|
67
|
+
#
|
68
|
+
# @example Get the documents from the map or criteria.
|
69
|
+
# criteria.multiple_from_map_or_db(ids)
|
70
|
+
#
|
71
|
+
# @param [ ids ] The searched ids.
|
72
|
+
#
|
73
|
+
# @return [ Array<Document> ] The found documents.
|
74
|
+
def multiple_from_db(ids)
|
75
|
+
return entries if embedded?
|
76
|
+
ids = mongoize_ids(ids)
|
77
|
+
ids.empty? ? [] : from_database(ids)
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
# Get the finder used to generate the id query.
|
83
|
+
#
|
84
|
+
# @api private
|
85
|
+
#
|
86
|
+
# @example Get the id finder.
|
87
|
+
# criteria.id_finder
|
88
|
+
#
|
89
|
+
# @return [ Symbol ] The name of the finder method.
|
90
|
+
#
|
91
|
+
# @since 3.1.0
|
92
|
+
def id_finder
|
93
|
+
@id_finder ||= extract_id ? :all_of : :where
|
94
|
+
end
|
95
|
+
|
96
|
+
# Get documents from the database only.
|
97
|
+
#
|
98
|
+
# @api private
|
99
|
+
#
|
100
|
+
# @example Get documents from the database.
|
101
|
+
# criteria.from_database(ids)
|
102
|
+
#
|
103
|
+
# @param [ Array<Object> ] ids The ids to fetch with.
|
104
|
+
#
|
105
|
+
# @return [ Array<Document> ] The matching documents.
|
106
|
+
#
|
107
|
+
# @since 3.0.0
|
108
|
+
def from_database(ids)
|
109
|
+
(ids.size > 1 ? any_in(id: ids) : where(id: ids.first)).entries
|
110
|
+
end
|
111
|
+
|
112
|
+
# Convert all the ids to their proper types.
|
113
|
+
#
|
114
|
+
# @api private
|
115
|
+
#
|
116
|
+
# @example Convert the ids.
|
117
|
+
# criteria.mongoize_ids(ids)
|
118
|
+
#
|
119
|
+
# @param [ Array<Object> ] ids The ids to convert.
|
120
|
+
#
|
121
|
+
# @return [ Array<Object> ] The converted ids.
|
122
|
+
#
|
123
|
+
# @since 3.0.0
|
124
|
+
def mongoize_ids(ids)
|
125
|
+
ids.map{ |id| klass.fields["_id"].mongoize(id) }
|
126
|
+
end
|
127
|
+
|
128
|
+
# Convenience method of raising an invalid options error.
|
129
|
+
#
|
130
|
+
# @example Raise the error.
|
131
|
+
# criteria.raise_invalid
|
132
|
+
#
|
133
|
+
# @raise [ Errors::InvalidOptions ] The error.
|
134
|
+
#
|
135
|
+
# @since 2.0.0
|
136
|
+
def raise_invalid
|
137
|
+
raise Errors::InvalidFind.new
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid
|
3
|
-
|
3
|
+
class Criteria
|
4
4
|
module Findable
|
5
5
|
|
6
6
|
# Execute the criteria or raise an error if no documents found.
|
@@ -16,7 +16,7 @@ module Mongoid
|
|
16
16
|
#
|
17
17
|
# @since 2.0.0
|
18
18
|
def execute_or_raise(ids, multi)
|
19
|
-
result =
|
19
|
+
result = multiple_from_db(ids)
|
20
20
|
check_for_missing_documents!(result, ids)
|
21
21
|
multi ? result : result.first
|
22
22
|
end
|
@@ -24,12 +24,12 @@ module Mongoid
|
|
24
24
|
# Find the matchind document(s) in the criteria for the provided ids.
|
25
25
|
#
|
26
26
|
# @example Find by an id.
|
27
|
-
# criteria.find(
|
27
|
+
# criteria.find(BSON::ObjectId.new)
|
28
28
|
#
|
29
29
|
# @example Find by multiple ids.
|
30
|
-
# criteria.find([
|
30
|
+
# criteria.find([ BSON::ObjectId.new, BSON::ObjectId.new ])
|
31
31
|
#
|
32
|
-
# @param [ Array<
|
32
|
+
# @param [ Array<BSON::ObjectId> ] args The ids to search for.
|
33
33
|
#
|
34
34
|
# @return [ Array<Document>, Document ] The matching document(s).
|
35
35
|
#
|
@@ -60,23 +60,6 @@ module Mongoid
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
-
# Get the document from the identity map, and if not found hit the
|
64
|
-
# database.
|
65
|
-
#
|
66
|
-
# @example Get the document from the map or criteria.
|
67
|
-
# criteria.from_map_or_db
|
68
|
-
#
|
69
|
-
# @return [ Document ] The found document.
|
70
|
-
#
|
71
|
-
# @since 2.2.1
|
72
|
-
def from_map_or_db
|
73
|
-
id = extract_id
|
74
|
-
id = klass.fields["_id"].mongoize(id) if id
|
75
|
-
doc = IdentityMap.get(klass, id || selector_with_type_selection)
|
76
|
-
return nil if doc == {}
|
77
|
-
doc && doc.matches?(selector) ? doc : first
|
78
|
-
end
|
79
|
-
|
80
63
|
# Get the documents from the identity map, and if not found hit the
|
81
64
|
# database.
|
82
65
|
#
|
@@ -86,11 +69,10 @@ module Mongoid
|
|
86
69
|
# @param [ ids ] The searched ids.
|
87
70
|
#
|
88
71
|
# @return [ Array<Document> ] The found documents.
|
89
|
-
def
|
72
|
+
def multiple_from_db(ids)
|
90
73
|
return entries if embedded?
|
91
74
|
ids = mongoize_ids(ids)
|
92
|
-
|
93
|
-
ids.empty? ? result : result + from_database(ids)
|
75
|
+
ids.empty? ? [] : from_database(ids)
|
94
76
|
end
|
95
77
|
|
96
78
|
private
|
@@ -125,28 +107,6 @@ module Mongoid
|
|
125
107
|
(ids.size > 1 ? any_in(id: ids) : where(id: ids.first)).entries
|
126
108
|
end
|
127
109
|
|
128
|
-
# Get documents from the identity map only.
|
129
|
-
#
|
130
|
-
# @api private
|
131
|
-
#
|
132
|
-
# @example Get documents from the identity map.
|
133
|
-
# criteria.from_identity_map(ids)
|
134
|
-
#
|
135
|
-
# @param [ Array<Object> ] ids The ids to fetch with.
|
136
|
-
#
|
137
|
-
# @return [ Array<Document> ] The matching documents.
|
138
|
-
#
|
139
|
-
# @since 3.0.0
|
140
|
-
def from_identity_map(ids)
|
141
|
-
result = []
|
142
|
-
selection = selector_with_type_selection
|
143
|
-
ids.reject! do |id|
|
144
|
-
doc = IdentityMap.get(klass, id)
|
145
|
-
doc && doc.matches?(selection) ? result.push(doc) : false
|
146
|
-
end
|
147
|
-
result
|
148
|
-
end
|
149
|
-
|
150
110
|
# Convert all the ids to their proper types.
|
151
111
|
#
|
152
112
|
# @api private
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid
|
3
|
-
|
3
|
+
class Criteria
|
4
4
|
module Marshalable
|
5
5
|
|
6
6
|
# Provides the data needed to Marshal.dump a criteria.
|
@@ -21,6 +21,8 @@ module Mongoid
|
|
21
21
|
# @example Load the criteria.
|
22
22
|
# Marshal.load(criteria)
|
23
23
|
#
|
24
|
+
# @param [ Array ] data The raw data.
|
25
|
+
#
|
24
26
|
# @since 3.0.15
|
25
27
|
def marshal_load(data)
|
26
28
|
@scoping_options, raw_selector, raw_options = data.pop(3)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid
|
3
|
-
|
3
|
+
class Criteria
|
4
4
|
module Modifiable
|
5
5
|
|
6
6
|
# Build a document given the selector and return it.
|
@@ -68,6 +68,22 @@ module Mongoid
|
|
68
68
|
find_or(:create, attrs, &block)
|
69
69
|
end
|
70
70
|
|
71
|
+
# Find the first +Document+ given the conditions, or creates a new document
|
72
|
+
# with the conditions that were supplied. If validation fails an
|
73
|
+
# exception will be raised.
|
74
|
+
#
|
75
|
+
# @example Find or create the document.
|
76
|
+
# Person.find_or_create_by!(:attribute => "value")
|
77
|
+
#
|
78
|
+
# @param [ Hash ] attrs The attributes to check.
|
79
|
+
#
|
80
|
+
# @raise [ Errors::Validations ] on validation error.
|
81
|
+
#
|
82
|
+
# @return [ Document ] A matching or newly created document.
|
83
|
+
def find_or_create_by!(attrs = {}, &block)
|
84
|
+
find_or(:create!, attrs, &block)
|
85
|
+
end
|
86
|
+
|
71
87
|
# Find the first +Document+ given the conditions, or initializes a new document
|
72
88
|
# with the conditions that were supplied.
|
73
89
|
#
|
@@ -144,13 +160,17 @@ module Mongoid
|
|
144
160
|
#
|
145
161
|
# @since 3.0.0
|
146
162
|
def create_document(method, attrs = nil, &block)
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
163
|
+
attributes = selector.reduce(attrs || {}) do |hash, (key, value)|
|
164
|
+
unless key.to_s =~ /\$/ || value.is_a?(Hash)
|
165
|
+
hash[key] = value
|
166
|
+
end
|
167
|
+
hash
|
168
|
+
end
|
169
|
+
if embedded?
|
170
|
+
attributes[:_parent] = parent_document
|
171
|
+
attributes[:__metadata] = metadata
|
172
|
+
end
|
173
|
+
klass.__send__(method, attributes, &block)
|
154
174
|
end
|
155
175
|
|
156
176
|
# Find the first object or create/initialize it.
|