mongoid 3.1.6 → 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 +432 -8
- 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 +63 -101
- 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 +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 +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/{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/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 +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/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/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/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 +315 -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 +78 -38
- data/spec/mongoid/contextual/atomic_spec.rb +68 -58
- 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 +578 -2295
- 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/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 +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} +9 -9
- 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 -335
- data/spec/spec_helper.rb +29 -13
- metadata +296 -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/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/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/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
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
require "mongoid/contextual/atomic"
|
|
3
3
|
require "mongoid/contextual/aggregable/mongo"
|
|
4
4
|
require "mongoid/contextual/command"
|
|
5
|
-
require "mongoid/contextual/eager"
|
|
6
5
|
require "mongoid/contextual/find_and_modify"
|
|
7
6
|
require "mongoid/contextual/geo_near"
|
|
8
7
|
require "mongoid/contextual/map_reduce"
|
|
8
|
+
require "mongoid/contextual/text_search"
|
|
9
|
+
require "mongoid/relations/eager"
|
|
9
10
|
|
|
10
11
|
module Mongoid
|
|
11
12
|
module Contextual
|
|
@@ -13,7 +14,7 @@ module Mongoid
|
|
|
13
14
|
include Enumerable
|
|
14
15
|
include Aggregable::Mongo
|
|
15
16
|
include Atomic
|
|
16
|
-
include Eager
|
|
17
|
+
include Relations::Eager
|
|
17
18
|
include Queryable
|
|
18
19
|
|
|
19
20
|
# @attribute [r] query The Moped query.
|
|
@@ -56,7 +57,7 @@ module Mongoid
|
|
|
56
57
|
return collection.find(criteria.and(_id: document.id).selector).count
|
|
57
58
|
end
|
|
58
59
|
return query.count(document) if document
|
|
59
|
-
|
|
60
|
+
try_cache(:count) { query.count }
|
|
60
61
|
end
|
|
61
62
|
|
|
62
63
|
# Delete all documents in the database that match the selector.
|
|
@@ -118,13 +119,11 @@ module Mongoid
|
|
|
118
119
|
# @since 3.0.0
|
|
119
120
|
def each(&block)
|
|
120
121
|
if block_given?
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
yield_document(doc, &block)
|
|
124
|
-
end
|
|
125
|
-
@cache_loaded = true
|
|
126
|
-
eager_loadable? ? docs : self
|
|
122
|
+
documents_for_iteration.each do |doc|
|
|
123
|
+
yield_document(doc, &block)
|
|
127
124
|
end
|
|
125
|
+
@cache_loaded = true
|
|
126
|
+
self
|
|
128
127
|
else
|
|
129
128
|
to_enum
|
|
130
129
|
end
|
|
@@ -143,7 +142,12 @@ module Mongoid
|
|
|
143
142
|
#
|
|
144
143
|
# @since 3.0.0
|
|
145
144
|
def exists?
|
|
146
|
-
|
|
145
|
+
return !documents.empty? if cached? && cache_loaded?
|
|
146
|
+
return @count > 0 if instance_variable_defined?(:@count)
|
|
147
|
+
|
|
148
|
+
try_cache(:exists) do
|
|
149
|
+
!!(query.dup.select(_id: 1).limit(1).first)
|
|
150
|
+
end
|
|
147
151
|
end
|
|
148
152
|
|
|
149
153
|
# Run an explain on the criteria.
|
|
@@ -189,9 +193,8 @@ module Mongoid
|
|
|
189
193
|
#
|
|
190
194
|
# @since 3.0.0
|
|
191
195
|
def first
|
|
192
|
-
if cached? && cache_loaded?
|
|
193
|
-
|
|
194
|
-
else
|
|
196
|
+
return documents.first if cached? && cache_loaded?
|
|
197
|
+
try_cache(:first) do
|
|
195
198
|
with_sorting do
|
|
196
199
|
with_eager_loading(query.first)
|
|
197
200
|
end
|
|
@@ -257,7 +260,7 @@ module Mongoid
|
|
|
257
260
|
# @since 3.0.0
|
|
258
261
|
def initialize(criteria)
|
|
259
262
|
@criteria, @klass, @cache = criteria, criteria.klass, criteria.options[:cache]
|
|
260
|
-
@collection = klass.collection
|
|
263
|
+
@collection = @klass.with(criteria.persistence_options || {}).collection
|
|
261
264
|
criteria.send(:merge_type_selection)
|
|
262
265
|
@query = collection.find(criteria.selector)
|
|
263
266
|
apply_options
|
|
@@ -274,8 +277,10 @@ module Mongoid
|
|
|
274
277
|
#
|
|
275
278
|
# @since 3.0.0
|
|
276
279
|
def last
|
|
277
|
-
|
|
278
|
-
|
|
280
|
+
try_cache(:last) do
|
|
281
|
+
with_inverse_sorting do
|
|
282
|
+
with_eager_loading(query.first)
|
|
283
|
+
end
|
|
279
284
|
end
|
|
280
285
|
end
|
|
281
286
|
|
|
@@ -330,14 +335,24 @@ module Mongoid
|
|
|
330
335
|
# @note This method will return the raw db values - it performs no custom
|
|
331
336
|
# serialization.
|
|
332
337
|
#
|
|
333
|
-
# @param [ String, Symbol ] field
|
|
338
|
+
# @param [ String, Symbol, Array ] field Fields to pluck.
|
|
334
339
|
#
|
|
335
|
-
# @return [ Array<Object> ] The plucked values.
|
|
340
|
+
# @return [ Array<Object, Array> ] The plucked values.
|
|
336
341
|
#
|
|
337
342
|
# @since 3.1.0
|
|
338
|
-
def pluck(
|
|
339
|
-
|
|
340
|
-
|
|
343
|
+
def pluck(*fields)
|
|
344
|
+
normalized_select = fields.inject({}) do |hash, f|
|
|
345
|
+
hash[klass.database_field_name(f)] = 1
|
|
346
|
+
hash
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
query.dup.select(normalized_select).map do |doc|
|
|
350
|
+
if normalized_select.size == 1
|
|
351
|
+
doc[normalized_select.keys.first]
|
|
352
|
+
else
|
|
353
|
+
normalized_select.keys.map { |n| doc[n] }.compact
|
|
354
|
+
end
|
|
355
|
+
end.compact
|
|
341
356
|
end
|
|
342
357
|
|
|
343
358
|
# Skips the provided number of documents.
|
|
@@ -376,6 +391,20 @@ module Mongoid
|
|
|
376
391
|
end
|
|
377
392
|
end
|
|
378
393
|
|
|
394
|
+
# Execute a text command against the database.
|
|
395
|
+
#
|
|
396
|
+
# @example Find documents with the text "phase"
|
|
397
|
+
# context.text_search("phase")
|
|
398
|
+
#
|
|
399
|
+
# @param [ String ] query The text search query.
|
|
400
|
+
#
|
|
401
|
+
# @return [ TextSearch ] The TextSearch command.
|
|
402
|
+
#
|
|
403
|
+
# @since 4.0.0
|
|
404
|
+
def text_search(query)
|
|
405
|
+
TextSearch.new(collection, criteria, query)
|
|
406
|
+
end
|
|
407
|
+
|
|
379
408
|
# Update the first matching document atomically.
|
|
380
409
|
#
|
|
381
410
|
# @example Update the first matching document.
|
|
@@ -393,7 +422,7 @@ module Mongoid
|
|
|
393
422
|
# Update all the matching documents atomically.
|
|
394
423
|
#
|
|
395
424
|
# @example Update all the matching documents.
|
|
396
|
-
# context.
|
|
425
|
+
# context.update_all({ "$set" => { name: "Smiths" }})
|
|
397
426
|
#
|
|
398
427
|
# @param [ Hash ] attributes The new attributes for each document.
|
|
399
428
|
#
|
|
@@ -406,21 +435,21 @@ module Mongoid
|
|
|
406
435
|
|
|
407
436
|
private
|
|
408
437
|
|
|
409
|
-
#
|
|
410
|
-
#
|
|
411
|
-
# @api private
|
|
438
|
+
# yield the block given or return the cached value
|
|
412
439
|
#
|
|
413
|
-
# @
|
|
414
|
-
# context.check_existence
|
|
440
|
+
# @param [ String, Symbol ] key The instance variable name
|
|
415
441
|
#
|
|
416
|
-
# @return
|
|
442
|
+
# @return the result of the block
|
|
417
443
|
#
|
|
418
|
-
# @since 3.1.
|
|
419
|
-
def
|
|
420
|
-
|
|
421
|
-
|
|
444
|
+
# @since 3.1.4
|
|
445
|
+
def try_cache(key, &block)
|
|
446
|
+
unless cached?
|
|
447
|
+
yield
|
|
422
448
|
else
|
|
423
|
-
|
|
449
|
+
unless ret = instance_variable_get("@#{key}")
|
|
450
|
+
instance_variable_set("@#{key}", ret = yield)
|
|
451
|
+
end
|
|
452
|
+
ret
|
|
424
453
|
end
|
|
425
454
|
end
|
|
426
455
|
|
|
@@ -593,7 +622,7 @@ module Mongoid
|
|
|
593
622
|
if cached? && !documents.empty?
|
|
594
623
|
documents
|
|
595
624
|
elsif eager_loadable?
|
|
596
|
-
docs = query.map{ |doc| Factory.from_db(klass, doc) }
|
|
625
|
+
docs = query.map{ |doc| Factory.from_db(klass, doc, criteria.options[:fields]) }
|
|
597
626
|
eager_load(docs)
|
|
598
627
|
docs
|
|
599
628
|
else
|
|
@@ -601,27 +630,6 @@ module Mongoid
|
|
|
601
630
|
end
|
|
602
631
|
end
|
|
603
632
|
|
|
604
|
-
# If we are limiting results, we need to set the field limitations on a
|
|
605
|
-
# thread local to avoid overriding the default values.
|
|
606
|
-
#
|
|
607
|
-
# @example Execute with selection.
|
|
608
|
-
# context.selecting do
|
|
609
|
-
# collection.find
|
|
610
|
-
# end
|
|
611
|
-
#
|
|
612
|
-
# @return [ Object ] The yielded value.
|
|
613
|
-
#
|
|
614
|
-
# @since 2.4.4
|
|
615
|
-
def selecting
|
|
616
|
-
begin
|
|
617
|
-
fields = criteria.options[:fields]
|
|
618
|
-
Threaded.set_selection(criteria.object_id, fields) unless fields.blank?
|
|
619
|
-
yield
|
|
620
|
-
ensure
|
|
621
|
-
Threaded.delete_selection(criteria.object_id)
|
|
622
|
-
end
|
|
623
|
-
end
|
|
624
|
-
|
|
625
633
|
# Yield to the document.
|
|
626
634
|
#
|
|
627
635
|
# @api private
|
|
@@ -636,7 +644,7 @@ module Mongoid
|
|
|
636
644
|
# @since 3.0.0
|
|
637
645
|
def yield_document(document, &block)
|
|
638
646
|
doc = document.respond_to?(:_id) ?
|
|
639
|
-
document : Factory.from_db(klass, document, criteria.
|
|
647
|
+
document : Factory.from_db(klass, document, criteria.options[:fields])
|
|
640
648
|
yield(doc)
|
|
641
649
|
documents.push(doc) if cacheable?
|
|
642
650
|
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Contextual
|
|
4
|
+
class None
|
|
5
|
+
include Enumerable
|
|
6
|
+
include Queryable
|
|
7
|
+
|
|
8
|
+
attr_reader :criteria, :klass
|
|
9
|
+
|
|
10
|
+
# Check if the context is equal to the other object.
|
|
11
|
+
#
|
|
12
|
+
# @example Check equality.
|
|
13
|
+
# context == []
|
|
14
|
+
#
|
|
15
|
+
# @param [ Array ] other The other array.
|
|
16
|
+
#
|
|
17
|
+
# @return [ true, false ] If the objects are equal.
|
|
18
|
+
#
|
|
19
|
+
# @since 4.0.0
|
|
20
|
+
def ==(other)
|
|
21
|
+
other.is_a?(None)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Iterate over the null context. There are no documents to iterate over
|
|
25
|
+
# in this case.
|
|
26
|
+
#
|
|
27
|
+
# @example Iterate over the context.
|
|
28
|
+
# context.each do |doc|
|
|
29
|
+
# puts doc.name
|
|
30
|
+
# end
|
|
31
|
+
#
|
|
32
|
+
# @return [ Enumerator ] The enumerator.
|
|
33
|
+
#
|
|
34
|
+
# @since 4.0.0
|
|
35
|
+
def each
|
|
36
|
+
if block_given?
|
|
37
|
+
[].each { |doc| yield(doc) }
|
|
38
|
+
self
|
|
39
|
+
else
|
|
40
|
+
to_enum
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Do any documents exist for the context.
|
|
45
|
+
#
|
|
46
|
+
# @example Do any documents exist for the context.
|
|
47
|
+
# context.exists?
|
|
48
|
+
#
|
|
49
|
+
# @return [ true, false ] If the count is more than zero.
|
|
50
|
+
#
|
|
51
|
+
# @since 4.0.0
|
|
52
|
+
def exists?; false; end
|
|
53
|
+
|
|
54
|
+
# Create the new null context.
|
|
55
|
+
#
|
|
56
|
+
# @example Create the new context.
|
|
57
|
+
# Null.new(criteria)
|
|
58
|
+
#
|
|
59
|
+
# @param [ Criteria ] The criteria.
|
|
60
|
+
#
|
|
61
|
+
# @since 4.0.0
|
|
62
|
+
def initialize(criteria)
|
|
63
|
+
@criteria, @klass = criteria, criteria.klass
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Always returns nil.
|
|
67
|
+
#
|
|
68
|
+
# @example Get the last document.
|
|
69
|
+
# context.last
|
|
70
|
+
#
|
|
71
|
+
# @return [ nil ] Always nil.
|
|
72
|
+
#
|
|
73
|
+
# @since 4.0.0
|
|
74
|
+
def last; nil; end
|
|
75
|
+
|
|
76
|
+
# Always returns zero.
|
|
77
|
+
#
|
|
78
|
+
# @example Get the length of matching documents.
|
|
79
|
+
# context.length
|
|
80
|
+
#
|
|
81
|
+
# @return [ Integer ] Always zero.
|
|
82
|
+
#
|
|
83
|
+
# @since 4.0.0
|
|
84
|
+
def length
|
|
85
|
+
entries.length
|
|
86
|
+
end
|
|
87
|
+
alias :size :length
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Contextual
|
|
4
|
+
|
|
5
|
+
# Wraps behaviour around a lazy text search command.
|
|
6
|
+
#
|
|
7
|
+
# @since 4.0.0
|
|
8
|
+
class TextSearch
|
|
9
|
+
include Enumerable
|
|
10
|
+
include Command
|
|
11
|
+
|
|
12
|
+
delegate :[], to: :results
|
|
13
|
+
delegate :==, :empty?, to: :entries
|
|
14
|
+
|
|
15
|
+
# Iterate over the results of the text search command.
|
|
16
|
+
#
|
|
17
|
+
# @example Iterate over the results.
|
|
18
|
+
# text_search.each do |doc|
|
|
19
|
+
# #...
|
|
20
|
+
# end
|
|
21
|
+
#
|
|
22
|
+
# @return [ Enumerator ] The enumerator.
|
|
23
|
+
#
|
|
24
|
+
# @since 4.0.0
|
|
25
|
+
def each
|
|
26
|
+
if block_given?
|
|
27
|
+
documents.each do |doc|
|
|
28
|
+
yield doc
|
|
29
|
+
end
|
|
30
|
+
else
|
|
31
|
+
to_enum
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Instantiate a new text search lazy proxy.
|
|
36
|
+
#
|
|
37
|
+
# @example Instantiate the text search.
|
|
38
|
+
# TextSearch.new(collection, criteria, "test")
|
|
39
|
+
#
|
|
40
|
+
# @param [ Moped::Collection ] collection The collection to execute on.
|
|
41
|
+
# @param [ Criteria ] criteria The criteria to filter results.
|
|
42
|
+
# @param [ String ] search_string The search string.
|
|
43
|
+
#
|
|
44
|
+
# @since 4.0.0
|
|
45
|
+
def initialize(collection, criteria, search_string)
|
|
46
|
+
@collection, @criteria = collection, criteria
|
|
47
|
+
command[:text] = collection.name.to_s
|
|
48
|
+
command[:search] = search_string
|
|
49
|
+
apply_criteria_options
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Inspect the text search object.
|
|
53
|
+
#
|
|
54
|
+
# @example Inspect the text search.
|
|
55
|
+
# text_search.inspect
|
|
56
|
+
#
|
|
57
|
+
# @return [ String ] The inspection.
|
|
58
|
+
#
|
|
59
|
+
# @since 4.0.0
|
|
60
|
+
def inspect
|
|
61
|
+
%Q{#<Mongoid::Contextual::TextSearch
|
|
62
|
+
selector: #{criteria.selector.inspect}
|
|
63
|
+
class: #{criteria.klass}
|
|
64
|
+
search: #{command[:search]}
|
|
65
|
+
filter: #{command[:filter] || "N/A"}
|
|
66
|
+
project: #{command[:project] || "N/A"}
|
|
67
|
+
limit: #{command[:limit] || "N/A"}
|
|
68
|
+
language: #{command[:language] || "default"}>
|
|
69
|
+
}
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Execute the text search command, and return the raw results (in hash
|
|
73
|
+
# form).
|
|
74
|
+
#
|
|
75
|
+
# @example Execute the command.
|
|
76
|
+
# text_search.execute
|
|
77
|
+
#
|
|
78
|
+
# @return [ Hash ] The raw results.
|
|
79
|
+
#
|
|
80
|
+
# @since 4.0.0
|
|
81
|
+
def execute
|
|
82
|
+
results
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Set the language of the text search.
|
|
86
|
+
#
|
|
87
|
+
# @example Set the text search language.
|
|
88
|
+
# text_search.language("deutsch")
|
|
89
|
+
#
|
|
90
|
+
# @param [ String ] value The name of the language.
|
|
91
|
+
#
|
|
92
|
+
# @return [ TextSearch ] The modified text search.
|
|
93
|
+
#
|
|
94
|
+
# @since 4.0.0
|
|
95
|
+
def language(value)
|
|
96
|
+
command[:language] = value
|
|
97
|
+
self
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Limits the fields returned by the text search for each document. By
|
|
101
|
+
# default, _id is always included.
|
|
102
|
+
#
|
|
103
|
+
# @example Limit the returned fields.
|
|
104
|
+
# text_search.project(name: 1, title: 1)
|
|
105
|
+
#
|
|
106
|
+
# @param [ Hash ] value The fields to project.
|
|
107
|
+
#
|
|
108
|
+
# @return [ TextSearch ] The modified text search.
|
|
109
|
+
#
|
|
110
|
+
# @since 4.0.0
|
|
111
|
+
def project(value)
|
|
112
|
+
command[:project] = value
|
|
113
|
+
self
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Get the raw statistics returned from the text search.
|
|
117
|
+
#
|
|
118
|
+
# @example Get the stats.
|
|
119
|
+
# text_search.stats
|
|
120
|
+
#
|
|
121
|
+
# @return [ Hash ] The raw statistics.
|
|
122
|
+
#
|
|
123
|
+
# @since 4.0.0
|
|
124
|
+
def stats
|
|
125
|
+
results["stats"]
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
private
|
|
129
|
+
|
|
130
|
+
# Apply the options from the criteria to the text search command.
|
|
131
|
+
#
|
|
132
|
+
# @api private
|
|
133
|
+
#
|
|
134
|
+
# @example Apply the criteria options, filter and limit only.
|
|
135
|
+
# text_search.apply_criteria_options
|
|
136
|
+
#
|
|
137
|
+
# @return [ nil ] Nothing.
|
|
138
|
+
#
|
|
139
|
+
# @since 4.0.0
|
|
140
|
+
def apply_criteria_options
|
|
141
|
+
command[:filter] = criteria.selector
|
|
142
|
+
if limit = criteria.options[:limit]
|
|
143
|
+
command[:limit] = limit
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Get the results of the text search as documents.
|
|
148
|
+
#
|
|
149
|
+
# @api private
|
|
150
|
+
#
|
|
151
|
+
# @example Get the results as documents.
|
|
152
|
+
# text_search.documents
|
|
153
|
+
#
|
|
154
|
+
# @return [ Array<Document> ] The documents.
|
|
155
|
+
#
|
|
156
|
+
# @since 4.0.0
|
|
157
|
+
def documents
|
|
158
|
+
results["results"].map do |attributes|
|
|
159
|
+
Factory.from_db(criteria.klass, attributes["obj"], command[:project])
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# Get the raw results.
|
|
164
|
+
#
|
|
165
|
+
# @api private
|
|
166
|
+
#
|
|
167
|
+
# @example Get the raw results.
|
|
168
|
+
# text_search.results
|
|
169
|
+
#
|
|
170
|
+
# @return [ Hash ] The raw results.
|
|
171
|
+
#
|
|
172
|
+
# @since 4.0.0
|
|
173
|
+
def results
|
|
174
|
+
@results ||= session.command(command)
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
data/lib/mongoid/contextual.rb
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
require "mongoid/contextual/queryable"
|
|
3
3
|
require "mongoid/contextual/mongo"
|
|
4
4
|
require "mongoid/contextual/memory"
|
|
5
|
+
require "mongoid/contextual/none"
|
|
5
6
|
|
|
6
7
|
module Mongoid
|
|
7
8
|
module Contextual
|
|
@@ -48,6 +49,7 @@ module Mongoid
|
|
|
48
49
|
#
|
|
49
50
|
# @since 3.0.0
|
|
50
51
|
def create_context
|
|
52
|
+
return None.new(self) if empty_and_chainable?
|
|
51
53
|
embedded ? Memory.new(self) : Mongo.new(self)
|
|
52
54
|
end
|
|
53
55
|
end
|
data/lib/mongoid/copyable.rb
CHANGED
|
@@ -6,7 +6,7 @@ module Mongoid
|
|
|
6
6
|
extend ActiveSupport::Concern
|
|
7
7
|
|
|
8
8
|
# Clone or dup the current +Document+. This will return all attributes with
|
|
9
|
-
# the exception of the document's id
|
|
9
|
+
# the exception of the document's id, and will reset all the
|
|
10
10
|
# instance variables.
|
|
11
11
|
#
|
|
12
12
|
# This clone also includes embedded documents.
|
|
@@ -22,7 +22,7 @@ module Mongoid
|
|
|
22
22
|
# _id and id field in the document would cause problems with Mongoid
|
|
23
23
|
# elsewhere.
|
|
24
24
|
attrs = clone_document.except("_id", "id")
|
|
25
|
-
self.class.new(attrs
|
|
25
|
+
self.class.new(attrs)
|
|
26
26
|
end
|
|
27
27
|
alias :dup :clone
|
|
28
28
|
|
|
@@ -40,7 +40,6 @@ module Mongoid
|
|
|
40
40
|
# @since 3.0.22
|
|
41
41
|
def clone_document
|
|
42
42
|
attrs = as_document.__deep_copy__
|
|
43
|
-
attrs["version"] = 1 if attrs.delete("versions")
|
|
44
43
|
process_localized_attributes(attrs)
|
|
45
44
|
attrs
|
|
46
45
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
module Mongoid
|
|
3
|
-
|
|
3
|
+
class Criteria
|
|
4
4
|
module Findable
|
|
5
5
|
|
|
6
6
|
# Execute the criteria or raise an error if no documents found.
|
|
@@ -16,7 +16,7 @@ module Mongoid
|
|
|
16
16
|
#
|
|
17
17
|
# @since 2.0.0
|
|
18
18
|
def execute_or_raise(ids, multi)
|
|
19
|
-
result =
|
|
19
|
+
result = multiple_from_db(ids)
|
|
20
20
|
check_for_missing_documents!(result, ids)
|
|
21
21
|
multi ? result : result.first
|
|
22
22
|
end
|
|
@@ -24,12 +24,12 @@ module Mongoid
|
|
|
24
24
|
# Find the matchind document(s) in the criteria for the provided ids.
|
|
25
25
|
#
|
|
26
26
|
# @example Find by an id.
|
|
27
|
-
# criteria.find(
|
|
27
|
+
# criteria.find(BSON::ObjectId.new)
|
|
28
28
|
#
|
|
29
29
|
# @example Find by multiple ids.
|
|
30
|
-
# criteria.find([
|
|
30
|
+
# criteria.find([ BSON::ObjectId.new, BSON::ObjectId.new ])
|
|
31
31
|
#
|
|
32
|
-
# @param [ Array<
|
|
32
|
+
# @param [ Array<BSON::ObjectId> ] args The ids to search for.
|
|
33
33
|
#
|
|
34
34
|
# @return [ Array<Document>, Document ] The matching document(s).
|
|
35
35
|
#
|
|
@@ -60,23 +60,6 @@ module Mongoid
|
|
|
60
60
|
end
|
|
61
61
|
end
|
|
62
62
|
|
|
63
|
-
# Get the document from the identity map, and if not found hit the
|
|
64
|
-
# database.
|
|
65
|
-
#
|
|
66
|
-
# @example Get the document from the map or criteria.
|
|
67
|
-
# criteria.from_map_or_db
|
|
68
|
-
#
|
|
69
|
-
# @return [ Document ] The found document.
|
|
70
|
-
#
|
|
71
|
-
# @since 2.2.1
|
|
72
|
-
def from_map_or_db
|
|
73
|
-
id = extract_id
|
|
74
|
-
id = klass.fields["_id"].mongoize(id) if id
|
|
75
|
-
doc = IdentityMap.get(klass, id || selector_with_type_selection)
|
|
76
|
-
return nil if doc == {}
|
|
77
|
-
doc && doc.matches?(selector) ? doc : first
|
|
78
|
-
end
|
|
79
|
-
|
|
80
63
|
# Get the documents from the identity map, and if not found hit the
|
|
81
64
|
# database.
|
|
82
65
|
#
|
|
@@ -86,11 +69,10 @@ module Mongoid
|
|
|
86
69
|
# @param [ ids ] The searched ids.
|
|
87
70
|
#
|
|
88
71
|
# @return [ Array<Document> ] The found documents.
|
|
89
|
-
def
|
|
72
|
+
def multiple_from_db(ids)
|
|
90
73
|
return entries if embedded?
|
|
91
74
|
ids = mongoize_ids(ids)
|
|
92
|
-
|
|
93
|
-
ids.empty? ? result : result + from_database(ids)
|
|
75
|
+
ids.empty? ? [] : from_database(ids)
|
|
94
76
|
end
|
|
95
77
|
|
|
96
78
|
private
|
|
@@ -125,28 +107,6 @@ module Mongoid
|
|
|
125
107
|
(ids.size > 1 ? any_in(id: ids) : where(id: ids.first)).entries
|
|
126
108
|
end
|
|
127
109
|
|
|
128
|
-
# Get documents from the identity map only.
|
|
129
|
-
#
|
|
130
|
-
# @api private
|
|
131
|
-
#
|
|
132
|
-
# @example Get documents from the identity map.
|
|
133
|
-
# criteria.from_identity_map(ids)
|
|
134
|
-
#
|
|
135
|
-
# @param [ Array<Object> ] ids The ids to fetch with.
|
|
136
|
-
#
|
|
137
|
-
# @return [ Array<Document> ] The matching documents.
|
|
138
|
-
#
|
|
139
|
-
# @since 3.0.0
|
|
140
|
-
def from_identity_map(ids)
|
|
141
|
-
result = []
|
|
142
|
-
selection = selector_with_type_selection
|
|
143
|
-
ids.reject! do |id|
|
|
144
|
-
doc = IdentityMap.get(klass, id)
|
|
145
|
-
doc && doc.matches?(selection) ? result.push(doc) : false
|
|
146
|
-
end
|
|
147
|
-
result
|
|
148
|
-
end
|
|
149
|
-
|
|
150
110
|
# Convert all the ids to their proper types.
|
|
151
111
|
#
|
|
152
112
|
# @api private
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
module Mongoid
|
|
3
|
-
|
|
3
|
+
class Criteria
|
|
4
4
|
module Marshalable
|
|
5
5
|
|
|
6
6
|
# Provides the data needed to Marshal.dump a criteria.
|
|
@@ -21,6 +21,8 @@ module Mongoid
|
|
|
21
21
|
# @example Load the criteria.
|
|
22
22
|
# Marshal.load(criteria)
|
|
23
23
|
#
|
|
24
|
+
# @param [ Array ] data The raw data.
|
|
25
|
+
#
|
|
24
26
|
# @since 3.0.15
|
|
25
27
|
def marshal_load(data)
|
|
26
28
|
@scoping_options, raw_selector, raw_options = data.pop(3)
|