mongoid 3.1.7 → 4.0.0
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 +423 -9
- data/README.md +5 -6
- data/lib/config/locales/en.yml +32 -18
- 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/embedded.rb +0 -30
- data/lib/mongoid/atomic/paths/root.rb +0 -13
- data/lib/mongoid/atomic.rb +1 -12
- 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/attributes.rb +61 -99
- data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
- data/lib/mongoid/composable.rb +105 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config.rb +3 -9
- data/lib/mongoid/contextual/aggregable/mongo.rb +5 -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 +18 -6
- data/lib/mongoid/contextual/mongo.rb +64 -56
- data/lib/mongoid/contextual/none.rb +90 -0
- data/lib/mongoid/contextual/text_search.rb +178 -0
- data/lib/mongoid/contextual.rb +2 -0
- data/lib/mongoid/copyable.rb +2 -3
- data/lib/mongoid/criteria/{#findable.rb# → findable.rb} +0 -2
- 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/criteria.rb +39 -34
- data/lib/mongoid/document.rb +32 -17
- 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/errors.rb +4 -1
- 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/extensions.rb +2 -7
- data/lib/mongoid/factory.rb +8 -6
- 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/fields.rb +41 -8
- data/lib/mongoid/{finders.rb → findable.rb} +8 -2
- data/lib/mongoid/indexable/specification.rb +104 -0
- data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
- data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
- 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/{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 +1 -1
- 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/matchable.rb +152 -0
- data/lib/mongoid/persistable/creatable.rb +188 -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 +152 -0
- data/lib/mongoid/persistable/upsertable.rb +55 -0
- data/lib/mongoid/persistable.rb +216 -0
- data/lib/mongoid/positional.rb +71 -0
- data/lib/mongoid/query_cache.rb +247 -0
- data/lib/mongoid/railtie.rb +32 -45
- data/lib/mongoid/railties/database.rake +9 -25
- data/lib/mongoid/relations/accessors.rb +13 -49
- data/lib/mongoid/relations/auto_save.rb +15 -36
- data/lib/mongoid/relations/binding.rb +1 -24
- 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 +3 -1
- data/lib/mongoid/relations/builder.rb +1 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -5
- 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/builders.rb +2 -2
- 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/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/eager.rb +46 -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 +30 -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/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 +19 -32
- data/lib/mongoid/relations/referenced/many_to_many.rb +15 -38
- data/lib/mongoid/relations/referenced/one.rb +6 -25
- data/lib/mongoid/relations/synchronization.rb +3 -3
- data/lib/mongoid/relations/touchable.rb +34 -1
- data/lib/mongoid/relations.rb +11 -25
- data/lib/mongoid/{reloading.rb → reloadable.rb} +6 -4
- 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/factory.rb +2 -0
- data/lib/mongoid/sessions/options.rb +180 -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/sessions.rb +37 -345
- 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/lifecycle.rb +0 -28
- data/lib/mongoid/threaded.rb +0 -157
- data/lib/mongoid/timestamps/updated/short.rb +2 -2
- data/lib/mongoid/{hierarchy.rb → traversable.rb} +9 -5
- 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 +23 -19
- data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid.rb +10 -76
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +13 -24
- 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/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/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/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/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} +335 -448
- data/spec/mongoid/attributes/readonly_spec.rb +58 -18
- data/spec/mongoid/attributes_spec.rb +300 -436
- 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 +46 -38
- data/spec/mongoid/contextual/atomic_spec.rb +69 -59
- 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 +151 -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 +1255 -0
- data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
- data/spec/mongoid/criteria_spec.rb +576 -2293
- data/spec/mongoid/document_spec.rb +166 -120
- 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 +15 -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/{finders_spec.rb → findable_spec.rb} +127 -27
- 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/{matchers → matchable}/ne_spec.rb +3 -3
- 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 +512 -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 +461 -0
- data/spec/mongoid/persistable/settable_spec.rb +139 -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} +19 -14
- data/spec/mongoid/query_cache_spec.rb +231 -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 +393 -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 +434 -527
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +352 -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} +20 -60
- 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 +107 -0
- data/spec/mongoid/sessions_spec.rb +289 -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 -350
- data/spec/spec_helper.rb +24 -15
- metadata +259 -251
- 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/criterion/findable.rb +0 -179
- 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/strategies.rb +0 -97
- data/lib/mongoid/matchers.rb +0 -32
- 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/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/atomic.rb +0 -231
- 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/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/operations.rb +0 -214
- data/lib/mongoid/persistence/upsertion.rb +0 -31
- data/lib/mongoid/persistence.rb +0 -357
- data/lib/mongoid/unit_of_work.rb +0 -61
- data/lib/mongoid/versioning.rb +0 -217
- data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
- data/lib/rack/mongoid.rb +0 -2
- 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/#atomic_spec.rb# +0 -365
- 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/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/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
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Atomic
|
|
4
|
-
|
|
5
|
-
# This module is responsible for taking update selectors and switching out
|
|
6
|
-
# the indexes for the $ positional operator where appropriate.
|
|
7
|
-
#
|
|
8
|
-
# @since 3.1.0
|
|
9
|
-
module Positionable
|
|
10
|
-
|
|
11
|
-
# Takes the provided selector and atomic operations and replaces the
|
|
12
|
-
# indexes of the embedded documents with the positional operator when
|
|
13
|
-
# needed.
|
|
14
|
-
#
|
|
15
|
-
# @note The only time we can accurately know when to use the positional
|
|
16
|
-
# operator is at the exact time we are going to persist something. So
|
|
17
|
-
# we can tell by the selector that we are sending if it is actually
|
|
18
|
-
# possible to use the positional operator at all. For example, if the
|
|
19
|
-
# selector is: { "_id" => 1 }, then we could not use the positional
|
|
20
|
-
# operator for updating embedded documents since there would never be a
|
|
21
|
-
# match - we base whether we can based on the number of levels deep the
|
|
22
|
-
# selector goes, and if the id values are not nil.
|
|
23
|
-
#
|
|
24
|
-
# @example Process the operations.
|
|
25
|
-
# positionally(
|
|
26
|
-
# { "_id" => 1, "addresses._id" => 2 },
|
|
27
|
-
# { "$set" => { "addresses.0.street" => "hobrecht" }}
|
|
28
|
-
# )
|
|
29
|
-
#
|
|
30
|
-
# @param [ Hash ] selector The selector.
|
|
31
|
-
# @param [ Hash ] operations The update operations.
|
|
32
|
-
# @param [ Hash ] processed The processed update operations.
|
|
33
|
-
#
|
|
34
|
-
# @return [ Hash ] The new operations.
|
|
35
|
-
#
|
|
36
|
-
# @since 3.1.0
|
|
37
|
-
def positionally(selector, operations, processed = {})
|
|
38
|
-
if selector.size == 1 || selector.values.any? { |val| val.nil? }
|
|
39
|
-
return operations
|
|
40
|
-
end
|
|
41
|
-
keys = selector.keys.map{ |m| m.sub('._id','') } - ['_id']
|
|
42
|
-
keys = keys.sort_by { |s| s.length*-1 }
|
|
43
|
-
process_operations(keys, operations, processed)
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
private
|
|
47
|
-
|
|
48
|
-
def process_operations(keys, operations, processed)
|
|
49
|
-
operations.each_pair do |operation, update|
|
|
50
|
-
processed[operation] = process_updates(keys, update)
|
|
51
|
-
end
|
|
52
|
-
processed
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def process_updates(keys, update, updates = {})
|
|
56
|
-
update.each_pair do |position, value|
|
|
57
|
-
updates[replace_index(keys, position)] = value
|
|
58
|
-
end
|
|
59
|
-
updates
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def replace_index(keys, position)
|
|
63
|
-
# replace to $ only if that key is on the selector
|
|
64
|
-
keys.each do |kk|
|
|
65
|
-
if position =~ /^#{kk}\.\d+\.(.*)/
|
|
66
|
-
return "#{kk}.$.#{$1}"
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
position
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
data/lib/mongoid/components.rb
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Components
|
|
4
|
-
extend ActiveSupport::Concern
|
|
5
|
-
|
|
6
|
-
# All modules that a +Document+ is composed of are defined in this
|
|
7
|
-
# module, to keep the document class from getting too cluttered.
|
|
8
|
-
included do
|
|
9
|
-
extend ActiveModel::Translation
|
|
10
|
-
extend Mongoid::Finders
|
|
11
|
-
|
|
12
|
-
class_attribute :paranoid
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
include ActiveModel::Conversion
|
|
16
|
-
include ActiveModel::MassAssignmentSecurity
|
|
17
|
-
include ActiveModel::Naming
|
|
18
|
-
include ActiveModel::Observing
|
|
19
|
-
include ActiveModel::Serializers::JSON
|
|
20
|
-
include ActiveModel::Serializers::Xml
|
|
21
|
-
include Mongoid::Atomic
|
|
22
|
-
include Mongoid::Dirty
|
|
23
|
-
include Mongoid::Attributes
|
|
24
|
-
include Mongoid::Evolvable
|
|
25
|
-
include Mongoid::Fields
|
|
26
|
-
include Mongoid::Hierarchy
|
|
27
|
-
include Mongoid::Indexes
|
|
28
|
-
include Mongoid::Inspection
|
|
29
|
-
include Mongoid::JSON
|
|
30
|
-
include Mongoid::Matchers
|
|
31
|
-
include Mongoid::NestedAttributes
|
|
32
|
-
include Mongoid::Persistence
|
|
33
|
-
include Mongoid::Relations
|
|
34
|
-
include Mongoid::Reloading
|
|
35
|
-
include Mongoid::Scoping
|
|
36
|
-
include Mongoid::Sessions
|
|
37
|
-
include Mongoid::Serialization
|
|
38
|
-
include Mongoid::Sharding
|
|
39
|
-
include Mongoid::State
|
|
40
|
-
include Mongoid::Threaded::Lifecycle
|
|
41
|
-
include Mongoid::Validations
|
|
42
|
-
include Mongoid::Callbacks
|
|
43
|
-
include Mongoid::Copyable
|
|
44
|
-
include Mongoid::Equality
|
|
45
|
-
|
|
46
|
-
MODULES = [
|
|
47
|
-
Mongoid::Atomic,
|
|
48
|
-
Mongoid::Attributes,
|
|
49
|
-
Mongoid::Callbacks,
|
|
50
|
-
Mongoid::Copyable,
|
|
51
|
-
Mongoid::Dirty,
|
|
52
|
-
Mongoid::Evolvable,
|
|
53
|
-
Mongoid::Fields,
|
|
54
|
-
Mongoid::Hierarchy,
|
|
55
|
-
Mongoid::Indexes,
|
|
56
|
-
Mongoid::Inspection,
|
|
57
|
-
Mongoid::JSON,
|
|
58
|
-
Mongoid::Matchers,
|
|
59
|
-
Mongoid::NestedAttributes,
|
|
60
|
-
Mongoid::Persistence,
|
|
61
|
-
Mongoid::Relations,
|
|
62
|
-
Mongoid::Reloading,
|
|
63
|
-
Mongoid::Scoping,
|
|
64
|
-
Mongoid::Serialization,
|
|
65
|
-
Mongoid::Sessions,
|
|
66
|
-
Mongoid::Sharding,
|
|
67
|
-
Mongoid::State,
|
|
68
|
-
Mongoid::Threaded::Lifecycle,
|
|
69
|
-
Mongoid::Timestamps::Timeless,
|
|
70
|
-
Mongoid::Validations,
|
|
71
|
-
Mongoid::Equality
|
|
72
|
-
]
|
|
73
|
-
|
|
74
|
-
class << self
|
|
75
|
-
|
|
76
|
-
# Get a list of methods that would be a bad idea to define as field names
|
|
77
|
-
# or override when including Mongoid::Document.
|
|
78
|
-
#
|
|
79
|
-
# @example Bad thing!
|
|
80
|
-
# Mongoid::Components.prohibited_methods
|
|
81
|
-
#
|
|
82
|
-
# @return [ Array<Symbol> ]
|
|
83
|
-
#
|
|
84
|
-
# @since 2.1.8
|
|
85
|
-
def prohibited_methods
|
|
86
|
-
@prohibited_methods ||= MODULES.flat_map do |mod|
|
|
87
|
-
mod.instance_methods.map{ |m| m.to_sym }
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
end
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Contextual
|
|
4
|
-
module Eager
|
|
5
|
-
|
|
6
|
-
# @attribute [rw] eager_loaded Has the context been eager loaded?
|
|
7
|
-
attr_accessor :eager_loaded
|
|
8
|
-
|
|
9
|
-
private
|
|
10
|
-
|
|
11
|
-
# Eager load the inclusions for the provided documents.
|
|
12
|
-
#
|
|
13
|
-
# @api private
|
|
14
|
-
#
|
|
15
|
-
# @example Eager load the inclusions.
|
|
16
|
-
# context.eager_load(docs)
|
|
17
|
-
#
|
|
18
|
-
# @param [ Array<Document> ] docs The docs returning from the db.
|
|
19
|
-
#
|
|
20
|
-
# @return [ true ] Always true.
|
|
21
|
-
#
|
|
22
|
-
# @since 3.0.0
|
|
23
|
-
def eager_load(docs)
|
|
24
|
-
load_inclusions(docs)
|
|
25
|
-
self.eager_loaded = true
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
# Eager load the inclusions for the provided document.
|
|
29
|
-
#
|
|
30
|
-
# @api private
|
|
31
|
-
#
|
|
32
|
-
# @example Eager load the inclusions.
|
|
33
|
-
# context.eager_load(doc)
|
|
34
|
-
#
|
|
35
|
-
# @param [ Document ] doc The doc returning from the db.
|
|
36
|
-
#
|
|
37
|
-
# @return [ true ] Always true.
|
|
38
|
-
#
|
|
39
|
-
# @since 3.0.16
|
|
40
|
-
def eager_load_one(doc)
|
|
41
|
-
load_inclusions([ doc ])
|
|
42
|
-
inclusions_loaded[doc.id] = true
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# Get the ids that to be used to eager load documents.
|
|
46
|
-
#
|
|
47
|
-
# @api private
|
|
48
|
-
#
|
|
49
|
-
# @example Get the ids.
|
|
50
|
-
# context.eager_load(docs, metadata)
|
|
51
|
-
#
|
|
52
|
-
# @param [ Array<Document> ] docs The pre-loaded documents.
|
|
53
|
-
# @param [ Metadata ] metadata The relation metadata.
|
|
54
|
-
#
|
|
55
|
-
# @return [ Array<Object> ] The ids.
|
|
56
|
-
#
|
|
57
|
-
# @since 3.0.0
|
|
58
|
-
def eager_loaded_ids(docs, metadata)
|
|
59
|
-
if metadata.stores_foreign_key?
|
|
60
|
-
docs.flat_map{ |doc| doc.send(metadata.foreign_key) }
|
|
61
|
-
else
|
|
62
|
-
docs.map(&:id)
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
# Is this context able to be eager loaded?
|
|
67
|
-
#
|
|
68
|
-
# @api private
|
|
69
|
-
#
|
|
70
|
-
# @example Is the context eager loadable?
|
|
71
|
-
# context.eager_loadable?
|
|
72
|
-
#
|
|
73
|
-
# @example Is the single document eager loadable?
|
|
74
|
-
# context.eager_loadable?(document)
|
|
75
|
-
#
|
|
76
|
-
# @param [ Document ] document The single document to load for.
|
|
77
|
-
#
|
|
78
|
-
# @return [ true, false ] If the context is able to be eager loaded.
|
|
79
|
-
#
|
|
80
|
-
# @since 3.0.0
|
|
81
|
-
def eager_loadable?(document = nil)
|
|
82
|
-
return false if criteria.inclusions.empty?
|
|
83
|
-
document ? !inclusions_loaded?(document) : !eager_loaded
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
# Has a hash of individual documents that have had their relations reager
|
|
87
|
-
# loaded.
|
|
88
|
-
#
|
|
89
|
-
# @api private
|
|
90
|
-
#
|
|
91
|
-
# @example Get the documents with relations eager loaded.
|
|
92
|
-
# context.inclusions_loaded
|
|
93
|
-
#
|
|
94
|
-
# @return [ Hash ] The documents that have had eager loaded inclusions.
|
|
95
|
-
#
|
|
96
|
-
# @since 3.0.16
|
|
97
|
-
def inclusions_loaded
|
|
98
|
-
@inclusions_loaded ||= {}
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
# Has the document had its inclusions loaded?
|
|
102
|
-
#
|
|
103
|
-
# @api private
|
|
104
|
-
#
|
|
105
|
-
# @example Has the document had its inclusions loaded?
|
|
106
|
-
# context.inclusions_loaded?(document)
|
|
107
|
-
#
|
|
108
|
-
# @param [ Document ] document The document to check.
|
|
109
|
-
#
|
|
110
|
-
# @return [ true, false ] If the document had it's inclusions loaded.
|
|
111
|
-
#
|
|
112
|
-
# @since 3.0.16
|
|
113
|
-
def inclusions_loaded?(document)
|
|
114
|
-
inclusions_loaded.has_key?(document.id)
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
# Eager load the inclusions for the provided documents.
|
|
118
|
-
#
|
|
119
|
-
# @api private
|
|
120
|
-
#
|
|
121
|
-
# @example Eager load the inclusions.
|
|
122
|
-
# context.load_inclusions(docs)
|
|
123
|
-
#
|
|
124
|
-
# @param [ Array<Document> ] docs The docs returning from the db.
|
|
125
|
-
#
|
|
126
|
-
# @return [ true ] Always true.
|
|
127
|
-
#
|
|
128
|
-
# @since 3.0.16
|
|
129
|
-
def load_inclusions(docs)
|
|
130
|
-
criteria.inclusions.each do |metadata|
|
|
131
|
-
metadata.eager_load(eager_loaded_ids(docs, metadata)) if !docs.empty?
|
|
132
|
-
end
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
# If the provided document exists, eager load its dependencies or return
|
|
136
|
-
# nil.
|
|
137
|
-
#
|
|
138
|
-
# @api private
|
|
139
|
-
#
|
|
140
|
-
# @example Eager load if the document is not nil.
|
|
141
|
-
# context.with_eager_loading(document)
|
|
142
|
-
#
|
|
143
|
-
# @param [ Hash ] document The document from the database.
|
|
144
|
-
#
|
|
145
|
-
# @return [ Document, nil ] The instantiated model document.
|
|
146
|
-
#
|
|
147
|
-
# @since 3.0.0
|
|
148
|
-
def with_eager_loading(document)
|
|
149
|
-
selecting do
|
|
150
|
-
return nil unless document
|
|
151
|
-
doc = Factory.from_db(klass, document, criteria.object_id)
|
|
152
|
-
eager_load_one(doc) if eager_loadable?(doc)
|
|
153
|
-
doc
|
|
154
|
-
end
|
|
155
|
-
end
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
|
-
end
|
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Criterion
|
|
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_map_or_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(Moped::BSON::ObjectId.new)
|
|
28
|
-
#
|
|
29
|
-
# @example Find by multiple ids.
|
|
30
|
-
# criteria.find([ Moped::BSON::ObjectId.new, Moped::BSON::ObjectId.new ])
|
|
31
|
-
#
|
|
32
|
-
# @param [ Array<Moped::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
|
-
for_ids(ids).execute_or_raise(ids, args.multi_arged?)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Adds a criterion to the +Criteria+ that specifies an id that must be matched.
|
|
44
|
-
#
|
|
45
|
-
# @example Add a single id criteria.
|
|
46
|
-
# criteria.for_ids([ 1 ])
|
|
47
|
-
#
|
|
48
|
-
# @example Add multiple id criteria.
|
|
49
|
-
# criteria.for_ids([ 1, 2 ])
|
|
50
|
-
#
|
|
51
|
-
# @param [ Array ] ids The array of ids.
|
|
52
|
-
#
|
|
53
|
-
# @return [ Criteria ] The cloned criteria.
|
|
54
|
-
def for_ids(ids)
|
|
55
|
-
ids = mongoize_ids(ids)
|
|
56
|
-
if ids.size > 1
|
|
57
|
-
send(id_finder, { _id: { "$in" => ids }})
|
|
58
|
-
else
|
|
59
|
-
send(id_finder, { _id: ids.first })
|
|
60
|
-
end
|
|
61
|
-
end
|
|
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
|
-
# Get the documents from the identity map, and if not found hit the
|
|
81
|
-
# database.
|
|
82
|
-
#
|
|
83
|
-
# @example Get the documents from the map or criteria.
|
|
84
|
-
# criteria.multiple_from_map_or_db(ids)
|
|
85
|
-
#
|
|
86
|
-
# @param [ ids ] The searched ids.
|
|
87
|
-
#
|
|
88
|
-
# @return [ Array<Document> ] The found documents.
|
|
89
|
-
def multiple_from_map_or_db(ids)
|
|
90
|
-
return entries if embedded?
|
|
91
|
-
ids = mongoize_ids(ids)
|
|
92
|
-
result = from_identity_map(ids)
|
|
93
|
-
ids.empty? ? result : result + from_database(ids)
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
private
|
|
97
|
-
|
|
98
|
-
# Get the finder used to generate the id query.
|
|
99
|
-
#
|
|
100
|
-
# @api private
|
|
101
|
-
#
|
|
102
|
-
# @example Get the id finder.
|
|
103
|
-
# criteria.id_finder
|
|
104
|
-
#
|
|
105
|
-
# @return [ Symbol ] The name of the finder method.
|
|
106
|
-
#
|
|
107
|
-
# @since 3.1.0
|
|
108
|
-
def id_finder
|
|
109
|
-
@id_finder ||= extract_id ? :all_of : :where
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
# Get documents from the database only.
|
|
113
|
-
#
|
|
114
|
-
# @api private
|
|
115
|
-
#
|
|
116
|
-
# @example Get documents from the database.
|
|
117
|
-
# criteria.from_database(ids)
|
|
118
|
-
#
|
|
119
|
-
# @param [ Array<Object> ] ids The ids to fetch with.
|
|
120
|
-
#
|
|
121
|
-
# @return [ Array<Document> ] The matching documents.
|
|
122
|
-
#
|
|
123
|
-
# @since 3.0.0
|
|
124
|
-
def from_database(ids)
|
|
125
|
-
(ids.size > 1 ? any_in(id: ids) : where(id: ids.first)).entries
|
|
126
|
-
end
|
|
127
|
-
|
|
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
|
-
# Convert all the ids to their proper types.
|
|
151
|
-
#
|
|
152
|
-
# @api private
|
|
153
|
-
#
|
|
154
|
-
# @example Convert the ids.
|
|
155
|
-
# criteria.mongoize_ids(ids)
|
|
156
|
-
#
|
|
157
|
-
# @param [ Array<Object> ] ids The ids to convert.
|
|
158
|
-
#
|
|
159
|
-
# @return [ Array<Object> ] The converted ids.
|
|
160
|
-
#
|
|
161
|
-
# @since 3.0.0
|
|
162
|
-
def mongoize_ids(ids)
|
|
163
|
-
ids.map{ |id| klass.fields["_id"].mongoize(id) }
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
# Convenience method of raising an invalid options error.
|
|
167
|
-
#
|
|
168
|
-
# @example Raise the error.
|
|
169
|
-
# criteria.raise_invalid
|
|
170
|
-
#
|
|
171
|
-
# @raise [ Errors::InvalidOptions ] The error.
|
|
172
|
-
#
|
|
173
|
-
# @since 2.0.0
|
|
174
|
-
def raise_invalid
|
|
175
|
-
raise Errors::InvalidFind.new
|
|
176
|
-
end
|
|
177
|
-
end
|
|
178
|
-
end
|
|
179
|
-
end
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Errors
|
|
4
|
-
|
|
5
|
-
# This error is raised when attempting to version an embedded document.
|
|
6
|
-
class VersioningNotOnRoot < MongoidError
|
|
7
|
-
|
|
8
|
-
# Create the new error.
|
|
9
|
-
#
|
|
10
|
-
# @example Create the new error.
|
|
11
|
-
# VersioningNotOnRoot.new(Address)
|
|
12
|
-
#
|
|
13
|
-
# @param [ Class ] klass The embedded class.
|
|
14
|
-
#
|
|
15
|
-
# @since 3.0.0
|
|
16
|
-
def initialize(klass)
|
|
17
|
-
super(
|
|
18
|
-
compose_message("versioning_not_on_root", { klass: klass })
|
|
19
|
-
)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
data/lib/mongoid/identity_map.rb
DELETED
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
|
|
4
|
-
# Defines behaviour for the identity map in Mongoid.
|
|
5
|
-
class IdentityMap < Hash
|
|
6
|
-
|
|
7
|
-
# Clear out the loaded documents for the provided selector.
|
|
8
|
-
#
|
|
9
|
-
# @example Clear out the documents.
|
|
10
|
-
# map.clear_many(Post, { person_id: person.id })
|
|
11
|
-
#
|
|
12
|
-
# @param [ Class ] klass The class of the relation.
|
|
13
|
-
# @param [ Hash ] selector The selector.
|
|
14
|
-
#
|
|
15
|
-
# @return [ Array ] An empty array.
|
|
16
|
-
#
|
|
17
|
-
# @since 2.4.10
|
|
18
|
-
def clear_many(klass, selector)
|
|
19
|
-
documents_for(klass)[selector] = {}
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# Get a document from the identity map by its id.
|
|
23
|
-
#
|
|
24
|
-
# @example Get the document from the map.
|
|
25
|
-
# map.get(Person, id)
|
|
26
|
-
#
|
|
27
|
-
# @param [ Class ] klass The class of the document.
|
|
28
|
-
# @param [ Object, Hash ] idenfier The document id or selector.
|
|
29
|
-
#
|
|
30
|
-
# @return [ Document ] The matching document.
|
|
31
|
-
#
|
|
32
|
-
# @since 2.1.0
|
|
33
|
-
def get(klass, identifier)
|
|
34
|
-
if Mongoid.using_identity_map? && klass
|
|
35
|
-
if identifier.is_a?(::Array)
|
|
36
|
-
documents = documents_for(klass)
|
|
37
|
-
identifier.map do |id|
|
|
38
|
-
documents[id] || (return nil)
|
|
39
|
-
end
|
|
40
|
-
else
|
|
41
|
-
documents_for(klass)[identifier]
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# Get many documents from the map via the selector
|
|
47
|
-
#
|
|
48
|
-
# @example Get the document from the map.
|
|
49
|
-
# map.get(Person, { post_id: post })
|
|
50
|
-
#
|
|
51
|
-
# @param [ Class ] klass The class of the document.
|
|
52
|
-
# @param [ Hash ] idenfier The selector.
|
|
53
|
-
#
|
|
54
|
-
# @return [ Array<Document> ] The matching documents.
|
|
55
|
-
#
|
|
56
|
-
# @since 3.0.0
|
|
57
|
-
def get_many(klass, identifier)
|
|
58
|
-
if Mongoid.using_identity_map? && klass
|
|
59
|
-
documents_for(klass)[identifier].try(:values)
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# Remove the document from the identity map.
|
|
64
|
-
#
|
|
65
|
-
# @example Remove the document.
|
|
66
|
-
# map.removed(person)
|
|
67
|
-
#
|
|
68
|
-
# @param [ Document ] document The document to remove.
|
|
69
|
-
#
|
|
70
|
-
# @return [ Document, nil ] The removed document.
|
|
71
|
-
#
|
|
72
|
-
# @since 2.1.0
|
|
73
|
-
def remove(document)
|
|
74
|
-
if Mongoid.using_identity_map? && document && document.id
|
|
75
|
-
documents_for(document.class).delete(document.id)
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
# Puts a document in the identity map, accessed by its id.
|
|
80
|
-
#
|
|
81
|
-
# @example Put the document in the map.
|
|
82
|
-
# identity_map.set(document)
|
|
83
|
-
#
|
|
84
|
-
# @param [ Document ] document The document to place in the map.
|
|
85
|
-
#
|
|
86
|
-
# @return [ Document ] The provided document.
|
|
87
|
-
#
|
|
88
|
-
# @since 2.1.0
|
|
89
|
-
def set(document)
|
|
90
|
-
if Mongoid.using_identity_map? && document && document.id
|
|
91
|
-
documents_for(document.class)[document.id] = document
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
# Set a document in the identity map for the provided selector.
|
|
96
|
-
#
|
|
97
|
-
# @example Set the document in the map.
|
|
98
|
-
# identity_map.set_selector(document, { :person_id => person.id })
|
|
99
|
-
#
|
|
100
|
-
# @param [ Document ] document The document to set.
|
|
101
|
-
# @param [ Hash ] selector The selector to identify it.
|
|
102
|
-
#
|
|
103
|
-
# @return [ Array<Document> ] The documents.
|
|
104
|
-
#
|
|
105
|
-
# @since 2.2.0
|
|
106
|
-
def set_many(document, selector)
|
|
107
|
-
(documents_for(document.class)[selector] ||= {})[document.id] = document
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
# Set a document in the identity map for the provided selector.
|
|
111
|
-
#
|
|
112
|
-
# @example Set the document in the map.
|
|
113
|
-
# identity_map.set_selector(document, { :person_id => person.id })
|
|
114
|
-
#
|
|
115
|
-
# @param [ Document ] document The document to set.
|
|
116
|
-
# @param [ Hash ] selector The selector to identify it.
|
|
117
|
-
#
|
|
118
|
-
# @return [ Document ] The matching document.
|
|
119
|
-
#
|
|
120
|
-
# @since 2.2.0
|
|
121
|
-
def set_one(document, selector)
|
|
122
|
-
documents_for(document.class)[selector] = document
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
private
|
|
126
|
-
|
|
127
|
-
# Get the documents in the identity map for a specific class.
|
|
128
|
-
#
|
|
129
|
-
# @example Get the documents for the class.
|
|
130
|
-
# map.documents_for(Person)
|
|
131
|
-
#
|
|
132
|
-
# @param [ Class ] klass The class to retrieve.
|
|
133
|
-
#
|
|
134
|
-
# @return [ Hash ] The documents.
|
|
135
|
-
#
|
|
136
|
-
# @since 2.1.0
|
|
137
|
-
def documents_for(klass)
|
|
138
|
-
if klass
|
|
139
|
-
self[klass.collection_name] ||= {}
|
|
140
|
-
end
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
class << self
|
|
144
|
-
|
|
145
|
-
# For ease of access we provide the same API to the identity map on the
|
|
146
|
-
# class level, which in turn just gets the identity map that is on the
|
|
147
|
-
# current thread.
|
|
148
|
-
#
|
|
149
|
-
# @example Get a document from the current identity map by id.
|
|
150
|
-
# IdentityMap.get(id)
|
|
151
|
-
#
|
|
152
|
-
# @example Set a document in the current identity map.
|
|
153
|
-
# IdentityMap.set(document)
|
|
154
|
-
#
|
|
155
|
-
# @since 2.1.0
|
|
156
|
-
delegate(*(
|
|
157
|
-
Hash.public_instance_methods(false) +
|
|
158
|
-
IdentityMap.public_instance_methods(false) <<
|
|
159
|
-
{ to: :"Mongoid::Threaded.identity_map" }
|
|
160
|
-
))
|
|
161
|
-
end
|
|
162
|
-
end
|
|
163
|
-
end
|
data/lib/mongoid/json.rb
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
# This module is for hooking in to +ActiveModel+s serialization to let
|
|
4
|
-
# configuring the ability to include the root in JSON happen from the Mongoid
|
|
5
|
-
# config.
|
|
6
|
-
module JSON
|
|
7
|
-
extend ActiveSupport::Concern
|
|
8
|
-
|
|
9
|
-
# We need to redefine where the JSON configuration is getting defined,
|
|
10
|
-
# similar to +ActiveRecord+.
|
|
11
|
-
included do
|
|
12
|
-
undef_method :include_root_in_json
|
|
13
|
-
delegate :include_root_in_json, to: ::Mongoid
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|