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
@@ -0,0 +1,46 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "mongoid/relations/eager/base"
|
3
|
+
require "mongoid/relations/eager/belongs_to"
|
4
|
+
require "mongoid/relations/eager/has_one"
|
5
|
+
require "mongoid/relations/eager/has_many"
|
6
|
+
require "mongoid/relations/eager/has_and_belongs_to_many"
|
7
|
+
|
8
|
+
module Mongoid
|
9
|
+
module Relations
|
10
|
+
module Eager
|
11
|
+
|
12
|
+
attr_accessor :eager_loaded
|
13
|
+
|
14
|
+
def with_eager_loading(document)
|
15
|
+
return nil unless document
|
16
|
+
doc = Factory.from_db(klass, document, criteria.options[:fields])
|
17
|
+
eager_load_one(doc)
|
18
|
+
doc
|
19
|
+
end
|
20
|
+
|
21
|
+
def eager_load_one(doc)
|
22
|
+
eager_load([doc])
|
23
|
+
end
|
24
|
+
|
25
|
+
def eager_loadable?(document = nil)
|
26
|
+
return false if criteria.inclusions.empty?
|
27
|
+
!eager_loaded
|
28
|
+
end
|
29
|
+
|
30
|
+
def eager_load(docs)
|
31
|
+
return false unless eager_loadable?
|
32
|
+
preload(criteria.inclusions, docs)
|
33
|
+
self.eager_loaded = true
|
34
|
+
end
|
35
|
+
|
36
|
+
def preload(relations, docs)
|
37
|
+
|
38
|
+
relations.group_by do |metadata|
|
39
|
+
metadata.relation
|
40
|
+
end.each do |relation, associations|
|
41
|
+
relation.eager_load_klass.new(associations, docs).run
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
|
+
module Eager
|
5
|
+
# Base class for eager load preload functions.
|
6
|
+
#
|
7
|
+
# @since 4.0.0
|
8
|
+
class Base
|
9
|
+
|
10
|
+
# Instantiate the eager load class.
|
11
|
+
#
|
12
|
+
# @example Create the new belongs to eager load preloader.
|
13
|
+
# BelongsTo.new(relations_metadata, parent_docs)
|
14
|
+
#
|
15
|
+
# @param [ Array<Metadata> ] Relations to eager load
|
16
|
+
# @param [ Array<Document> ] Documents to preload the relations
|
17
|
+
#
|
18
|
+
# @return [ Base ] The eager load preloader
|
19
|
+
#
|
20
|
+
# @since 4.0.0
|
21
|
+
def initialize(associations, docs)
|
22
|
+
@associations = associations
|
23
|
+
@docs = docs
|
24
|
+
@grouped_docs = {}
|
25
|
+
end
|
26
|
+
|
27
|
+
# Shift the current relation metadata
|
28
|
+
#
|
29
|
+
# @example Shift the current metadata.
|
30
|
+
# loader.shift_metadata
|
31
|
+
#
|
32
|
+
# @return [ Object ] The relation metadata object.
|
33
|
+
#
|
34
|
+
# @since 4.0.0
|
35
|
+
def shift_metadata
|
36
|
+
@metadata = @associations.shift
|
37
|
+
end
|
38
|
+
|
39
|
+
# Run the preloader.
|
40
|
+
#
|
41
|
+
# @example Preload the relations into the documents.
|
42
|
+
# loader.run
|
43
|
+
#
|
44
|
+
# @return [ Array ] The list of documents given.
|
45
|
+
#
|
46
|
+
# @since 4.0.0
|
47
|
+
def run
|
48
|
+
while shift_metadata
|
49
|
+
preload
|
50
|
+
end
|
51
|
+
@docs
|
52
|
+
end
|
53
|
+
|
54
|
+
# Preload the current relation.
|
55
|
+
#
|
56
|
+
# This method should be implemented in the subclass
|
57
|
+
#
|
58
|
+
# @example Preload the current relation into the documents.
|
59
|
+
# loader.preload
|
60
|
+
#
|
61
|
+
# @since 4.0.0
|
62
|
+
def preload
|
63
|
+
raise NotImplementedError
|
64
|
+
end
|
65
|
+
|
66
|
+
# Run the preloader.
|
67
|
+
#
|
68
|
+
# @example Iterate over the documents loadded for the current relation
|
69
|
+
# loader.each_loaded_document { |doc| }
|
70
|
+
#
|
71
|
+
# @since 4.0.0
|
72
|
+
def each_loaded_document
|
73
|
+
@metadata.klass.any_in(key => keys_from_docs).each do |doc|
|
74
|
+
yield doc
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Set the pre-loaded document into its parent.
|
79
|
+
#
|
80
|
+
# @example Set docs into parent with pk = "foo"
|
81
|
+
# loader.set_on_parent("foo", docs)
|
82
|
+
#
|
83
|
+
# @param [ ObjectId ] parent`s id
|
84
|
+
# @param [ Document, Array ] element to push into the parent
|
85
|
+
#
|
86
|
+
# @since 4.0.0
|
87
|
+
def set_on_parent(id, element)
|
88
|
+
grouped_docs[id].each do |d|
|
89
|
+
set_relation(d, element)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# Return a hash with the current documents grouped by key.
|
94
|
+
#
|
95
|
+
# @example Return a hash with the current documents grouped by key.
|
96
|
+
# loader.grouped_docs
|
97
|
+
#
|
98
|
+
# @return [ Hash ] hash with groupd documents.
|
99
|
+
#
|
100
|
+
# @since 4.0.0
|
101
|
+
def grouped_docs
|
102
|
+
@grouped_docs[@metadata.name] ||= @docs.group_by do |doc|
|
103
|
+
doc.send(group_by_key)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
# Group the documents and return the keys
|
108
|
+
#
|
109
|
+
# @example
|
110
|
+
# loader.keys_from_docs
|
111
|
+
#
|
112
|
+
# @return [ Array ] keys, ids
|
113
|
+
#
|
114
|
+
# @since 4.0.0
|
115
|
+
def keys_from_docs
|
116
|
+
grouped_docs.keys
|
117
|
+
end
|
118
|
+
|
119
|
+
# Return the key to group the current documents.
|
120
|
+
#
|
121
|
+
# This method should be implemented in the subclass
|
122
|
+
#
|
123
|
+
# @example Return the key for group
|
124
|
+
# loader.group_by_key
|
125
|
+
#
|
126
|
+
# @return [ Symbol ] Key to group by the current documents.
|
127
|
+
#
|
128
|
+
# @since 4.0.0
|
129
|
+
def group_by_key
|
130
|
+
raise NotImplementedError
|
131
|
+
end
|
132
|
+
|
133
|
+
protected
|
134
|
+
# Set the pre-loaded document into its parent.
|
135
|
+
#
|
136
|
+
# @example Set docs into parent using the current relation name.
|
137
|
+
# loader.set_relation(doc, docs)
|
138
|
+
#
|
139
|
+
# @param [ Document ] document
|
140
|
+
# @param [ Document, Array ] element to set into the parent
|
141
|
+
#
|
142
|
+
# @since 4.0.0
|
143
|
+
def set_relation(doc, element)
|
144
|
+
doc.set_relation(@metadata.name, element)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
|
+
module Eager
|
5
|
+
|
6
|
+
class BelongsTo < Base
|
7
|
+
|
8
|
+
def preload
|
9
|
+
raise Errors::EagerLoad.new(@metadata.name) if @metadata.polymorphic?
|
10
|
+
|
11
|
+
@docs.each do |d|
|
12
|
+
set_relation(d, nil)
|
13
|
+
end
|
14
|
+
|
15
|
+
each_loaded_document do |doc|
|
16
|
+
id = doc.send(key)
|
17
|
+
set_on_parent(id, doc)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def group_by_key
|
22
|
+
@metadata.foreign_key
|
23
|
+
end
|
24
|
+
|
25
|
+
def key
|
26
|
+
@metadata.primary_key
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
|
+
module Eager
|
5
|
+
|
6
|
+
class HasAndBelongsToMany < Base
|
7
|
+
|
8
|
+
def preload
|
9
|
+
@docs.each do |d|
|
10
|
+
set_relation(d, [])
|
11
|
+
end
|
12
|
+
|
13
|
+
entries = {}
|
14
|
+
each_loaded_document do |doc|
|
15
|
+
entries[doc.send(key)] = doc
|
16
|
+
end
|
17
|
+
|
18
|
+
@docs.each do |d|
|
19
|
+
keys = d.send(group_by_key)
|
20
|
+
docs = entries.values_at(*keys)
|
21
|
+
set_relation(d, docs)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def keys_from_docs
|
26
|
+
keys = Set.new
|
27
|
+
@docs.each do |d|
|
28
|
+
keys += d.send(group_by_key)
|
29
|
+
end
|
30
|
+
keys.to_a
|
31
|
+
end
|
32
|
+
|
33
|
+
def set_relation(doc, element)
|
34
|
+
doc.__build__(@metadata.name, element, @metadata)
|
35
|
+
end
|
36
|
+
|
37
|
+
def group_by_key
|
38
|
+
@metadata.foreign_key
|
39
|
+
end
|
40
|
+
|
41
|
+
def key
|
42
|
+
@metadata.primary_key
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
|
+
module Eager
|
5
|
+
|
6
|
+
class HasMany < Base
|
7
|
+
|
8
|
+
def preload
|
9
|
+
@docs.each do |d|
|
10
|
+
set_relation(d, [])
|
11
|
+
end
|
12
|
+
|
13
|
+
entries = Hash.new { |hash, key| hash[key] = [] }
|
14
|
+
each_loaded_document do |doc|
|
15
|
+
fk = doc.send(key)
|
16
|
+
entries[fk] << doc
|
17
|
+
end
|
18
|
+
|
19
|
+
entries.each do |id, docs|
|
20
|
+
set_on_parent(id, docs)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def set_relation(doc, element)
|
25
|
+
doc.__build__(@metadata.name, element, @metadata)
|
26
|
+
end
|
27
|
+
|
28
|
+
def group_by_key
|
29
|
+
@metadata.primary_key
|
30
|
+
end
|
31
|
+
|
32
|
+
def key
|
33
|
+
@metadata.foreign_key
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
|
+
module Eager
|
5
|
+
|
6
|
+
class HasOne < Base
|
7
|
+
|
8
|
+
def preload
|
9
|
+
@docs.each do |d|
|
10
|
+
set_relation(d, nil)
|
11
|
+
end
|
12
|
+
|
13
|
+
each_loaded_document do |doc|
|
14
|
+
id = doc.send(key)
|
15
|
+
set_on_parent(id, doc)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def group_by_key
|
20
|
+
@metadata.primary_key
|
21
|
+
end
|
22
|
+
|
23
|
+
def key
|
24
|
+
@metadata.foreign_key
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -6,7 +6,7 @@ module Mongoid
|
|
6
6
|
# Contains behaviour for executing operations in batch on embedded
|
7
7
|
# documents.
|
8
8
|
module Batchable
|
9
|
-
include
|
9
|
+
include Positional
|
10
10
|
|
11
11
|
# Insert new documents as a batch push ($pushAll). This ensures that
|
12
12
|
# all callbacks are run at the appropriate time and only 1 request is
|
@@ -198,9 +198,9 @@ module Mongoid
|
|
198
198
|
def normalize_docs(docs)
|
199
199
|
if docs.first.is_a?(::Hash)
|
200
200
|
docs.map do |doc|
|
201
|
-
attributes = {
|
201
|
+
attributes = { __metadata: __metadata, _parent: base }
|
202
202
|
attributes.merge!(doc)
|
203
|
-
Factory.build(klass, attributes
|
203
|
+
Factory.build(klass, attributes)
|
204
204
|
end
|
205
205
|
else
|
206
206
|
docs
|
@@ -296,7 +296,7 @@ module Mongoid
|
|
296
296
|
docs.map do |doc|
|
297
297
|
self.path = doc.atomic_path unless path
|
298
298
|
execute_callback :before_remove, doc
|
299
|
-
|
299
|
+
unless _assigning?
|
300
300
|
doc.cascade!
|
301
301
|
doc.run_before_callbacks(:destroy) if method == :destroy
|
302
302
|
end
|
@@ -346,7 +346,6 @@ module Mongoid
|
|
346
346
|
doc.run_after_callbacks(:destroy) if method == :destroy
|
347
347
|
doc.freeze
|
348
348
|
doc.destroyed = true
|
349
|
-
IdentityMap.remove(doc)
|
350
349
|
end
|
351
350
|
end
|
352
351
|
end
|
@@ -61,7 +61,7 @@ module Mongoid
|
|
61
61
|
#
|
62
62
|
# @since 2.0.0.rc.1
|
63
63
|
def binding
|
64
|
-
Bindings::Embedded::In.new(base, target,
|
64
|
+
Bindings::Embedded::In.new(base, target, __metadata)
|
65
65
|
end
|
66
66
|
|
67
67
|
# Characterize the document.
|
@@ -73,8 +73,8 @@ module Mongoid
|
|
73
73
|
#
|
74
74
|
# @since 2.1.0
|
75
75
|
def characterize_one(document)
|
76
|
-
unless base.
|
77
|
-
base.
|
76
|
+
unless base.__metadata
|
77
|
+
base.__metadata = __metadata.inverse_metadata(document)
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
@@ -209,7 +209,7 @@ module Mongoid
|
|
209
209
|
#
|
210
210
|
# @since 2.1.0
|
211
211
|
def valid_options
|
212
|
-
[ :autobuild, :cyclic, :polymorphic ]
|
212
|
+
[ :autobuild, :cyclic, :polymorphic, :touch ]
|
213
213
|
end
|
214
214
|
|
215
215
|
# Get the default validation setting for the relation. Determines if
|
@@ -71,7 +71,6 @@ module Mongoid
|
|
71
71
|
#
|
72
72
|
# @overload build(attributes = {}, options = {}, type = nil)
|
73
73
|
# @param [ Hash ] attributes The attributes to build the document with.
|
74
|
-
# @param [ Hash ] options The scoped assignment options.
|
75
74
|
# @param [ Class ] type Optional class to build the document with.
|
76
75
|
#
|
77
76
|
# @overload build(attributes = {}, type = nil)
|
@@ -79,11 +78,8 @@ module Mongoid
|
|
79
78
|
# @param [ Class ] type Optional class to build the document with.
|
80
79
|
#
|
81
80
|
# @return [ Document ] The new document.
|
82
|
-
def build(attributes = {},
|
83
|
-
|
84
|
-
options, type = {}, options
|
85
|
-
end
|
86
|
-
doc = Factory.build(type || metadata.klass, attributes, options)
|
81
|
+
def build(attributes = {}, type = nil)
|
82
|
+
doc = Factory.build(type || __metadata.klass, attributes)
|
87
83
|
append(doc)
|
88
84
|
doc.apply_post_processed_defaults
|
89
85
|
yield(doc) if block_given?
|
@@ -133,13 +129,9 @@ module Mongoid
|
|
133
129
|
execute_callback :before_remove, document
|
134
130
|
doc = target.delete_one(document)
|
135
131
|
if doc && !_binding?
|
136
|
-
_unscoped.delete_one(doc)
|
132
|
+
_unscoped.delete_one(doc)
|
137
133
|
if _assigning?
|
138
|
-
|
139
|
-
doc.destroy(suppress: true)
|
140
|
-
else
|
141
|
-
base.add_atomic_pull(doc)
|
142
|
-
end
|
134
|
+
base.add_atomic_pull(doc)
|
143
135
|
else
|
144
136
|
doc.delete(suppress: true)
|
145
137
|
unbind_one(doc)
|
@@ -150,18 +142,6 @@ module Mongoid
|
|
150
142
|
doc
|
151
143
|
end
|
152
144
|
|
153
|
-
# For use only with Mongoid::Paranoia - will be removed in 4.0.
|
154
|
-
#
|
155
|
-
# @example Get the deleted documents from the relation.
|
156
|
-
# person.paranoid_phones.deleted
|
157
|
-
#
|
158
|
-
# @return [ Criteria ] The deleted documents.
|
159
|
-
#
|
160
|
-
# @since 3.0.10
|
161
|
-
def deleted
|
162
|
-
unscoped.deleted
|
163
|
-
end
|
164
|
-
|
165
145
|
# Delete all the documents in the association without running callbacks.
|
166
146
|
#
|
167
147
|
# @example Delete all documents from the relation.
|
@@ -228,10 +208,10 @@ module Mongoid
|
|
228
208
|
# methods.
|
229
209
|
#
|
230
210
|
# @example Find a document by its id.
|
231
|
-
# person.addresses.find(
|
211
|
+
# person.addresses.find(BSON::ObjectId.new)
|
232
212
|
#
|
233
213
|
# @example Find documents for multiple ids.
|
234
|
-
# person.addresses.find([
|
214
|
+
# person.addresses.find([ BSON::ObjectId.new, BSON::ObjectId.new ])
|
235
215
|
#
|
236
216
|
# @param [ Array<Object> ] args Various arguments.
|
237
217
|
#
|
@@ -361,7 +341,7 @@ module Mongoid
|
|
361
341
|
#
|
362
342
|
# @since 2.0.0.rc.1
|
363
343
|
def binding
|
364
|
-
Bindings::Embedded::Many.new(base, target,
|
344
|
+
Bindings::Embedded::Many.new(base, target, __metadata)
|
365
345
|
end
|
366
346
|
|
367
347
|
# Returns the criteria object for the target class with its documents set
|
@@ -375,7 +355,9 @@ module Mongoid
|
|
375
355
|
criterion = klass.scoped
|
376
356
|
criterion.embedded = true
|
377
357
|
criterion.documents = target
|
378
|
-
|
358
|
+
criterion.parent_document = base
|
359
|
+
criterion.metadata = relation_metadata
|
360
|
+
Many.apply_ordering(criterion, __metadata)
|
379
361
|
end
|
380
362
|
|
381
363
|
# Deletes one document from the target and unscoped.
|
@@ -421,7 +403,7 @@ module Mongoid
|
|
421
403
|
def method_missing(name, *args, &block)
|
422
404
|
return super if target.respond_to?(name)
|
423
405
|
klass.send(:with_scope, criteria) do
|
424
|
-
criteria.
|
406
|
+
criteria.public_send(name, *args, &block)
|
425
407
|
end
|
426
408
|
end
|
427
409
|
|
@@ -463,8 +445,8 @@ module Mongoid
|
|
463
445
|
#
|
464
446
|
# @since 2.4.0
|
465
447
|
def scope(docs)
|
466
|
-
return docs unless
|
467
|
-
crit =
|
448
|
+
return docs unless __metadata.order || __metadata.klass.default_scoping?
|
449
|
+
crit = __metadata.klass.order_by(__metadata.order)
|
468
450
|
crit.embedded = true
|
469
451
|
crit.documents = docs
|
470
452
|
crit.entries
|
@@ -635,7 +617,7 @@ module Mongoid
|
|
635
617
|
# @since 2.1.0
|
636
618
|
def valid_options
|
637
619
|
[
|
638
|
-
:as, :cascade_callbacks, :cyclic, :order, :
|
620
|
+
:as, :cascade_callbacks, :cyclic, :order, :store_as,
|
639
621
|
:before_add, :after_add, :before_remove, :after_remove
|
640
622
|
]
|
641
623
|
end
|