mongoid 9.0.11 → 9.1.1
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 +8 -8
- data/README.md +5 -11
- data/Rakefile +35 -38
- data/lib/config/locales/en.yml +60 -0
- data/lib/mongoid/association/accessors.rb +27 -26
- data/lib/mongoid/association/bindable.rb +43 -45
- data/lib/mongoid/association/builders.rb +18 -15
- data/lib/mongoid/association/constrainable.rb +3 -5
- data/lib/mongoid/association/depending.rb +43 -43
- data/lib/mongoid/association/eager.rb +56 -13
- data/lib/mongoid/association/eager_load/discriminated_inclusion.rb +88 -0
- data/lib/mongoid/association/eager_load/embedded_distributor.rb +151 -0
- data/lib/mongoid/association/eager_load/inclusion.rb +173 -0
- data/lib/mongoid/association/eager_load/inclusion_tree.rb +96 -0
- data/lib/mongoid/association/eager_load/lookup_pipeline.rb +121 -0
- data/lib/mongoid/association/eager_load/polymorphic_preloader.rb +61 -0
- data/lib/mongoid/association/eager_load/polymorphic_targets.rb +151 -0
- data/lib/mongoid/association/eager_loadable.rb +108 -23
- data/lib/mongoid/association/embedded/batchable.rb +28 -30
- data/lib/mongoid/association/embedded/cyclic.rb +8 -11
- data/lib/mongoid/association/embedded/eager.rb +1 -6
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +6 -9
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -3
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -0
- data/lib/mongoid/association/embedded/embedded_in.rb +25 -22
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +0 -2
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +2 -3
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +7 -2
- data/lib/mongoid/association/embedded/embeds_many.rb +24 -21
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +0 -2
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +2 -6
- data/lib/mongoid/association/embedded/embeds_one.rb +21 -18
- data/lib/mongoid/association/embedded.rb +0 -1
- data/lib/mongoid/association/macros.rb +16 -8
- data/lib/mongoid/association/many.rb +75 -3
- data/lib/mongoid/association/marshalable.rb +0 -3
- data/lib/mongoid/association/nested/many.rb +52 -18
- data/lib/mongoid/association/nested/nested_buildable.rb +20 -9
- data/lib/mongoid/association/nested/one.rb +10 -8
- data/lib/mongoid/association/nested.rb +1 -3
- data/lib/mongoid/association/one.rb +0 -3
- data/lib/mongoid/association/options.rb +25 -7
- data/lib/mongoid/association/referenced/auto_save.rb +0 -2
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +11 -15
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +23 -5
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +7 -4
- data/lib/mongoid/association/referenced/belongs_to.rb +49 -43
- data/lib/mongoid/association/referenced/counter_cache.rb +7 -12
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +0 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +8 -4
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +0 -3
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +57 -47
- data/lib/mongoid/association/referenced/has_many/binding.rb +0 -2
- data/lib/mongoid/association/referenced/has_many/buildable.rb +11 -5
- data/lib/mongoid/association/referenced/has_many/eager.rb +0 -3
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +109 -38
- data/lib/mongoid/association/referenced/has_many/proxy.rb +110 -7
- data/lib/mongoid/association/referenced/has_many.rb +30 -24
- data/lib/mongoid/association/referenced/has_many_through/eager.rb +99 -0
- data/lib/mongoid/association/referenced/has_many_through/proxy.rb +68 -0
- data/lib/mongoid/association/referenced/has_many_through.rb +201 -0
- data/lib/mongoid/association/referenced/has_one/binding.rb +0 -2
- data/lib/mongoid/association/referenced/has_one/buildable.rb +11 -9
- data/lib/mongoid/association/referenced/has_one/eager.rb +0 -3
- data/lib/mongoid/association/referenced/has_one.rb +27 -21
- data/lib/mongoid/association/referenced/has_one_through/eager.rb +65 -0
- data/lib/mongoid/association/referenced/has_one_through/proxy.rb +30 -0
- data/lib/mongoid/association/referenced/has_one_through.rb +167 -0
- data/lib/mongoid/association/referenced/syncable.rb +30 -34
- data/lib/mongoid/association/referenced.rb +2 -1
- data/lib/mongoid/association/reflections.rb +0 -3
- data/lib/mongoid/association/relatable.rb +108 -65
- data/lib/mongoid/association.rb +19 -15
- data/lib/mongoid/atomic/modifiers.rb +65 -25
- data/lib/mongoid/atomic/paths/embedded/many.rb +4 -7
- data/lib/mongoid/atomic/paths/embedded/one.rb +2 -4
- data/lib/mongoid/atomic/paths/embedded.rb +3 -6
- data/lib/mongoid/atomic/paths/root.rb +1 -4
- data/lib/mongoid/atomic/paths.rb +2 -3
- data/lib/mongoid/atomic.rb +0 -3
- data/lib/mongoid/attributes/dynamic.rb +6 -7
- data/lib/mongoid/attributes/nested.rb +8 -10
- data/lib/mongoid/attributes/projector.rb +7 -20
- data/lib/mongoid/attributes/readonly.rb +6 -11
- data/lib/mongoid/attributes.rb +18 -34
- data/lib/mongoid/cacheable.rb +24 -6
- data/lib/mongoid/clients/factory.rb +13 -22
- data/lib/mongoid/clients/options.rb +2 -5
- data/lib/mongoid/clients/sessions.rb +50 -60
- data/lib/mongoid/clients/storage_options.rb +1 -4
- data/lib/mongoid/clients/validators/storage.rb +2 -3
- data/lib/mongoid/clients/validators.rb +1 -2
- data/lib/mongoid/clients.rb +8 -11
- data/lib/mongoid/collection_configurable.rb +18 -14
- data/lib/mongoid/composable.rb +30 -34
- data/lib/mongoid/config/defaults.rb +6 -4
- data/lib/mongoid/config/encryption.rb +36 -21
- data/lib/mongoid/config/environment.rb +7 -16
- data/lib/mongoid/config/introspection.rb +14 -16
- data/lib/mongoid/config/options.rb +16 -10
- data/lib/mongoid/config/validators/async_query_executor.rb +3 -6
- data/lib/mongoid/config/validators/client.rb +12 -15
- data/lib/mongoid/config/validators/option.rb +3 -5
- data/lib/mongoid/config/validators.rb +3 -4
- data/lib/mongoid/config.rb +188 -47
- data/lib/mongoid/contextual/aggregable/memory.rb +7 -5
- data/lib/mongoid/contextual/aggregable/mongo.rb +20 -22
- data/lib/mongoid/contextual/aggregable/none.rb +2 -4
- data/lib/mongoid/contextual/aggregable.rb +5 -7
- data/lib/mongoid/contextual/atomic.rb +20 -24
- data/lib/mongoid/contextual/command.rb +0 -3
- data/lib/mongoid/contextual/map_reduce.rb +12 -16
- data/lib/mongoid/contextual/memory.rb +87 -69
- data/lib/mongoid/contextual/mongo/documents_loader.rb +2 -3
- data/lib/mongoid/contextual/mongo.rb +169 -85
- data/lib/mongoid/contextual/none.rb +9 -9
- data/lib/mongoid/contextual/queryable.rb +1 -4
- data/lib/mongoid/contextual.rb +18 -7
- data/lib/mongoid/copyable.rb +7 -9
- data/lib/mongoid/criteria/findable.rb +5 -7
- data/lib/mongoid/criteria/includable.rb +67 -14
- data/lib/mongoid/criteria/inspectable.rb +2 -5
- data/lib/mongoid/criteria/marshalable.rb +4 -8
- data/lib/mongoid/criteria/modifiable.rb +3 -11
- data/lib/mongoid/criteria/options.rb +0 -3
- data/lib/mongoid/criteria/permission.rb +34 -37
- data/lib/mongoid/criteria/queryable/aggregable.rb +9 -10
- data/lib/mongoid/criteria/queryable/expandable.rb +4 -9
- data/lib/mongoid/criteria/queryable/extensions/array.rb +7 -10
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -5
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -4
- data/lib/mongoid/criteria/queryable/extensions/date.rb +2 -6
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +3 -7
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -4
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +20 -11
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +15 -11
- data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -8
- data/lib/mongoid/criteria/queryable/extensions/range.rb +6 -9
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -12
- data/lib/mongoid/criteria/queryable/extensions/set.rb +4 -6
- data/lib/mongoid/criteria/queryable/extensions/string.rb +5 -9
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -7
- data/lib/mongoid/criteria/queryable/extensions/time.rb +2 -6
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +2 -12
- data/lib/mongoid/criteria/queryable/extensions.rb +18 -21
- data/lib/mongoid/criteria/queryable/key.rb +12 -18
- data/lib/mongoid/criteria/queryable/macroable.rb +0 -3
- data/lib/mongoid/criteria/queryable/mergeable.rb +35 -39
- data/lib/mongoid/criteria/queryable/optional.rb +17 -18
- data/lib/mongoid/criteria/queryable/options.rb +20 -9
- data/lib/mongoid/criteria/queryable/pipeline.rb +6 -9
- data/lib/mongoid/criteria/queryable/selectable.rb +253 -199
- data/lib/mongoid/criteria/queryable/selector.rb +20 -29
- data/lib/mongoid/criteria/queryable/smash.rb +1 -6
- data/lib/mongoid/criteria/queryable/storable.rb +20 -39
- data/lib/mongoid/criteria/queryable.rb +25 -15
- data/lib/mongoid/criteria/scopable.rb +5 -11
- data/lib/mongoid/criteria/translator.rb +5 -8
- data/lib/mongoid/criteria.rb +109 -54
- data/lib/mongoid/deprecable.rb +45 -5
- data/lib/mongoid/deprecation.rb +2 -6
- data/lib/mongoid/document.rb +1 -1
- data/lib/mongoid/encryptable.rb +47 -2
- data/lib/mongoid/equality.rb +4 -5
- data/lib/mongoid/errors/ambiguous_relationship.rb +2 -5
- data/lib/mongoid/errors/attribute_not_loaded.rb +1 -4
- data/lib/mongoid/errors/callback.rb +1 -4
- data/lib/mongoid/errors/config_redactor.rb +43 -0
- data/lib/mongoid/errors/create_collection_failure.rb +8 -11
- data/lib/mongoid/errors/criteria_argument_required.rb +2 -5
- data/lib/mongoid/errors/delete_restriction.rb +1 -4
- data/lib/mongoid/errors/document_not_destroyed.rb +1 -4
- data/lib/mongoid/errors/document_not_found.rb +16 -21
- data/lib/mongoid/errors/drop_collection_failure.rb +7 -10
- data/lib/mongoid/errors/empty_config_file.rb +1 -4
- data/lib/mongoid/errors/immutable_attribute.rb +1 -4
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -4
- data/lib/mongoid/errors/in_memory_regexp_timeout.rb +26 -0
- data/lib/mongoid/errors/invalid_async_query_executor.rb +2 -5
- data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +2 -5
- data/lib/mongoid/errors/invalid_collection.rb +1 -3
- data/lib/mongoid/errors/invalid_config_file.rb +1 -4
- data/lib/mongoid/errors/invalid_config_option.rb +2 -5
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +6 -10
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +2 -4
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +1 -4
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +5 -9
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +1 -4
- data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +1 -4
- data/lib/mongoid/errors/invalid_expression_operator.rb +3 -7
- data/lib/mongoid/errors/invalid_field.rb +2 -5
- data/lib/mongoid/errors/invalid_field_operator.rb +5 -9
- data/lib/mongoid/errors/invalid_field_option.rb +2 -5
- data/lib/mongoid/errors/invalid_field_type.rb +1 -4
- data/lib/mongoid/errors/invalid_find.rb +1 -4
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +1 -4
- data/lib/mongoid/errors/invalid_includes.rb +3 -6
- data/lib/mongoid/errors/invalid_index.rb +1 -4
- data/lib/mongoid/errors/invalid_options.rb +1 -4
- data/lib/mongoid/errors/invalid_path.rb +1 -4
- data/lib/mongoid/errors/invalid_persistence_option.rb +4 -7
- data/lib/mongoid/errors/invalid_query.rb +6 -11
- data/lib/mongoid/errors/invalid_relation.rb +10 -13
- data/lib/mongoid/errors/invalid_relation_option.rb +4 -7
- data/lib/mongoid/errors/invalid_scope.rb +1 -4
- data/lib/mongoid/errors/invalid_session_nesting.rb +0 -3
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +2 -4
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -4
- data/lib/mongoid/errors/invalid_time.rb +1 -4
- data/lib/mongoid/errors/invalid_transaction_nesting.rb +0 -3
- data/lib/mongoid/errors/inverse_not_found.rb +1 -4
- data/lib/mongoid/errors/mixed_client_configuration.rb +2 -5
- data/lib/mongoid/errors/mixed_relations.rb +1 -3
- data/lib/mongoid/errors/mongoid_error.rb +7 -11
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -4
- data/lib/mongoid/errors/no_client_config.rb +1 -4
- data/lib/mongoid/errors/no_client_database.rb +2 -5
- data/lib/mongoid/errors/no_client_hosts.rb +2 -5
- data/lib/mongoid/errors/no_clients_config.rb +1 -4
- data/lib/mongoid/errors/no_default_client.rb +1 -4
- data/lib/mongoid/errors/no_encryption_schema.rb +28 -0
- data/lib/mongoid/errors/no_environment.rb +1 -4
- data/lib/mongoid/errors/no_map_reduce_output.rb +1 -4
- data/lib/mongoid/errors/no_metadata.rb +1 -4
- data/lib/mongoid/errors/no_parent.rb +1 -4
- data/lib/mongoid/errors/readonly_association.rb +29 -0
- data/lib/mongoid/errors/readonly_attribute.rb +1 -4
- data/lib/mongoid/errors/readonly_document.rb +1 -4
- data/lib/mongoid/errors/rollback.rb +0 -2
- data/lib/mongoid/errors/scope_overwrite.rb +2 -4
- data/lib/mongoid/errors/sessions_not_supported.rb +0 -3
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -3
- data/lib/mongoid/errors/transaction_error.rb +0 -3
- data/lib/mongoid/errors/transactions_not_supported.rb +0 -3
- data/lib/mongoid/errors/unknown_attribute.rb +1 -4
- data/lib/mongoid/errors/unknown_model.rb +1 -4
- data/lib/mongoid/errors/unregistered_class.rb +1 -1
- data/lib/mongoid/errors/unsaved_document.rb +1 -3
- data/lib/mongoid/errors/unsupported_isolation_level.rb +22 -0
- data/lib/mongoid/errors/unsupported_javascript.rb +1 -4
- data/lib/mongoid/errors/validations.rb +3 -5
- data/lib/mongoid/errors.rb +76 -72
- data/lib/mongoid/evolvable.rb +0 -3
- data/lib/mongoid/extensions/array.rb +5 -7
- data/lib/mongoid/extensions/big_decimal.rb +6 -7
- data/lib/mongoid/extensions/binary.rb +3 -6
- data/lib/mongoid/extensions/boolean.rb +4 -7
- data/lib/mongoid/extensions/bson_document.rb +28 -0
- data/lib/mongoid/extensions/date.rb +10 -14
- data/lib/mongoid/extensions/date_time.rb +2 -6
- data/lib/mongoid/extensions/decimal128.rb +1 -5
- data/lib/mongoid/extensions/false_class.rb +3 -5
- data/lib/mongoid/extensions/float.rb +5 -10
- data/lib/mongoid/extensions/hash.rb +5 -10
- data/lib/mongoid/extensions/integer.rb +5 -10
- data/lib/mongoid/extensions/module.rb +1 -4
- data/lib/mongoid/extensions/nil_class.rb +0 -1
- data/lib/mongoid/extensions/object.rb +9 -14
- data/lib/mongoid/extensions/object_id.rb +2 -6
- data/lib/mongoid/extensions/range.rb +14 -15
- data/lib/mongoid/extensions/raw_value.rb +0 -3
- data/lib/mongoid/extensions/regexp.rb +3 -6
- data/lib/mongoid/extensions/set.rb +3 -4
- data/lib/mongoid/extensions/string.rb +8 -12
- data/lib/mongoid/extensions/symbol.rb +3 -7
- data/lib/mongoid/extensions/time.rb +24 -26
- data/lib/mongoid/extensions/time_with_zone.rb +4 -7
- data/lib/mongoid/extensions/true_class.rb +3 -5
- data/lib/mongoid/extensions/vector.rb +64 -0
- data/lib/mongoid/extensions.rb +27 -26
- data/lib/mongoid/factory.rb +5 -9
- data/lib/mongoid/field_readable.rb +69 -0
- data/lib/mongoid/fields/encrypted.rb +0 -1
- data/lib/mongoid/fields/foreign_key.rb +9 -10
- data/lib/mongoid/fields/localized.rb +12 -12
- data/lib/mongoid/fields/standard.rb +5 -7
- data/lib/mongoid/fields/validators/macro.rb +23 -34
- data/lib/mongoid/fields/validators.rb +1 -2
- data/lib/mongoid/fields.rb +151 -58
- data/lib/mongoid/findable.rb +82 -53
- data/lib/mongoid/indexable/specification.rb +20 -6
- data/lib/mongoid/indexable/validators/options.rb +33 -40
- data/lib/mongoid/indexable.rb +53 -40
- data/lib/mongoid/inspectable.rb +4 -7
- data/lib/mongoid/interceptable.rb +41 -40
- data/lib/mongoid/loadable.rb +17 -18
- data/lib/mongoid/loggable.rb +4 -8
- data/lib/mongoid/matchable.rb +6 -3
- data/lib/mongoid/matcher/all.rb +2 -5
- data/lib/mongoid/matcher/and.rb +0 -3
- data/lib/mongoid/matcher/bits.rb +13 -8
- data/lib/mongoid/matcher/bits_all_clear.rb +1 -3
- data/lib/mongoid/matcher/bits_all_set.rb +1 -3
- data/lib/mongoid/matcher/bits_any_clear.rb +1 -3
- data/lib/mongoid/matcher/bits_any_set.rb +1 -3
- data/lib/mongoid/matcher/elem_match.rb +13 -15
- data/lib/mongoid/matcher/elem_match_expression.rb +0 -3
- data/lib/mongoid/matcher/eq.rb +0 -3
- data/lib/mongoid/matcher/eq_impl.rb +12 -17
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +4 -9
- data/lib/mongoid/matcher/exists.rb +1 -4
- data/lib/mongoid/matcher/expression.rb +5 -10
- data/lib/mongoid/matcher/expression_operator.rb +1 -3
- data/lib/mongoid/matcher/field_expression.rb +10 -13
- data/lib/mongoid/matcher/field_operator.rb +4 -6
- data/lib/mongoid/matcher/gt.rb +0 -3
- data/lib/mongoid/matcher/gte.rb +0 -3
- data/lib/mongoid/matcher/in.rb +9 -12
- data/lib/mongoid/matcher/lt.rb +0 -3
- data/lib/mongoid/matcher/lte.rb +0 -3
- data/lib/mongoid/matcher/mod.rb +4 -8
- data/lib/mongoid/matcher/ne.rb +0 -3
- data/lib/mongoid/matcher/nin.rb +0 -3
- data/lib/mongoid/matcher/nor.rb +1 -6
- data/lib/mongoid/matcher/not.rb +0 -3
- data/lib/mongoid/matcher/or.rb +0 -3
- data/lib/mongoid/matcher/regex.rb +9 -13
- data/lib/mongoid/matcher/regexp_budget.rb +372 -0
- data/lib/mongoid/matcher/size.rb +2 -5
- data/lib/mongoid/matcher/type.rb +32 -37
- data/lib/mongoid/matcher.rb +8 -15
- data/lib/mongoid/model_resolver.rb +1 -0
- data/lib/mongoid/persistable/creatable.rb +23 -7
- data/lib/mongoid/persistable/deletable.rb +6 -7
- data/lib/mongoid/persistable/destroyable.rb +2 -6
- data/lib/mongoid/persistable/incrementable.rb +1 -3
- data/lib/mongoid/persistable/logical.rb +3 -5
- data/lib/mongoid/persistable/maxable.rb +2 -4
- data/lib/mongoid/persistable/minable.rb +2 -4
- data/lib/mongoid/persistable/multipliable.rb +1 -3
- data/lib/mongoid/persistable/poppable.rb +2 -4
- data/lib/mongoid/persistable/pullable.rb +3 -5
- data/lib/mongoid/persistable/pushable.rb +5 -7
- data/lib/mongoid/persistable/renamable.rb +1 -3
- data/lib/mongoid/persistable/savable.rb +0 -3
- data/lib/mongoid/persistable/settable.rb +4 -13
- data/lib/mongoid/persistable/unsettable.rb +1 -3
- data/lib/mongoid/persistable/updatable.rb +23 -33
- data/lib/mongoid/persistable/upsertable.rb +8 -10
- data/lib/mongoid/persistable.rb +28 -27
- data/lib/mongoid/persistence_context.rb +69 -41
- data/lib/mongoid/pluckable.rb +0 -2
- data/lib/mongoid/positional.rb +5 -11
- data/lib/mongoid/railtie.rb +16 -22
- data/lib/mongoid/railties/console_sandbox.rb +6 -8
- data/lib/mongoid/railties/controller_runtime.rb +7 -11
- data/lib/mongoid/railties/database.rake +42 -44
- data/lib/mongoid/scopable.rb +23 -31
- data/lib/mongoid/search_indexable.rb +378 -7
- data/lib/mongoid/selectable.rb +1 -3
- data/lib/mongoid/serializable.rb +18 -12
- data/lib/mongoid/shardable.rb +8 -17
- data/lib/mongoid/stateful.rb +5 -10
- data/lib/mongoid/stringified_symbol.rb +5 -9
- data/lib/mongoid/tasks/database.rake +31 -32
- data/lib/mongoid/tasks/database.rb +51 -39
- data/lib/mongoid/tasks/encryption.rb +10 -15
- data/lib/mongoid/threaded/lifecycle.rb +6 -9
- data/lib/mongoid/threaded.rb +168 -32
- data/lib/mongoid/timestamps/created/short.rb +2 -3
- data/lib/mongoid/timestamps/created.rb +1 -2
- data/lib/mongoid/timestamps/short.rb +0 -1
- data/lib/mongoid/timestamps/timeless.rb +92 -23
- data/lib/mongoid/timestamps/updated/short.rb +2 -3
- data/lib/mongoid/timestamps/updated.rb +2 -5
- data/lib/mongoid/timestamps.rb +4 -6
- data/lib/mongoid/touchable.rb +19 -11
- data/lib/mongoid/traversable.rb +5 -4
- data/lib/mongoid/validatable/associated.rb +19 -7
- data/lib/mongoid/validatable/format.rb +0 -2
- data/lib/mongoid/validatable/length.rb +0 -2
- data/lib/mongoid/validatable/localizable.rb +0 -3
- data/lib/mongoid/validatable/macros.rb +0 -2
- data/lib/mongoid/validatable/numericality.rb +24 -3
- data/lib/mongoid/validatable/presence.rb +8 -10
- data/lib/mongoid/validatable/queryable.rb +0 -3
- data/lib/mongoid/validatable/uniqueness.rb +12 -14
- data/lib/mongoid/validatable.rb +15 -20
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +10 -11
- data/lib/mongoid.rb +30 -34
- data/lib/rails/generators/mongoid/config/config_generator.rb +2 -4
- data/lib/rails/generators/mongoid/config/templates/mongoid.rb +4 -5
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +2 -2
- data/lib/rails/generators/mongoid/model/model_generator.rb +5 -8
- data/lib/rails/generators/mongoid_generator.rb +6 -10
- data/lib/rails/mongoid.rb +1 -3
- data/spec/integration/active_job_spec.rb +1 -2
- data/spec/integration/app_spec.rb +149 -179
- data/spec/integration/associations/belongs_to_spec.rb +43 -28
- data/spec/integration/associations/embedded_dirty_spec.rb +0 -1
- data/spec/integration/associations/embedded_spec.rb +41 -43
- data/spec/integration/associations/embeds_many_spec.rb +46 -29
- data/spec/integration/associations/embeds_one_spec.rb +2 -1
- data/spec/integration/associations/foreign_key_spec.rb +10 -11
- data/spec/integration/associations/foreign_key_spec_models.rb +8 -9
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +33 -15
- data/spec/integration/associations/has_many_spec.rb +17 -18
- data/spec/integration/associations/has_one_spec.rb +42 -45
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +36 -39
- data/spec/integration/associations/reverse_population_spec.rb +4 -5
- data/spec/integration/associations/reverse_population_spec_models.rb +0 -1
- data/spec/integration/associations/scope_option_spec.rb +18 -20
- data/spec/integration/atomic/modifiers_spec.rb +72 -52
- data/spec/integration/bson_regexp_raw_spec.rb +2 -3
- data/spec/integration/caching_spec.rb +68 -0
- data/spec/integration/callbacks_models.rb +11 -9
- data/spec/integration/callbacks_spec.rb +78 -80
- data/spec/integration/contextual/empty_spec.rb +19 -20
- data/spec/integration/criteria/alias_query_spec.rb +12 -19
- data/spec/integration/criteria/date_field_spec.rb +1 -2
- data/spec/integration/criteria/default_scope_spec.rb +23 -18
- data/spec/integration/criteria/logical_spec.rb +18 -19
- data/spec/integration/criteria/range_spec.rb +77 -86
- data/spec/integration/criteria/raw_value_spec.rb +122 -109
- data/spec/integration/criteria/time_with_zone_spec.rb +33 -24
- data/spec/integration/discriminator_key_spec.rb +85 -85
- data/spec/integration/discriminator_value_spec.rb +70 -73
- data/spec/integration/document_spec.rb +9 -10
- data/spec/integration/dots_and_dollars_spec.rb +115 -120
- data/spec/integration/encryption_spec.rb +157 -9
- data/spec/integration/i18n_fallbacks_spec.rb +7 -8
- data/spec/integration/isolation_state_spec.rb +241 -0
- data/spec/integration/matcher_examples_spec.rb +145 -168
- data/spec/integration/matcher_operator_data/in.yml +6 -6
- data/spec/integration/matcher_operator_data/regex.yml +21 -0
- data/spec/integration/matcher_operator_spec.rb +16 -26
- data/spec/integration/matcher_regexp_timeout_spec.rb +215 -0
- data/spec/integration/matcher_spec.rb +31 -32
- data/spec/integration/persistence/collection_options_spec.rb +0 -2
- data/spec/integration/persistence/range_field_spec.rb +24 -2
- data/spec/integration/query_operator_guard_spec.rb +89 -0
- data/spec/integration/server_query_spec.rb +43 -37
- data/spec/integration/shardable_spec.rb +10 -11
- data/spec/integration/stringified_symbol_field_spec.rb +28 -43
- data/spec/lite_spec_helper.rb +11 -12
- data/spec/mongoid/association/accessors_spec.rb +197 -285
- data/spec/mongoid/association/auto_save_spec.rb +62 -93
- data/spec/mongoid/association/builders_spec.rb +121 -74
- data/spec/mongoid/association/constrainable_spec.rb +9 -22
- data/spec/mongoid/association/counter_cache_spec.rb +71 -104
- data/spec/mongoid/association/depending_spec.rb +166 -208
- data/spec/mongoid/association/eager_loadable_spec.rb +47 -0
- data/spec/mongoid/association/eager_spec.rb +416 -80
- data/spec/mongoid/association/embedded/cyclic_spec.rb +36 -48
- data/spec/mongoid/association/embedded/dirty_spec.rb +15 -20
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +36 -54
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +8 -15
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +135 -175
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +25 -127
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +9 -14
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +38 -51
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +1184 -1340
- data/spec/mongoid/association/embedded/embeds_many_models.rb +17 -17
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +11 -11
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +25 -138
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +15 -23
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +18 -26
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +204 -273
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_one_models.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +5 -6
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -143
- data/spec/mongoid/association/fallback_spec.rb +425 -0
- data/spec/mongoid/association/macros_spec.rb +239 -300
- data/spec/mongoid/association/nested/many_spec.rb +51 -73
- data/spec/mongoid/association/nested/one_spec.rb +56 -80
- data/spec/mongoid/association/options_spec.rb +187 -310
- data/spec/mongoid/association/polymorphic_spec.rb +35 -53
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +55 -76
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +36 -41
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +98 -101
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +258 -345
- data/spec/mongoid/association/referenced/belongs_to_models.rb +4 -3
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +3 -4
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +91 -294
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +42 -56
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +41 -32
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +36 -42
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +8 -9
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +819 -975
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +9 -9
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +5 -6
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +109 -177
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +29 -43
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +53 -53
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +137 -67
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +431 -675
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -2
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +318 -11
- data/spec/mongoid/association/referenced/has_many_models.rb +1 -2
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +3 -4
- data/spec/mongoid/association/referenced/has_many_spec.rb +44 -188
- data/spec/mongoid/association/referenced/has_many_through/eager_spec.rb +58 -0
- data/spec/mongoid/association/referenced/has_many_through/proxy_spec.rb +62 -0
- data/spec/mongoid/association/referenced/has_many_through_spec.rb +399 -0
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +26 -38
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +28 -29
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +29 -42
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +270 -332
- data/spec/mongoid/association/referenced/has_one_models.rb +1 -2
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +3 -4
- data/spec/mongoid/association/referenced/has_one_spec.rb +40 -188
- data/spec/mongoid/association/referenced/has_one_through/eager_spec.rb +58 -0
- data/spec/mongoid/association/referenced/has_one_through/proxy_spec.rb +49 -0
- data/spec/mongoid/association/referenced/has_one_through_spec.rb +211 -0
- data/spec/mongoid/association/reflections_spec.rb +14 -24
- data/spec/mongoid/association/syncable_spec.rb +102 -125
- data/spec/mongoid/association_spec.rb +47 -70
- data/spec/mongoid/atomic/modifiers_spec.rb +184 -197
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +39 -52
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +35 -49
- data/spec/mongoid/atomic/paths/root_spec.rb +9 -15
- data/spec/mongoid/atomic/paths_spec.rb +81 -117
- data/spec/mongoid/atomic_spec.rb +156 -171
- data/spec/mongoid/attributes/dynamic_spec.rb +5 -6
- data/spec/mongoid/attributes/nested_spec.rb +1461 -1693
- data/spec/mongoid/attributes/nested_spec_models.rb +8 -9
- data/spec/mongoid/attributes/projector_spec.rb +2 -6
- data/spec/mongoid/attributes/readonly_spec.rb +73 -97
- data/spec/mongoid/attributes_spec.rb +669 -826
- data/spec/mongoid/cacheable_spec.rb +74 -44
- data/spec/mongoid/changeable_spec.rb +591 -733
- data/spec/mongoid/clients/factory_spec.rb +122 -154
- data/spec/mongoid/clients/options_spec.rb +40 -59
- data/spec/mongoid/clients/sessions_spec.rb +25 -44
- data/spec/mongoid/clients/transactions_spec.rb +33 -50
- data/spec/mongoid/clients/transactions_spec_models.rb +3 -4
- data/spec/mongoid/clients_spec.rb +265 -355
- data/spec/mongoid/collection_configurable_spec.rb +9 -12
- data/spec/mongoid/composable_spec.rb +2 -9
- data/spec/mongoid/config/defaults_spec.rb +56 -30
- data/spec/mongoid/config/encryption_spec.rb +282 -57
- data/spec/mongoid/config/environment_spec.rb +30 -40
- data/spec/mongoid/config/introspection_spec.rb +42 -37
- data/spec/mongoid/config/options_spec.rb +14 -21
- data/spec/mongoid/config_spec.rb +145 -195
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +189 -135
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +4 -7
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +149 -187
- data/spec/mongoid/contextual/aggregable/none_spec.rb +14 -16
- data/spec/mongoid/contextual/atomic_spec.rb +223 -271
- data/spec/mongoid/contextual/map_reduce_spec.rb +110 -138
- data/spec/mongoid/contextual/memory_spec.rb +883 -854
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +12 -13
- data/spec/mongoid/contextual/mongo_spec.rb +1008 -1213
- data/spec/mongoid/contextual/none_spec.rb +54 -59
- data/spec/mongoid/contextual/short_circuit_spec.rb +139 -0
- data/spec/mongoid/copyable_spec.rb +254 -300
- data/spec/mongoid/copyable_spec_models.rb +0 -1
- data/spec/mongoid/criteria/findable_spec.rb +322 -387
- data/spec/mongoid/criteria/includable_spec.rb +1356 -432
- data/spec/mongoid/criteria/includable_spec_models.rb +16 -7
- data/spec/mongoid/criteria/inspectable_spec.rb +11 -14
- data/spec/mongoid/criteria/marshalable_spec.rb +11 -14
- data/spec/mongoid/criteria/modifiable_spec.rb +366 -512
- data/spec/mongoid/criteria/options_spec.rb +2 -7
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +112 -141
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +8 -11
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +127 -184
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +123 -60
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +84 -117
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +44 -65
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +86 -108
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +94 -33
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +103 -138
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +95 -34
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +25 -38
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +26 -28
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +32 -54
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +136 -130
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +16 -24
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +15 -24
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +12 -19
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +46 -63
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +28 -42
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +73 -96
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +71 -92
- data/spec/mongoid/criteria/queryable/key_spec.rb +32 -36
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +44 -49
- data/spec/mongoid/criteria/queryable/optional_spec.rb +373 -486
- data/spec/mongoid/criteria/queryable/options_spec.rb +172 -123
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +65 -87
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +41 -53
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +589 -679
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +7 -11
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +807 -998
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +354 -190
- data/spec/mongoid/criteria/queryable/selector_spec.rb +294 -390
- data/spec/mongoid/criteria/queryable/smash_spec.rb +6 -11
- data/spec/mongoid/criteria/queryable/storable_spec.rb +54 -81
- data/spec/mongoid/criteria/queryable_mql_spec.rb +92 -0
- data/spec/mongoid/criteria/scopable_spec.rb +102 -138
- data/spec/mongoid/criteria/translator_spec.rb +59 -60
- data/spec/mongoid/criteria_projection_spec.rb +81 -99
- data/spec/mongoid/criteria_spec.rb +937 -949
- data/spec/mongoid/document_fields_spec.rb +28 -30
- data/spec/mongoid/document_persistence_context_spec.rb +13 -15
- data/spec/mongoid/document_query_spec.rb +9 -12
- data/spec/mongoid/document_spec.rb +317 -409
- data/spec/mongoid/encryptable_spec.rb +61 -0
- data/spec/mongoid/equality_spec.rb +69 -102
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +8 -11
- data/spec/mongoid/errors/attribute_not_loaded_spec.rb +7 -10
- data/spec/mongoid/errors/callback_spec.rb +8 -11
- data/spec/mongoid/errors/config_redactor_spec.rb +112 -0
- data/spec/mongoid/errors/delete_restriction_spec.rb +5 -8
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +7 -10
- data/spec/mongoid/errors/document_not_found_spec.rb +51 -61
- data/spec/mongoid/errors/invalid_collection_spec.rb +9 -13
- data/spec/mongoid/errors/invalid_config_file_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_config_option_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_field_option_spec.rb +7 -10
- data/spec/mongoid/errors/invalid_field_spec.rb +10 -11
- data/spec/mongoid/errors/invalid_field_type_spec.rb +9 -12
- data/spec/mongoid/errors/invalid_find_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_includes_spec.rb +9 -13
- data/spec/mongoid/errors/invalid_index_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_options_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_path_spec.rb +7 -10
- data/spec/mongoid/errors/invalid_relation_spec.rb +15 -16
- data/spec/mongoid/errors/invalid_scope_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -6
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_time_spec.rb +8 -11
- data/spec/mongoid/errors/inverse_not_found_spec.rb +9 -12
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +40 -12
- data/spec/mongoid/errors/mixed_relations_spec.rb +8 -11
- data/spec/mongoid/errors/mongoid_error_spec.rb +21 -24
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +6 -9
- data/spec/mongoid/errors/no_client_config_spec.rb +7 -10
- data/spec/mongoid/errors/no_client_database_spec.rb +38 -12
- data/spec/mongoid/errors/no_client_hosts_spec.rb +35 -12
- data/spec/mongoid/errors/no_clients_config_spec.rb +7 -10
- data/spec/mongoid/errors/no_environment_spec.rb +8 -11
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +8 -11
- data/spec/mongoid/errors/no_metadata_spec.rb +7 -10
- data/spec/mongoid/errors/no_parent_spec.rb +7 -10
- data/spec/mongoid/errors/readonly_association_spec.rb +34 -0
- data/spec/mongoid/errors/readonly_attribute_spec.rb +7 -10
- data/spec/mongoid/errors/readonly_document_spec.rb +6 -9
- data/spec/mongoid/errors/scope_overwrite_spec.rb +9 -12
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +9 -12
- data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -8
- data/spec/mongoid/errors/unsaved_document_spec.rb +8 -11
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +9 -12
- data/spec/mongoid/errors/validations_spec.rb +11 -14
- data/spec/mongoid/extensions/array_spec.rb +70 -92
- data/spec/mongoid/extensions/big_decimal_spec.rb +233 -313
- data/spec/mongoid/extensions/binary_spec.rb +21 -32
- data/spec/mongoid/extensions/boolean_spec.rb +52 -75
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +43 -54
- data/spec/mongoid/extensions/date_spec.rb +26 -38
- data/spec/mongoid/extensions/date_time_spec.rb +22 -32
- data/spec/mongoid/extensions/decimal128_spec.rb +12 -18
- data/spec/mongoid/extensions/false_class_spec.rb +10 -17
- data/spec/mongoid/extensions/float_spec.rb +40 -61
- data/spec/mongoid/extensions/hash_spec.rb +46 -64
- data/spec/mongoid/extensions/integer_spec.rb +40 -61
- data/spec/mongoid/extensions/module_spec.rb +13 -18
- data/spec/mongoid/extensions/nil_class_spec.rb +2 -5
- data/spec/mongoid/extensions/object_id_spec.rb +159 -247
- data/spec/mongoid/extensions/object_spec.rb +31 -47
- data/spec/mongoid/extensions/range_spec.rb +112 -115
- data/spec/mongoid/extensions/raw_value_spec.rb +10 -12
- data/spec/mongoid/extensions/regexp_spec.rb +23 -36
- data/spec/mongoid/extensions/set_spec.rb +38 -49
- data/spec/mongoid/extensions/string_spec.rb +118 -167
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +29 -43
- data/spec/mongoid/extensions/symbol_spec.rb +12 -20
- data/spec/mongoid/extensions/time_spec.rb +160 -202
- data/spec/mongoid/extensions/time_with_zone_spec.rb +79 -105
- data/spec/mongoid/extensions/true_class_spec.rb +10 -17
- data/spec/mongoid/extensions/vector_spec.rb +175 -0
- data/spec/mongoid/factory_spec.rb +125 -148
- data/spec/mongoid/fields/foreign_key_spec.rb +124 -169
- data/spec/mongoid/fields/localized_spec.rb +140 -185
- data/spec/mongoid/fields/standard_spec.rb +43 -59
- data/spec/mongoid/fields_spec.rb +751 -620
- data/spec/mongoid/findable_spec.rb +260 -228
- data/spec/mongoid/indexable/specification_spec.rb +42 -58
- data/spec/mongoid/indexable_spec.rb +260 -264
- data/spec/mongoid/inspectable_spec.rb +45 -55
- data/spec/mongoid/interceptable_spec.rb +784 -922
- data/spec/mongoid/interceptable_spec_models.rb +35 -35
- data/spec/mongoid/loading_spec.rb +47 -43
- data/spec/mongoid/loggable_spec.rb +3 -6
- data/spec/mongoid/matcher/extract_attribute_spec.rb +2 -6
- data/spec/mongoid/matcher/regexp_budget_spec.rb +570 -0
- data/spec/mongoid/mongoizable_spec.rb +81 -90
- data/spec/mongoid/monkey_patches_spec.rb +4 -0
- data/spec/mongoid/persistable/creatable_spec.rb +181 -220
- data/spec/mongoid/persistable/deletable_spec.rb +139 -179
- data/spec/mongoid/persistable/destroyable_spec.rb +135 -164
- data/spec/mongoid/persistable/incrementable_spec.rb +65 -84
- data/spec/mongoid/persistable/logical_spec.rb +48 -61
- data/spec/mongoid/persistable/maxable_spec.rb +45 -44
- data/spec/mongoid/persistable/minable_spec.rb +45 -44
- data/spec/mongoid/persistable/multipliable_spec.rb +54 -69
- data/spec/mongoid/persistable/poppable_spec.rb +47 -60
- data/spec/mongoid/persistable/pullable_spec.rb +79 -103
- data/spec/mongoid/persistable/pushable_spec.rb +106 -131
- data/spec/mongoid/persistable/renamable_spec.rb +52 -65
- data/spec/mongoid/persistable/savable_spec.rb +152 -189
- data/spec/mongoid/persistable/settable_spec.rb +121 -145
- data/spec/mongoid/persistable/unsettable_spec.rb +56 -73
- data/spec/mongoid/persistable/updatable_spec.rb +185 -232
- data/spec/mongoid/persistable/upsertable_spec.rb +66 -77
- data/spec/mongoid/persistable_spec.rb +132 -139
- data/spec/mongoid/persistence_context_spec.rb +31 -89
- data/spec/mongoid/positional_spec.rb +67 -79
- data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +0 -3
- data/spec/mongoid/railties/console_sandbox_spec.rb +0 -1
- data/spec/mongoid/relations/proxy_spec.rb +0 -1
- data/spec/mongoid/reloadable_spec.rb +250 -145
- data/spec/mongoid/scopable_spec.rb +319 -398
- data/spec/mongoid/search_indexable_spec.rb +735 -44
- data/spec/mongoid/selectable_spec.rb +36 -51
- data/spec/mongoid/serializable_spec.rb +269 -312
- data/spec/mongoid/shardable_models.rb +5 -5
- data/spec/mongoid/shardable_spec.rb +44 -46
- data/spec/mongoid/stateful_spec.rb +55 -75
- data/spec/mongoid/tasks/database_rake_spec.rb +138 -141
- data/spec/mongoid/tasks/database_spec.rb +98 -80
- data/spec/mongoid/tasks/encryption_spec.rb +22 -20
- data/spec/mongoid/threaded_spec.rb +57 -83
- data/spec/mongoid/timestamps/created/short_spec.rb +12 -16
- data/spec/mongoid/timestamps/created_spec.rb +16 -20
- data/spec/mongoid/timestamps/timeless_spec.rb +228 -48
- data/spec/mongoid/timestamps/updated/short_spec.rb +21 -28
- data/spec/mongoid/timestamps/updated_spec.rb +18 -25
- data/spec/mongoid/timestamps_spec.rb +171 -188
- data/spec/mongoid/timestamps_spec_models.rb +12 -13
- data/spec/mongoid/touchable_spec.rb +355 -294
- data/spec/mongoid/touchable_spec_models.rb +45 -37
- data/spec/mongoid/traversable_spec.rb +435 -471
- data/spec/mongoid/validatable/associated_spec.rb +60 -59
- data/spec/mongoid/validatable/format_spec.rb +24 -34
- data/spec/mongoid/validatable/length_spec.rb +62 -86
- data/spec/mongoid/validatable/numericality_spec.rb +114 -23
- data/spec/mongoid/validatable/presence_spec.rb +149 -203
- data/spec/mongoid/validatable/uniqueness_spec.rb +632 -830
- data/spec/mongoid/validatable_spec.rb +71 -103
- data/spec/mongoid/warnings_spec.rb +5 -9
- data/spec/mongoid_spec.rb +25 -41
- data/spec/rails/controller_extension/controller_runtime_spec.rb +45 -49
- data/spec/rails/mongoid_spec.rb +15 -15
- data/spec/shared/lib/mrss/cluster_config.rb +5 -40
- data/spec/shared/lib/mrss/constraints.rb +7 -46
- data/spec/shared/lib/mrss/docker_runner.rb +10 -21
- data/spec/shared/lib/mrss/eg_config_utils.rb +0 -31
- data/spec/shared/lib/mrss/release/candidate.rb +18 -12
- data/spec/shared/lib/mrss/server_version_registry.rb +1 -5
- data/spec/shared/share/Dockerfile.erb +6 -8
- data/spec/shared/shlib/server.sh +0 -50
- data/spec/shared/shlib/set_env.sh +4 -10
- data/spec/spec_helper.rb +59 -32
- data/spec/support/authorization.rb +0 -1
- data/spec/support/client_registry.rb +1 -2
- data/spec/support/constraints.rb +8 -25
- data/spec/support/crypt/models.rb +164 -8
- data/spec/support/crypt.rb +6 -9
- data/spec/support/expectations.rb +21 -7
- data/spec/support/feature_sandbox.rb +1 -4
- data/spec/support/helpers.rb +0 -1
- data/spec/support/immutable_ids.rb +20 -21
- data/spec/support/macros.rb +1 -3
- data/spec/support/models/account.rb +4 -5
- data/spec/support/models/acolyte.rb +5 -5
- data/spec/support/models/actor.rb +3 -3
- data/spec/support/models/actress.rb +0 -1
- data/spec/support/models/address.rb +11 -11
- data/spec/support/models/address_component.rb +1 -1
- data/spec/support/models/address_number.rb +1 -1
- data/spec/support/models/agency.rb +1 -1
- data/spec/support/models/agent.rb +1 -1
- data/spec/support/models/album.rb +1 -2
- data/spec/support/models/alert.rb +1 -1
- data/spec/support/models/animal.rb +4 -5
- data/spec/support/models/answer.rb +1 -1
- data/spec/support/models/appointment.rb +2 -2
- data/spec/support/models/armrest.rb +0 -1
- data/spec/support/models/array_field.rb +0 -1
- data/spec/support/models/article.rb +0 -1
- data/spec/support/models/artist.rb +16 -12
- data/spec/support/models/artwork.rb +1 -1
- data/spec/support/models/audible_sound.rb +0 -1
- data/spec/support/models/audio.rb +2 -2
- data/spec/support/models/augmentation.rb +1 -2
- data/spec/support/models/author.rb +1 -1
- data/spec/support/models/baby.rb +1 -1
- data/spec/support/models/band.rb +0 -1
- data/spec/support/models/bar.rb +2 -2
- data/spec/support/models/basic.rb +0 -1
- data/spec/support/models/bed.rb +0 -1
- data/spec/support/models/big_palette.rb +0 -1
- data/spec/support/models/birthday.rb +3 -5
- data/spec/support/models/bolt.rb +0 -1
- data/spec/support/models/bomb.rb +1 -1
- data/spec/support/models/book.rb +1 -1
- data/spec/support/models/breed.rb +1 -1
- data/spec/support/models/browser.rb +1 -2
- data/spec/support/models/building.rb +0 -1
- data/spec/support/models/building_address.rb +1 -1
- data/spec/support/models/bus.rb +1 -1
- data/spec/support/models/business.rb +2 -2
- data/spec/support/models/callback_test.rb +1 -1
- data/spec/support/models/canvas.rb +5 -6
- data/spec/support/models/car.rb +0 -1
- data/spec/support/models/cat.rb +0 -2
- data/spec/support/models/catalog.rb +0 -1
- data/spec/support/models/category.rb +1 -1
- data/spec/support/models/child.rb +1 -1
- data/spec/support/models/child_doc.rb +5 -6
- data/spec/support/models/church.rb +1 -1
- data/spec/support/models/circle.rb +0 -1
- data/spec/support/models/circuit.rb +2 -2
- data/spec/support/models/circus.rb +0 -1
- data/spec/support/models/code.rb +2 -1
- data/spec/support/models/coding/pull_request.rb +0 -1
- data/spec/support/models/coding.rb +0 -1
- data/spec/support/models/comment.rb +0 -1
- data/spec/support/models/company.rb +0 -1
- data/spec/support/models/consumption_period.rb +0 -1
- data/spec/support/models/contextable_item.rb +1 -1
- data/spec/support/models/contractor.rb +1 -1
- data/spec/support/models/cookie.rb +0 -1
- data/spec/support/models/country_code.rb +2 -3
- data/spec/support/models/courier_job.rb +2 -2
- data/spec/support/models/cover.rb +0 -1
- data/spec/support/models/crate.rb +0 -1
- data/spec/support/models/customer.rb +0 -1
- data/spec/support/models/customer_address.rb +0 -1
- data/spec/support/models/deed.rb +1 -1
- data/spec/support/models/definition.rb +1 -1
- data/spec/support/models/delegating_patient.rb +0 -1
- data/spec/support/models/description.rb +0 -1
- data/spec/support/models/dictionary.rb +1 -1
- data/spec/support/models/division.rb +2 -2
- data/spec/support/models/doctor.rb +0 -1
- data/spec/support/models/dog.rb +2 -2
- data/spec/support/models/dokument.rb +1 -1
- data/spec/support/models/draft.rb +0 -1
- data/spec/support/models/dragon.rb +1 -1
- data/spec/support/models/driver.rb +2 -2
- data/spec/support/models/drug.rb +1 -1
- data/spec/support/models/dungeon.rb +1 -1
- data/spec/support/models/edit.rb +1 -1
- data/spec/support/models/email.rb +1 -1
- data/spec/support/models/employer.rb +1 -2
- data/spec/support/models/entry.rb +1 -1
- data/spec/support/models/eraser.rb +0 -1
- data/spec/support/models/even.rb +1 -1
- data/spec/support/models/event.rb +3 -4
- data/spec/support/models/exhibition.rb +1 -1
- data/spec/support/models/exhibitor.rb +1 -1
- data/spec/support/models/explosion.rb +1 -1
- data/spec/support/models/eye.rb +0 -1
- data/spec/support/models/eye_bowl.rb +2 -3
- data/spec/support/models/face.rb +2 -3
- data/spec/support/models/fanatic.rb +1 -1
- data/spec/support/models/favorite.rb +1 -1
- data/spec/support/models/filesystem.rb +1 -1
- data/spec/support/models/fire_hydrant.rb +1 -1
- data/spec/support/models/firefox.rb +0 -1
- data/spec/support/models/fish.rb +0 -1
- data/spec/support/models/folder.rb +0 -2
- data/spec/support/models/folder_item.rb +1 -3
- data/spec/support/models/fruits.rb +9 -5
- data/spec/support/models/game.rb +3 -4
- data/spec/support/models/ghost.rb +0 -1
- data/spec/support/models/guitar.rb +0 -1
- data/spec/support/models/hole.rb +0 -1
- data/spec/support/models/home.rb +1 -1
- data/spec/support/models/house.rb +2 -2
- data/spec/support/models/html_writer.rb +0 -1
- data/spec/support/models/id_key.rb +3 -3
- data/spec/support/models/idnodef.rb +0 -1
- data/spec/support/models/image.rb +0 -1
- data/spec/support/models/implant.rb +1 -2
- data/spec/support/models/instrument.rb +2 -3
- data/spec/support/models/item.rb +2 -2
- data/spec/support/models/jar.rb +1 -2
- data/spec/support/models/kaleidoscope.rb +1 -1
- data/spec/support/models/kangaroo.rb +1 -1
- data/spec/support/models/label.rb +2 -2
- data/spec/support/models/language.rb +1 -1
- data/spec/support/models/lat_lng.rb +0 -1
- data/spec/support/models/league.rb +1 -1
- data/spec/support/models/learner.rb +0 -1
- data/spec/support/models/line_item.rb +1 -1
- data/spec/support/models/location.rb +1 -1
- data/spec/support/models/login.rb +1 -2
- data/spec/support/models/manufacturer.rb +0 -1
- data/spec/support/models/meat.rb +1 -1
- data/spec/support/models/membership.rb +1 -1
- data/spec/support/models/message.rb +1 -2
- data/spec/support/models/minim.rb +0 -1
- data/spec/support/models/mixed_drink.rb +1 -1
- data/spec/support/models/modifier_models.rb +25 -0
- data/spec/support/models/mop.rb +0 -1
- data/spec/support/models/movie.rb +1 -1
- data/spec/support/models/my_hash.rb +1 -2
- data/spec/support/models/name.rb +4 -5
- data/spec/support/models/name_only.rb +0 -1
- data/spec/support/models/node.rb +1 -1
- data/spec/support/models/note.rb +3 -3
- data/spec/support/models/nut.rb +0 -1
- data/spec/support/models/odd.rb +1 -1
- data/spec/support/models/order.rb +1 -1
- data/spec/support/models/ordered_post.rb +1 -1
- data/spec/support/models/ordered_preference.rb +1 -1
- data/spec/support/models/oscar.rb +1 -1
- data/spec/support/models/other_owner_object.rb +0 -1
- data/spec/support/models/override.rb +3 -11
- data/spec/support/models/ownable.rb +1 -1
- data/spec/support/models/owner.rb +1 -1
- data/spec/support/models/pack.rb +0 -1
- data/spec/support/models/page.rb +3 -3
- data/spec/support/models/page_question.rb +1 -1
- data/spec/support/models/palette.rb +2 -2
- data/spec/support/models/parent.rb +2 -2
- data/spec/support/models/parent_doc.rb +1 -1
- data/spec/support/models/passport.rb +0 -1
- data/spec/support/models/patient.rb +2 -2
- data/spec/support/models/pdf_writer.rb +0 -1
- data/spec/support/models/pencil.rb +0 -1
- data/spec/support/models/person.rb +32 -28
- data/spec/support/models/pet.rb +1 -1
- data/spec/support/models/pet_owner.rb +1 -1
- data/spec/support/models/phone.rb +1 -2
- data/spec/support/models/piano.rb +0 -1
- data/spec/support/models/pizza.rb +1 -1
- data/spec/support/models/player.rb +5 -5
- data/spec/support/models/post.rb +12 -12
- data/spec/support/models/post_genre.rb +1 -1
- data/spec/support/models/powerup.rb +1 -2
- data/spec/support/models/preference.rb +2 -2
- data/spec/support/models/princess.rb +1 -1
- data/spec/support/models/product.rb +3 -3
- data/spec/support/models/profile.rb +2 -1
- data/spec/support/models/pronunciation.rb +1 -1
- data/spec/support/models/pub.rb +2 -2
- data/spec/support/models/publication/encyclopedia.rb +0 -1
- data/spec/support/models/publication/review.rb +0 -1
- data/spec/support/models/publication.rb +0 -1
- data/spec/support/models/purchase.rb +1 -1
- data/spec/support/models/purchased_item.rb +1 -1
- data/spec/support/models/question.rb +2 -2
- data/spec/support/models/quiz.rb +1 -1
- data/spec/support/models/rating.rb +1 -1
- data/spec/support/models/record.rb +2 -3
- data/spec/support/models/registry.rb +1 -1
- data/spec/support/models/role.rb +1 -1
- data/spec/support/models/root_category.rb +1 -1
- data/spec/support/models/sandbox/app/models/app_models_message.rb +0 -1
- data/spec/support/models/sandbox/lib/models/lib_models_message.rb +0 -1
- data/spec/support/models/sandbox/sandbox_message.rb +0 -1
- data/spec/support/models/sandbox/sandbox_user.rb +0 -1
- data/spec/support/models/sandbox/subdir/sandbox_comment.rb +0 -1
- data/spec/support/models/sandwich.rb +1 -1
- data/spec/support/models/scheduler.rb +0 -1
- data/spec/support/models/school.rb +0 -1
- data/spec/support/models/scribe.rb +1 -1
- data/spec/support/models/sealer.rb +0 -1
- data/spec/support/models/seat.rb +0 -1
- data/spec/support/models/seo.rb +1 -1
- data/spec/support/models/series.rb +1 -1
- data/spec/support/models/server.rb +1 -1
- data/spec/support/models/service.rb +2 -2
- data/spec/support/models/shape.rb +3 -3
- data/spec/support/models/shelf.rb +1 -1
- data/spec/support/models/shield.rb +2 -2
- data/spec/support/models/shipment_address.rb +0 -1
- data/spec/support/models/shipping_container.rb +1 -1
- data/spec/support/models/shipping_pack.rb +0 -1
- data/spec/support/models/shirt.rb +0 -1
- data/spec/support/models/shop.rb +2 -2
- data/spec/support/models/short_agent.rb +0 -1
- data/spec/support/models/short_quiz.rb +1 -1
- data/spec/support/models/simple.rb +1 -1
- data/spec/support/models/slave.rb +1 -1
- data/spec/support/models/song.rb +1 -2
- data/spec/support/models/sound.rb +2 -2
- data/spec/support/models/spacer.rb +0 -1
- data/spec/support/models/square.rb +0 -1
- data/spec/support/models/staff.rb +0 -1
- data/spec/support/models/store_as_dup_test1.rb +2 -2
- data/spec/support/models/store_as_dup_test2.rb +1 -1
- data/spec/support/models/store_as_dup_test3.rb +2 -2
- data/spec/support/models/store_as_dup_test4.rb +1 -1
- data/spec/support/models/strategy.rb +0 -1
- data/spec/support/models/student.rb +1 -2
- data/spec/support/models/sub_item.rb +0 -1
- data/spec/support/models/subscription.rb +2 -2
- data/spec/support/models/survey.rb +2 -2
- data/spec/support/models/symptom.rb +2 -2
- data/spec/support/models/system_role.rb +2 -3
- data/spec/support/models/tag.rb +2 -2
- data/spec/support/models/target.rb +1 -1
- data/spec/support/models/template.rb +1 -1
- data/spec/support/models/thing.rb +1 -1
- data/spec/support/models/threadlocker.rb +0 -1
- data/spec/support/models/title.rb +0 -1
- data/spec/support/models/tool.rb +3 -3
- data/spec/support/models/topping.rb +1 -1
- data/spec/support/models/toy.rb +0 -1
- data/spec/support/models/track.rb +1 -1
- data/spec/support/models/translation.rb +1 -1
- data/spec/support/models/tree.rb +2 -3
- data/spec/support/models/truck.rb +0 -1
- data/spec/support/models/updatable.rb +0 -1
- data/spec/support/models/user.rb +3 -4
- data/spec/support/models/user_account.rb +3 -3
- data/spec/support/models/validation_callback.rb +4 -4
- data/spec/support/models/vehicle.rb +2 -3
- data/spec/support/models/version.rb +1 -1
- data/spec/support/models/vertex.rb +0 -1
- data/spec/support/models/vet_visit.rb +1 -1
- data/spec/support/models/video.rb +2 -2
- data/spec/support/models/video_game.rb +0 -1
- data/spec/support/models/washer.rb +0 -1
- data/spec/support/models/weapon.rb +1 -2
- data/spec/support/models/wiki_page.rb +2 -3
- data/spec/support/models/word.rb +2 -2
- data/spec/support/models/word_origin.rb +1 -2
- data/spec/support/models/writer.rb +3 -3
- data/spec/support/rails_mock.rb +7 -12
- data/spec/support/shared/time.rb +0 -1
- data/spec/support/sinatra_mock.rb +4 -2
- data/spec/support/spec_config.rb +19 -18
- metadata +64 -2
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
module Mongoid
|
|
5
4
|
class Criteria
|
|
6
5
|
module Queryable
|
|
7
|
-
|
|
8
6
|
# An queryable selectable is selectable, in that it has the ability to select
|
|
9
7
|
# document from the database. The selectable module brings all functionality
|
|
10
8
|
# to the selectable that has to do with building MongoDB selectors.
|
|
@@ -12,13 +10,13 @@ module Mongoid
|
|
|
12
10
|
extend Macroable
|
|
13
11
|
|
|
14
12
|
# Constant for a LineString $geometry.
|
|
15
|
-
LINE_STRING =
|
|
13
|
+
LINE_STRING = 'LineString'
|
|
16
14
|
|
|
17
15
|
# Constant for a Point $geometry.
|
|
18
|
-
POINT =
|
|
16
|
+
POINT = 'Point'
|
|
19
17
|
|
|
20
18
|
# Constant for a Polygon $geometry.
|
|
21
|
-
POLYGON =
|
|
19
|
+
POLYGON = 'Polygon'
|
|
22
20
|
|
|
23
21
|
# @attribute [rw] negating If the next expression is negated.
|
|
24
22
|
# @attribute [rw] selector The query selector.
|
|
@@ -43,27 +41,23 @@ module Mongoid
|
|
|
43
41
|
end
|
|
44
42
|
|
|
45
43
|
criteria.inject(clone) do |query, condition|
|
|
46
|
-
if condition.nil?
|
|
47
|
-
raise Errors::CriteriaArgumentRequired, :all
|
|
48
|
-
end
|
|
44
|
+
raise Errors::CriteriaArgumentRequired, :all if condition.nil?
|
|
49
45
|
|
|
50
46
|
condition = expand_condition_to_array_values(condition)
|
|
51
47
|
|
|
52
48
|
if strategy
|
|
53
|
-
send(strategy, condition,
|
|
49
|
+
send(strategy, condition, '$all')
|
|
54
50
|
else
|
|
55
51
|
condition.inject(query) do |_query, (field, value)|
|
|
56
|
-
v = {'$all' => value}
|
|
57
|
-
if negating?
|
|
58
|
-
v = {'$not' => v}
|
|
59
|
-
end
|
|
52
|
+
v = { '$all' => value }
|
|
53
|
+
v = { '$not' => v } if negating?
|
|
60
54
|
_query.add_field_expression(field.to_s, v)
|
|
61
55
|
end
|
|
62
56
|
end
|
|
63
57
|
end.reset_strategies!
|
|
64
58
|
end
|
|
65
|
-
alias
|
|
66
|
-
key :all, :union,
|
|
59
|
+
alias all_in all
|
|
60
|
+
key :all, :union, '$all'
|
|
67
61
|
|
|
68
62
|
# Add the $and criterion.
|
|
69
63
|
#
|
|
@@ -76,10 +70,8 @@ module Mongoid
|
|
|
76
70
|
#
|
|
77
71
|
# @return [ Selectable ] The new selectable.
|
|
78
72
|
def and(*criteria)
|
|
79
|
-
_mongoid_flatten_arrays(criteria).inject(
|
|
80
|
-
if new_s.is_a?(Selectable)
|
|
81
|
-
new_s = new_s.selector
|
|
82
|
-
end
|
|
73
|
+
_mongoid_flatten_arrays(criteria).inject(clone) do |c, new_s|
|
|
74
|
+
new_s = new_s.selector if new_s.is_a?(Selectable)
|
|
83
75
|
normalized = _mongoid_expand_keys(new_s)
|
|
84
76
|
normalized.each do |k, v|
|
|
85
77
|
k = k.to_s
|
|
@@ -90,16 +82,15 @@ module Mongoid
|
|
|
90
82
|
# we can add to existing conditions.
|
|
91
83
|
# Otherwise use $and.
|
|
92
84
|
if v.is_a?(Hash) &&
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
then
|
|
85
|
+
v.length == 1 &&
|
|
86
|
+
(new_k = v.keys.first).start_with?('$') &&
|
|
87
|
+
(existing_kv = c.selector[k]).is_a?(Hash) &&
|
|
88
|
+
!existing_kv.key?(new_k) &&
|
|
89
|
+
existing_kv.keys.all? { |sub_k| sub_k.start_with?('$') }
|
|
99
90
|
merged_v = c.selector[k].merge(v)
|
|
100
91
|
c.selector.store(k, merged_v)
|
|
101
92
|
else
|
|
102
|
-
c = c.send(:__multi__, [k => v], '$and')
|
|
93
|
+
c = c.send(:__multi__, [ { k => v } ], '$and')
|
|
103
94
|
end
|
|
104
95
|
else
|
|
105
96
|
c.selector.store(k, v)
|
|
@@ -108,7 +99,7 @@ module Mongoid
|
|
|
108
99
|
c
|
|
109
100
|
end
|
|
110
101
|
end
|
|
111
|
-
alias
|
|
102
|
+
alias all_of and
|
|
112
103
|
|
|
113
104
|
# Add the range selection.
|
|
114
105
|
#
|
|
@@ -122,14 +113,12 @@ module Mongoid
|
|
|
122
113
|
#
|
|
123
114
|
# @return [ Selectable ] The cloned selectable.
|
|
124
115
|
def between(criterion)
|
|
125
|
-
if criterion.nil?
|
|
126
|
-
raise Errors::CriteriaArgumentRequired, :between
|
|
127
|
-
end
|
|
116
|
+
raise Errors::CriteriaArgumentRequired, :between if criterion.nil?
|
|
128
117
|
|
|
129
118
|
selection(criterion) do |selector, field, value|
|
|
130
119
|
selector.store(
|
|
131
120
|
field,
|
|
132
|
-
{
|
|
121
|
+
{ '$gte' => value.min, '$lte' => value.max }
|
|
133
122
|
)
|
|
134
123
|
end
|
|
135
124
|
end
|
|
@@ -152,13 +141,11 @@ module Mongoid
|
|
|
152
141
|
#
|
|
153
142
|
# @return [ Selectable ] The cloned selectable.
|
|
154
143
|
def elem_match(criterion)
|
|
155
|
-
if criterion.nil?
|
|
156
|
-
raise Errors::CriteriaArgumentRequired, :elem_match
|
|
157
|
-
end
|
|
144
|
+
raise Errors::CriteriaArgumentRequired, :elem_match if criterion.nil?
|
|
158
145
|
|
|
159
|
-
and_with_operator(criterion,
|
|
146
|
+
and_with_operator(criterion, '$elemMatch')
|
|
160
147
|
end
|
|
161
|
-
key :elem_match, :override,
|
|
148
|
+
key :elem_match, :override, '$elemMatch'
|
|
162
149
|
|
|
163
150
|
# Add the $exists selection.
|
|
164
151
|
#
|
|
@@ -175,15 +162,13 @@ module Mongoid
|
|
|
175
162
|
#
|
|
176
163
|
# @return [ Selectable ] The cloned selectable.
|
|
177
164
|
def exists(criterion)
|
|
178
|
-
if criterion.nil?
|
|
179
|
-
raise Errors::CriteriaArgumentRequired, :exists
|
|
180
|
-
end
|
|
165
|
+
raise Errors::CriteriaArgumentRequired, :exists if criterion.nil?
|
|
181
166
|
|
|
182
|
-
typed_override(criterion,
|
|
167
|
+
typed_override(criterion, '$exists') do |value|
|
|
183
168
|
Mongoid::Boolean.evolve(value)
|
|
184
169
|
end
|
|
185
170
|
end
|
|
186
|
-
key :exists, :override,
|
|
171
|
+
key :exists, :override, '$exists' do |value|
|
|
187
172
|
Mongoid::Boolean.evolve(value)
|
|
188
173
|
end
|
|
189
174
|
|
|
@@ -222,26 +207,24 @@ module Mongoid
|
|
|
222
207
|
#
|
|
223
208
|
# @return [ Selectable ] The cloned selectable.
|
|
224
209
|
def geo_spatial(criterion)
|
|
225
|
-
if criterion.nil?
|
|
226
|
-
raise Errors::CriteriaArgumentRequired, :geo_spatial
|
|
227
|
-
end
|
|
210
|
+
raise Errors::CriteriaArgumentRequired, :geo_spatial if criterion.nil?
|
|
228
211
|
|
|
229
212
|
__merge__(criterion)
|
|
230
213
|
end
|
|
231
214
|
|
|
232
|
-
key :intersects_line, :override,
|
|
233
|
-
{
|
|
215
|
+
key :intersects_line, :override, '$geoIntersects', '$geometry' do |value|
|
|
216
|
+
{ 'type' => LINE_STRING, 'coordinates' => value }
|
|
234
217
|
end
|
|
235
|
-
key :intersects_point, :override,
|
|
236
|
-
{
|
|
218
|
+
key :intersects_point, :override, '$geoIntersects', '$geometry' do |value|
|
|
219
|
+
{ 'type' => POINT, 'coordinates' => value }
|
|
237
220
|
end
|
|
238
|
-
key :intersects_polygon, :override,
|
|
239
|
-
{
|
|
221
|
+
key :intersects_polygon, :override, '$geoIntersects', '$geometry' do |value|
|
|
222
|
+
{ 'type' => POLYGON, 'coordinates' => value }
|
|
240
223
|
end
|
|
241
|
-
key :within_polygon, :override,
|
|
242
|
-
{
|
|
224
|
+
key :within_polygon, :override, '$geoWithin', '$geometry' do |value|
|
|
225
|
+
{ 'type' => POLYGON, 'coordinates' => value }
|
|
243
226
|
end
|
|
244
|
-
key :within_box, :override,
|
|
227
|
+
key :within_box, :override, '$geoWithin', '$box'
|
|
245
228
|
|
|
246
229
|
# Add the $eq criterion to the selector.
|
|
247
230
|
#
|
|
@@ -255,13 +238,11 @@ module Mongoid
|
|
|
255
238
|
#
|
|
256
239
|
# @return [ Selectable ] The cloned selectable.
|
|
257
240
|
def eq(criterion)
|
|
258
|
-
if criterion.nil?
|
|
259
|
-
raise Errors::CriteriaArgumentRequired, :eq
|
|
260
|
-
end
|
|
241
|
+
raise Errors::CriteriaArgumentRequired, :eq if criterion.nil?
|
|
261
242
|
|
|
262
|
-
and_with_operator(criterion,
|
|
243
|
+
and_with_operator(criterion, '$eq')
|
|
263
244
|
end
|
|
264
|
-
key :eq, :override,
|
|
245
|
+
key :eq, :override, '$eq'
|
|
265
246
|
|
|
266
247
|
# Add the $gt criterion to the selector.
|
|
267
248
|
#
|
|
@@ -275,13 +256,11 @@ module Mongoid
|
|
|
275
256
|
#
|
|
276
257
|
# @return [ Selectable ] The cloned selectable.
|
|
277
258
|
def gt(criterion)
|
|
278
|
-
if criterion.nil?
|
|
279
|
-
raise Errors::CriteriaArgumentRequired, :gt
|
|
280
|
-
end
|
|
259
|
+
raise Errors::CriteriaArgumentRequired, :gt if criterion.nil?
|
|
281
260
|
|
|
282
|
-
and_with_operator(criterion,
|
|
261
|
+
and_with_operator(criterion, '$gt')
|
|
283
262
|
end
|
|
284
|
-
key :gt, :override,
|
|
263
|
+
key :gt, :override, '$gt'
|
|
285
264
|
|
|
286
265
|
# Add the $gte criterion to the selector.
|
|
287
266
|
#
|
|
@@ -295,13 +274,11 @@ module Mongoid
|
|
|
295
274
|
#
|
|
296
275
|
# @return [ Selectable ] The cloned selectable.
|
|
297
276
|
def gte(criterion)
|
|
298
|
-
if criterion.nil?
|
|
299
|
-
raise Errors::CriteriaArgumentRequired, :gte
|
|
300
|
-
end
|
|
277
|
+
raise Errors::CriteriaArgumentRequired, :gte if criterion.nil?
|
|
301
278
|
|
|
302
|
-
and_with_operator(criterion,
|
|
279
|
+
and_with_operator(criterion, '$gte')
|
|
303
280
|
end
|
|
304
|
-
key :gte, :override,
|
|
281
|
+
key :gte, :override, '$gte'
|
|
305
282
|
|
|
306
283
|
# Adds the $in selection to the selectable.
|
|
307
284
|
#
|
|
@@ -318,26 +295,22 @@ module Mongoid
|
|
|
318
295
|
#
|
|
319
296
|
# @return [ Selectable ] The cloned selectable.
|
|
320
297
|
def in(condition)
|
|
321
|
-
if condition.nil?
|
|
322
|
-
raise Errors::CriteriaArgumentRequired, :in
|
|
323
|
-
end
|
|
298
|
+
raise Errors::CriteriaArgumentRequired, :in if condition.nil?
|
|
324
299
|
|
|
325
300
|
condition = expand_condition_to_array_values(condition)
|
|
326
301
|
|
|
327
302
|
if strategy
|
|
328
|
-
send(strategy, condition,
|
|
303
|
+
send(strategy, condition, '$in')
|
|
329
304
|
else
|
|
330
305
|
condition.inject(clone) do |query, (field, value)|
|
|
331
|
-
v = {'$in' => value}
|
|
332
|
-
if negating?
|
|
333
|
-
v = {'$not' => v}
|
|
334
|
-
end
|
|
306
|
+
v = { '$in' => value }
|
|
307
|
+
v = { '$not' => v } if negating?
|
|
335
308
|
query.add_field_expression(field.to_s, v)
|
|
336
309
|
end.reset_strategies!
|
|
337
310
|
end
|
|
338
311
|
end
|
|
339
|
-
alias
|
|
340
|
-
key :in, :intersect,
|
|
312
|
+
alias any_in in
|
|
313
|
+
key :in, :intersect, '$in'
|
|
341
314
|
|
|
342
315
|
# Add the $lt criterion to the selector.
|
|
343
316
|
#
|
|
@@ -351,13 +324,11 @@ module Mongoid
|
|
|
351
324
|
#
|
|
352
325
|
# @return [ Selectable ] The cloned selectable.
|
|
353
326
|
def lt(criterion)
|
|
354
|
-
if criterion.nil?
|
|
355
|
-
raise Errors::CriteriaArgumentRequired, :lt
|
|
356
|
-
end
|
|
327
|
+
raise Errors::CriteriaArgumentRequired, :lt if criterion.nil?
|
|
357
328
|
|
|
358
|
-
and_with_operator(criterion,
|
|
329
|
+
and_with_operator(criterion, '$lt')
|
|
359
330
|
end
|
|
360
|
-
key :lt, :override,
|
|
331
|
+
key :lt, :override, '$lt'
|
|
361
332
|
|
|
362
333
|
# Add the $lte criterion to the selector.
|
|
363
334
|
#
|
|
@@ -371,13 +342,11 @@ module Mongoid
|
|
|
371
342
|
#
|
|
372
343
|
# @return [ Selectable ] The cloned selectable.
|
|
373
344
|
def lte(criterion)
|
|
374
|
-
if criterion.nil?
|
|
375
|
-
raise Errors::CriteriaArgumentRequired, :lte
|
|
376
|
-
end
|
|
345
|
+
raise Errors::CriteriaArgumentRequired, :lte if criterion.nil?
|
|
377
346
|
|
|
378
|
-
and_with_operator(criterion,
|
|
347
|
+
and_with_operator(criterion, '$lte')
|
|
379
348
|
end
|
|
380
|
-
key :lte, :override,
|
|
349
|
+
key :lte, :override, '$lte'
|
|
381
350
|
|
|
382
351
|
# Add a $maxDistance selection to the selectable.
|
|
383
352
|
#
|
|
@@ -388,12 +357,10 @@ module Mongoid
|
|
|
388
357
|
#
|
|
389
358
|
# @return [ Selectable ] The cloned selectable.
|
|
390
359
|
def max_distance(criterion)
|
|
391
|
-
if criterion.nil?
|
|
392
|
-
raise Errors::CriteriaArgumentRequired, :max_distance
|
|
393
|
-
end
|
|
360
|
+
raise Errors::CriteriaArgumentRequired, :max_distance if criterion.nil?
|
|
394
361
|
|
|
395
362
|
# $maxDistance must be given together with $near
|
|
396
|
-
__add__(criterion,
|
|
363
|
+
__add__(criterion, '$maxDistance')
|
|
397
364
|
end
|
|
398
365
|
|
|
399
366
|
# Adds $mod selection to the selectable.
|
|
@@ -408,13 +375,11 @@ module Mongoid
|
|
|
408
375
|
#
|
|
409
376
|
# @return [ Selectable ] The cloned selectable.
|
|
410
377
|
def mod(criterion)
|
|
411
|
-
if criterion.nil?
|
|
412
|
-
raise Errors::CriteriaArgumentRequired, :mod
|
|
413
|
-
end
|
|
378
|
+
raise Errors::CriteriaArgumentRequired, :mod if criterion.nil?
|
|
414
379
|
|
|
415
|
-
and_with_operator(criterion,
|
|
380
|
+
and_with_operator(criterion, '$mod')
|
|
416
381
|
end
|
|
417
|
-
key :mod, :override,
|
|
382
|
+
key :mod, :override, '$mod'
|
|
418
383
|
|
|
419
384
|
# Adds $ne selection to the selectable.
|
|
420
385
|
#
|
|
@@ -428,14 +393,12 @@ module Mongoid
|
|
|
428
393
|
#
|
|
429
394
|
# @return [ Selectable ] The cloned selectable.
|
|
430
395
|
def ne(criterion)
|
|
431
|
-
if criterion.nil?
|
|
432
|
-
raise Errors::CriteriaArgumentRequired, :ne
|
|
433
|
-
end
|
|
396
|
+
raise Errors::CriteriaArgumentRequired, :ne if criterion.nil?
|
|
434
397
|
|
|
435
|
-
and_with_operator(criterion,
|
|
398
|
+
and_with_operator(criterion, '$ne')
|
|
436
399
|
end
|
|
437
|
-
alias
|
|
438
|
-
key :ne, :override,
|
|
400
|
+
alias excludes ne
|
|
401
|
+
key :ne, :override, '$ne'
|
|
439
402
|
|
|
440
403
|
# Adds a $near criterion to a geo selection.
|
|
441
404
|
#
|
|
@@ -449,13 +412,11 @@ module Mongoid
|
|
|
449
412
|
#
|
|
450
413
|
# @return [ Selectable ] The cloned selectable.
|
|
451
414
|
def near(criterion)
|
|
452
|
-
if criterion.nil?
|
|
453
|
-
raise Errors::CriteriaArgumentRequired, :near
|
|
454
|
-
end
|
|
415
|
+
raise Errors::CriteriaArgumentRequired, :near if criterion.nil?
|
|
455
416
|
|
|
456
|
-
and_with_operator(criterion,
|
|
417
|
+
and_with_operator(criterion, '$near')
|
|
457
418
|
end
|
|
458
|
-
key :near, :override,
|
|
419
|
+
key :near, :override, '$near'
|
|
459
420
|
|
|
460
421
|
# Adds a $nearSphere criterion to a geo selection.
|
|
461
422
|
#
|
|
@@ -469,13 +430,11 @@ module Mongoid
|
|
|
469
430
|
#
|
|
470
431
|
# @return [ Selectable ] The cloned selectable.
|
|
471
432
|
def near_sphere(criterion)
|
|
472
|
-
if criterion.nil?
|
|
473
|
-
raise Errors::CriteriaArgumentRequired, :near_sphere
|
|
474
|
-
end
|
|
433
|
+
raise Errors::CriteriaArgumentRequired, :near_sphere if criterion.nil?
|
|
475
434
|
|
|
476
|
-
and_with_operator(criterion,
|
|
435
|
+
and_with_operator(criterion, '$nearSphere')
|
|
477
436
|
end
|
|
478
|
-
key :near_sphere, :override,
|
|
437
|
+
key :near_sphere, :override, '$nearSphere'
|
|
479
438
|
|
|
480
439
|
# Adds the $nin selection to the selectable.
|
|
481
440
|
#
|
|
@@ -492,26 +451,22 @@ module Mongoid
|
|
|
492
451
|
#
|
|
493
452
|
# @return [ Selectable ] The cloned selectable.
|
|
494
453
|
def nin(condition)
|
|
495
|
-
if condition.nil?
|
|
496
|
-
raise Errors::CriteriaArgumentRequired, :nin
|
|
497
|
-
end
|
|
454
|
+
raise Errors::CriteriaArgumentRequired, :nin if condition.nil?
|
|
498
455
|
|
|
499
456
|
condition = expand_condition_to_array_values(condition)
|
|
500
457
|
|
|
501
458
|
if strategy
|
|
502
|
-
send(strategy, condition,
|
|
459
|
+
send(strategy, condition, '$nin')
|
|
503
460
|
else
|
|
504
461
|
condition.inject(clone) do |query, (field, value)|
|
|
505
|
-
v = {'$nin' => value}
|
|
506
|
-
if negating?
|
|
507
|
-
v = {'$not' => v}
|
|
508
|
-
end
|
|
462
|
+
v = { '$nin' => value }
|
|
463
|
+
v = { '$not' => v } if negating?
|
|
509
464
|
query.add_field_expression(field.to_s, v)
|
|
510
465
|
end.reset_strategies!
|
|
511
466
|
end
|
|
512
467
|
end
|
|
513
|
-
alias
|
|
514
|
-
key :nin, :intersect,
|
|
468
|
+
alias not_in nin
|
|
469
|
+
key :nin, :intersect, '$nin'
|
|
515
470
|
|
|
516
471
|
# Adds $nor selection to the selectable.
|
|
517
472
|
#
|
|
@@ -536,16 +491,16 @@ module Mongoid
|
|
|
536
491
|
!!negating
|
|
537
492
|
end
|
|
538
493
|
|
|
539
|
-
# Negate the arguments
|
|
540
|
-
#
|
|
541
|
-
# @example Negate the next selection.
|
|
542
|
-
# selectable.not.in(field: [ 1, 2 ])
|
|
494
|
+
# Negate the arguments.
|
|
543
495
|
#
|
|
544
496
|
# @example Add the $not criterion.
|
|
545
|
-
#
|
|
497
|
+
# Person.not(name: /Bob/)
|
|
546
498
|
#
|
|
547
499
|
# @example Execute a $not in a where query.
|
|
548
|
-
#
|
|
500
|
+
# Person.where(:name.not => /Bob/)
|
|
501
|
+
#
|
|
502
|
+
# @example Negate a Criteria instance
|
|
503
|
+
# Person.not(Person.where(...))
|
|
549
504
|
#
|
|
550
505
|
# @param [ [ Hash | Criteria ]... ] *criteria The key/value pair
|
|
551
506
|
# matches or Criteria objects to negate.
|
|
@@ -553,34 +508,38 @@ module Mongoid
|
|
|
553
508
|
# @return [ Selectable ] The new selectable.
|
|
554
509
|
def not(*criteria)
|
|
555
510
|
if criteria.empty?
|
|
511
|
+
# @deprecated
|
|
512
|
+
Mongoid.deprecation_warning(
|
|
513
|
+
:not_sans_arguments,
|
|
514
|
+
'Calling `#not` without arguments is deprecated, and will be ' \
|
|
515
|
+
'removed in the next major version. Instead, pass the Hash or ' \
|
|
516
|
+
'Criteria instance to negate.',
|
|
517
|
+
caller_locations
|
|
518
|
+
)
|
|
556
519
|
dup.tap { |query| query.negating = !query.negating }
|
|
557
520
|
else
|
|
558
|
-
criteria.compact.inject(
|
|
559
|
-
if new_s.is_a?(Selectable)
|
|
560
|
-
new_s = new_s.selector
|
|
561
|
-
end
|
|
521
|
+
criteria.compact.inject(clone) do |c, new_s|
|
|
522
|
+
new_s = new_s.selector if new_s.is_a?(Selectable)
|
|
562
523
|
_mongoid_expand_keys(new_s).each do |k, v|
|
|
563
524
|
k = k.to_s
|
|
564
525
|
if c.selector[k] || k.start_with?('$')
|
|
565
|
-
c = c.send(:__multi__, [{'$nor' => [{k => v}]}], '$and')
|
|
526
|
+
c = c.send(:__multi__, [ { '$nor' => [ { k => v } ] } ], '$and')
|
|
527
|
+
elsif v.is_a?(Hash)
|
|
528
|
+
c = c.send(:__multi__, [ { '$nor' => [ { k => v } ] } ], '$and')
|
|
566
529
|
else
|
|
567
|
-
if v.is_a?(
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
negated_operator = '$ne'
|
|
574
|
-
end
|
|
575
|
-
c = c.send(:__override__, {k => v}, negated_operator)
|
|
576
|
-
end
|
|
530
|
+
negated_operator = if v.is_a?(Regexp)
|
|
531
|
+
'$not'
|
|
532
|
+
else
|
|
533
|
+
'$ne'
|
|
534
|
+
end
|
|
535
|
+
c = c.send(:__override__, { k => v }, negated_operator)
|
|
577
536
|
end
|
|
578
537
|
end
|
|
579
538
|
c
|
|
580
539
|
end
|
|
581
540
|
end
|
|
582
541
|
end
|
|
583
|
-
key :not, :override,
|
|
542
|
+
key :not, :override, '$not'
|
|
584
543
|
|
|
585
544
|
# Negate the arguments, constraining the query to only those documents
|
|
586
545
|
# that do NOT match the arguments.
|
|
@@ -604,8 +563,8 @@ module Mongoid
|
|
|
604
563
|
|
|
605
564
|
exprs = criteria.map do |criterion|
|
|
606
565
|
_mongoid_expand_keys(
|
|
607
|
-
|
|
608
|
-
|
|
566
|
+
criterion.is_a?(Selectable) ? criterion.selector : criterion
|
|
567
|
+
)
|
|
609
568
|
end
|
|
610
569
|
|
|
611
570
|
self.and('$nor' => exprs)
|
|
@@ -690,9 +649,9 @@ module Mongoid
|
|
|
690
649
|
else
|
|
691
650
|
Hash[criterion.map do |k, v|
|
|
692
651
|
if k.is_a?(Symbol)
|
|
693
|
-
[k.to_s, v]
|
|
652
|
+
[ k.to_s, v ]
|
|
694
653
|
else
|
|
695
|
-
[k, v]
|
|
654
|
+
[ k, v ]
|
|
696
655
|
end
|
|
697
656
|
end]
|
|
698
657
|
end
|
|
@@ -716,15 +675,13 @@ module Mongoid
|
|
|
716
675
|
#
|
|
717
676
|
# @return [ Selectable ] The cloned selectable.
|
|
718
677
|
def with_size(criterion)
|
|
719
|
-
if criterion.nil?
|
|
720
|
-
raise Errors::CriteriaArgumentRequired, :with_size
|
|
721
|
-
end
|
|
678
|
+
raise Errors::CriteriaArgumentRequired, :with_size if criterion.nil?
|
|
722
679
|
|
|
723
|
-
typed_override(criterion,
|
|
680
|
+
typed_override(criterion, '$size') do |value|
|
|
724
681
|
::Integer.evolve(value)
|
|
725
682
|
end
|
|
726
683
|
end
|
|
727
|
-
key :with_size, :override,
|
|
684
|
+
key :with_size, :override, '$size' do |value|
|
|
728
685
|
::Integer.evolve(value)
|
|
729
686
|
end
|
|
730
687
|
|
|
@@ -742,15 +699,13 @@ module Mongoid
|
|
|
742
699
|
#
|
|
743
700
|
# @return [ Selectable ] The cloned selectable.
|
|
744
701
|
def with_type(criterion)
|
|
745
|
-
if criterion.nil?
|
|
746
|
-
raise Errors::CriteriaArgumentRequired, :with_type
|
|
747
|
-
end
|
|
702
|
+
raise Errors::CriteriaArgumentRequired, :with_type if criterion.nil?
|
|
748
703
|
|
|
749
|
-
typed_override(criterion,
|
|
704
|
+
typed_override(criterion, '$type') do |value|
|
|
750
705
|
::Integer.evolve(value)
|
|
751
706
|
end
|
|
752
707
|
end
|
|
753
|
-
key :with_type, :override,
|
|
708
|
+
key :with_type, :override, '$type' do |value|
|
|
754
709
|
::Integer.evolve(value)
|
|
755
710
|
end
|
|
756
711
|
|
|
@@ -774,12 +729,10 @@ module Mongoid
|
|
|
774
729
|
#
|
|
775
730
|
# @return [ Selectable ] The cloned selectable.
|
|
776
731
|
def text_search(terms, opts = nil)
|
|
777
|
-
if terms.nil?
|
|
778
|
-
raise Errors::CriteriaArgumentRequired, :terms
|
|
779
|
-
end
|
|
732
|
+
raise Errors::CriteriaArgumentRequired, :terms if terms.nil?
|
|
780
733
|
|
|
781
734
|
clone.tap do |query|
|
|
782
|
-
criterion = {'$text' => { '$search' => terms }}
|
|
735
|
+
criterion = { '$text' => { '$search' => terms } }
|
|
783
736
|
criterion['$text'].merge!(opts) if opts
|
|
784
737
|
if query.selector['$text']
|
|
785
738
|
# Per https://www.mongodb.com/docs/manual/reference/operator/query/text/
|
|
@@ -788,7 +741,7 @@ module Mongoid
|
|
|
788
741
|
# overwriting previous text search condition with the currently
|
|
789
742
|
# given one.
|
|
790
743
|
Mongoid.logger.warn('Multiple $text expressions per query are not currently supported by the server')
|
|
791
|
-
query.selector = {'$and' => [query.selector]}.merge(criterion)
|
|
744
|
+
query.selector = { '$and' => [ query.selector ] }.merge(criterion)
|
|
792
745
|
else
|
|
793
746
|
query.selector = query.selector.merge(criterion)
|
|
794
747
|
end
|
|
@@ -810,10 +763,10 @@ module Mongoid
|
|
|
810
763
|
#
|
|
811
764
|
# @return [ Selectable ] The cloned selectable.
|
|
812
765
|
def where(*criteria)
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
766
|
+
return clone.reset_strategies! if criteria.empty?
|
|
767
|
+
|
|
768
|
+
criteria.inject(self) do |query, criterion|
|
|
769
|
+
raise Errors::CriteriaArgumentRequired, :where if criterion.nil?
|
|
817
770
|
|
|
818
771
|
# We need to save the criterion in an instance variable so
|
|
819
772
|
# Modifiable methods know how to create a polymorphic object.
|
|
@@ -823,14 +776,31 @@ module Mongoid
|
|
|
823
776
|
# only ever specify one criterion to #where.
|
|
824
777
|
@criterion = criterion
|
|
825
778
|
if criterion.is_a?(String)
|
|
826
|
-
|
|
779
|
+
unless Mongoid.allow_unsafe_query_operators?
|
|
780
|
+
raise Errors::InvalidQuery,
|
|
781
|
+
"String criteria are not allowed because they compile to the '$where' operator, " \
|
|
782
|
+
'which is not allowed in a query expression. Set Mongoid.allow_unsafe_query_operators = true ' \
|
|
783
|
+
'to permit all operators.'
|
|
784
|
+
end
|
|
785
|
+
query.js_query(criterion)
|
|
827
786
|
else
|
|
828
|
-
expr_query(criterion)
|
|
787
|
+
query.expr_query(criterion)
|
|
829
788
|
end
|
|
830
|
-
end
|
|
789
|
+
end
|
|
831
790
|
end
|
|
832
791
|
|
|
833
|
-
|
|
792
|
+
# Operators permitted at the top level of a query expression without
|
|
793
|
+
# opt-in. Excludes $where (JS execution) and other operators not needed
|
|
794
|
+
# for ordinary application queries.
|
|
795
|
+
ALLOWED_QUERY_OPERATORS = %w[
|
|
796
|
+
$and $or $nor $not $text $comment $expr $jsonSchema $alwaysFalse $alwaysTrue
|
|
797
|
+
].freeze
|
|
798
|
+
|
|
799
|
+
# Operators that execute server-side JavaScript. These are rejected at
|
|
800
|
+
# any depth, not just at the top level: the allowlist above permits
|
|
801
|
+
# $expr and the logical operators, and their values are arbitrary
|
|
802
|
+
# nested expressions that can carry $function or $where.
|
|
803
|
+
JAVASCRIPT_QUERY_OPERATORS = %w[$where $function $accumulator].freeze
|
|
834
804
|
|
|
835
805
|
# Adds the specified expression to the query.
|
|
836
806
|
#
|
|
@@ -850,19 +820,18 @@ module Mongoid
|
|
|
850
820
|
# @return [ Selectable ] The cloned selectable.
|
|
851
821
|
# @api private
|
|
852
822
|
def expr_query(criterion)
|
|
853
|
-
if criterion.nil?
|
|
854
|
-
|
|
855
|
-
end
|
|
856
|
-
unless Hash === criterion
|
|
823
|
+
raise ArgumentError, 'Criterion cannot be nil here' if criterion.nil?
|
|
824
|
+
unless criterion.is_a?(Hash)
|
|
857
825
|
raise Errors::InvalidQuery, "Expression must be a Hash: #{Errors::InvalidQuery.truncate_expr(criterion)}"
|
|
858
826
|
end
|
|
859
827
|
|
|
828
|
+
# The operator guard is applied by _mongoid_expand_keys, which every
|
|
829
|
+
# query method that accepts a user-supplied expression passes through.
|
|
860
830
|
normalized = _mongoid_expand_keys(criterion)
|
|
861
831
|
clone.tap do |query|
|
|
862
832
|
normalized.each do |field, value|
|
|
863
833
|
field_s = field.to_s
|
|
864
834
|
if field_s.start_with?('$')
|
|
865
|
-
# Query expression-level operator, like $and or $where
|
|
866
835
|
query.add_operator_expression(field_s, value)
|
|
867
836
|
else
|
|
868
837
|
query.add_field_expression(field, value)
|
|
@@ -872,25 +841,6 @@ module Mongoid
|
|
|
872
841
|
end
|
|
873
842
|
end
|
|
874
843
|
|
|
875
|
-
# Force the values of the criterion to be evolved.
|
|
876
|
-
#
|
|
877
|
-
# @api private
|
|
878
|
-
#
|
|
879
|
-
# @example Force values to booleans.
|
|
880
|
-
# selectable.force_typing(criterion) do |val|
|
|
881
|
-
# Boolean.evolve(val)
|
|
882
|
-
# end
|
|
883
|
-
#
|
|
884
|
-
# @param [ Hash ] criterion The criterion.
|
|
885
|
-
def typed_override(criterion, operator)
|
|
886
|
-
if criterion
|
|
887
|
-
criterion.transform_values! do |value|
|
|
888
|
-
yield(value)
|
|
889
|
-
end
|
|
890
|
-
end
|
|
891
|
-
__override__(criterion, operator)
|
|
892
|
-
end
|
|
893
|
-
|
|
894
844
|
# Create a javascript selection.
|
|
895
845
|
#
|
|
896
846
|
# @api private
|
|
@@ -905,7 +855,7 @@ module Mongoid
|
|
|
905
855
|
clone.tap do |query|
|
|
906
856
|
if negating?
|
|
907
857
|
query.add_operator_expression('$and',
|
|
908
|
-
|
|
858
|
+
[ { '$nor' => [ { '$where' => criterion } ] } ])
|
|
909
859
|
else
|
|
910
860
|
query.add_operator_expression('$where', criterion)
|
|
911
861
|
end
|
|
@@ -913,6 +863,111 @@ module Mongoid
|
|
|
913
863
|
end
|
|
914
864
|
end
|
|
915
865
|
|
|
866
|
+
private
|
|
867
|
+
|
|
868
|
+
# Enforces the operator rules governed by the
|
|
869
|
+
# +allow_unsafe_query_operators+ configuration option against a
|
|
870
|
+
# normalized query expression.
|
|
871
|
+
#
|
|
872
|
+
# Two rules apply, and both are skipped when the option is true:
|
|
873
|
+
#
|
|
874
|
+
# - An operator at the top level of the expression must appear in
|
|
875
|
+
# ALLOWED_QUERY_OPERATORS.
|
|
876
|
+
# - An operator in JAVASCRIPT_QUERY_OPERATORS is rejected at any depth.
|
|
877
|
+
#
|
|
878
|
+
# This is called from #_mongoid_expand_keys rather than from the
|
|
879
|
+
# individual query methods, because that is the one point every query
|
|
880
|
+
# method taking a user-supplied expression passes through on its way to
|
|
881
|
+
# the selector.
|
|
882
|
+
#
|
|
883
|
+
# It deliberately does not cover the APIs that ask for JavaScript
|
|
884
|
+
# outright, such as #js_query and Criteria#for_js: there the developer
|
|
885
|
+
# has chosen server-side JavaScript, so there is nothing to guard
|
|
886
|
+
# against. The same goes for the low-level Storable methods
|
|
887
|
+
# (#add_field_expression, #add_operator_expression), which write to the
|
|
888
|
+
# selector directly.
|
|
889
|
+
#
|
|
890
|
+
# @param [ Hash ] expr A normalized query expression.
|
|
891
|
+
#
|
|
892
|
+
# @raise [ Errors::InvalidQuery ] If a disallowed operator is present.
|
|
893
|
+
#
|
|
894
|
+
# @api private
|
|
895
|
+
def _mongoid_validate_operators!(expr)
|
|
896
|
+
return if Mongoid.allow_unsafe_query_operators?
|
|
897
|
+
|
|
898
|
+
expr.each_key do |field|
|
|
899
|
+
field_s = field.to_s
|
|
900
|
+
next unless field_s.start_with?('$')
|
|
901
|
+
next if ALLOWED_QUERY_OPERATORS.include?(field_s)
|
|
902
|
+
|
|
903
|
+
raise Errors::InvalidQuery,
|
|
904
|
+
"Operator '#{field_s}' is not allowed in a query expression. " \
|
|
905
|
+
'Set Mongoid.allow_unsafe_query_operators = true to permit all operators.'
|
|
906
|
+
end
|
|
907
|
+
|
|
908
|
+
_mongoid_validate_no_javascript!(expr)
|
|
909
|
+
end
|
|
910
|
+
|
|
911
|
+
# Walks a query expression looking for operators that execute
|
|
912
|
+
# server-side JavaScript, descending through both hashes and arrays so
|
|
913
|
+
# that nested forms such as {'$expr' => {'$function' => ...}} and
|
|
914
|
+
# {'$or' => [ {'$where' => ...} ]} are caught.
|
|
915
|
+
#
|
|
916
|
+
# The walk does not distinguish operator position from value position,
|
|
917
|
+
# so it also rejects queries where a JavaScript operator name appears as
|
|
918
|
+
# data rather than as an operator. Server 5.0+ permits $-prefixed field
|
|
919
|
+
# names in stored documents, which makes this reachable:
|
|
920
|
+
#
|
|
921
|
+
# Doc.where(payload: { '$eq' => { '$function' => 'abc' } })
|
|
922
|
+
#
|
|
923
|
+
# Here the $eq marks its argument as a literal value to compare, so the
|
|
924
|
+
# server never evaluates it, but the guard raises anyway. The only
|
|
925
|
+
# workaround today is the global allow_unsafe_query_operators flag.
|
|
926
|
+
#
|
|
927
|
+
# TODO: discuss whether to track operator position (skipping the subtree
|
|
928
|
+
# under $eq, $ne, $in, $nin, and $elemMatch values) in a future
|
|
929
|
+
# iteration. It removes the false positive but adds exactly the kind of
|
|
930
|
+
# state that a real bypass could hide in, so it was left out for now.
|
|
931
|
+
#
|
|
932
|
+
# @param [ Object ] object A fragment of a query expression.
|
|
933
|
+
#
|
|
934
|
+
# @raise [ Errors::InvalidQuery ] If a JavaScript operator is present.
|
|
935
|
+
#
|
|
936
|
+
# @api private
|
|
937
|
+
def _mongoid_validate_no_javascript!(object)
|
|
938
|
+
case object
|
|
939
|
+
when Hash
|
|
940
|
+
object.each do |key, value|
|
|
941
|
+
key_s = key.to_s
|
|
942
|
+
if JAVASCRIPT_QUERY_OPERATORS.include?(key_s)
|
|
943
|
+
raise Errors::InvalidQuery,
|
|
944
|
+
"Operator '#{key_s}' executes server-side JavaScript and is not allowed " \
|
|
945
|
+
'anywhere in a query expression. Set Mongoid.allow_unsafe_query_operators = true ' \
|
|
946
|
+
'to permit all operators.'
|
|
947
|
+
end
|
|
948
|
+
|
|
949
|
+
_mongoid_validate_no_javascript!(value)
|
|
950
|
+
end
|
|
951
|
+
when Array
|
|
952
|
+
object.each { |value| _mongoid_validate_no_javascript!(value) }
|
|
953
|
+
end
|
|
954
|
+
end
|
|
955
|
+
|
|
956
|
+
# Force the values of the criterion to be evolved.
|
|
957
|
+
#
|
|
958
|
+
# @api private
|
|
959
|
+
#
|
|
960
|
+
# @example Force values to booleans.
|
|
961
|
+
# selectable.force_typing(criterion) do |val|
|
|
962
|
+
# Boolean.evolve(val)
|
|
963
|
+
# end
|
|
964
|
+
#
|
|
965
|
+
# @param [ Hash ] criterion The criterion.
|
|
966
|
+
def typed_override(criterion, operator, &block)
|
|
967
|
+
criterion.transform_values!(&block) if criterion
|
|
968
|
+
__override__(criterion, operator)
|
|
969
|
+
end
|
|
970
|
+
|
|
916
971
|
# Take the provided criterion and store it as a selection in the query
|
|
917
972
|
# selector.
|
|
918
973
|
#
|
|
@@ -935,7 +990,6 @@ module Mongoid
|
|
|
935
990
|
end
|
|
936
991
|
|
|
937
992
|
class << self
|
|
938
|
-
|
|
939
993
|
# Get the methods on the selectable that can be forwarded to from a model.
|
|
940
994
|
#
|
|
941
995
|
# @example Get the forwardable methods.
|
|
@@ -944,7 +998,7 @@ module Mongoid
|
|
|
944
998
|
# @return [ Array<Symbol> ] The names of the forwardable methods.
|
|
945
999
|
def forwardables
|
|
946
1000
|
public_instance_methods(false) -
|
|
947
|
-
[
|
|
1001
|
+
%i[negating negating= negating? selector selector=]
|
|
948
1002
|
end
|
|
949
1003
|
end
|
|
950
1004
|
end
|