mongoid 3.1.7 → 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 +470 -9
- data/README.md +10 -7
- data/lib/config/locales/en.yml +34 -20
- 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 +3 -14
- 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 -99
- data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
- data/lib/mongoid/composable.rb +105 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config.rb +3 -9
- data/lib/mongoid/contextual/aggregable/memory.rb +2 -2
- data/lib/mongoid/contextual/aggregable/mongo.rb +5 -9
- data/lib/mongoid/contextual/atomic.rb +53 -53
- data/lib/mongoid/contextual/geo_near.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +4 -2
- data/lib/mongoid/contextual/memory.rb +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/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 +39 -24
- 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 +15 -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} +35 -7
- data/lib/mongoid/indexable/specification.rb +104 -0
- data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
- data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
- data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
- data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
- data/lib/mongoid/log_subscriber.rb +55 -0
- data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/ne.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
- data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
- data/lib/mongoid/matchable.rb +152 -0
- data/lib/mongoid/persistable/creatable.rb +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/persistable.rb +216 -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/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/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/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 +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/relations.rb +11 -25
- 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/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/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 +26 -172
- data/lib/mongoid/timestamps/updated/short.rb +2 -2
- data/lib/mongoid/{hierarchy.rb → traversable.rb} +15 -7
- 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/{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 +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/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/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 +334 -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 +46 -38
- data/spec/mongoid/contextual/atomic_spec.rb +59 -55
- 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 +713 -2419
- 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/{matchers → matchable}/ne_spec.rb +3 -3
- data/spec/mongoid/matchable/nin_spec.rb +48 -0
- data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
- data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
- data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
- data/spec/mongoid/persistable/creatable_spec.rb +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} +9 -9
- 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 -350
- data/spec/spec_helper.rb +26 -15
- metadata +262 -247
- 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/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/nin_spec.rb +0 -25
- data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
- data/spec/mongoid/observer_spec.rb +0 -290
- data/spec/mongoid/paranoia_spec.rb +0 -759
- data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
- data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
- data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
- data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
- data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
- data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
- data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
- data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
- data/spec/mongoid/persistence/atomic_spec.rb +0 -216
- data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
- data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
- data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
- data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
- data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
- data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
- data/spec/mongoid/persistence/operations_spec.rb +0 -313
- data/spec/mongoid/persistence_spec.rb +0 -2279
- data/spec/mongoid/unit_of_work_spec.rb +0 -196
- data/spec/mongoid/versioning_spec.rb +0 -540
- data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
|
@@ -0,0 +1,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)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
module Mongoid
|
|
3
|
-
|
|
3
|
+
class Criteria
|
|
4
4
|
module Modifiable
|
|
5
5
|
|
|
6
6
|
# Build a document given the selector and return it.
|
|
@@ -68,6 +68,22 @@ module Mongoid
|
|
|
68
68
|
find_or(:create, attrs, &block)
|
|
69
69
|
end
|
|
70
70
|
|
|
71
|
+
# Find the first +Document+ given the conditions, or creates a new document
|
|
72
|
+
# with the conditions that were supplied. If validation fails an
|
|
73
|
+
# exception will be raised.
|
|
74
|
+
#
|
|
75
|
+
# @example Find or create the document.
|
|
76
|
+
# Person.find_or_create_by!(:attribute => "value")
|
|
77
|
+
#
|
|
78
|
+
# @param [ Hash ] attrs The attributes to check.
|
|
79
|
+
#
|
|
80
|
+
# @raise [ Errors::Validations ] on validation error.
|
|
81
|
+
#
|
|
82
|
+
# @return [ Document ] A matching or newly created document.
|
|
83
|
+
def find_or_create_by!(attrs = {}, &block)
|
|
84
|
+
find_or(:create!, attrs, &block)
|
|
85
|
+
end
|
|
86
|
+
|
|
71
87
|
# Find the first +Document+ given the conditions, or initializes a new document
|
|
72
88
|
# with the conditions that were supplied.
|
|
73
89
|
#
|
|
@@ -144,13 +160,17 @@ module Mongoid
|
|
|
144
160
|
#
|
|
145
161
|
# @since 3.0.0
|
|
146
162
|
def create_document(method, attrs = nil, &block)
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
163
|
+
attributes = selector.reduce(attrs || {}) do |hash, (key, value)|
|
|
164
|
+
unless key.to_s =~ /\$/ || value.is_a?(Hash)
|
|
165
|
+
hash[key] = value
|
|
166
|
+
end
|
|
167
|
+
hash
|
|
168
|
+
end
|
|
169
|
+
if embedded?
|
|
170
|
+
attributes[:_parent] = parent_document
|
|
171
|
+
attributes[:__metadata] = metadata
|
|
172
|
+
end
|
|
173
|
+
klass.__send__(method, attributes, &block)
|
|
154
174
|
end
|
|
155
175
|
|
|
156
176
|
# Find the first object or create/initialize it.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
class Criteria
|
|
4
|
+
module Permission
|
|
5
|
+
|
|
6
|
+
[:all,
|
|
7
|
+
:all_in,
|
|
8
|
+
:and,
|
|
9
|
+
:all_of,
|
|
10
|
+
:between,
|
|
11
|
+
:elem_match,
|
|
12
|
+
:exists,
|
|
13
|
+
:gt,
|
|
14
|
+
:gte,
|
|
15
|
+
:in,
|
|
16
|
+
:any_in,
|
|
17
|
+
:lt,
|
|
18
|
+
:lte,
|
|
19
|
+
:max_distance,
|
|
20
|
+
:mod,
|
|
21
|
+
:ne,
|
|
22
|
+
:excludes,
|
|
23
|
+
:near,
|
|
24
|
+
:near_sphere,
|
|
25
|
+
:nin,
|
|
26
|
+
:not_in,
|
|
27
|
+
:nor,
|
|
28
|
+
:negating?,
|
|
29
|
+
:not,
|
|
30
|
+
:or,
|
|
31
|
+
:any_of,
|
|
32
|
+
:with_size,
|
|
33
|
+
:with_type,
|
|
34
|
+
:where,
|
|
35
|
+
:within_box,
|
|
36
|
+
:within_circle,
|
|
37
|
+
:within_polygon,
|
|
38
|
+
:within_spherical_circle
|
|
39
|
+
].each do |method|
|
|
40
|
+
define_method(method) do |*criteria|
|
|
41
|
+
raise Errors::CriteriaNotPermitted.new(klass, method, criteria) unless should_permit?(criteria)
|
|
42
|
+
super(*criteria)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
# Ensure that the criteria are permitted.
|
|
49
|
+
#
|
|
50
|
+
# @example Ignoring ActionController::Parameters
|
|
51
|
+
# should_permit?({_id: ActionController::Parameters.new("$size" => 1)})
|
|
52
|
+
#
|
|
53
|
+
# @api private
|
|
54
|
+
#
|
|
55
|
+
# @param [ Object ] criteria
|
|
56
|
+
# @return [ Boolean ] if should permit
|
|
57
|
+
def should_permit?(criteria)
|
|
58
|
+
if criteria.respond_to?(:permitted?)
|
|
59
|
+
return criteria.permitted?
|
|
60
|
+
elsif criteria.respond_to?(:each)
|
|
61
|
+
criteria.each do |criterion|
|
|
62
|
+
return false unless should_permit?(criterion)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
true
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
data/lib/mongoid/criteria.rb
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
require "mongoid/
|
|
3
|
-
require "mongoid/
|
|
4
|
-
require "mongoid/
|
|
5
|
-
require "mongoid/
|
|
6
|
-
require "mongoid/
|
|
2
|
+
require "mongoid/criteria/findable"
|
|
3
|
+
require "mongoid/criteria/inspectable"
|
|
4
|
+
require "mongoid/criteria/marshalable"
|
|
5
|
+
require "mongoid/criteria/modifiable"
|
|
6
|
+
require "mongoid/criteria/scopable"
|
|
7
|
+
require "mongoid/sessions/options"
|
|
7
8
|
|
|
8
9
|
module Mongoid
|
|
9
10
|
|
|
@@ -17,11 +18,12 @@ module Mongoid
|
|
|
17
18
|
include Enumerable
|
|
18
19
|
include Contextual
|
|
19
20
|
include Origin::Queryable
|
|
20
|
-
include
|
|
21
|
-
include
|
|
22
|
-
include
|
|
23
|
-
include
|
|
24
|
-
include
|
|
21
|
+
include Findable
|
|
22
|
+
include Inspectable
|
|
23
|
+
include Marshalable
|
|
24
|
+
include Modifiable
|
|
25
|
+
include Scopable
|
|
26
|
+
include Sessions::Options
|
|
25
27
|
|
|
26
28
|
# Static array used to check with method missing - we only need to ever
|
|
27
29
|
# instantiate once.
|
|
@@ -29,7 +31,7 @@ module Mongoid
|
|
|
29
31
|
# @since 4.0.0
|
|
30
32
|
CHECK = []
|
|
31
33
|
|
|
32
|
-
attr_accessor :embedded, :klass
|
|
34
|
+
attr_accessor :embedded, :klass, :parent_document, :metadata
|
|
33
35
|
|
|
34
36
|
# Returns true if the supplied +Enumerable+ or +Criteria+ is equal to the results
|
|
35
37
|
# of this +Criteria+ or the criteria itself.
|
|
@@ -197,9 +199,6 @@ module Mongoid
|
|
|
197
199
|
# into the identity map who's ids match based on the extra query for the
|
|
198
200
|
# ids.
|
|
199
201
|
#
|
|
200
|
-
# @note This will only work if Mongoid's identity map is enabled. To do
|
|
201
|
-
# so set identity_map_enabled: true in your mongoid.yml
|
|
202
|
-
#
|
|
203
202
|
# @note This will work for embedded relations that reference another
|
|
204
203
|
# collection via belongs_to as well.
|
|
205
204
|
#
|
|
@@ -298,6 +297,31 @@ module Mongoid
|
|
|
298
297
|
self
|
|
299
298
|
end
|
|
300
299
|
|
|
300
|
+
# Returns a criteria that will always contain zero results and never hits
|
|
301
|
+
# the database.
|
|
302
|
+
#
|
|
303
|
+
# @example Return a none criteria.
|
|
304
|
+
# criteria.none
|
|
305
|
+
#
|
|
306
|
+
# @return [ Criteria ] The none criteria.
|
|
307
|
+
#
|
|
308
|
+
# @since 4.0.0
|
|
309
|
+
def none
|
|
310
|
+
@none = true and self
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
# Is the criteria an empty but chainable criteria?
|
|
314
|
+
#
|
|
315
|
+
# @example Is the criteria a none criteria?
|
|
316
|
+
# criteria.empty_and_chainable?
|
|
317
|
+
#
|
|
318
|
+
# @return [ true, false ] If the criteria is a none.
|
|
319
|
+
#
|
|
320
|
+
# @since 4.0.0
|
|
321
|
+
def empty_and_chainable?
|
|
322
|
+
!!@none
|
|
323
|
+
end
|
|
324
|
+
|
|
301
325
|
# Overriden to include _type in the fields.
|
|
302
326
|
#
|
|
303
327
|
# @example Limit the fields returned from the database.
|
|
@@ -396,25 +420,6 @@ module Mongoid
|
|
|
396
420
|
super
|
|
397
421
|
end
|
|
398
422
|
|
|
399
|
-
# Tell the next persistance operation to query from a specific collection,
|
|
400
|
-
# database or session.
|
|
401
|
-
#
|
|
402
|
-
# @example Send the criteria to another collection.
|
|
403
|
-
# Band.where(name: "Depeche Mode").with(collection: "artists")
|
|
404
|
-
#
|
|
405
|
-
# @param [ Hash ] options The storage options.
|
|
406
|
-
#
|
|
407
|
-
# @option options [ String, Symbol ] :collection The collection name.
|
|
408
|
-
# @option options [ String, Symbol ] :database The database name.
|
|
409
|
-
# @option options [ String, Symbol ] :session The session name.
|
|
410
|
-
#
|
|
411
|
-
# @return [ Criteria ] The criteria.
|
|
412
|
-
#
|
|
413
|
-
# @since 3.0.0
|
|
414
|
-
def with(options)
|
|
415
|
-
Threaded.set_persistence_options(klass, options)
|
|
416
|
-
self
|
|
417
|
-
end
|
|
418
423
|
|
|
419
424
|
# Get a version of this criteria without the options.
|
|
420
425
|
#
|
|
@@ -445,7 +450,7 @@ module Mongoid
|
|
|
445
450
|
#
|
|
446
451
|
# @since 3.1.0
|
|
447
452
|
def for_js(javascript, scope = {})
|
|
448
|
-
js_query(
|
|
453
|
+
js_query(BSON::CodeWithScope.new(javascript, scope))
|
|
449
454
|
end
|
|
450
455
|
|
|
451
456
|
private
|