mongoid 9.0.11 → 9.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -8
- data/README.md +5 -11
- data/Rakefile +35 -38
- data/lib/config/locales/en.yml +11 -0
- data/lib/mongoid/association/accessors.rb +19 -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 +34 -38
- data/lib/mongoid/association/eager.rb +47 -13
- data/lib/mongoid/association/eager_loadable.rb +152 -24
- 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 +1 -1
- 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 +20 -18
- data/lib/mongoid/association/embedded.rb +0 -1
- data/lib/mongoid/association/macros.rb +3 -7
- data/lib/mongoid/association/many.rb +75 -3
- data/lib/mongoid/association/marshalable.rb +0 -3
- data/lib/mongoid/association/nested/many.rb +18 -13
- data/lib/mongoid/association/nested/nested_buildable.rb +6 -9
- data/lib/mongoid/association/nested/one.rb +4 -7
- data/lib/mongoid/association/nested.rb +1 -3
- data/lib/mongoid/association/one.rb +0 -3
- data/lib/mongoid/association/options.rb +8 -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 +1 -3
- data/lib/mongoid/association/referenced/belongs_to.rb +48 -43
- data/lib/mongoid/association/referenced/counter_cache.rb +5 -10
- 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 +52 -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 +107 -38
- data/lib/mongoid/association/referenced/has_many/proxy.rb +10 -6
- data/lib/mongoid/association/referenced/has_many.rb +30 -24
- 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 +26 -21
- data/lib/mongoid/association/referenced/syncable.rb +30 -34
- data/lib/mongoid/association/referenced.rb +0 -1
- data/lib/mongoid/association/reflections.rb +0 -3
- data/lib/mongoid/association/relatable.rb +69 -66
- data/lib/mongoid/association.rb +12 -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 +12 -15
- 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 +10 -14
- data/lib/mongoid/composable.rb +30 -34
- data/lib/mongoid/config/defaults.rb +7 -4
- data/lib/mongoid/config/encryption.rb +1 -3
- 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 +132 -42
- data/lib/mongoid/contextual/aggregable/memory.rb +2 -4
- 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 +72 -65
- 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 +37 -8
- 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 +31 -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 +131 -193
- 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 +1 -4
- data/lib/mongoid/deprecation.rb +2 -6
- data/lib/mongoid/document.rb +1 -1
- data/lib/mongoid/encryptable.rb +1 -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/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/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 +1 -4
- 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 +1 -4
- data/lib/mongoid/errors/no_client_hosts.rb +1 -4
- 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_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_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 +72 -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.rb +26 -26
- data/lib/mongoid/factory.rb +5 -9
- 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 +26 -25
- 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 +0 -2
- 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 -7
- 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 +11 -14
- data/lib/mongoid/matcher/size.rb +2 -5
- data/lib/mongoid/matcher/type.rb +32 -37
- data/lib/mongoid/matcher.rb +7 -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 +16 -24
- data/lib/mongoid/persistable/upsertable.rb +8 -10
- data/lib/mongoid/persistable.rb +28 -27
- data/lib/mongoid/persistence_context.rb +34 -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 +330 -0
- data/lib/mongoid/selectable.rb +1 -3
- data/lib/mongoid/serializable.rb +6 -8
- 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 +28 -30
- data/lib/mongoid/tasks/encryption.rb +10 -15
- data/lib/mongoid/threaded/lifecycle.rb +6 -9
- data/lib/mongoid/threaded.rb +132 -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 +8 -13
- 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 +3 -2
- data/lib/mongoid/validatable/associated.rb +1 -5
- 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 +142 -178
- data/spec/integration/associations/belongs_to_spec.rb +30 -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 +16 -13
- 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 +104 -119
- data/spec/integration/encryption_spec.rb +8 -11
- 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_spec.rb +16 -26
- 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/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_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 +1151 -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/macros_spec.rb +213 -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 +81 -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 +771 -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 +59 -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 +104 -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 +173 -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_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/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 +1219 -1692
- 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 +24 -31
- data/spec/mongoid/config/encryption_spec.rb +54 -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 +98 -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 +706 -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 +421 -372
- 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 +576 -680
- 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 +154 -191
- 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 +935 -950
- 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/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/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 +9 -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 +9 -12
- data/spec/mongoid/errors/no_client_hosts_spec.rb +9 -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_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/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/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 +446 -41
- 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 +80 -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 +31 -43
- 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 +330 -294
- data/spec/mongoid/touchable_spec_models.rb +35 -37
- data/spec/mongoid/traversable_spec.rb +435 -471
- data/spec/mongoid/validatable/associated_spec.rb +42 -60
- 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 +54 -31
- 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 +7 -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 +14 -2
|
@@ -55,6 +55,96 @@ module Mongoid
|
|
|
55
55
|
self.search_index_specs = []
|
|
56
56
|
end
|
|
57
57
|
|
|
58
|
+
# Performs a vector search for documents similar to this one, using
|
|
59
|
+
# this document's stored embedding as the query vector. The document
|
|
60
|
+
# itself is excluded from the results.
|
|
61
|
+
#
|
|
62
|
+
# @example Find articles similar to this one.
|
|
63
|
+
# article.vector_search(limit: 5, filter: { status: 'published' })
|
|
64
|
+
#
|
|
65
|
+
# @param [ String | Symbol | nil ] index The name of the vector search
|
|
66
|
+
# index to use (optional if only one is declared on the model).
|
|
67
|
+
# @param [ String | Symbol | nil ] path The field containing the stored
|
|
68
|
+
# vector (optional if unambiguous from the index definition).
|
|
69
|
+
# @param [ Integer ] limit The maximum number of results (default: 10).
|
|
70
|
+
# @param [ Integer | nil ] num_candidates The number of candidates to
|
|
71
|
+
# consider during the ANN search; defaults to limit * 10.
|
|
72
|
+
# @param [ Hash | nil ] filter An optional MongoDB filter to pre-filter
|
|
73
|
+
# candidates before scoring.
|
|
74
|
+
# @param [ Array ] pipeline Additional aggregation stages to append after
|
|
75
|
+
# the vector search and score projection.
|
|
76
|
+
#
|
|
77
|
+
# @return [ Array<Mongoid::Document> ] matching documents, each with
|
|
78
|
+
# a populated +vector_search_score+ attribute.
|
|
79
|
+
def vector_search(index: nil, path: nil, limit: 10, num_candidates: nil, filter: nil, pipeline: [])
|
|
80
|
+
_index, resolved_path = self.class.send(:resolve_vector_index, index, path)
|
|
81
|
+
query_vector = public_send(resolved_path)
|
|
82
|
+
|
|
83
|
+
if query_vector.nil?
|
|
84
|
+
raise ArgumentError,
|
|
85
|
+
"#{resolved_path} is nil on this document; cannot perform vector search"
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
self_filter = { '_id' => { '$ne' => _id } }
|
|
89
|
+
combined_filter = filter ? { '$and' => [ self_filter, filter ] } : self_filter
|
|
90
|
+
|
|
91
|
+
self.class.vector_search(
|
|
92
|
+
query_vector,
|
|
93
|
+
index: index,
|
|
94
|
+
path: path,
|
|
95
|
+
limit: limit,
|
|
96
|
+
num_candidates: num_candidates,
|
|
97
|
+
filter: combined_filter,
|
|
98
|
+
pipeline: pipeline
|
|
99
|
+
)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Performs an Atlas Vector Search query for documents with text similar
|
|
103
|
+
# to this document's stored text field, using auto-embedding. The current
|
|
104
|
+
# document is excluded from the results.
|
|
105
|
+
#
|
|
106
|
+
# @example Find articles with similar descriptions.
|
|
107
|
+
# article.auto_embed_search(limit: 5, filter: { status: 'published' })
|
|
108
|
+
#
|
|
109
|
+
# @param [ String | Symbol | nil ] index The name of the auto-embed index
|
|
110
|
+
# to use (optional when only one is declared on the model).
|
|
111
|
+
# @param [ String | Symbol | nil ] path The indexed text field path
|
|
112
|
+
# (optional if unambiguous from the index definition).
|
|
113
|
+
# @param [ Integer ] limit Maximum number of results (default: 10).
|
|
114
|
+
# @param [ Integer | nil ] num_candidates Candidates for ANN search;
|
|
115
|
+
# defaults to limit * 10. Ignored when exact: true.
|
|
116
|
+
# @param [ Hash | nil ] filter Optional MongoDB filter for pre-filtering.
|
|
117
|
+
# @param [ true | false ] exact Use exact nearest-neighbor search (default: false).
|
|
118
|
+
# @param [ String | nil ] model Query-time embedding model override.
|
|
119
|
+
# @param [ Array ] pipeline Additional aggregation stages to append.
|
|
120
|
+
#
|
|
121
|
+
# @return [ Array<Mongoid::Document> ] matching documents, each with
|
|
122
|
+
# a populated +vector_search_score+ attribute.
|
|
123
|
+
def auto_embed_search(index: nil, path: nil, limit: 10, num_candidates: nil, filter: nil, exact: false, model: nil, pipeline: []) # rubocop:disable Metrics/ParameterLists
|
|
124
|
+
_index, resolved_path = self.class.send(:resolve_auto_embed_index, index, path)
|
|
125
|
+
text = public_send(resolved_path)
|
|
126
|
+
|
|
127
|
+
if text.nil?
|
|
128
|
+
raise ArgumentError,
|
|
129
|
+
"#{resolved_path} is nil on this document; cannot perform auto-embed search"
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
self_filter = { '_id' => { '$ne' => _id } }
|
|
133
|
+
combined_filter = filter ? { '$and' => [ self_filter, filter ] } : self_filter
|
|
134
|
+
|
|
135
|
+
self.class.auto_embed_search(
|
|
136
|
+
text,
|
|
137
|
+
index: index,
|
|
138
|
+
path: path,
|
|
139
|
+
limit: limit,
|
|
140
|
+
num_candidates: num_candidates,
|
|
141
|
+
filter: combined_filter,
|
|
142
|
+
exact: exact,
|
|
143
|
+
model: model,
|
|
144
|
+
pipeline: pipeline
|
|
145
|
+
)
|
|
146
|
+
end
|
|
147
|
+
|
|
58
148
|
# Implementations for the feature's class-level methods.
|
|
59
149
|
module ClassMethods
|
|
60
150
|
# Request the creation of all registered search indices. Note
|
|
@@ -152,6 +242,136 @@ module Mongoid
|
|
|
152
242
|
search_index_specs.push(spec)
|
|
153
243
|
end
|
|
154
244
|
|
|
245
|
+
# Adds a vector search index definition. Also defines a read-only
|
|
246
|
+
# +vector_search_score+ field on the model the first time it is called,
|
|
247
|
+
# which is populated on documents returned by +vector_search+.
|
|
248
|
+
#
|
|
249
|
+
# @example Create a vector search index.
|
|
250
|
+
# class Person
|
|
251
|
+
# include Mongoid::Document
|
|
252
|
+
# vector_search_index({ fields: [...] })
|
|
253
|
+
# vector_search_index :my_vector_index, { fields: [...] }
|
|
254
|
+
# end
|
|
255
|
+
#
|
|
256
|
+
# @param [ Symbol | String | Hash ] name_or_defn Either the name of the index to
|
|
257
|
+
# define, or the index definition.
|
|
258
|
+
# @param [ Hash ] defn The vector search index definition.
|
|
259
|
+
def vector_search_index(name_or_defn, defn = nil)
|
|
260
|
+
name = name_or_defn
|
|
261
|
+
name, defn = nil, name if name.is_a?(Hash)
|
|
262
|
+
|
|
263
|
+
spec = { type: 'vectorSearch', definition: defn }.tap { |s| s[:name] = name.to_s if name }
|
|
264
|
+
search_index_specs.push(spec)
|
|
265
|
+
|
|
266
|
+
return if fields.key?('vector_search_score')
|
|
267
|
+
|
|
268
|
+
field :vector_search_score, type: Float
|
|
269
|
+
attr_readonly :vector_search_score
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
# Performs an Atlas Vector Search query and returns matching documents.
|
|
273
|
+
# Each returned document has a +vector_search_score+ attribute populated
|
|
274
|
+
# with its relevance score.
|
|
275
|
+
#
|
|
276
|
+
# The vector field (given by +path:+) is excluded from the returned
|
|
277
|
+
# documents by default, as vectors are large and rarely useful after
|
|
278
|
+
# retrieval.
|
|
279
|
+
#
|
|
280
|
+
# @example Search by an explicit query vector.
|
|
281
|
+
# Article.vector_search(embedding, limit: 5, filter: { status: 'published' })
|
|
282
|
+
#
|
|
283
|
+
# @param [ Array<Numeric> ] vector The query vector.
|
|
284
|
+
# @param [ String | Symbol | nil ] index The name of the vector search
|
|
285
|
+
# index to use (optional if only one is declared on the model).
|
|
286
|
+
# @param [ String | Symbol | nil ] path The field containing the stored
|
|
287
|
+
# vector (optional if unambiguous from the index definition).
|
|
288
|
+
# @param [ Integer ] limit The maximum number of results (default: 10).
|
|
289
|
+
# @param [ Integer | nil ] num_candidates The number of candidates to
|
|
290
|
+
# consider during the ANN search; defaults to limit * 10.
|
|
291
|
+
# @param [ Hash | nil ] filter An optional MongoDB filter to pre-filter
|
|
292
|
+
# candidates before scoring.
|
|
293
|
+
# @param [ Array ] pipeline Additional aggregation stages to append after
|
|
294
|
+
# the vector search and score projection.
|
|
295
|
+
#
|
|
296
|
+
# @return [ Array<Mongoid::Document> ] matching documents, each with
|
|
297
|
+
# a populated +vector_search_score+ attribute.
|
|
298
|
+
def vector_search(vector, index: nil, path: nil, limit: 10, num_candidates: nil, filter: nil, pipeline: []) # rubocop:disable Metrics/ParameterLists
|
|
299
|
+
resolved_index, resolved_path = resolve_vector_index(index, path)
|
|
300
|
+
num_candidates ||= limit * 10
|
|
301
|
+
|
|
302
|
+
vs_options = {
|
|
303
|
+
'index' => resolved_index,
|
|
304
|
+
'path' => resolved_path,
|
|
305
|
+
'queryVector' => vector,
|
|
306
|
+
'numCandidates' => num_candidates,
|
|
307
|
+
'limit' => limit
|
|
308
|
+
}
|
|
309
|
+
vs_options['filter'] = filter if filter
|
|
310
|
+
|
|
311
|
+
agg_pipeline = [
|
|
312
|
+
{ '$vectorSearch' => vs_options },
|
|
313
|
+
{ '$addFields' => { 'vector_search_score' => { '$meta' => 'vectorSearchScore' } } },
|
|
314
|
+
{ '$project' => { resolved_path => 0 } }
|
|
315
|
+
]
|
|
316
|
+
agg_pipeline.concat(Array(pipeline))
|
|
317
|
+
|
|
318
|
+
collection.aggregate(agg_pipeline).map { |doc| instantiate(doc) }
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
# Performs an Atlas Vector Search query using auto-embedding. Atlas
|
|
322
|
+
# generates the query vector from the supplied text at query time; no
|
|
323
|
+
# pre-computed embedding is required.
|
|
324
|
+
#
|
|
325
|
+
# Each returned document has a +vector_search_score+ attribute populated
|
|
326
|
+
# with its relevance score. Unlike +vector_search+, the indexed text field
|
|
327
|
+
# is retained in returned documents.
|
|
328
|
+
#
|
|
329
|
+
# @example Search by text.
|
|
330
|
+
# Article.auto_embed_search('machine learning', limit: 5)
|
|
331
|
+
#
|
|
332
|
+
# @example Exact nearest-neighbor search (no numCandidates).
|
|
333
|
+
# Article.auto_embed_search('deep learning', exact: true, limit: 5)
|
|
334
|
+
#
|
|
335
|
+
# @param [ String ] text The query text.
|
|
336
|
+
# @param [ String | Symbol | nil ] index The name of the auto-embed index
|
|
337
|
+
# to use (optional when only one is declared on the model).
|
|
338
|
+
# @param [ String | Symbol | nil ] path The indexed text field path
|
|
339
|
+
# (optional if unambiguous from the index definition).
|
|
340
|
+
# @param [ Integer ] limit Maximum number of results (default: 10).
|
|
341
|
+
# @param [ Integer | nil ] num_candidates Candidates for ANN search;
|
|
342
|
+
# defaults to limit * 10. Ignored when exact: true.
|
|
343
|
+
# @param [ Hash | nil ] filter Optional MongoDB filter for pre-filtering.
|
|
344
|
+
# @param [ true | false ] exact Use exact nearest-neighbor (ENN) search
|
|
345
|
+
# instead of ANN (default: false). When true, numCandidates is omitted.
|
|
346
|
+
# @param [ String | nil ] model Query-time embedding model override.
|
|
347
|
+
# @param [ Array ] pipeline Additional aggregation stages appended after
|
|
348
|
+
# the vector search and score projection.
|
|
349
|
+
#
|
|
350
|
+
# @return [ Array<Mongoid::Document> ] matching documents, each with
|
|
351
|
+
# a populated +vector_search_score+ attribute.
|
|
352
|
+
def auto_embed_search(text, index: nil, path: nil, limit: 10, num_candidates: nil, filter: nil, exact: false, model: nil, pipeline: []) # rubocop:disable Metrics/ParameterLists
|
|
353
|
+
resolved_index, resolved_path = resolve_auto_embed_index(index, path)
|
|
354
|
+
|
|
355
|
+
vs_options = {
|
|
356
|
+
'index' => resolved_index,
|
|
357
|
+
'path' => resolved_path,
|
|
358
|
+
'query' => { 'text' => text },
|
|
359
|
+
'limit' => limit
|
|
360
|
+
}
|
|
361
|
+
vs_options['numCandidates'] = num_candidates || (limit * 10) unless exact
|
|
362
|
+
vs_options['exact'] = true if exact
|
|
363
|
+
vs_options['filter'] = filter if filter
|
|
364
|
+
vs_options['model'] = model if model
|
|
365
|
+
|
|
366
|
+
agg_pipeline = [
|
|
367
|
+
{ '$vectorSearch' => vs_options },
|
|
368
|
+
{ '$addFields' => { 'vector_search_score' => { '$meta' => 'vectorSearchScore' } } }
|
|
369
|
+
]
|
|
370
|
+
agg_pipeline.concat(Array(pipeline))
|
|
371
|
+
|
|
372
|
+
collection.aggregate(agg_pipeline).map { |doc| instantiate(doc) }
|
|
373
|
+
end
|
|
374
|
+
|
|
155
375
|
private
|
|
156
376
|
|
|
157
377
|
# Retrieves the index records for the indexes with the given names.
|
|
@@ -162,6 +382,116 @@ module Mongoid
|
|
|
162
382
|
def get_indexes(names)
|
|
163
383
|
collection.search_indexes.select { |i| names.include?(i['name']) }
|
|
164
384
|
end
|
|
385
|
+
|
|
386
|
+
# Resolves the index name and vector path from the declared specs,
|
|
387
|
+
# applying inference when either is omitted.
|
|
388
|
+
#
|
|
389
|
+
# @param [ String | Symbol | nil ] index The requested index name.
|
|
390
|
+
# @param [ String | Symbol | nil ] path The requested field path.
|
|
391
|
+
#
|
|
392
|
+
# @return [ Array<String> ] the resolved [ index_name, field_path ] pair.
|
|
393
|
+
def resolve_vector_index(index, path)
|
|
394
|
+
vector_specs = search_index_specs.select { |s| s[:type] == 'vectorSearch' }
|
|
395
|
+
|
|
396
|
+
raise ArgumentError, "No vector search indexes declared on #{name}" if vector_specs.empty?
|
|
397
|
+
|
|
398
|
+
spec = if index
|
|
399
|
+
found = vector_specs.find { |s| s[:name] == index.to_s }
|
|
400
|
+
raise ArgumentError, "No vector search index '#{index}' declared on #{name}" unless found
|
|
401
|
+
|
|
402
|
+
found
|
|
403
|
+
elsif vector_specs.size == 1
|
|
404
|
+
vector_specs.first
|
|
405
|
+
else
|
|
406
|
+
raise ArgumentError,
|
|
407
|
+
"#{name} has multiple vector search indexes; specify index: to select one"
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
resolved_index = spec[:name] || 'default'
|
|
411
|
+
resolved_path = path ? path.to_s : infer_vector_path(spec)
|
|
412
|
+
|
|
413
|
+
[ resolved_index, resolved_path ]
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
# Infers the vector field path from the index definition by locating
|
|
417
|
+
# the first field declared with type 'vector'.
|
|
418
|
+
#
|
|
419
|
+
# @param [ Hash ] spec The vector search index spec.
|
|
420
|
+
#
|
|
421
|
+
# @return [ String ] the field path.
|
|
422
|
+
def infer_vector_path(spec)
|
|
423
|
+
field_list = spec.dig(:definition, :fields) || spec.dig(:definition, 'fields') || []
|
|
424
|
+
vector_field = field_list.find { |f| (f[:type] || f['type']) == 'vector' }
|
|
425
|
+
|
|
426
|
+
unless vector_field
|
|
427
|
+
raise ArgumentError,
|
|
428
|
+
"Cannot infer vector path on #{name}: no 'vector' type field in index definition; specify path:"
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
(vector_field[:path] || vector_field['path']).to_s
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
# Resolves the index name and text field path for an auto-embedding
|
|
435
|
+
# query, applying inference when either is omitted.
|
|
436
|
+
#
|
|
437
|
+
# @param [ String | Symbol | nil ] index The requested index name.
|
|
438
|
+
# @param [ String | Symbol | nil ] path The requested field path.
|
|
439
|
+
#
|
|
440
|
+
# @return [ Array<String> ] the resolved [ index_name, field_path ] pair.
|
|
441
|
+
def resolve_auto_embed_index(index, path)
|
|
442
|
+
auto_embed_specs = search_index_specs.select do |s|
|
|
443
|
+
s[:type] == 'vectorSearch' &&
|
|
444
|
+
(s.dig(:definition, :fields) || s.dig(:definition, 'fields') || [])
|
|
445
|
+
.any? { |f| (f[:type] || f['type']) == 'autoEmbed' }
|
|
446
|
+
end
|
|
447
|
+
|
|
448
|
+
raise ArgumentError, "No auto-embed indexes declared on #{name}" if auto_embed_specs.empty?
|
|
449
|
+
|
|
450
|
+
# Extracted to keep cyclomatic complexity within RuboCop's threshold.
|
|
451
|
+
spec = select_auto_embed_spec(auto_embed_specs, index)
|
|
452
|
+
resolved_index = spec[:name] || 'default'
|
|
453
|
+
resolved_path = path ? path.to_s : infer_auto_embed_path(spec)
|
|
454
|
+
|
|
455
|
+
[ resolved_index, resolved_path ]
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
# Picks one spec from the list of auto-embed specs, guided by +index+.
|
|
459
|
+
#
|
|
460
|
+
# @param [ Array<Hash> ] specs The candidate auto-embed specs.
|
|
461
|
+
# @param [ String | Symbol | nil ] index The requested index name.
|
|
462
|
+
#
|
|
463
|
+
# @return [ Hash ] the selected spec.
|
|
464
|
+
def select_auto_embed_spec(specs, index)
|
|
465
|
+
if index
|
|
466
|
+
found = specs.find { |s| s[:name] == index.to_s }
|
|
467
|
+
raise ArgumentError, "No auto-embed index '#{index}' declared on #{name}" unless found
|
|
468
|
+
|
|
469
|
+
found
|
|
470
|
+
elsif specs.size == 1
|
|
471
|
+
specs.first
|
|
472
|
+
else
|
|
473
|
+
raise ArgumentError,
|
|
474
|
+
"#{name} has multiple auto-embed indexes; specify index: to select one"
|
|
475
|
+
end
|
|
476
|
+
end
|
|
477
|
+
|
|
478
|
+
# Infers the text field path from an index definition by locating
|
|
479
|
+
# the first field declared with type 'autoEmbed'.
|
|
480
|
+
#
|
|
481
|
+
# @param [ Hash ] spec The vector search index spec.
|
|
482
|
+
#
|
|
483
|
+
# @return [ String ] the field path.
|
|
484
|
+
def infer_auto_embed_path(spec)
|
|
485
|
+
field_list = spec.dig(:definition, :fields) || spec.dig(:definition, 'fields') || []
|
|
486
|
+
ae_field = field_list.find { |f| (f[:type] || f['type']) == 'autoEmbed' }
|
|
487
|
+
|
|
488
|
+
unless ae_field
|
|
489
|
+
raise ArgumentError,
|
|
490
|
+
"Cannot infer path on #{name}: no 'autoEmbed' field in index definition; specify path:"
|
|
491
|
+
end
|
|
492
|
+
|
|
493
|
+
(ae_field[:path] || ae_field['path']).to_s
|
|
494
|
+
end
|
|
165
495
|
end
|
|
166
496
|
end
|
|
167
497
|
end
|
data/lib/mongoid/selectable.rb
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
module Mongoid
|
|
5
|
-
|
|
6
4
|
# Provides behavior for generating the selector for a specific document.
|
|
7
5
|
module Selectable
|
|
8
6
|
extend ActiveSupport::Concern
|
|
@@ -44,7 +42,7 @@ module Mongoid
|
|
|
44
42
|
#
|
|
45
43
|
# @return [ Hash ] The root document selector.
|
|
46
44
|
def root_atomic_selector_in_db
|
|
47
|
-
{
|
|
45
|
+
{ '_id' => _id }.merge!(shard_key_selector_in_db)
|
|
48
46
|
end
|
|
49
47
|
end
|
|
50
48
|
end
|
data/lib/mongoid/serializable.rb
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
module Mongoid
|
|
5
|
-
|
|
6
4
|
# This module provides the extra behavior for including associations in JSON
|
|
7
5
|
# and XML serialization.
|
|
8
6
|
module Serializable
|
|
@@ -11,15 +9,15 @@ module Mongoid
|
|
|
11
9
|
# We need to redefine where the JSON configuration is getting defined,
|
|
12
10
|
# similar to +ActiveRecord+.
|
|
13
11
|
included do
|
|
14
|
-
|
|
15
12
|
class << self
|
|
13
|
+
# These methods are previously defined by ActiveModel which we override to include default behavior.
|
|
14
|
+
remove_method :include_root_in_json if method_defined?(:include_root_in_json)
|
|
15
|
+
remove_method :include_root_in_json= if method_defined?(:include_root_in_json=)
|
|
16
16
|
def include_root_in_json
|
|
17
17
|
@include_root_in_json.nil? ? ::Mongoid.include_root_in_json : @include_root_in_json
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
@include_root_in_json = new_value
|
|
22
|
-
end
|
|
20
|
+
attr_writer :include_root_in_json
|
|
23
21
|
end
|
|
24
22
|
end
|
|
25
23
|
|
|
@@ -78,9 +76,9 @@ module Mongoid
|
|
|
78
76
|
|
|
79
77
|
only = Array.wrap(options[:only]).map(&:to_s)
|
|
80
78
|
except = Array.wrap(options[:except]).map(&:to_s)
|
|
81
|
-
except |= [self.class.discriminator_key] unless Mongoid.include_type_for_serialization
|
|
79
|
+
except |= [ self.class.discriminator_key ] unless Mongoid.include_type_for_serialization
|
|
82
80
|
|
|
83
|
-
if !only.empty?
|
|
81
|
+
if !options[:only].nil? && (!Mongoid.serializable_hash_with_legacy_only || !only.empty?)
|
|
84
82
|
names &= only
|
|
85
83
|
elsif !except.empty?
|
|
86
84
|
names -= except
|
data/lib/mongoid/shardable.rb
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
module Mongoid
|
|
5
|
-
|
|
6
4
|
# This module contains behavior for adding shard key fields to updates.
|
|
7
5
|
module Shardable
|
|
8
6
|
extend ActiveSupport::Concern
|
|
@@ -94,8 +92,8 @@ module Mongoid
|
|
|
94
92
|
#
|
|
95
93
|
# @api private
|
|
96
94
|
def shard_key_field_value(field, prefer_persisted:)
|
|
97
|
-
if field.include?(
|
|
98
|
-
relation, remaining = field.split(
|
|
95
|
+
if field.include?('.')
|
|
96
|
+
relation, remaining = field.split('.', 2)
|
|
99
97
|
send(relation)&.shard_key_field_value(remaining, prefer_persisted: prefer_persisted)
|
|
100
98
|
elsif prefer_persisted && !new_record?
|
|
101
99
|
attribute_was(field)
|
|
@@ -105,7 +103,6 @@ module Mongoid
|
|
|
105
103
|
end
|
|
106
104
|
|
|
107
105
|
module ClassMethods
|
|
108
|
-
|
|
109
106
|
# Specifies a shard key with the field(s) specified.
|
|
110
107
|
#
|
|
111
108
|
# @example Specify the shard key.
|
|
@@ -120,34 +117,28 @@ module Mongoid
|
|
|
120
117
|
def shard_key(*args)
|
|
121
118
|
unless args.first.is_a?(Hash)
|
|
122
119
|
# Shorthand syntax
|
|
123
|
-
if args.last.is_a?(Hash)
|
|
124
|
-
raise ArgumentError, 'Shorthand shard_key syntax does not permit options'
|
|
125
|
-
end
|
|
120
|
+
raise ArgumentError, 'Shorthand shard_key syntax does not permit options' if args.last.is_a?(Hash)
|
|
126
121
|
|
|
127
122
|
spec = Hash[args.map do |name|
|
|
128
|
-
[name, 1]
|
|
123
|
+
[ name, 1 ]
|
|
129
124
|
end]
|
|
130
125
|
|
|
131
126
|
return shard_key(spec)
|
|
132
127
|
end
|
|
133
128
|
|
|
134
|
-
if args.length > 2
|
|
135
|
-
raise ArgumentError, 'Full shard_key syntax requires 1 or 2 arguments'
|
|
136
|
-
end
|
|
129
|
+
raise ArgumentError, 'Full shard_key syntax requires 1 or 2 arguments' if args.length > 2
|
|
137
130
|
|
|
138
131
|
spec, options = args
|
|
139
132
|
|
|
140
133
|
spec = Hash[spec.map do |name, value|
|
|
141
|
-
if value.is_a?(Symbol)
|
|
142
|
-
|
|
143
|
-
end
|
|
144
|
-
[database_field_name(name).to_sym, value]
|
|
134
|
+
value = value.to_s if value.is_a?(Symbol)
|
|
135
|
+
[ database_field_name(name).to_sym, value ]
|
|
145
136
|
end]
|
|
146
137
|
|
|
147
138
|
self.shard_key_fields = spec.keys
|
|
148
139
|
self.shard_config = {
|
|
149
140
|
key: spec.freeze,
|
|
150
|
-
options: (options || {}).dup.freeze
|
|
141
|
+
options: (options || {}).dup.freeze
|
|
151
142
|
}.freeze
|
|
152
143
|
end
|
|
153
144
|
end
|
data/lib/mongoid/stateful.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
|
# Mixin module included into Mongoid::Document which adds behavior for
|
|
7
5
|
# getting the various lifecycle states a document can transition through.
|
|
8
6
|
module Stateful
|
|
9
|
-
|
|
10
7
|
attr_writer :destroyed, :flagged_for_destroy, :previously_new_record
|
|
11
8
|
|
|
12
9
|
# Sets whether the document has been persisted to the database.
|
|
@@ -16,9 +13,7 @@ module Mongoid
|
|
|
16
13
|
# @return [ true | false ] The set value.
|
|
17
14
|
def new_record=(new_value)
|
|
18
15
|
@new_record ||= false
|
|
19
|
-
if @new_record && !new_value
|
|
20
|
-
@previously_new_record = true
|
|
21
|
-
end
|
|
16
|
+
@previously_new_record = true if @new_record && !new_value
|
|
22
17
|
@new_record = new_value
|
|
23
18
|
end
|
|
24
19
|
|
|
@@ -73,10 +68,10 @@ module Mongoid
|
|
|
73
68
|
def flagged_for_destroy?
|
|
74
69
|
@flagged_for_destroy ||= false
|
|
75
70
|
end
|
|
76
|
-
alias
|
|
77
|
-
alias
|
|
71
|
+
alias marked_for_destruction? flagged_for_destroy?
|
|
72
|
+
alias _destroy flagged_for_destroy?
|
|
78
73
|
|
|
79
|
-
# Returns true if the +Document+ has been
|
|
74
|
+
# Returns true if the +Document+ has been successfully destroyed, and false
|
|
80
75
|
# if it hasn't. This is determined by the variable @destroyed and NOT
|
|
81
76
|
# by checking the database.
|
|
82
77
|
#
|
|
@@ -126,7 +121,7 @@ module Mongoid
|
|
|
126
121
|
# @return [ true | false ] If the document is readonly.
|
|
127
122
|
def readonly?
|
|
128
123
|
if Mongoid.legacy_readonly
|
|
129
|
-
__selected_fields
|
|
124
|
+
!__selected_fields.nil?
|
|
130
125
|
else
|
|
131
126
|
@readonly ||= false
|
|
132
127
|
end
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
module Mongoid
|
|
5
|
-
|
|
6
4
|
# A class which sends values to the database as Strings but returns
|
|
7
5
|
# them to the user as Symbols.
|
|
8
6
|
class StringifiedSymbol
|
|
9
|
-
|
|
10
7
|
class << self
|
|
11
|
-
|
|
12
8
|
# Convert the object from its mongo friendly ruby type to this type.
|
|
13
9
|
#
|
|
14
10
|
# @example Demongoize the object.
|
|
@@ -39,11 +35,11 @@ module Mongoid
|
|
|
39
35
|
#
|
|
40
36
|
# @api private
|
|
41
37
|
def mongoize(object)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
38
|
+
if object.nil?
|
|
39
|
+
object
|
|
40
|
+
else
|
|
41
|
+
object.to_s
|
|
42
|
+
end
|
|
47
43
|
end
|
|
48
44
|
|
|
49
45
|
# Turn the object from the Ruby type into the type
|
|
@@ -1,62 +1,61 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
namespace :db do
|
|
5
4
|
namespace :mongoid do
|
|
6
5
|
task :load_models do
|
|
7
|
-
|
|
6
|
+
Mongoid.load_models
|
|
8
7
|
end
|
|
9
8
|
|
|
10
|
-
desc
|
|
11
|
-
task :
|
|
12
|
-
|
|
9
|
+
desc 'Create collections for Mongoid models'
|
|
10
|
+
task create_collections: %i[environment load_models] do
|
|
11
|
+
Mongoid::Tasks::Database.create_collections
|
|
13
12
|
end
|
|
14
13
|
|
|
15
|
-
desc
|
|
16
|
-
task :
|
|
17
|
-
|
|
14
|
+
desc 'Create indexes specified in Mongoid models'
|
|
15
|
+
task create_indexes: %i[environment load_models] do
|
|
16
|
+
Mongoid::Tasks::Database.create_indexes
|
|
18
17
|
end
|
|
19
18
|
|
|
20
|
-
desc
|
|
21
|
-
task :
|
|
19
|
+
desc 'Create search indexes specified in Mongoid models'
|
|
20
|
+
task create_search_indexes: %i[environment load_models] do
|
|
22
21
|
wait = Mongoid::Utils.truthy_string?(ENV['WAIT_FOR_SEARCH_INDEXES'] || '1')
|
|
23
|
-
|
|
22
|
+
Mongoid::Tasks::Database.create_search_indexes(wait: wait)
|
|
24
23
|
end
|
|
25
24
|
|
|
26
|
-
desc
|
|
27
|
-
task :
|
|
28
|
-
|
|
25
|
+
desc 'Remove indexes that exist in the database but are not specified in Mongoid models'
|
|
26
|
+
task remove_undefined_indexes: %i[environment load_models] do
|
|
27
|
+
Mongoid::Tasks::Database.remove_undefined_indexes
|
|
29
28
|
end
|
|
30
29
|
|
|
31
|
-
desc
|
|
32
|
-
task :
|
|
33
|
-
|
|
30
|
+
desc 'Remove indexes specified in Mongoid models'
|
|
31
|
+
task remove_indexes: %i[environment load_models] do
|
|
32
|
+
Mongoid::Tasks::Database.remove_indexes
|
|
34
33
|
end
|
|
35
34
|
|
|
36
|
-
desc
|
|
37
|
-
task :
|
|
38
|
-
|
|
35
|
+
desc 'Remove search indexes specified in Mongoid models'
|
|
36
|
+
task remove_search_indexes: %i[environment load_models] do
|
|
37
|
+
Mongoid::Tasks::Database.remove_search_indexes
|
|
39
38
|
end
|
|
40
39
|
|
|
41
|
-
desc
|
|
42
|
-
task :
|
|
43
|
-
|
|
40
|
+
desc 'Shard collections with shard keys specified in Mongoid models'
|
|
41
|
+
task shard_collections: %i[environment load_models] do
|
|
42
|
+
Mongoid::Tasks::Database.shard_collections
|
|
44
43
|
end
|
|
45
44
|
|
|
46
|
-
desc
|
|
47
|
-
task :
|
|
48
|
-
|
|
45
|
+
desc 'Drop the database of the default Mongoid client'
|
|
46
|
+
task drop: :environment do
|
|
47
|
+
Mongoid::Clients.default.database.drop
|
|
49
48
|
end
|
|
50
49
|
|
|
51
|
-
desc
|
|
52
|
-
task :
|
|
53
|
-
|
|
50
|
+
desc 'Drop all non-system collections'
|
|
51
|
+
task purge: :environment do
|
|
52
|
+
Mongoid.purge!
|
|
54
53
|
end
|
|
55
54
|
|
|
56
55
|
namespace :create_collections do
|
|
57
|
-
desc
|
|
58
|
-
task :
|
|
59
|
-
|
|
56
|
+
desc 'Drop and create collections for Mongoid models'
|
|
57
|
+
task force: %i[environment load_models] do
|
|
58
|
+
Mongoid::Tasks::Database.create_collections(force: true)
|
|
60
59
|
end
|
|
61
60
|
end
|
|
62
61
|
end
|