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,13 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
module Mongoid
|
|
5
4
|
module Persistable
|
|
6
|
-
|
|
7
5
|
# Defines behavior for persistence operations that update existing
|
|
8
6
|
# documents.
|
|
9
7
|
module Updatable
|
|
10
|
-
|
|
11
8
|
# Update a single attribute and persist the entire document.
|
|
12
9
|
# This skips validation but fires the callbacks.
|
|
13
10
|
#
|
|
@@ -22,7 +19,7 @@ module Mongoid
|
|
|
22
19
|
#
|
|
23
20
|
# @return [ true | false ] True if save was successful, false if not.
|
|
24
21
|
def update_attribute(name, value)
|
|
25
|
-
as_writable_attribute!(name, value) do |
|
|
22
|
+
as_writable_attribute!(name, value) do |_access|
|
|
26
23
|
normalized = name.to_s
|
|
27
24
|
process_attribute(normalized, value)
|
|
28
25
|
save(validate: false)
|
|
@@ -41,7 +38,7 @@ module Mongoid
|
|
|
41
38
|
assign_attributes(attributes)
|
|
42
39
|
save
|
|
43
40
|
end
|
|
44
|
-
alias
|
|
41
|
+
alias update_attributes update
|
|
45
42
|
|
|
46
43
|
# Update the document attributes in the database and raise an error if
|
|
47
44
|
# validation failed.
|
|
@@ -63,7 +60,7 @@ module Mongoid
|
|
|
63
60
|
end
|
|
64
61
|
result
|
|
65
62
|
end
|
|
66
|
-
alias
|
|
63
|
+
alias update_attributes! update!
|
|
67
64
|
|
|
68
65
|
private
|
|
69
66
|
|
|
@@ -98,13 +95,15 @@ module Mongoid
|
|
|
98
95
|
# @return [ true | false ] The result of the update.
|
|
99
96
|
def prepare_update(options = {})
|
|
100
97
|
raise Errors::ReadonlyDocument.new(self.class) if readonly? && !Mongoid.legacy_readonly
|
|
98
|
+
|
|
101
99
|
enforce_immutability_of_id_field!
|
|
102
100
|
ensure_client_compatibility!
|
|
103
101
|
return false if performing_validations?(options) &&
|
|
104
|
-
|
|
102
|
+
invalid?(options[:context] || :update)
|
|
103
|
+
|
|
105
104
|
process_flagged_destroys
|
|
106
105
|
update_children = cascadable_children(:update)
|
|
107
|
-
process_touch_option(options
|
|
106
|
+
process_touch_option(options) do
|
|
108
107
|
run_all_callbacks_for_update(update_children) do
|
|
109
108
|
result = yield(self)
|
|
110
109
|
self.previously_new_record = false
|
|
@@ -140,12 +139,11 @@ module Mongoid
|
|
|
140
139
|
# of foo.0.bars while adding another foo. Each conflicting update
|
|
141
140
|
# is applied using its own write.
|
|
142
141
|
conflicts.each_pair do |modifier, changes|
|
|
143
|
-
|
|
144
142
|
# Group the changes according to their root key which is
|
|
145
143
|
# the top-level association name.
|
|
146
144
|
# This handles at least the cases described in MONGOID-4982.
|
|
147
145
|
conflicting_change_groups = changes.group_by do |key, _|
|
|
148
|
-
key.split(
|
|
146
|
+
key.split('.', 2).first
|
|
149
147
|
end.values
|
|
150
148
|
|
|
151
149
|
# Apply changes in batches. Pop one change from each
|
|
@@ -154,7 +152,7 @@ module Mongoid
|
|
|
154
152
|
while batched_changes = conflicting_change_groups.map(&:pop).compact.to_h.presence
|
|
155
153
|
coll.find(selector).update_one(
|
|
156
154
|
positionally(selector, modifier => batched_changes),
|
|
157
|
-
session: _session
|
|
155
|
+
session: _session
|
|
158
156
|
)
|
|
159
157
|
end
|
|
160
158
|
end
|
|
@@ -162,24 +160,22 @@ module Mongoid
|
|
|
162
160
|
end
|
|
163
161
|
end
|
|
164
162
|
|
|
165
|
-
# If there is a touch option and it is false, this method
|
|
166
|
-
#
|
|
167
|
-
#
|
|
168
|
-
#
|
|
163
|
+
# If there is a touch option and it is false, this method suppresses
|
|
164
|
+
# timestamping for the duration of the update using a block-based
|
|
165
|
+
# timeless scope, which covers this document and every cascaded child
|
|
166
|
+
# (at any nesting depth), and also suppresses touch callbacks.
|
|
169
167
|
#
|
|
170
168
|
# @param [ Hash ] options The options.
|
|
171
|
-
# @param [ Array<Document> ] children The children that the :update
|
|
172
|
-
# callbacks will be executed on.
|
|
173
169
|
#
|
|
174
170
|
# @option options [ true | false ] :touch Whether or not the updated_at
|
|
175
171
|
# attribute will be updated with the current time.
|
|
176
|
-
def process_touch_option(options,
|
|
172
|
+
def process_touch_option(options, &block)
|
|
177
173
|
if options.fetch(:touch, true)
|
|
178
174
|
yield
|
|
179
175
|
else
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
176
|
+
Mongoid::Timestamps::Timeless.with_timeless do
|
|
177
|
+
suppress_touch_callbacks(&block)
|
|
178
|
+
end
|
|
183
179
|
end
|
|
184
180
|
end
|
|
185
181
|
|
|
@@ -199,13 +195,10 @@ module Mongoid
|
|
|
199
195
|
# (somehow?) create the address with a nil _id first, before then
|
|
200
196
|
# saving it *again* with the correct _id.
|
|
201
197
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
Mongoid::Warnings.warn_mutable_ids
|
|
207
|
-
end
|
|
208
|
-
end
|
|
198
|
+
return unless _id_changed? && !_id_was.nil? && persisted?
|
|
199
|
+
raise Errors::ImmutableAttribute.new(:_id, _id) if Mongoid::Config.immutable_ids
|
|
200
|
+
|
|
201
|
+
Mongoid::Warnings.warn_mutable_ids
|
|
209
202
|
end
|
|
210
203
|
|
|
211
204
|
# Consolidates all the callback invocations into a single place, to
|
|
@@ -213,22 +206,19 @@ module Mongoid
|
|
|
213
206
|
#
|
|
214
207
|
# @param [ Array<Document> ] update_children The children that the
|
|
215
208
|
# :update callbacks will be executed on.
|
|
216
|
-
def run_all_callbacks_for_update(update_children)
|
|
209
|
+
def run_all_callbacks_for_update(update_children, &block)
|
|
217
210
|
run_callbacks(:commit, with_children: true, skip_if: -> { in_transaction? }) do
|
|
218
211
|
run_callbacks(:save, with_children: false) do
|
|
219
212
|
run_callbacks(:update, with_children: false) do
|
|
220
213
|
run_callbacks(:persist_parent, with_children: false) do
|
|
221
214
|
_mongoid_run_child_callbacks(:save) do
|
|
222
|
-
_mongoid_run_child_callbacks(:update, children: update_children)
|
|
223
|
-
yield
|
|
224
|
-
end # _mongoid_run_child_callbacks :update
|
|
215
|
+
_mongoid_run_child_callbacks(:update, children: update_children, &block) # _mongoid_run_child_callbacks :update
|
|
225
216
|
end # _mongoid_run_child_callbacks :save
|
|
226
217
|
end # :persist_parent
|
|
227
218
|
end # :update
|
|
228
219
|
end # :save
|
|
229
220
|
end # :commit
|
|
230
221
|
end
|
|
231
|
-
|
|
232
222
|
end
|
|
233
223
|
end
|
|
234
224
|
end
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
module Mongoid
|
|
5
4
|
module Persistable
|
|
6
|
-
|
|
7
5
|
# Defines behavior for persistence operations that upsert documents.
|
|
8
6
|
module Upsertable
|
|
9
|
-
|
|
10
7
|
# Perform an upsert of the document. If the document does not exist in the
|
|
11
8
|
# database, then Mongo will insert a new one, otherwise the fields will get
|
|
12
9
|
# overwritten with new values on the existing document.
|
|
@@ -36,18 +33,18 @@ module Mongoid
|
|
|
36
33
|
def upsert(options = {})
|
|
37
34
|
prepare_upsert(options) do
|
|
38
35
|
if options[:replace]
|
|
39
|
-
if options[:set_on_insert]
|
|
40
|
-
raise ArgumentError, "cannot specify :set_on_insert with `replace: true`"
|
|
41
|
-
end
|
|
36
|
+
raise ArgumentError, 'cannot specify :set_on_insert with `replace: true`' if options[:set_on_insert]
|
|
42
37
|
|
|
43
38
|
collection.find(atomic_selector).replace_one(
|
|
44
|
-
as_attributes, upsert: true, session: _session
|
|
39
|
+
as_attributes, upsert: true, session: _session
|
|
40
|
+
)
|
|
45
41
|
else
|
|
46
|
-
attrs = {
|
|
47
|
-
attrs[
|
|
42
|
+
attrs = { '$set' => as_attributes }
|
|
43
|
+
attrs['$setOnInsert'] = options[:set_on_insert] if options[:set_on_insert]
|
|
48
44
|
|
|
49
45
|
collection.find(atomic_selector).update_one(
|
|
50
|
-
attrs, upsert: true, session: _session
|
|
46
|
+
attrs, upsert: true, session: _session
|
|
47
|
+
)
|
|
51
48
|
end
|
|
52
49
|
end
|
|
53
50
|
end
|
|
@@ -71,6 +68,7 @@ module Mongoid
|
|
|
71
68
|
def prepare_upsert(options = {})
|
|
72
69
|
raise Errors::ReadonlyDocument.new(self.class) if readonly? && !Mongoid.legacy_readonly
|
|
73
70
|
return false if performing_validations?(options) && invalid?(:upsert)
|
|
71
|
+
|
|
74
72
|
result = run_callbacks(:upsert) do
|
|
75
73
|
yield(self)
|
|
76
74
|
true
|
data/lib/mongoid/persistable.rb
CHANGED
|
@@ -1,26 +1,24 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
|
-
require
|
|
5
|
-
require
|
|
6
|
-
require
|
|
7
|
-
require
|
|
8
|
-
require
|
|
9
|
-
require
|
|
10
|
-
require
|
|
11
|
-
require
|
|
12
|
-
require
|
|
13
|
-
require
|
|
14
|
-
require
|
|
15
|
-
require
|
|
16
|
-
require
|
|
17
|
-
require
|
|
18
|
-
require
|
|
19
|
-
require
|
|
20
|
-
require
|
|
3
|
+
require 'mongoid/persistable/creatable'
|
|
4
|
+
require 'mongoid/persistable/deletable'
|
|
5
|
+
require 'mongoid/persistable/destroyable'
|
|
6
|
+
require 'mongoid/persistable/incrementable'
|
|
7
|
+
require 'mongoid/persistable/logical'
|
|
8
|
+
require 'mongoid/persistable/maxable'
|
|
9
|
+
require 'mongoid/persistable/minable'
|
|
10
|
+
require 'mongoid/persistable/multipliable'
|
|
11
|
+
require 'mongoid/persistable/poppable'
|
|
12
|
+
require 'mongoid/persistable/pullable'
|
|
13
|
+
require 'mongoid/persistable/pushable'
|
|
14
|
+
require 'mongoid/persistable/renamable'
|
|
15
|
+
require 'mongoid/persistable/savable'
|
|
16
|
+
require 'mongoid/persistable/settable'
|
|
17
|
+
require 'mongoid/persistable/updatable'
|
|
18
|
+
require 'mongoid/persistable/upsertable'
|
|
19
|
+
require 'mongoid/persistable/unsettable'
|
|
21
20
|
|
|
22
21
|
module Mongoid
|
|
23
|
-
|
|
24
22
|
# Contains general behavior for persistence operations.
|
|
25
23
|
module Persistable
|
|
26
24
|
extend ActiveSupport::Concern
|
|
@@ -44,7 +42,7 @@ module Mongoid
|
|
|
44
42
|
include Unsettable
|
|
45
43
|
|
|
46
44
|
# The atomic operations that deal with arrays or sets in the db.
|
|
47
|
-
LIST_OPERATIONS = [
|
|
45
|
+
LIST_OPERATIONS = [ '$addToSet', '$push', '$pull', '$pullAll' ].freeze
|
|
48
46
|
|
|
49
47
|
# Execute operations atomically (in a single database call) for everything
|
|
50
48
|
# that would happen inside the block. This method supports nesting further
|
|
@@ -174,9 +172,7 @@ module Mongoid
|
|
|
174
172
|
def post_process_persist(result, options = {})
|
|
175
173
|
post_persist unless result == false
|
|
176
174
|
errors.clear unless performing_validations?(options)
|
|
177
|
-
if in_transaction?
|
|
178
|
-
Threaded.add_modified_document(_session, self)
|
|
179
|
-
end
|
|
175
|
+
Threaded.add_modified_document(_session, self) if in_transaction?
|
|
180
176
|
true
|
|
181
177
|
end
|
|
182
178
|
|
|
@@ -193,6 +189,7 @@ module Mongoid
|
|
|
193
189
|
# @return [ Object ] The result of the operation.
|
|
194
190
|
def prepare_atomic_operation
|
|
195
191
|
raise Errors::ReadonlyDocument.new(self.class) if readonly? && !Mongoid.legacy_readonly
|
|
192
|
+
|
|
196
193
|
operations = yield({})
|
|
197
194
|
persist_or_delay_atomic_operation(operations)
|
|
198
195
|
self
|
|
@@ -229,6 +226,7 @@ module Mongoid
|
|
|
229
226
|
# document._mongoid_remove_atomic_context_changes
|
|
230
227
|
def _mongoid_remove_atomic_context_changes
|
|
231
228
|
return unless executing_atomically?
|
|
229
|
+
|
|
232
230
|
_mongoid_atomic_context_changed_fields.each { |f| remove_change f }
|
|
233
231
|
end
|
|
234
232
|
|
|
@@ -241,6 +239,7 @@ module Mongoid
|
|
|
241
239
|
# document._mongoid_reset_atomic_context_changes!
|
|
242
240
|
def _mongoid_reset_atomic_context_changes!
|
|
243
241
|
return unless executing_atomically?
|
|
242
|
+
|
|
244
243
|
_mongoid_atomic_context_changed_fields.each { |f| reset_attribute! f }
|
|
245
244
|
end
|
|
246
245
|
|
|
@@ -252,6 +251,7 @@ module Mongoid
|
|
|
252
251
|
# document._mongoid_push_atomic_context
|
|
253
252
|
def _mongoid_push_atomic_context
|
|
254
253
|
return unless executing_atomically?
|
|
254
|
+
|
|
255
255
|
@atomic_context = {}
|
|
256
256
|
@atomic_updates_to_execute_stack << @atomic_context
|
|
257
257
|
end
|
|
@@ -264,6 +264,7 @@ module Mongoid
|
|
|
264
264
|
# document._mongoid_pop_atomic_context
|
|
265
265
|
def _mongoid_pop_atomic_context
|
|
266
266
|
return unless executing_atomically?
|
|
267
|
+
|
|
267
268
|
@atomic_updates_to_execute_stack.pop
|
|
268
269
|
@atomic_context = @atomic_updates_to_execute_stack.last
|
|
269
270
|
end
|
|
@@ -309,10 +310,10 @@ module Mongoid
|
|
|
309
310
|
#
|
|
310
311
|
# @param [ Hash ] operations The atomic operations.
|
|
311
312
|
def persist_atomic_operations(operations)
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
313
|
+
return unless persisted? && operations && !operations.empty?
|
|
314
|
+
|
|
315
|
+
selector = atomic_selector
|
|
316
|
+
_root.collection.find(selector).update_one(positionally(selector, operations), session: _session)
|
|
316
317
|
end
|
|
317
318
|
end
|
|
318
319
|
end
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
module Mongoid
|
|
5
|
-
|
|
6
4
|
# Object encapsulating logic for setting/getting a collection and database name
|
|
7
5
|
# and a client with particular options to use when persisting models.
|
|
8
6
|
class PersistenceContext
|
|
@@ -24,16 +22,15 @@ module Mongoid
|
|
|
24
22
|
#
|
|
25
23
|
# @return [ Array<Symbol> ] The list of extra options besides client options
|
|
26
24
|
# that determine the persistence context.
|
|
27
|
-
EXTRA_OPTIONS = [
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
].freeze
|
|
25
|
+
EXTRA_OPTIONS = %i[client
|
|
26
|
+
collection
|
|
27
|
+
collection_options].freeze
|
|
31
28
|
|
|
32
29
|
# The full list of valid persistence context options.
|
|
33
30
|
#
|
|
34
31
|
# @return [ Array<Symbol> ] The full list of options defining the persistence
|
|
35
32
|
# context.
|
|
36
|
-
VALID_OPTIONS = (
|
|
33
|
+
VALID_OPTIONS = (Mongo::Client::VALID_OPTIONS + EXTRA_OPTIONS).freeze
|
|
37
34
|
|
|
38
35
|
# Initialize the persistence context object.
|
|
39
36
|
#
|
|
@@ -79,9 +76,11 @@ module Mongoid
|
|
|
79
76
|
# @return [ Mongo::Collection ] The collection for this persistence
|
|
80
77
|
# context.
|
|
81
78
|
def collection(parent = nil)
|
|
82
|
-
parent
|
|
83
|
-
parent.collection.with(client_options.except(:database,
|
|
79
|
+
if parent
|
|
80
|
+
parent.collection.with(client_options.except(:database, 'database'))
|
|
81
|
+
else
|
|
84
82
|
client[collection_name.to_sym]
|
|
83
|
+
end
|
|
85
84
|
end
|
|
86
85
|
|
|
87
86
|
# Get the collection name for this persistence context.
|
|
@@ -92,8 +91,8 @@ module Mongoid
|
|
|
92
91
|
# @return [ String ] The collection name for this persistence
|
|
93
92
|
# context.
|
|
94
93
|
def collection_name
|
|
95
|
-
@collection_name ||=
|
|
96
|
-
storage_options[:collection])
|
|
94
|
+
@collection_name ||= __evaluate__(options[:collection] ||
|
|
95
|
+
storage_options[:collection])
|
|
97
96
|
end
|
|
98
97
|
|
|
99
98
|
# Get the database name for this persistence context.
|
|
@@ -126,6 +125,8 @@ module Mongoid
|
|
|
126
125
|
|
|
127
126
|
client = client.with(options) unless options.empty?
|
|
128
127
|
|
|
128
|
+
verify_encryption_schema!(client)
|
|
129
|
+
|
|
129
130
|
client
|
|
130
131
|
end
|
|
131
132
|
end
|
|
@@ -139,8 +140,8 @@ module Mongoid
|
|
|
139
140
|
# context.
|
|
140
141
|
def client_name
|
|
141
142
|
@client_name ||= __evaluate__(options[:client]) ||
|
|
142
|
-
|
|
143
|
-
|
|
143
|
+
Threaded.client_override ||
|
|
144
|
+
__evaluate__(storage_options[:client])
|
|
144
145
|
end
|
|
145
146
|
|
|
146
147
|
# Determine if this persistence context is equal to another.
|
|
@@ -153,6 +154,7 @@ module Mongoid
|
|
|
153
154
|
# @return [ true | false ] Whether the two persistence contexts are equal.
|
|
154
155
|
def ==(other)
|
|
155
156
|
return false unless other.is_a?(PersistenceContext)
|
|
157
|
+
|
|
156
158
|
options == other.options
|
|
157
159
|
end
|
|
158
160
|
|
|
@@ -168,7 +170,7 @@ module Mongoid
|
|
|
168
170
|
#
|
|
169
171
|
# @api private
|
|
170
172
|
def reusable_client?
|
|
171
|
-
@options.keys == [:client]
|
|
173
|
+
@options.keys == [ :client ]
|
|
172
174
|
end
|
|
173
175
|
|
|
174
176
|
# The subset of provided options that may be used as storage
|
|
@@ -187,38 +189,68 @@ module Mongoid
|
|
|
187
189
|
|
|
188
190
|
def set_options!(opts)
|
|
189
191
|
@options ||= opts.each.reduce({}) do |_options, (key, value)|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
end
|
|
192
|
+
raise Errors::InvalidPersistenceOption.new(key.to_sym, VALID_OPTIONS) unless VALID_OPTIONS.include?(key.to_sym)
|
|
193
|
+
|
|
194
|
+
value ? _options.merge!(key => value) : _options
|
|
195
|
+
end
|
|
195
196
|
end
|
|
196
197
|
|
|
197
198
|
def __evaluate__(name)
|
|
198
199
|
return nil unless name
|
|
200
|
+
|
|
199
201
|
name.respond_to?(:call) ? name.call.to_sym : name.to_sym
|
|
200
202
|
end
|
|
201
203
|
|
|
204
|
+
# Refuse to use a client that would store a model's encrypted fields in
|
|
205
|
+
# plaintext.
|
|
206
|
+
#
|
|
207
|
+
# The automatic encryption schema is keyed by namespace and is built once,
|
|
208
|
+
# when the client is created. The driver looks the target namespace up in
|
|
209
|
+
# that schema, and when it is absent it asks the server for a schema
|
|
210
|
+
# instead; a collection without a validator then yields no encryption at
|
|
211
|
+
# all, and no error. Checking the namespace here is what turns that silent
|
|
212
|
+
# downgrade into a failure.
|
|
213
|
+
#
|
|
214
|
+
# @param [ Mongo::Client ] client The client this context resolved to.
|
|
215
|
+
#
|
|
216
|
+
# @raise [ Errors::NoEncryptionSchema ] if the model needs an encryption
|
|
217
|
+
# schema and the client's schema does not cover the target namespace.
|
|
218
|
+
def verify_encryption_schema!(client)
|
|
219
|
+
klass = @object.is_a?(Class) ? @object : @object.class
|
|
220
|
+
# A model whose encrypted fields all live on embedded models declares no
|
|
221
|
+
# encryption of its own, and still needs a schema for its collection.
|
|
222
|
+
return unless klass.respond_to?(:requires_encryption_schema?) && klass.requires_encryption_schema?
|
|
223
|
+
# An embedded document is persisted as part of its parent, so the
|
|
224
|
+
# parent's context is what governs the namespace.
|
|
225
|
+
return if klass.embedded?
|
|
226
|
+
# Collection and index management sends no document data, so it does not
|
|
227
|
+
# need an encryption-capable client.
|
|
228
|
+
return if Threaded.managing_collection?
|
|
229
|
+
|
|
230
|
+
schema_map = client.options.dig(:auto_encryption_options, :schema_map)
|
|
231
|
+
namespace = "#{client.database.name}.#{collection_name}"
|
|
232
|
+
return if schema_map&.key?(namespace)
|
|
233
|
+
|
|
234
|
+
raise Errors::NoEncryptionSchema.new(klass, namespace, client_name)
|
|
235
|
+
end
|
|
236
|
+
|
|
202
237
|
def client_options
|
|
203
238
|
@client_options ||= begin
|
|
204
|
-
opts = options.select do |k,
|
|
205
|
-
|
|
206
|
-
end
|
|
207
|
-
if opts[:read].is_a?(Symbol)
|
|
208
|
-
opts[:read] = {mode: opts[:read]}
|
|
239
|
+
opts = options.select do |k, _v|
|
|
240
|
+
Mongo::Client::VALID_OPTIONS.include?(k.to_sym)
|
|
209
241
|
end
|
|
242
|
+
opts[:read] = { mode: opts[:read] } if opts[:read].is_a?(Symbol)
|
|
210
243
|
opts
|
|
211
244
|
end
|
|
212
245
|
end
|
|
213
246
|
|
|
214
247
|
def database_name_option
|
|
215
248
|
@database_name_option ||= options[:database] ||
|
|
216
|
-
|
|
217
|
-
|
|
249
|
+
Threaded.database_override ||
|
|
250
|
+
storage_options[:database]
|
|
218
251
|
end
|
|
219
252
|
|
|
220
253
|
class << self
|
|
221
|
-
|
|
222
254
|
# Set the persistence context for a particular class or model instance.
|
|
223
255
|
#
|
|
224
256
|
# If there already is a persistence context set, options in the existing
|
|
@@ -235,13 +267,11 @@ module Mongoid
|
|
|
235
267
|
def set(object, options_or_context)
|
|
236
268
|
existing_context = get_context(object)
|
|
237
269
|
existing_options = if existing_context
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
if options_or_context.is_a?(PersistenceContext)
|
|
243
|
-
options_or_context = options_or_context.options
|
|
244
|
-
end
|
|
270
|
+
existing_context.options
|
|
271
|
+
else
|
|
272
|
+
{}
|
|
273
|
+
end
|
|
274
|
+
options_or_context = options_or_context.options if options_or_context.is_a?(PersistenceContext)
|
|
245
275
|
new_options = existing_options.merge(options_or_context)
|
|
246
276
|
context = PersistenceContext.new(object, new_options)
|
|
247
277
|
store_context(object, context)
|
|
@@ -269,10 +299,8 @@ module Mongoid
|
|
|
269
299
|
# @param [ Mongoid::PersistenceContext ] original_context The original persistence
|
|
270
300
|
# context that was set before this context was used.
|
|
271
301
|
def clear(object, cluster = nil, original_context = nil)
|
|
272
|
-
if context = get(object)
|
|
273
|
-
|
|
274
|
-
context.client.close unless context.reusable_client?
|
|
275
|
-
end
|
|
302
|
+
if (context = get(object)) && !(cluster.nil? || context.cluster.equal?(cluster)) && !context.reusable_client?
|
|
303
|
+
context.client.close
|
|
276
304
|
end
|
|
277
305
|
ensure
|
|
278
306
|
store_context(object, original_context)
|
|
@@ -283,7 +311,7 @@ module Mongoid
|
|
|
283
311
|
# Key to store persistence contexts in the thread local storage.
|
|
284
312
|
#
|
|
285
313
|
# @api private
|
|
286
|
-
PERSISTENCE_CONTEXT_KEY = :
|
|
314
|
+
PERSISTENCE_CONTEXT_KEY = :'[mongoid]:persistence_context'
|
|
287
315
|
|
|
288
316
|
def context_store
|
|
289
317
|
Threaded.get(PERSISTENCE_CONTEXT_KEY) { {} }
|
|
@@ -292,7 +320,7 @@ module Mongoid
|
|
|
292
320
|
# Get the persistence context for a given object from the thread local
|
|
293
321
|
# storage.
|
|
294
322
|
#
|
|
295
|
-
# @param [ Object ] object Object to get the
|
|
323
|
+
# @param [ Object ] object Object to get the persistence context for.
|
|
296
324
|
#
|
|
297
325
|
# @return [ Mongoid::PersistenceContext | nil ] The persistence context
|
|
298
326
|
# for the object if previously stored, otherwise nil.
|
|
@@ -305,7 +333,7 @@ module Mongoid
|
|
|
305
333
|
# Store persistence context for a given object in the thread local
|
|
306
334
|
# storage.
|
|
307
335
|
#
|
|
308
|
-
# @param [ Object ] object Object to store the
|
|
336
|
+
# @param [ Object ] object Object to store the persistence context for.
|
|
309
337
|
# @param [ Mongoid::PersistenceContext ] context Context to store
|
|
310
338
|
#
|
|
311
339
|
# @api private
|
data/lib/mongoid/pluckable.rb
CHANGED
|
@@ -100,7 +100,6 @@ module Mongoid
|
|
|
100
100
|
#
|
|
101
101
|
# @return [ Object ] The value at the next level.
|
|
102
102
|
#
|
|
103
|
-
# rubocop:disable Metrics/ParameterLists
|
|
104
103
|
def descend(part, current, method_name, field, part_count, is_translation)
|
|
105
104
|
# 1. If curr is an array fetch from all elements in the array.
|
|
106
105
|
# 2. If the field is localized, and is not an _translations field
|
|
@@ -127,6 +126,5 @@ module Mongoid
|
|
|
127
126
|
fetch_and_demongoize(current, method_name, field)
|
|
128
127
|
end
|
|
129
128
|
end
|
|
130
|
-
# rubocop:enable Metrics/ParameterLists
|
|
131
129
|
end
|
|
132
130
|
end
|
data/lib/mongoid/positional.rb
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
module Mongoid
|
|
5
|
-
|
|
6
4
|
# This module is responsible for taking update selectors and switching out
|
|
7
5
|
# the indexes for the $ positional operator where appropriate.
|
|
8
6
|
module Positional
|
|
9
|
-
|
|
10
7
|
# Takes the provided selector and atomic operations and replaces the
|
|
11
8
|
# indexes of the embedded documents with the positional operator when
|
|
12
9
|
# needed.
|
|
@@ -32,11 +29,10 @@ module Mongoid
|
|
|
32
29
|
#
|
|
33
30
|
# @return [ Hash ] The new operations.
|
|
34
31
|
def positionally(selector, operations, processed = {})
|
|
35
|
-
if selector.size == 1 || selector.values.any? { |val| val.nil? }
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
keys =
|
|
39
|
-
keys = keys.sort_by { |s| s.length*-1 }
|
|
32
|
+
return operations if selector.size == 1 || selector.values.any? { |val| val.nil? }
|
|
33
|
+
|
|
34
|
+
keys = selector.keys.map { |m| m.sub('._id', '') } - [ '_id' ]
|
|
35
|
+
keys = keys.sort_by { |s| s.length * -1 }
|
|
40
36
|
process_operations(keys, operations, processed)
|
|
41
37
|
end
|
|
42
38
|
|
|
@@ -62,9 +58,7 @@ module Mongoid
|
|
|
62
58
|
matches = position.scan(/\.\d+\./)
|
|
63
59
|
if matches.size == 1
|
|
64
60
|
keys.each do |kk|
|
|
65
|
-
if position =~ /\A#{kk}\.\d+\.(.*)\z/
|
|
66
|
-
return "#{kk}.$.#{$1}"
|
|
67
|
-
end
|
|
61
|
+
return "#{kk}.$.#{::Regexp.last_match(1)}" if position =~ /\A#{kk}\.\d+\.(.*)\z/
|
|
68
62
|
end
|
|
69
63
|
end
|
|
70
64
|
position
|