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
@@ -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.
|
@@ -53,10 +54,10 @@ module Mongoid
|
|
53
54
|
def count(document = false, &block)
|
54
55
|
return super(&block) if block_given?
|
55
56
|
if document.is_a?(Document)
|
56
|
-
return collection.find(criteria.and(_id: document.
|
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
|
@@ -199,6 +202,16 @@ module Mongoid
|
|
199
202
|
end
|
200
203
|
alias :one :first
|
201
204
|
|
205
|
+
# Return the first result without applying sort
|
206
|
+
#
|
207
|
+
# @api private
|
208
|
+
#
|
209
|
+
# @since 4.0.2
|
210
|
+
def find_first
|
211
|
+
return documents.first if cached? && cache_loaded?
|
212
|
+
with_eager_loading(query.first)
|
213
|
+
end
|
214
|
+
|
202
215
|
# Execute a $geoNear command against the database.
|
203
216
|
#
|
204
217
|
# @example Find documents close to 10, 10.
|
@@ -257,7 +270,7 @@ module Mongoid
|
|
257
270
|
# @since 3.0.0
|
258
271
|
def initialize(criteria)
|
259
272
|
@criteria, @klass, @cache = criteria, criteria.klass, criteria.options[:cache]
|
260
|
-
@collection = klass.collection
|
273
|
+
@collection = @klass.with(criteria.persistence_options || {}).collection
|
261
274
|
criteria.send(:merge_type_selection)
|
262
275
|
@query = collection.find(criteria.selector)
|
263
276
|
apply_options
|
@@ -274,8 +287,10 @@ module Mongoid
|
|
274
287
|
#
|
275
288
|
# @since 3.0.0
|
276
289
|
def last
|
277
|
-
|
278
|
-
|
290
|
+
try_cache(:last) do
|
291
|
+
with_inverse_sorting do
|
292
|
+
with_eager_loading(query.first)
|
293
|
+
end
|
279
294
|
end
|
280
295
|
end
|
281
296
|
|
@@ -330,14 +345,24 @@ module Mongoid
|
|
330
345
|
# @note This method will return the raw db values - it performs no custom
|
331
346
|
# serialization.
|
332
347
|
#
|
333
|
-
# @param [ String, Symbol ] field
|
348
|
+
# @param [ String, Symbol, Array ] field Fields to pluck.
|
334
349
|
#
|
335
|
-
# @return [ Array<Object> ] The plucked values.
|
350
|
+
# @return [ Array<Object, Array> ] The plucked values.
|
336
351
|
#
|
337
352
|
# @since 3.1.0
|
338
|
-
def pluck(
|
339
|
-
|
340
|
-
|
353
|
+
def pluck(*fields)
|
354
|
+
normalized_select = fields.inject({}) do |hash, f|
|
355
|
+
hash[klass.database_field_name(f)] = 1
|
356
|
+
hash
|
357
|
+
end
|
358
|
+
|
359
|
+
query.dup.select(normalized_select).map do |doc|
|
360
|
+
if normalized_select.size == 1
|
361
|
+
doc[normalized_select.keys.first]
|
362
|
+
else
|
363
|
+
normalized_select.keys.map { |n| doc[n] }
|
364
|
+
end
|
365
|
+
end
|
341
366
|
end
|
342
367
|
|
343
368
|
# Skips the provided number of documents.
|
@@ -376,6 +401,20 @@ module Mongoid
|
|
376
401
|
end
|
377
402
|
end
|
378
403
|
|
404
|
+
# Execute a text command against the database.
|
405
|
+
#
|
406
|
+
# @example Find documents with the text "phase"
|
407
|
+
# context.text_search("phase")
|
408
|
+
#
|
409
|
+
# @param [ String ] query The text search query.
|
410
|
+
#
|
411
|
+
# @return [ TextSearch ] The TextSearch command.
|
412
|
+
#
|
413
|
+
# @since 4.0.0
|
414
|
+
def text_search(query)
|
415
|
+
TextSearch.new(collection, criteria, query)
|
416
|
+
end
|
417
|
+
|
379
418
|
# Update the first matching document atomically.
|
380
419
|
#
|
381
420
|
# @example Update the first matching document.
|
@@ -393,7 +432,7 @@ module Mongoid
|
|
393
432
|
# Update all the matching documents atomically.
|
394
433
|
#
|
395
434
|
# @example Update all the matching documents.
|
396
|
-
# context.
|
435
|
+
# context.update_all({ "$set" => { name: "Smiths" }})
|
397
436
|
#
|
398
437
|
# @param [ Hash ] attributes The new attributes for each document.
|
399
438
|
#
|
@@ -406,21 +445,21 @@ module Mongoid
|
|
406
445
|
|
407
446
|
private
|
408
447
|
|
409
|
-
#
|
410
|
-
#
|
411
|
-
# @api private
|
448
|
+
# yield the block given or return the cached value
|
412
449
|
#
|
413
|
-
# @
|
414
|
-
# context.check_existence
|
450
|
+
# @param [ String, Symbol ] key The instance variable name
|
415
451
|
#
|
416
|
-
# @return
|
452
|
+
# @return the result of the block
|
417
453
|
#
|
418
|
-
# @since 3.1.
|
419
|
-
def
|
420
|
-
|
421
|
-
|
454
|
+
# @since 3.1.4
|
455
|
+
def try_cache(key, &block)
|
456
|
+
unless cached?
|
457
|
+
yield
|
422
458
|
else
|
423
|
-
|
459
|
+
unless ret = instance_variable_get("@#{key}")
|
460
|
+
instance_variable_set("@#{key}", ret = yield)
|
461
|
+
end
|
462
|
+
ret
|
424
463
|
end
|
425
464
|
end
|
426
465
|
|
@@ -593,7 +632,7 @@ module Mongoid
|
|
593
632
|
if cached? && !documents.empty?
|
594
633
|
documents
|
595
634
|
elsif eager_loadable?
|
596
|
-
docs = query.map{ |doc| Factory.from_db(klass, doc) }
|
635
|
+
docs = query.map{ |doc| Factory.from_db(klass, doc, criteria.options[:fields]) }
|
597
636
|
eager_load(docs)
|
598
637
|
docs
|
599
638
|
else
|
@@ -601,27 +640,6 @@ module Mongoid
|
|
601
640
|
end
|
602
641
|
end
|
603
642
|
|
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
643
|
# Yield to the document.
|
626
644
|
#
|
627
645
|
# @api private
|
@@ -636,7 +654,7 @@ module Mongoid
|
|
636
654
|
# @since 3.0.0
|
637
655
|
def yield_document(document, &block)
|
638
656
|
doc = document.respond_to?(:_id) ?
|
639
|
-
document : Factory.from_db(klass, document, criteria.
|
657
|
+
document : Factory.from_db(klass, document, criteria.options[:fields])
|
640
658
|
yield(doc)
|
641
659
|
documents.push(doc) if cacheable?
|
642
660
|
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
|