mongoid 7.2.1 → 9.0.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
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +20 -20
- data/LICENSE +1 -1
- data/README.md +7 -12
- data/Rakefile +58 -1
- data/lib/config/locales/en.yml +191 -60
- data/lib/mongoid/association/accessors.rb +67 -53
- data/lib/mongoid/association/bindable.rb +77 -31
- data/lib/mongoid/association/builders.rb +8 -14
- data/lib/mongoid/association/constrainable.rb +2 -5
- data/lib/mongoid/association/depending.rb +20 -12
- data/lib/mongoid/association/eager.rb +160 -0
- data/lib/mongoid/association/eager_loadable.rb +41 -11
- data/lib/mongoid/association/embedded/batchable.rb +63 -52
- data/lib/mongoid/association/embedded/cyclic.rb +4 -12
- data/lib/mongoid/association/embedded/eager.rb +23 -0
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +29 -13
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +3 -5
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +25 -23
- data/lib/mongoid/association/embedded/embedded_in.rb +11 -26
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -9
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +5 -6
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +226 -203
- data/lib/mongoid/association/embedded/embeds_many.rb +3 -33
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -9
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +20 -8
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +131 -42
- data/lib/mongoid/association/embedded/embeds_one.rb +4 -30
- data/lib/mongoid/association/embedded.rb +2 -1
- data/lib/mongoid/association/macros.rb +47 -16
- data/lib/mongoid/association/many.rb +12 -24
- data/lib/mongoid/association/marshalable.rb +4 -5
- data/lib/mongoid/association/nested/many.rb +14 -19
- data/lib/mongoid/association/nested/nested_buildable.rb +36 -13
- data/lib/mongoid/association/nested/one.rb +54 -26
- data/lib/mongoid/association/nested.rb +1 -3
- data/lib/mongoid/association/one.rb +3 -11
- data/lib/mongoid/association/options.rb +18 -44
- data/lib/mongoid/association/proxy.rb +49 -42
- data/lib/mongoid/association/referenced/auto_save.rb +11 -15
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -7
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +6 -6
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -2
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +23 -32
- data/lib/mongoid/association/referenced/belongs_to.rb +13 -37
- data/lib/mongoid/association/referenced/counter_cache.rb +18 -26
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -8
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -3
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +191 -123
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -42
- data/lib/mongoid/association/referenced/has_many/binding.rb +1 -5
- data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -3
- data/lib/mongoid/association/referenced/has_many/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +471 -496
- data/lib/mongoid/association/referenced/has_many/proxy.rb +182 -179
- data/lib/mongoid/association/referenced/has_many.rb +17 -43
- data/lib/mongoid/association/referenced/has_one/binding.rb +1 -7
- data/lib/mongoid/association/referenced/has_one/buildable.rb +5 -5
- data/lib/mongoid/association/referenced/has_one/eager.rb +3 -4
- data/lib/mongoid/association/referenced/has_one/proxy.rb +38 -41
- data/lib/mongoid/association/referenced/has_one.rb +17 -36
- data/lib/mongoid/association/referenced/syncable.rb +11 -27
- data/lib/mongoid/association/referenced.rb +1 -1
- data/lib/mongoid/association/reflections.rb +9 -9
- data/lib/mongoid/association/relatable.rb +55 -74
- data/lib/mongoid/association.rb +10 -22
- data/lib/mongoid/atomic/modifiers.rb +7 -53
- data/lib/mongoid/atomic/paths/embedded/many.rb +20 -5
- data/lib/mongoid/atomic/paths/embedded/one.rb +1 -5
- data/lib/mongoid/atomic/paths/embedded.rb +1 -3
- data/lib/mongoid/atomic/paths/root.rb +1 -5
- data/lib/mongoid/atomic/paths.rb +1 -1
- data/lib/mongoid/atomic.rb +39 -86
- data/lib/mongoid/atomic_update_preparer.rb +88 -0
- data/lib/mongoid/attributes/dynamic.rb +5 -21
- data/lib/mongoid/attributes/embedded.rb +34 -0
- data/lib/mongoid/attributes/nested.rb +9 -13
- data/lib/mongoid/attributes/processing.rb +43 -28
- data/lib/mongoid/attributes/projector.rb +120 -0
- data/lib/mongoid/attributes/readonly.rb +4 -8
- data/lib/mongoid/attributes.rb +85 -89
- data/lib/mongoid/cacheable.rb +5 -9
- data/lib/mongoid/changeable.rb +183 -97
- data/lib/mongoid/clients/factory.rb +58 -15
- data/lib/mongoid/clients/options.rb +117 -8
- data/lib/mongoid/clients/sessions.rb +246 -84
- data/lib/mongoid/clients/storage_options.rb +37 -11
- data/lib/mongoid/clients/validators/storage.rb +4 -24
- data/lib/mongoid/clients/validators.rb +1 -1
- data/lib/mongoid/clients.rb +37 -14
- data/lib/mongoid/collection_configurable.rb +59 -0
- data/lib/mongoid/composable.rb +7 -7
- data/lib/mongoid/config/defaults.rb +40 -0
- data/lib/mongoid/config/encryption.rb +213 -0
- data/lib/mongoid/config/environment.rb +25 -5
- data/lib/mongoid/config/introspection.rb +152 -0
- data/lib/mongoid/config/options.rb +11 -14
- data/lib/mongoid/config/validators/async_query_executor.rb +34 -0
- data/lib/mongoid/config/validators/client.rb +7 -23
- data/lib/mongoid/config/validators/option.rb +1 -3
- data/lib/mongoid/config/validators.rb +2 -1
- data/lib/mongoid/config.rb +183 -46
- data/lib/mongoid/contextual/aggregable/memory.rb +38 -26
- data/lib/mongoid/contextual/aggregable/mongo.rb +26 -32
- data/lib/mongoid/contextual/aggregable/none.rb +66 -0
- data/lib/mongoid/contextual/aggregable.rb +18 -0
- data/lib/mongoid/contextual/atomic.rb +97 -30
- data/lib/mongoid/contextual/command.rb +3 -5
- data/lib/mongoid/contextual/map_reduce.rb +8 -33
- data/lib/mongoid/contextual/memory.rb +396 -89
- data/lib/mongoid/contextual/mongo/documents_loader.rb +178 -0
- data/lib/mongoid/contextual/mongo.rb +640 -311
- data/lib/mongoid/contextual/none.rb +244 -30
- data/lib/mongoid/contextual/queryable.rb +5 -4
- data/lib/mongoid/contextual.rb +18 -7
- data/lib/mongoid/copyable.rb +34 -14
- data/lib/mongoid/criteria/findable.rb +52 -22
- data/lib/mongoid/criteria/includable.rb +31 -34
- data/lib/mongoid/criteria/inspectable.rb +4 -3
- data/lib/mongoid/criteria/marshalable.rb +14 -7
- data/lib/mongoid/criteria/modifiable.rb +5 -19
- data/lib/mongoid/criteria/options.rb +1 -3
- data/lib/mongoid/criteria/permission.rb +6 -2
- data/lib/mongoid/criteria/queryable/aggregable.rb +3 -15
- data/lib/mongoid/criteria/queryable/expandable.rb +1 -25
- data/lib/mongoid/criteria/queryable/extensions/array.rb +6 -41
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -9
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -7
- data/lib/mongoid/criteria/queryable/extensions/date.rb +10 -11
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +8 -7
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -41
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -14
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -21
- data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -30
- data/lib/mongoid/criteria/queryable/extensions/range.rb +48 -17
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -13
- data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -5
- data/lib/mongoid/criteria/queryable/extensions/string.rb +19 -34
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +6 -22
- data/lib/mongoid/criteria/queryable/extensions/time.rb +8 -9
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
- data/lib/mongoid/criteria/queryable/extensions.rb +1 -5
- data/lib/mongoid/criteria/queryable/key.rb +15 -18
- data/lib/mongoid/criteria/queryable/macroable.rb +1 -3
- data/lib/mongoid/criteria/queryable/mergeable.rb +69 -50
- data/lib/mongoid/criteria/queryable/optional.rb +12 -62
- data/lib/mongoid/criteria/queryable/options.rb +3 -21
- data/lib/mongoid/criteria/queryable/pipeline.rb +2 -14
- data/lib/mongoid/criteria/queryable/selectable.rb +87 -124
- data/lib/mongoid/criteria/queryable/selector.rb +96 -25
- data/lib/mongoid/criteria/queryable/smash.rb +41 -18
- data/lib/mongoid/criteria/queryable/storable.rb +14 -9
- data/lib/mongoid/criteria/queryable.rb +12 -13
- data/lib/mongoid/criteria/scopable.rb +32 -21
- data/lib/mongoid/criteria/translator.rb +46 -0
- data/lib/mongoid/criteria.rb +60 -109
- data/lib/mongoid/deprecable.rb +38 -0
- data/lib/mongoid/deprecation.rb +29 -0
- data/lib/mongoid/document.rb +263 -173
- data/lib/mongoid/encryptable.rb +53 -0
- data/lib/mongoid/equality.rb +22 -25
- data/lib/mongoid/errors/ambiguous_relationship.rb +3 -5
- data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
- data/lib/mongoid/errors/callback.rb +1 -3
- data/lib/mongoid/errors/create_collection_failure.rb +34 -0
- data/lib/mongoid/errors/criteria_argument_required.rb +1 -1
- data/lib/mongoid/errors/delete_restriction.rb +9 -12
- data/lib/mongoid/errors/document_not_destroyed.rb +3 -7
- data/lib/mongoid/errors/document_not_found.rb +34 -21
- data/lib/mongoid/errors/drop_collection_failure.rb +28 -0
- data/lib/mongoid/errors/empty_config_file.rb +26 -0
- data/lib/mongoid/errors/immutable_attribute.rb +27 -0
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -3
- data/lib/mongoid/errors/invalid_async_query_executor.rb +26 -0
- data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
- data/lib/mongoid/errors/invalid_collection.rb +1 -1
- data/lib/mongoid/errors/invalid_config_file.rb +26 -0
- data/lib/mongoid/errors/invalid_config_option.rb +2 -4
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -4
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -1
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +24 -0
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -5
- data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
- data/lib/mongoid/errors/invalid_expression_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_field.rb +7 -7
- data/lib/mongoid/errors/invalid_field_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_field_option.rb +1 -3
- data/lib/mongoid/errors/invalid_field_type.rb +27 -0
- data/lib/mongoid/errors/invalid_find.rb +1 -3
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +23 -0
- data/lib/mongoid/errors/invalid_includes.rb +1 -3
- data/lib/mongoid/errors/invalid_index.rb +1 -3
- data/lib/mongoid/errors/invalid_options.rb +1 -3
- data/lib/mongoid/errors/invalid_path.rb +1 -3
- data/lib/mongoid/errors/invalid_persistence_option.rb +1 -5
- data/lib/mongoid/errors/invalid_query.rb +1 -1
- data/lib/mongoid/errors/invalid_relation.rb +2 -8
- data/lib/mongoid/errors/invalid_relation_option.rb +2 -4
- data/lib/mongoid/errors/invalid_scope.rb +1 -3
- data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -2
- data/lib/mongoid/errors/invalid_storage_options.rb +2 -4
- data/lib/mongoid/errors/invalid_time.rb +1 -3
- data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
- data/lib/mongoid/errors/inverse_not_found.rb +1 -3
- data/lib/mongoid/errors/mixed_client_configuration.rb +1 -3
- data/lib/mongoid/errors/mixed_relations.rb +1 -3
- data/lib/mongoid/errors/mongoid_error.rb +8 -16
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +2 -4
- data/lib/mongoid/errors/no_client_config.rb +1 -3
- data/lib/mongoid/errors/no_client_database.rb +2 -4
- data/lib/mongoid/errors/no_client_hosts.rb +2 -4
- data/lib/mongoid/errors/no_clients_config.rb +1 -3
- data/lib/mongoid/errors/no_default_client.rb +1 -3
- data/lib/mongoid/errors/no_environment.rb +1 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +1 -3
- data/lib/mongoid/errors/no_metadata.rb +1 -3
- data/lib/mongoid/errors/no_parent.rb +1 -3
- data/lib/mongoid/errors/readonly_attribute.rb +2 -4
- data/lib/mongoid/errors/readonly_document.rb +2 -6
- data/lib/mongoid/errors/rollback.rb +15 -0
- data/lib/mongoid/errors/scope_overwrite.rb +1 -1
- data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -2
- data/lib/mongoid/errors/transaction_error.rb +25 -0
- data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
- data/lib/mongoid/errors/unknown_attribute.rb +2 -4
- data/lib/mongoid/errors/unknown_model.rb +1 -3
- data/lib/mongoid/errors/unsaved_document.rb +2 -2
- data/lib/mongoid/errors/unsupported_javascript.rb +1 -3
- data/lib/mongoid/errors/validations.rb +1 -1
- data/lib/mongoid/errors.rb +18 -5
- data/lib/mongoid/evolvable.rb +2 -4
- data/lib/mongoid/extensions/array.rb +20 -58
- data/lib/mongoid/extensions/big_decimal.rb +44 -24
- data/lib/mongoid/extensions/binary.rb +45 -0
- data/lib/mongoid/extensions/boolean.rb +11 -6
- data/lib/mongoid/extensions/date.rb +31 -29
- data/lib/mongoid/extensions/date_time.rb +5 -16
- data/lib/mongoid/extensions/decimal128.rb +3 -5
- data/lib/mongoid/extensions/false_class.rb +8 -10
- data/lib/mongoid/extensions/float.rb +11 -12
- data/lib/mongoid/extensions/hash.rb +28 -148
- data/lib/mongoid/extensions/integer.rb +13 -14
- data/lib/mongoid/extensions/module.rb +5 -5
- data/lib/mongoid/extensions/nil_class.rb +5 -7
- data/lib/mongoid/extensions/object.rb +32 -81
- data/lib/mongoid/extensions/object_id.rb +3 -7
- data/lib/mongoid/extensions/range.rb +47 -24
- data/lib/mongoid/extensions/raw_value.rb +34 -0
- data/lib/mongoid/extensions/regexp.rb +14 -7
- data/lib/mongoid/extensions/set.rb +24 -13
- data/lib/mongoid/extensions/string.rb +30 -62
- data/lib/mongoid/extensions/symbol.rb +9 -22
- data/lib/mongoid/extensions/time.rb +30 -40
- data/lib/mongoid/extensions/time_with_zone.rb +18 -11
- data/lib/mongoid/extensions/true_class.rb +8 -10
- data/lib/mongoid/extensions.rb +3 -20
- data/lib/mongoid/factory.rb +178 -37
- data/lib/mongoid/fields/encrypted.rb +48 -0
- data/lib/mongoid/fields/foreign_key.rb +39 -27
- data/lib/mongoid/fields/localized.rb +25 -15
- data/lib/mongoid/fields/standard.rb +22 -40
- data/lib/mongoid/fields/validators/macro.rb +6 -19
- data/lib/mongoid/fields/validators.rb +1 -1
- data/lib/mongoid/fields.rb +354 -76
- data/lib/mongoid/findable.rb +62 -22
- data/lib/mongoid/indexable/specification.rb +55 -34
- data/lib/mongoid/indexable/validators/options.rb +7 -9
- data/lib/mongoid/indexable.rb +2 -18
- data/lib/mongoid/inspectable.rb +34 -11
- data/lib/mongoid/interceptable.rb +197 -41
- data/lib/mongoid/loadable.rb +83 -0
- data/lib/mongoid/loggable.rb +1 -9
- data/lib/mongoid/matchable.rb +2 -6
- data/lib/mongoid/matcher/all.rb +15 -0
- data/lib/mongoid/matcher/and.rb +14 -0
- data/lib/mongoid/matcher/bits.rb +60 -0
- data/lib/mongoid/matcher/bits_all_clear.rb +41 -0
- data/lib/mongoid/matcher/bits_all_set.rb +41 -0
- data/lib/mongoid/matcher/bits_any_clear.rb +41 -0
- data/lib/mongoid/matcher/bits_any_set.rb +41 -0
- data/lib/mongoid/matcher/elem_match.rb +17 -1
- data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
- data/lib/mongoid/matcher/eq.rb +15 -0
- data/lib/mongoid/matcher/eq_impl.rb +54 -2
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +18 -1
- data/lib/mongoid/matcher/exists.rb +15 -0
- data/lib/mongoid/matcher/expression.rb +22 -14
- data/lib/mongoid/matcher/expression_operator.rb +14 -0
- data/lib/mongoid/matcher/field_expression.rb +19 -5
- data/lib/mongoid/matcher/field_operator.rb +30 -0
- data/lib/mongoid/matcher/gt.rb +15 -0
- data/lib/mongoid/matcher/gte.rb +15 -0
- data/lib/mongoid/matcher/in.rb +15 -0
- data/lib/mongoid/matcher/lt.rb +15 -0
- data/lib/mongoid/matcher/lte.rb +15 -0
- data/lib/mongoid/matcher/mod.rb +33 -0
- data/lib/mongoid/matcher/ne.rb +15 -0
- data/lib/mongoid/matcher/nin.rb +15 -0
- data/lib/mongoid/matcher/nor.rb +14 -0
- data/lib/mongoid/matcher/not.rb +16 -0
- data/lib/mongoid/matcher/or.rb +14 -0
- data/lib/mongoid/matcher/regex.rb +24 -0
- data/lib/mongoid/matcher/size.rb +16 -0
- data/lib/mongoid/matcher/type.rb +124 -0
- data/lib/mongoid/matcher.rb +59 -52
- data/lib/mongoid/persistable/creatable.rb +25 -29
- data/lib/mongoid/persistable/deletable.rb +10 -23
- data/lib/mongoid/persistable/destroyable.rb +37 -11
- data/lib/mongoid/persistable/incrementable.rb +2 -6
- data/lib/mongoid/persistable/logical.rb +1 -5
- data/lib/mongoid/persistable/maxable.rb +37 -0
- data/lib/mongoid/persistable/minable.rb +37 -0
- data/lib/mongoid/persistable/multipliable.rb +36 -0
- data/lib/mongoid/persistable/poppable.rb +1 -5
- data/lib/mongoid/persistable/pullable.rb +1 -7
- data/lib/mongoid/persistable/pushable.rb +1 -7
- data/lib/mongoid/persistable/renamable.rb +1 -5
- data/lib/mongoid/persistable/savable.rb +14 -8
- data/lib/mongoid/persistable/settable.rb +1 -5
- data/lib/mongoid/persistable/unsettable.rb +3 -7
- data/lib/mongoid/persistable/updatable.rb +114 -28
- data/lib/mongoid/persistable/upsertable.rb +33 -8
- data/lib/mongoid/persistable.rb +17 -27
- data/lib/mongoid/persistence_context.rb +111 -43
- data/lib/mongoid/positional.rb +1 -5
- data/lib/mongoid/railtie.rb +23 -15
- data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
- data/lib/mongoid/railties/console_sandbox.rb +42 -0
- data/lib/mongoid/railties/controller_runtime.rb +21 -6
- data/lib/mongoid/railties/database.rake +19 -2
- data/lib/mongoid/reloadable.rb +45 -42
- data/lib/mongoid/scopable.rb +25 -53
- data/lib/mongoid/search_indexable.rb +167 -0
- data/lib/mongoid/selectable.rb +6 -17
- data/lib/mongoid/serializable.rb +11 -21
- data/lib/mongoid/shardable.rb +50 -16
- data/lib/mongoid/stateful.rb +66 -22
- data/lib/mongoid/stringified_symbol.rb +19 -7
- data/lib/mongoid/tasks/database.rake +25 -0
- data/lib/mongoid/tasks/database.rb +84 -8
- data/lib/mongoid/tasks/encryption.rake +59 -0
- data/lib/mongoid/tasks/encryption.rb +108 -0
- data/lib/mongoid/threaded/lifecycle.rb +6 -26
- data/lib/mongoid/threaded.rb +131 -92
- data/lib/mongoid/timestamps/created/short.rb +1 -1
- data/lib/mongoid/timestamps/created.rb +4 -4
- data/lib/mongoid/timestamps/short.rb +1 -1
- data/lib/mongoid/timestamps/timeless.rb +29 -7
- data/lib/mongoid/timestamps/updated/short.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +3 -5
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/touchable.rb +155 -29
- data/lib/mongoid/traversable.rb +180 -125
- data/lib/mongoid/utils.rb +52 -0
- data/lib/mongoid/validatable/associated.rb +97 -21
- data/lib/mongoid/validatable/format.rb +1 -1
- data/lib/mongoid/validatable/length.rb +1 -1
- data/lib/mongoid/validatable/localizable.rb +2 -4
- data/lib/mongoid/validatable/macros.rb +10 -14
- data/lib/mongoid/validatable/presence.rb +7 -13
- data/lib/mongoid/validatable/queryable.rb +9 -3
- data/lib/mongoid/validatable/uniqueness.rb +26 -39
- data/lib/mongoid/validatable.rb +20 -29
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/warnings.rb +37 -0
- data/lib/mongoid.rb +56 -22
- data/lib/rails/generators/mongoid/config/config_generator.rb +25 -5
- data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -64
- data/lib/rails/generators/mongoid/model/model_generator.rb +4 -1
- data/lib/rails/generators/mongoid_generator.rb +13 -1
- data/lib/rails/mongoid.rb +4 -32
- data/spec/config/mongoid.yml +16 -1
- data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
- data/spec/integration/active_job_spec.rb +32 -0
- data/spec/integration/app_spec.rb +180 -89
- data/spec/integration/associations/belongs_to_spec.rb +19 -1
- data/spec/integration/associations/embedded_dirty_spec.rb +58 -0
- data/spec/integration/associations/embedded_spec.rb +90 -7
- data/spec/integration/associations/embeds_many_spec.rb +197 -1
- data/spec/integration/associations/embeds_one_spec.rb +19 -1
- data/spec/integration/associations/foreign_key_spec.rb +10 -1
- data/spec/integration/associations/foreign_key_spec_models.rb +1 -1
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +62 -0
- data/spec/integration/associations/has_many_spec.rb +1 -1
- data/spec/integration/associations/has_one_spec.rb +145 -1
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -1
- data/spec/integration/associations/reverse_population_spec.rb +1 -1
- data/spec/integration/associations/reverse_population_spec_models.rb +1 -1
- data/spec/integration/associations/scope_option_spec.rb +102 -0
- data/spec/integration/atomic/modifiers_spec.rb +1 -1
- data/spec/integration/bson_regexp_raw_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +147 -3
- data/spec/integration/callbacks_spec.rb +398 -8
- data/spec/integration/contextual/empty_spec.rb +142 -0
- data/spec/integration/criteria/alias_query_spec.rb +98 -0
- data/spec/integration/criteria/date_field_spec.rb +2 -2
- data/spec/integration/criteria/default_scope_spec.rb +52 -0
- data/spec/integration/criteria/logical_spec.rb +12 -0
- data/spec/integration/criteria/range_spec.rb +358 -0
- data/spec/integration/criteria/raw_value_spec.rb +525 -0
- data/spec/integration/criteria/time_with_zone_spec.rb +126 -15
- data/spec/integration/discriminator_key_spec.rb +119 -81
- data/spec/integration/discriminator_value_spec.rb +1 -1
- data/spec/integration/document_spec.rb +31 -1
- data/spec/integration/dots_and_dollars_spec.rb +278 -0
- data/spec/integration/encryption_spec.rb +100 -0
- data/spec/integration/i18n_fallbacks_spec.rb +10 -52
- data/spec/integration/matcher_examples_spec.rb +21 -14
- data/spec/integration/matcher_operator_data/bits_all_clear.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_all_set.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_any_clear.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_any_set.yml +144 -0
- data/spec/integration/matcher_operator_data/comment.yml +22 -0
- data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
- data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
- data/spec/integration/matcher_operator_data/in.yml +16 -0
- data/spec/integration/matcher_operator_data/mod.yml +55 -0
- data/spec/integration/matcher_operator_data/size.yml +0 -3
- data/spec/integration/matcher_operator_data/type.yml +64 -0
- data/spec/integration/matcher_operator_data/type_array.yml +15 -0
- data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
- data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
- data/spec/integration/matcher_operator_data/type_code.yml +26 -0
- data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
- data/spec/integration/matcher_operator_data/type_date.yml +39 -0
- data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
- data/spec/integration/matcher_operator_data/type_decimal.yml +37 -0
- data/spec/integration/matcher_operator_data/type_double.yml +15 -0
- data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
- data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
- data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_null.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
- data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
- data/spec/integration/matcher_operator_data/type_string.yml +15 -0
- data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
- data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
- data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
- data/spec/integration/matcher_operator_spec.rb +26 -3
- data/spec/integration/matcher_spec.rb +50 -1
- data/spec/integration/persistence/range_field_spec.rb +351 -0
- data/spec/integration/server_query_spec.rb +1 -1
- data/spec/integration/shardable_spec.rb +1 -1
- data/spec/integration/stringified_symbol_field_spec.rb +17 -3
- data/spec/lite_spec_helper.rb +47 -14
- data/spec/mongoid/association/accessors_spec.rb +31 -19
- data/spec/mongoid/association/auto_save_spec.rb +73 -34
- data/spec/mongoid/association/builders_spec.rb +2 -2
- data/spec/mongoid/association/constrainable_spec.rb +1 -1
- data/spec/mongoid/association/counter_cache_spec.rb +34 -34
- data/spec/mongoid/association/depending_spec.rb +397 -358
- data/spec/mongoid/association/eager_spec.rb +56 -6
- data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -3
- data/spec/mongoid/association/embedded/dirty_spec.rb +3 -3
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -2
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +55 -1
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +110 -23
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -8
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +113 -1
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +712 -203
- data/spec/mongoid/association/embedded/embeds_many_models.rb +189 -1
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +14 -2
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +69 -1
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +26 -1
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +37 -24
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_one_models.rb +25 -2
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -2
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +29 -1
- data/spec/mongoid/association/macros_spec.rb +10 -10
- data/spec/mongoid/association/nested/many_spec.rb +1 -1
- data/spec/mongoid/association/nested/one_spec.rb +17 -13
- data/spec/mongoid/association/options_spec.rb +1 -1
- data/spec/mongoid/association/polymorphic_spec.rb +1 -1
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -2
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +110 -17
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +51 -15
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +113 -59
- data/spec/mongoid/association/referenced/belongs_to_models.rb +12 -0
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +22 -2
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +27 -22
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +32 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +386 -376
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +44 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +57 -3
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +131 -1
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +24 -7
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +313 -134
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1313 -2109
- data/spec/mongoid/association/referenced/has_many_models.rb +39 -2
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_many_spec.rb +47 -1
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +54 -10
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +134 -28
- data/spec/mongoid/association/referenced/has_one_models.rb +43 -1
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one_spec.rb +22 -1
- data/spec/mongoid/association/reflections_spec.rb +1 -1
- data/spec/mongoid/association/syncable_spec.rb +47 -33
- data/spec/mongoid/association_spec.rb +1 -1
- data/spec/mongoid/atomic/modifiers_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/root_spec.rb +1 -1
- data/spec/mongoid/atomic/paths_spec.rb +65 -27
- data/spec/mongoid/atomic_spec.rb +29 -7
- data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
- data/spec/mongoid/attributes/dynamic_spec.rb +1 -1
- data/spec/mongoid/attributes/embedded_spec.rb +118 -0
- data/spec/mongoid/attributes/nested_spec.rb +147 -78
- data/spec/mongoid/attributes/nested_spec_models.rb +49 -0
- data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
- data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
- data/spec/mongoid/attributes/projector_spec.rb +41 -0
- data/spec/mongoid/attributes/readonly_spec.rb +23 -23
- data/spec/mongoid/attributes_spec.rb +921 -69
- data/spec/mongoid/cacheable_spec.rb +5 -5
- data/spec/mongoid/changeable_spec.rb +468 -76
- data/spec/mongoid/clients/factory_spec.rb +152 -30
- data/spec/mongoid/clients/options_spec.rb +24 -12
- data/spec/mongoid/clients/sessions_spec.rb +49 -71
- data/spec/mongoid/clients/transactions_spec.rb +971 -176
- data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
- data/spec/mongoid/clients_spec.rb +230 -22
- data/spec/mongoid/collection_configurable_spec.rb +159 -0
- data/spec/mongoid/composable_spec.rb +1 -1
- data/spec/mongoid/config/defaults_spec.rb +99 -0
- data/spec/mongoid/config/encryption_spec.rb +152 -0
- data/spec/mongoid/config/environment_spec.rb +126 -39
- data/spec/mongoid/config/introspection_spec.rb +114 -0
- data/spec/mongoid/config/options_spec.rb +1 -1
- data/spec/mongoid/config_spec.rb +375 -43
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +432 -154
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +63 -0
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +95 -20
- data/spec/mongoid/contextual/aggregable/none_spec.rb +49 -0
- data/spec/mongoid/contextual/atomic_spec.rb +329 -87
- data/spec/mongoid/contextual/map_reduce_spec.rb +5 -19
- data/spec/mongoid/contextual/memory_spec.rb +1479 -127
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +194 -0
- data/spec/mongoid/contextual/mongo_spec.rb +3374 -1254
- data/spec/mongoid/contextual/none_spec.rb +79 -68
- data/spec/mongoid/copyable_spec.rb +465 -23
- data/spec/mongoid/copyable_spec_models.rb +1 -1
- data/spec/mongoid/criteria/findable_spec.rb +295 -229
- data/spec/mongoid/criteria/includable_spec.rb +1493 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +55 -0
- data/spec/mongoid/criteria/inspectable_spec.rb +1 -1
- data/spec/mongoid/criteria/marshalable_spec.rb +19 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +38 -38
- data/spec/mongoid/criteria/options_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -74
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +8 -20
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +135 -27
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +32 -12
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -16
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +74 -8
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +238 -179
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -12
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -12
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -132
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -60
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/key_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +106 -8
- data/spec/mongoid/criteria/queryable/optional_spec.rb +17 -486
- data/spec/mongoid/criteria/queryable/options_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +700 -26
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +149 -683
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +186 -6
- data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/storable_spec.rb +87 -1
- data/spec/mongoid/criteria/scopable_spec.rb +128 -1
- data/spec/mongoid/criteria/translator_spec.rb +133 -0
- data/spec/mongoid/criteria_projection_spec.rb +407 -0
- data/spec/mongoid/criteria_spec.rb +1029 -1806
- data/spec/mongoid/document_fields_spec.rb +180 -5
- data/spec/mongoid/document_persistence_context_spec.rb +77 -1
- data/spec/mongoid/document_query_spec.rb +55 -4
- data/spec/mongoid/document_spec.rb +43 -172
- data/spec/mongoid/equality_spec.rb +7 -8
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -1
- data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
- data/spec/mongoid/errors/callback_spec.rb +1 -1
- data/spec/mongoid/errors/delete_restriction_spec.rb +2 -2
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -1
- data/spec/mongoid/errors/document_not_found_spec.rb +77 -1
- data/spec/mongoid/errors/invalid_collection_spec.rb +1 -1
- data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +6 -6
- data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_spec.rb +2 -2
- data/spec/mongoid/errors/invalid_field_type_spec.rb +56 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_includes_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_index_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_options_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_path_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_relation_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_scope_spec.rb +2 -2
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_time_spec.rb +1 -1
- data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -1
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -1
- data/spec/mongoid/errors/mixed_relations_spec.rb +1 -1
- data/spec/mongoid/errors/mongoid_error_spec.rb +4 -4
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_config_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_database_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -1
- data/spec/mongoid/errors/no_clients_config_spec.rb +1 -1
- data/spec/mongoid/errors/no_environment_spec.rb +4 -4
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -1
- data/spec/mongoid/errors/no_metadata_spec.rb +1 -1
- data/spec/mongoid/errors/no_parent_spec.rb +1 -1
- data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -1
- data/spec/mongoid/errors/readonly_document_spec.rb +3 -3
- data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -1
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -2
- data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -3
- data/spec/mongoid/errors/unsaved_document_spec.rb +1 -1
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -1
- data/spec/mongoid/errors/validations_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +19 -265
- data/spec/mongoid/extensions/big_decimal_spec.rb +713 -213
- data/spec/mongoid/extensions/binary_spec.rb +45 -10
- data/spec/mongoid/extensions/boolean_spec.rb +69 -83
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +15 -11
- data/spec/mongoid/extensions/date_spec.rb +74 -22
- data/spec/mongoid/extensions/date_time_spec.rb +18 -19
- data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
- data/spec/mongoid/extensions/false_class_spec.rb +2 -9
- data/spec/mongoid/extensions/float_spec.rb +56 -84
- data/spec/mongoid/extensions/hash_spec.rb +45 -219
- data/spec/mongoid/extensions/integer_spec.rb +53 -73
- data/spec/mongoid/extensions/module_spec.rb +1 -1
- data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/extensions/object_id_spec.rb +1 -1
- data/spec/mongoid/extensions/object_spec.rb +1 -177
- data/spec/mongoid/extensions/range_spec.rb +254 -64
- data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
- data/spec/mongoid/extensions/regexp_spec.rb +59 -34
- data/spec/mongoid/extensions/set_spec.rb +105 -1
- data/spec/mongoid/extensions/string_spec.rb +21 -104
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -1
- data/spec/mongoid/extensions/symbol_spec.rb +15 -53
- data/spec/mongoid/extensions/time_spec.rb +345 -131
- data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -107
- data/spec/mongoid/extensions/true_class_spec.rb +2 -9
- data/spec/mongoid/factory_spec.rb +63 -2
- data/spec/mongoid/fields/foreign_key_spec.rb +282 -120
- data/spec/mongoid/fields/localized_spec.rb +85 -42
- data/spec/mongoid/fields/standard_spec.rb +1 -1
- data/spec/mongoid/fields_spec.rb +826 -121
- data/spec/mongoid/findable_spec.rb +442 -80
- data/spec/mongoid/indexable/specification_spec.rb +132 -14
- data/spec/mongoid/indexable_spec.rb +361 -23
- data/spec/mongoid/inspectable_spec.rb +93 -5
- data/spec/mongoid/interceptable_spec.rb +926 -116
- data/spec/mongoid/interceptable_spec_models.rb +236 -4
- data/spec/mongoid/loading_spec.rb +110 -0
- data/spec/mongoid/loggable_spec.rb +1 -1
- data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
- data/spec/mongoid/matcher/extract_attribute_spec.rb +5 -15
- data/spec/mongoid/mongoizable_spec.rb +286 -0
- data/spec/mongoid/monkey_patches_spec.rb +211 -0
- data/spec/mongoid/persistable/creatable_spec.rb +5 -5
- data/spec/mongoid/persistable/deletable_spec.rb +267 -27
- data/spec/mongoid/persistable/destroyable_spec.rb +409 -24
- data/spec/mongoid/persistable/incrementable_spec.rb +46 -9
- data/spec/mongoid/persistable/logical_spec.rb +42 -5
- data/spec/mongoid/persistable/maxable_spec.rb +147 -0
- data/spec/mongoid/persistable/minable_spec.rb +147 -0
- data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
- data/spec/mongoid/persistable/poppable_spec.rb +41 -5
- data/spec/mongoid/persistable/pullable_spec.rb +81 -9
- data/spec/mongoid/persistable/pushable_spec.rb +81 -9
- data/spec/mongoid/persistable/renamable_spec.rb +40 -4
- data/spec/mongoid/persistable/savable_spec.rb +114 -20
- data/spec/mongoid/persistable/settable_spec.rb +77 -10
- data/spec/mongoid/persistable/unsettable_spec.rb +41 -5
- data/spec/mongoid/persistable/updatable_spec.rb +64 -52
- data/spec/mongoid/persistable/upsertable_spec.rb +124 -4
- data/spec/mongoid/persistable_spec.rb +4 -4
- data/spec/mongoid/persistence_context_spec.rb +58 -59
- data/spec/mongoid/positional_spec.rb +1 -1
- data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
- data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
- data/spec/mongoid/relations/proxy_spec.rb +7 -7
- data/spec/mongoid/reloadable_spec.rb +255 -30
- data/spec/mongoid/scopable_spec.rb +198 -58
- data/spec/mongoid/search_indexable_spec.rb +147 -0
- data/spec/mongoid/selectable_spec.rb +7 -7
- data/spec/mongoid/serializable_spec.rb +19 -40
- data/spec/mongoid/shardable_models.rb +15 -0
- data/spec/mongoid/shardable_spec.rb +181 -31
- data/spec/mongoid/stateful_spec.rb +152 -10
- data/spec/mongoid/tasks/database_rake_spec.rb +193 -42
- data/spec/mongoid/tasks/database_spec.rb +175 -2
- data/spec/mongoid/tasks/encryption_spec.rb +187 -0
- data/spec/mongoid/threaded_spec.rb +40 -3
- data/spec/mongoid/timestamps/created/short_spec.rb +2 -2
- data/spec/mongoid/timestamps/created_spec.rb +2 -2
- data/spec/mongoid/timestamps/timeless_spec.rb +3 -3
- data/spec/mongoid/timestamps/updated/short_spec.rb +4 -4
- data/spec/mongoid/timestamps/updated_spec.rb +4 -4
- data/spec/mongoid/timestamps_spec.rb +399 -11
- data/spec/mongoid/timestamps_spec_models.rb +68 -0
- data/spec/mongoid/touchable_spec.rb +971 -54
- data/spec/mongoid/touchable_spec_models.rb +154 -0
- data/spec/mongoid/traversable_spec.rb +79 -37
- data/spec/mongoid/validatable/associated_spec.rb +14 -31
- data/spec/mongoid/validatable/format_spec.rb +1 -1
- data/spec/mongoid/validatable/length_spec.rb +1 -1
- data/spec/mongoid/validatable/numericality_spec.rb +1 -1
- data/spec/mongoid/validatable/presence_spec.rb +27 -23
- data/spec/mongoid/validatable/uniqueness_spec.rb +170 -99
- data/spec/mongoid/validatable_spec.rb +4 -4
- data/spec/mongoid/warnings_spec.rb +36 -0
- data/spec/mongoid_spec.rb +61 -11
- data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -3
- data/spec/rails/mongoid_spec.rb +28 -132
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/cluster_config.rb +24 -4
- data/spec/shared/lib/mrss/constraints.rb +77 -29
- data/spec/shared/lib/mrss/docker_runner.rb +40 -4
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +64 -1
- data/spec/shared/lib/mrss/server_version_registry.rb +78 -34
- data/spec/shared/lib/mrss/session_registry.rb +69 -0
- data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
- data/spec/shared/lib/mrss/utils.rb +37 -0
- data/spec/shared/share/Dockerfile.erb +123 -71
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/distro.sh +2 -1
- data/spec/shared/shlib/server.sh +187 -40
- data/spec/shared/shlib/set_env.sh +49 -31
- data/spec/spec_helper.rb +46 -49
- data/spec/support/authorization.rb +1 -1
- data/spec/support/client_registry.rb +10 -0
- data/spec/support/constraints.rb +25 -1
- data/spec/support/crypt/models.rb +50 -0
- data/spec/support/crypt.rb +80 -0
- data/spec/support/expectations.rb +1 -1
- data/spec/support/feature_sandbox.rb +72 -0
- data/spec/support/helpers.rb +1 -0
- data/spec/support/immutable_ids.rb +119 -0
- data/spec/support/macros.rb +107 -1
- data/spec/support/models/account.rb +2 -2
- data/spec/support/models/acolyte.rb +1 -1
- data/spec/support/models/actor.rb +1 -1
- data/spec/support/models/actress.rb +1 -1
- data/spec/support/models/address.rb +7 -1
- 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 -1
- data/spec/support/models/alert.rb +1 -1
- data/spec/support/models/animal.rb +1 -1
- data/spec/support/models/answer.rb +1 -1
- data/spec/support/models/appointment.rb +1 -1
- data/spec/support/models/armrest.rb +1 -1
- data/spec/support/models/array_field.rb +1 -1
- data/spec/support/models/article.rb +1 -1
- data/spec/support/models/artist.rb +3 -2
- data/spec/support/models/artwork.rb +1 -1
- data/spec/support/models/audible_sound.rb +4 -0
- data/spec/support/models/audio.rb +1 -1
- data/spec/support/models/augmentation.rb +13 -1
- data/spec/support/models/author.rb +1 -1
- data/spec/support/models/baby.rb +1 -1
- data/spec/support/models/band.rb +13 -1
- data/spec/support/models/bar.rb +1 -1
- data/spec/support/models/basic.rb +1 -1
- data/spec/support/models/bed.rb +1 -1
- data/spec/support/models/big_palette.rb +1 -1
- data/spec/support/models/birthday.rb +1 -1
- data/spec/support/models/bolt.rb +8 -0
- data/spec/support/models/bomb.rb +1 -1
- data/spec/support/models/book.rb +2 -1
- data/spec/support/models/breed.rb +1 -1
- data/spec/support/models/browser.rb +1 -1
- data/spec/support/models/building.rb +3 -1
- data/spec/support/models/building_address.rb +1 -1
- data/spec/support/models/bus.rb +1 -1
- data/spec/support/models/business.rb +1 -1
- data/spec/support/models/callback_test.rb +1 -1
- data/spec/support/models/canvas.rb +1 -1
- data/spec/support/models/car.rb +1 -1
- data/spec/support/models/cat.rb +1 -1
- data/spec/support/models/catalog.rb +25 -0
- data/spec/support/models/category.rb +1 -1
- data/spec/support/models/child.rb +1 -1
- data/spec/support/models/child_doc.rb +4 -4
- data/spec/support/models/church.rb +1 -1
- data/spec/support/models/circle.rb +1 -1
- data/spec/support/models/circuit.rb +1 -1
- data/spec/support/models/circus.rb +4 -1
- data/spec/support/models/code.rb +3 -1
- data/spec/support/models/coding/pull_request.rb +1 -1
- data/spec/support/models/coding.rb +1 -1
- data/spec/support/models/comment.rb +1 -1
- data/spec/support/models/company.rb +1 -1
- data/spec/support/models/consumption_period.rb +1 -1
- data/spec/support/models/contextable_item.rb +1 -1
- data/spec/support/models/contractor.rb +1 -1
- data/spec/support/models/cookie.rb +1 -1
- data/spec/support/models/country_code.rb +3 -1
- data/spec/support/models/courier_job.rb +1 -1
- data/spec/support/models/cover.rb +11 -0
- data/spec/support/models/crate.rb +1 -1
- data/spec/support/models/customer.rb +1 -1
- data/spec/support/models/customer_address.rb +1 -1
- data/spec/support/models/deed.rb +1 -1
- data/spec/support/models/definition.rb +1 -1
- data/spec/support/models/delegating_patient.rb +1 -1
- data/spec/support/models/description.rb +1 -1
- data/spec/support/models/dictionary.rb +1 -1
- data/spec/support/models/division.rb +1 -1
- data/spec/support/models/doctor.rb +1 -1
- data/spec/support/models/dog.rb +1 -1
- data/spec/support/models/dokument.rb +1 -1
- data/spec/support/models/draft.rb +1 -1
- data/spec/support/models/dragon.rb +1 -1
- data/spec/support/models/driver.rb +1 -1
- 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 -1
- data/spec/support/models/entry.rb +1 -1
- data/spec/support/models/eraser.rb +1 -1
- data/spec/support/models/even.rb +1 -1
- data/spec/support/models/event.rb +1 -1
- 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 +1 -1
- data/spec/support/models/eye_bowl.rb +1 -1
- data/spec/support/models/face.rb +1 -1
- data/spec/support/models/fanatic.rb +9 -0
- data/spec/support/models/favorite.rb +8 -2
- data/spec/support/models/filesystem.rb +1 -1
- data/spec/support/models/fire_hydrant.rb +1 -1
- data/spec/support/models/firefox.rb +1 -1
- data/spec/support/models/fish.rb +1 -1
- data/spec/support/models/folder.rb +1 -1
- data/spec/support/models/folder_item.rb +1 -1
- data/spec/support/models/fruits.rb +1 -1
- data/spec/support/models/game.rb +1 -1
- data/spec/support/models/ghost.rb +1 -1
- data/spec/support/models/guitar.rb +1 -1
- data/spec/support/models/hole.rb +13 -0
- data/spec/support/models/home.rb +1 -1
- data/spec/support/models/house.rb +1 -1
- data/spec/support/models/html_writer.rb +1 -1
- data/spec/support/models/id_key.rb +1 -1
- data/spec/support/models/idnodef.rb +1 -1
- data/spec/support/models/image.rb +1 -1
- data/spec/support/models/implant.rb +10 -1
- data/spec/support/models/instrument.rb +1 -1
- data/spec/support/models/item.rb +1 -1
- data/spec/support/models/jar.rb +1 -1
- data/spec/support/models/kaleidoscope.rb +1 -1
- data/spec/support/models/kangaroo.rb +1 -1
- data/spec/support/models/label.rb +5 -2
- data/spec/support/models/language.rb +1 -1
- data/spec/support/models/lat_lng.rb +1 -1
- data/spec/support/models/league.rb +1 -1
- data/spec/support/models/learner.rb +1 -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 -1
- data/spec/support/models/manufacturer.rb +1 -1
- data/spec/support/models/meat.rb +1 -1
- data/spec/support/models/membership.rb +2 -1
- data/spec/support/models/message.rb +1 -1
- data/spec/support/models/minim.rb +1 -1
- data/spec/support/models/mixed_drink.rb +1 -1
- data/spec/support/models/mop.rb +10 -1
- data/spec/support/models/movie.rb +1 -1
- data/spec/support/models/my_hash.rb +1 -1
- data/spec/support/models/name.rb +11 -1
- data/spec/support/models/name_only.rb +1 -1
- data/spec/support/models/node.rb +1 -1
- data/spec/support/models/note.rb +1 -1
- data/spec/support/models/nut.rb +8 -0
- data/spec/support/models/odd.rb +1 -1
- data/spec/support/models/order.rb +3 -1
- data/spec/support/models/ordered_post.rb +2 -2
- 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 +1 -1
- data/spec/support/models/override.rb +1 -1
- data/spec/support/models/ownable.rb +1 -1
- data/spec/support/models/owner.rb +1 -1
- data/spec/support/models/pack.rb +1 -1
- data/spec/support/models/page.rb +1 -1
- data/spec/support/models/page_question.rb +1 -1
- data/spec/support/models/palette.rb +1 -1
- data/spec/support/models/parent.rb +1 -1
- data/spec/support/models/parent_doc.rb +1 -1
- data/spec/support/models/passport.rb +15 -1
- data/spec/support/models/patient.rb +1 -1
- data/spec/support/models/pdf_writer.rb +1 -1
- data/spec/support/models/pencil.rb +1 -1
- data/spec/support/models/person.rb +19 -1
- data/spec/support/models/pet.rb +1 -1
- data/spec/support/models/pet_owner.rb +1 -1
- data/spec/support/models/phone.rb +3 -2
- data/spec/support/models/piano.rb +1 -1
- data/spec/support/models/pizza.rb +1 -1
- data/spec/support/models/player.rb +3 -1
- data/spec/support/models/post.rb +1 -1
- data/spec/support/models/post_genre.rb +1 -1
- data/spec/support/models/powerup.rb +13 -1
- data/spec/support/models/preference.rb +1 -1
- data/spec/support/models/princess.rb +1 -1
- data/spec/support/models/product.rb +2 -1
- data/spec/support/models/profile.rb +1 -1
- data/spec/support/models/pronunciation.rb +1 -1
- data/spec/support/models/pub.rb +1 -1
- data/spec/support/models/publication/encyclopedia.rb +1 -1
- data/spec/support/models/publication/review.rb +1 -1
- data/spec/support/models/publication.rb +1 -1
- data/spec/support/models/purchase.rb +1 -1
- data/spec/support/models/purchased_item.rb +11 -0
- data/spec/support/models/purse.rb +9 -0
- data/spec/support/models/question.rb +1 -1
- data/spec/support/models/quiz.rb +1 -1
- data/spec/support/models/rating.rb +1 -1
- data/spec/support/models/record.rb +1 -1
- data/spec/support/models/registry.rb +2 -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 +4 -0
- data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
- data/spec/support/models/sandbox/sandbox_message.rb +4 -0
- data/spec/support/models/sandbox/sandbox_user.rb +4 -0
- data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
- data/spec/support/models/sandwich.rb +1 -1
- data/spec/support/models/scheduler.rb +1 -1
- data/spec/support/models/school.rb +15 -0
- data/spec/support/models/scribe.rb +1 -1
- data/spec/support/models/sealer.rb +8 -0
- data/spec/support/models/seat.rb +1 -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 +1 -1
- data/spec/support/models/shape.rb +1 -1
- data/spec/support/models/shelf.rb +1 -1
- data/spec/support/models/shield.rb +19 -0
- data/spec/support/models/shipment_address.rb +1 -1
- data/spec/support/models/shipping_container.rb +1 -1
- data/spec/support/models/shipping_pack.rb +1 -1
- data/spec/support/models/shirt.rb +12 -0
- data/spec/support/models/shop.rb +1 -1
- data/spec/support/models/short_agent.rb +1 -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 -1
- data/spec/support/models/sound.rb +1 -1
- data/spec/support/models/spacer.rb +8 -0
- data/spec/support/models/square.rb +1 -1
- data/spec/support/models/staff.rb +1 -1
- data/spec/support/models/store_as_dup_test1.rb +1 -1
- data/spec/support/models/store_as_dup_test2.rb +1 -1
- data/spec/support/models/store_as_dup_test3.rb +1 -1
- data/spec/support/models/store_as_dup_test4.rb +1 -1
- data/spec/support/models/strategy.rb +1 -1
- data/spec/support/models/student.rb +15 -0
- data/spec/support/models/sub_item.rb +1 -1
- data/spec/support/models/subscription.rb +1 -1
- data/spec/support/models/survey.rb +1 -1
- data/spec/support/models/symptom.rb +1 -1
- data/spec/support/models/system_role.rb +1 -0
- data/spec/support/models/tag.rb +1 -1
- 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 +8 -0
- data/spec/support/models/title.rb +1 -1
- data/spec/support/models/tool.rb +1 -1
- data/spec/support/models/topping.rb +1 -1
- data/spec/support/models/toy.rb +1 -1
- data/spec/support/models/track.rb +1 -1
- data/spec/support/models/translation.rb +1 -1
- data/spec/support/models/tree.rb +1 -1
- data/spec/support/models/truck.rb +1 -1
- data/spec/support/models/updatable.rb +1 -1
- data/spec/support/models/user.rb +1 -1
- data/spec/support/models/user_account.rb +1 -1
- data/spec/support/models/validation_callback.rb +1 -1
- data/spec/support/models/vehicle.rb +1 -1
- data/spec/support/models/version.rb +1 -1
- data/spec/support/models/vertex.rb +1 -1
- data/spec/support/models/vet_visit.rb +1 -1
- data/spec/support/models/video.rb +1 -1
- data/spec/support/models/video_game.rb +1 -1
- data/spec/support/models/washer.rb +8 -0
- data/spec/support/models/weapon.rb +13 -1
- data/spec/support/models/wiki_page.rb +1 -1
- data/spec/support/models/word.rb +1 -1
- data/spec/support/models/word_origin.rb +1 -1
- data/spec/support/models/writer.rb +1 -1
- data/spec/support/rails_mock.rb +32 -0
- data/spec/support/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_local.json +18 -0
- data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/shared/time.rb +3 -22
- data/spec/support/sinatra_mock.rb +7 -0
- data/spec/support/spec_config.rb +42 -7
- data.tar.gz.sig +0 -0
- metadata +883 -562
- metadata.gz.sig +0 -0
- data/lib/mongoid/association/referenced/eager.rb +0 -184
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -128
- data/lib/mongoid/contextual/geo_near.rb +0 -269
- data/lib/mongoid/errors/eager_load.rb +0 -26
- data/lib/mongoid/errors/invalid_session_use.rb +0 -26
- data/lib/mongoid/errors/invalid_storage_parent.rb +0 -28
- data/lib/mongoid/errors/invalid_value.rb +0 -18
- data/lib/mongoid/query_cache.rb +0 -333
- data/lib/support/ruby_version.rb +0 -29
- data/spec/mongoid/contextual/geo_near_spec.rb +0 -472
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
- data/spec/mongoid/extensions_spec.rb +0 -32
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -61
- data/spec/mongoid/query_cache_spec.rb +0 -978
- data/spec/support/cluster_config.rb +0 -158
- data/spec/support/session_registry.rb +0 -50
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# rubocop:todo all
|
|
2
|
+
require "mongoid/threaded"
|
|
3
|
+
require "mongoid/errors/transactions_not_supported"
|
|
4
|
+
|
|
5
|
+
# This method raises an error if the cluster the client is connected to
|
|
6
|
+
# does not support transactions in any case. At the moment this is the case
|
|
7
|
+
# of the standalone topology.
|
|
8
|
+
#
|
|
9
|
+
# Please note that if this method did not raise, it does not guarantee that
|
|
10
|
+
# transactions are available for the cluster.
|
|
11
|
+
#
|
|
12
|
+
# @param [ Mongo::Client ] client Client connected to a cluster to be tested.
|
|
13
|
+
#
|
|
14
|
+
# @raise [ Mongoid::Errors::TransactionsNotSupported ] If the cluster
|
|
15
|
+
# definitely does not support transactions.
|
|
16
|
+
def check_if_transactions_might_be_available!(client)
|
|
17
|
+
if client.cluster.single?
|
|
18
|
+
raise Mongoid::Errors::TransactionsNotSupported
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Starts a transaction that should include all the operations inside
|
|
23
|
+
# the sandboxed console session. This transaction should not be ever committed.
|
|
24
|
+
# When a user end the console session, the client will disconnect, and
|
|
25
|
+
# the transaction will be automatically aborted therefore.
|
|
26
|
+
#
|
|
27
|
+
# @param [ Mongo::Client ] client Client to start the transaction.
|
|
28
|
+
def start_sandbox_transaction(client)
|
|
29
|
+
session = client.start_session
|
|
30
|
+
::Mongoid::Threaded.set_session(session, client: client)
|
|
31
|
+
session.start_transaction
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Prepares console sandbox mode. This method should be called when
|
|
35
|
+
# a user starts rails console with '--sandbox' flag.
|
|
36
|
+
def start_sandbox
|
|
37
|
+
Mongoid.persistence_context.client.tap do |client|
|
|
38
|
+
check_if_transactions_might_be_available!(client)
|
|
39
|
+
start_sandbox_transaction(client)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
#
|
|
2
|
+
# rubocop:todo all
|
|
3
3
|
|
|
4
4
|
module Mongoid
|
|
5
5
|
module Railties
|
|
@@ -47,9 +47,7 @@ module Mongoid
|
|
|
47
47
|
messages << ("MongoDB: %.1fms" % mongoid_runtime.to_f) if mongoid_runtime
|
|
48
48
|
messages
|
|
49
49
|
end
|
|
50
|
-
|
|
51
50
|
end
|
|
52
|
-
|
|
53
51
|
end
|
|
54
52
|
|
|
55
53
|
# The Collector of MongoDB runtime metric, that subscribes to Mongo
|
|
@@ -60,30 +58,47 @@ module Mongoid
|
|
|
60
58
|
|
|
61
59
|
VARIABLE_NAME = "Mongoid.controller_runtime".freeze
|
|
62
60
|
|
|
61
|
+
# Call when event started. Does nothing.
|
|
62
|
+
#
|
|
63
|
+
# @return [ nil ] Nil.
|
|
63
64
|
def started _; end
|
|
64
65
|
|
|
66
|
+
# Call when event completed. Updates the runtime value.
|
|
67
|
+
#
|
|
68
|
+
# @param [ Mongo::Event::Base ] e The monitoring event.
|
|
69
|
+
#
|
|
70
|
+
# @return [ Integer ] The current runtime value.
|
|
65
71
|
def _completed e
|
|
66
|
-
Collector.runtime += e.duration
|
|
72
|
+
Collector.runtime += e.duration * 1000
|
|
67
73
|
end
|
|
68
74
|
alias :succeeded :_completed
|
|
69
75
|
alias :failed :_completed
|
|
70
76
|
|
|
77
|
+
# Get the runtime value on the current thread.
|
|
78
|
+
#
|
|
79
|
+
# @return [ Integer ] The runtime value.
|
|
71
80
|
def self.runtime
|
|
72
81
|
Thread.current[VARIABLE_NAME] ||= 0
|
|
73
82
|
end
|
|
74
83
|
|
|
84
|
+
# Set the runtime value on the current thread.
|
|
85
|
+
#
|
|
86
|
+
# @param [ Integer ] value The runtime value.
|
|
87
|
+
#
|
|
88
|
+
# @return [ Integer ] The runtime value.
|
|
75
89
|
def self.runtime= value
|
|
76
90
|
Thread.current[VARIABLE_NAME] = value
|
|
77
91
|
end
|
|
78
92
|
|
|
93
|
+
# Reset the runtime value to zero the current thread.
|
|
94
|
+
#
|
|
95
|
+
# @return [ Integer ] The previous runtime value.
|
|
79
96
|
def self.reset_runtime
|
|
80
97
|
to_now = runtime
|
|
81
98
|
self.runtime = 0
|
|
82
99
|
to_now
|
|
83
100
|
end
|
|
84
|
-
|
|
85
101
|
end
|
|
86
|
-
|
|
87
102
|
end
|
|
88
103
|
end
|
|
89
104
|
end
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# rubocop:todo all
|
|
2
3
|
|
|
3
4
|
load 'mongoid/tasks/database.rake'
|
|
5
|
+
load "mongoid/tasks/encryption.rake"
|
|
4
6
|
|
|
5
7
|
namespace :db do
|
|
6
8
|
|
|
@@ -25,7 +27,7 @@ namespace :db do
|
|
|
25
27
|
|
|
26
28
|
unless Rake::Task.task_defined?("db:setup")
|
|
27
29
|
desc "Create the database, and initialize with the seed data"
|
|
28
|
-
task :setup => [ "db:create", "mongoid:create_indexes", "db:seed" ]
|
|
30
|
+
task :setup => [ "db:create", "mongoid:create_collections", "mongoid:create_indexes", "db:seed" ]
|
|
29
31
|
end
|
|
30
32
|
|
|
31
33
|
unless Rake::Task.task_defined?("db:reset")
|
|
@@ -55,15 +57,25 @@ namespace :db do
|
|
|
55
57
|
|
|
56
58
|
unless Rake::Task.task_defined?("db:test:prepare")
|
|
57
59
|
namespace :test do
|
|
58
|
-
task :prepare => "mongoid:create_indexes"
|
|
60
|
+
task :prepare => ["mongoid:create_collections", "mongoid:create_indexes"]
|
|
59
61
|
end
|
|
60
62
|
end
|
|
61
63
|
|
|
64
|
+
unless Rake::Task.task_defined?("db:create_collections")
|
|
65
|
+
desc "Create collections specified in Mongoid models"
|
|
66
|
+
task :create_collections => "mongoid:create_collections"
|
|
67
|
+
end
|
|
68
|
+
|
|
62
69
|
unless Rake::Task.task_defined?("db:create_indexes")
|
|
63
70
|
desc "Create indexes specified in Mongoid models"
|
|
64
71
|
task :create_indexes => "mongoid:create_indexes"
|
|
65
72
|
end
|
|
66
73
|
|
|
74
|
+
unless Rake::Task.task_defined?("db:create_search_indexes")
|
|
75
|
+
desc "Create search indexes specified in Mongoid models"
|
|
76
|
+
task :create_search_indexes => "mongoid:create_search_indexes"
|
|
77
|
+
end
|
|
78
|
+
|
|
67
79
|
unless Rake::Task.task_defined?("db:remove_indexes")
|
|
68
80
|
desc "Remove indexes specified in Mongoid models"
|
|
69
81
|
task :remove_indexes => "mongoid:remove_indexes"
|
|
@@ -74,6 +86,11 @@ namespace :db do
|
|
|
74
86
|
task :shard_collections => "mongoid:shard_collections"
|
|
75
87
|
end
|
|
76
88
|
|
|
89
|
+
namespace :encryption do
|
|
90
|
+
desc "Create encryption key"
|
|
91
|
+
task :create_data_key => "mongoid:encryption:create_data_key"
|
|
92
|
+
end
|
|
93
|
+
|
|
77
94
|
namespace :mongoid do
|
|
78
95
|
task :load_models do
|
|
79
96
|
::Rails.application.eager_load! if defined?(::Rails)
|
data/lib/mongoid/reloadable.rb
CHANGED
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# encoding: utf-8
|
|
3
2
|
|
|
4
3
|
module Mongoid
|
|
5
|
-
|
|
6
4
|
# This module handles reloading behavior of documents.
|
|
7
|
-
#
|
|
8
|
-
# @since 4.0.0
|
|
9
5
|
module Reloadable
|
|
10
|
-
|
|
11
6
|
# Reloads the +Document+ attributes from the database. If the document has
|
|
12
7
|
# not been saved then an error will get raised if the configuration option
|
|
13
8
|
# was set. This can reload root documents or embedded documents.
|
|
@@ -18,19 +13,12 @@ module Mongoid
|
|
|
18
13
|
# @raise [ Errors::DocumentNotFound ] If the document was deleted.
|
|
19
14
|
#
|
|
20
15
|
# @return [ Document ] The document, reloaded.
|
|
21
|
-
#
|
|
22
|
-
# @since 1.0.0
|
|
23
16
|
def reload
|
|
24
17
|
reloaded = _reload
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
@attributes_before_type_cast = {}
|
|
30
|
-
changed_attributes.clear
|
|
31
|
-
reset_readonly
|
|
32
|
-
apply_defaults
|
|
33
|
-
reload_relations
|
|
18
|
+
check_for_deleted_document!(reloaded)
|
|
19
|
+
|
|
20
|
+
reset_object!(reloaded)
|
|
21
|
+
|
|
34
22
|
run_callbacks(:find) unless _find_callbacks.empty?
|
|
35
23
|
run_callbacks(:initialize) unless _initialize_callbacks.empty?
|
|
36
24
|
self
|
|
@@ -38,6 +26,43 @@ module Mongoid
|
|
|
38
26
|
|
|
39
27
|
private
|
|
40
28
|
|
|
29
|
+
# Resets the current object using the given attributes.
|
|
30
|
+
#
|
|
31
|
+
# @param [ Hash ] attributes The attributes to use to replace the current
|
|
32
|
+
# attributes hash.
|
|
33
|
+
def reset_object!(attributes)
|
|
34
|
+
reset_atomic_updates!
|
|
35
|
+
|
|
36
|
+
@attributes = attributes
|
|
37
|
+
@attributes_before_type_cast = @attributes.dup
|
|
38
|
+
@changed_attributes = {}
|
|
39
|
+
@previous_changes = {}
|
|
40
|
+
@previous_attributes = {}
|
|
41
|
+
@previously_new_record = false
|
|
42
|
+
|
|
43
|
+
reset_readonly
|
|
44
|
+
apply_defaults
|
|
45
|
+
reload_relations
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Checks to see if the given attributes argument indicates that the object
|
|
49
|
+
# has been deleted. If the attributes are nil or an empty Hash, then
|
|
50
|
+
# we assume it has been deleted.
|
|
51
|
+
#
|
|
52
|
+
# If Mongoid.raise_not_found_error is false, this will do nothing.
|
|
53
|
+
#
|
|
54
|
+
# @param [ Hash | nil ] attributes The attributes hash retrieved from
|
|
55
|
+
# the database
|
|
56
|
+
#
|
|
57
|
+
# @raise [ Errors::DocumentNotFound ] If the document was deleted.
|
|
58
|
+
def check_for_deleted_document!(attributes)
|
|
59
|
+
return unless Mongoid.raise_not_found_error
|
|
60
|
+
return unless attributes.nil? || attributes.empty?
|
|
61
|
+
|
|
62
|
+
shard_keys = atomic_selector.with_indifferent_access.slice(*shard_key_fields, :_id)
|
|
63
|
+
raise Errors::DocumentNotFound.new(self.class, _id, shard_keys)
|
|
64
|
+
end
|
|
65
|
+
|
|
41
66
|
# Reload the document, determining if it's embedded or not and what
|
|
42
67
|
# behavior to use.
|
|
43
68
|
#
|
|
@@ -45,8 +70,6 @@ module Mongoid
|
|
|
45
70
|
# document._reload
|
|
46
71
|
#
|
|
47
72
|
# @return [ Hash ] The reloaded attributes.
|
|
48
|
-
#
|
|
49
|
-
# @since 2.3.2
|
|
50
73
|
def _reload
|
|
51
74
|
embedded? ? reload_embedded_document : reload_root_document
|
|
52
75
|
end
|
|
@@ -57,8 +80,6 @@ module Mongoid
|
|
|
57
80
|
# document.reload_root_document
|
|
58
81
|
#
|
|
59
82
|
# @return [ Hash ] The reloaded attributes.
|
|
60
|
-
#
|
|
61
|
-
# @since 2.3.2
|
|
62
83
|
def reload_root_document
|
|
63
84
|
{}.merge(collection.find(atomic_selector, session: _session).read(mode: :primary).first || {})
|
|
64
85
|
end
|
|
@@ -69,29 +90,11 @@ module Mongoid
|
|
|
69
90
|
# document.reload_embedded_document
|
|
70
91
|
#
|
|
71
92
|
# @return [ Hash ] The reloaded attributes.
|
|
72
|
-
#
|
|
73
|
-
# @since 2.3.2
|
|
74
93
|
def reload_embedded_document
|
|
75
|
-
|
|
76
|
-
collection(_root).find(_root.atomic_selector).read(mode: :primary).first
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
# Extract only the desired embedded document from the attributes.
|
|
81
|
-
#
|
|
82
|
-
# @example Extract the embedded document.
|
|
83
|
-
# document.extract_embedded_attributes(attributes)
|
|
84
|
-
#
|
|
85
|
-
# @param [ Hash ] attributes The document in the db.
|
|
86
|
-
#
|
|
87
|
-
# @return [ Hash ] The document's extracted attributes.
|
|
88
|
-
#
|
|
89
|
-
# @since 2.3.2
|
|
90
|
-
def extract_embedded_attributes(attributes)
|
|
91
|
-
atomic_position.split(".").inject(attributes) do |attrs, part|
|
|
92
|
-
attrs = attrs[part =~ /\d/ ? part.to_i : part]
|
|
93
|
-
attrs
|
|
94
|
-
end
|
|
94
|
+
Mongoid::Attributes::Embedded.traverse(
|
|
95
|
+
collection(_root).find(_root.atomic_selector, session: _session).read(mode: :primary).first,
|
|
96
|
+
atomic_position
|
|
97
|
+
)
|
|
95
98
|
end
|
|
96
99
|
end
|
|
97
100
|
end
|
data/lib/mongoid/scopable.rb
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
#
|
|
2
|
+
# rubocop:todo all
|
|
3
3
|
|
|
4
4
|
module Mongoid
|
|
5
5
|
|
|
6
6
|
# This module contains behavior for all Mongoid scoping - named scopes,
|
|
7
7
|
# default scopes, and criteria accessors via scoped and unscoped.
|
|
8
|
-
#
|
|
9
|
-
# @since 4.0.0
|
|
10
8
|
module Scopable
|
|
11
9
|
extend ActiveSupport::Concern
|
|
12
10
|
|
|
@@ -26,9 +24,7 @@ module Mongoid
|
|
|
26
24
|
# @example Apply the default scoping.
|
|
27
25
|
# document.apply_default_scoping
|
|
28
26
|
#
|
|
29
|
-
# @return [ true
|
|
30
|
-
#
|
|
31
|
-
# @since 4.0.0
|
|
27
|
+
# @return [ true | false ] If default scoping was applied.
|
|
32
28
|
def apply_default_scoping
|
|
33
29
|
if default_scoping
|
|
34
30
|
default_scoping.call.selector.each do |field, value|
|
|
@@ -52,8 +48,6 @@ module Mongoid
|
|
|
52
48
|
# Band.scopes
|
|
53
49
|
#
|
|
54
50
|
# @return [ Hash ] The scopes defined for this class
|
|
55
|
-
#
|
|
56
|
-
# @since 3.1.4
|
|
57
51
|
def scopes
|
|
58
52
|
defined_scopes = {}
|
|
59
53
|
ancestors.reverse.each do |klass|
|
|
@@ -81,13 +75,11 @@ module Mongoid
|
|
|
81
75
|
# default_scope ->{ where(active: true) }
|
|
82
76
|
# end
|
|
83
77
|
#
|
|
84
|
-
# @param [ Proc
|
|
78
|
+
# @param [ Proc | Criteria ] value The default scope.
|
|
85
79
|
#
|
|
86
80
|
# @raise [ Errors::InvalidScope ] If the scope is not a proc or criteria.
|
|
87
81
|
#
|
|
88
82
|
# @return [ Proc ] The default scope.
|
|
89
|
-
#
|
|
90
|
-
# @since 1.0.0
|
|
91
83
|
def default_scope(value = nil)
|
|
92
84
|
value = Proc.new { yield } if block_given?
|
|
93
85
|
check_scope_validity(value)
|
|
@@ -99,9 +91,7 @@ module Mongoid
|
|
|
99
91
|
# @example Can the default scope be applied?
|
|
100
92
|
# Band.default_scopable?
|
|
101
93
|
#
|
|
102
|
-
# @return [ true
|
|
103
|
-
#
|
|
104
|
-
# @since 3.0.0
|
|
94
|
+
# @return [ true | false ] If the default scope can be applied.
|
|
105
95
|
def default_scopable?
|
|
106
96
|
default_scoping? && !Threaded.without_default_scope?(self)
|
|
107
97
|
end
|
|
@@ -114,8 +104,6 @@ module Mongoid
|
|
|
114
104
|
# Model.queryable
|
|
115
105
|
#
|
|
116
106
|
# @return [ Criteria ] The queryable.
|
|
117
|
-
#
|
|
118
|
-
# @since 3.0.0
|
|
119
107
|
def queryable
|
|
120
108
|
crit = Threaded.current_scope(self) || Criteria.new(self)
|
|
121
109
|
crit.embedded = true if (crit.klass.embedded? && !crit.klass.cyclic?)
|
|
@@ -141,8 +129,6 @@ module Mongoid
|
|
|
141
129
|
#
|
|
142
130
|
# @raise [ Errors::InvalidScope ] If the scope is not a proc.
|
|
143
131
|
# @raise [ Errors::ScopeOverwrite ] If the scope name already exists.
|
|
144
|
-
#
|
|
145
|
-
# @since 1.0.0
|
|
146
132
|
def scope(name, value, &block)
|
|
147
133
|
normalized = name.to_sym
|
|
148
134
|
check_scope_validity(value)
|
|
@@ -169,32 +155,31 @@ module Mongoid
|
|
|
169
155
|
# @option options [ Array ] :sort Optional sorting options.
|
|
170
156
|
#
|
|
171
157
|
# @return [ Criteria ] A scoped criteria.
|
|
172
|
-
#
|
|
173
|
-
# @since 3.0.0
|
|
174
158
|
def scoped(options = nil)
|
|
175
159
|
queryable.scoped(options)
|
|
176
160
|
end
|
|
177
161
|
|
|
178
|
-
# Get the criteria without
|
|
162
|
+
# Get the criteria without any scoping applied.
|
|
179
163
|
#
|
|
180
164
|
# @example Get the unscoped criteria.
|
|
181
165
|
# Band.unscoped
|
|
182
166
|
#
|
|
183
|
-
# @example Yield to block with no
|
|
167
|
+
# @example Yield to block with no scoping.
|
|
184
168
|
# Band.unscoped do
|
|
185
169
|
# Band.where(name: "Depeche Mode")
|
|
186
170
|
# end
|
|
187
171
|
#
|
|
188
|
-
# @note This will force the default scope
|
|
172
|
+
# @note This will force the default scope, as well as any scope applied
|
|
173
|
+
# using ``.with_scope``, to be removed.
|
|
189
174
|
#
|
|
190
|
-
# @return [ Criteria
|
|
175
|
+
# @return [ Criteria | Object ] The unscoped criteria or result of the
|
|
191
176
|
# block.
|
|
192
|
-
#
|
|
193
|
-
# @since 3.0.0
|
|
194
177
|
def unscoped
|
|
195
178
|
if block_given?
|
|
196
179
|
without_default_scope do
|
|
197
|
-
|
|
180
|
+
with_scope(nil) do
|
|
181
|
+
yield(self)
|
|
182
|
+
end
|
|
198
183
|
end
|
|
199
184
|
else
|
|
200
185
|
queryable.unscoped
|
|
@@ -207,8 +192,6 @@ module Mongoid
|
|
|
207
192
|
# Model.with_default_scope
|
|
208
193
|
#
|
|
209
194
|
# @return [ Criteria ] The criteria.
|
|
210
|
-
#
|
|
211
|
-
# @since 3.0.0
|
|
212
195
|
def with_default_scope
|
|
213
196
|
queryable.with_default_scope
|
|
214
197
|
end
|
|
@@ -223,14 +206,13 @@ module Mongoid
|
|
|
223
206
|
# @param [ Criteria ] criteria The criteria to apply.
|
|
224
207
|
#
|
|
225
208
|
# @return [ Criteria ] The yielded criteria.
|
|
226
|
-
#
|
|
227
|
-
# @since 1.0.0
|
|
228
209
|
def with_scope(criteria)
|
|
210
|
+
previous = Threaded.current_scope(self)
|
|
229
211
|
Threaded.set_current_scope(criteria, self)
|
|
230
212
|
begin
|
|
231
213
|
yield criteria
|
|
232
214
|
ensure
|
|
233
|
-
Threaded.set_current_scope(
|
|
215
|
+
Threaded.set_current_scope(previous, self)
|
|
234
216
|
end
|
|
235
217
|
end
|
|
236
218
|
|
|
@@ -242,8 +224,6 @@ module Mongoid
|
|
|
242
224
|
# end
|
|
243
225
|
#
|
|
244
226
|
# @return [ Object ] The result of the block.
|
|
245
|
-
#
|
|
246
|
-
# @since 3.0.0
|
|
247
227
|
def without_default_scope
|
|
248
228
|
Threaded.begin_without_default_scope(self)
|
|
249
229
|
yield
|
|
@@ -258,25 +238,23 @@ module Mongoid
|
|
|
258
238
|
# @api private
|
|
259
239
|
#
|
|
260
240
|
# @example Warn or raise error if name exists.
|
|
261
|
-
# Model.
|
|
241
|
+
# Model.check_scope_name("test")
|
|
262
242
|
#
|
|
263
|
-
# @param [ String
|
|
243
|
+
# @param [ String | Symbol ] name The name of the scope.
|
|
264
244
|
#
|
|
265
245
|
# @raise [ Errors::ScopeOverwrite ] If the name exists and configured to
|
|
266
246
|
# raise the error.
|
|
267
|
-
#
|
|
268
|
-
# @since 2.1.0
|
|
269
247
|
def check_scope_name(name)
|
|
270
248
|
if _declared_scopes[name] || respond_to?(name, true)
|
|
271
249
|
if Mongoid.scope_overwrite_exception
|
|
272
250
|
raise Errors::ScopeOverwrite.new(self.name, name)
|
|
273
251
|
else
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
252
|
+
Mongoid.logger.warn(
|
|
253
|
+
"Creating scope :#{name} which conflicts with #{self.name}.#{name}. " +
|
|
254
|
+
"Calls to `Mongoid::Criteria##{name}` will delegate to " +
|
|
255
|
+
"`Mongoid::Criteria##{name}` for criteria with klass #{self.name} " +
|
|
256
|
+
"and will ignore the declared scope."
|
|
257
|
+
)
|
|
280
258
|
end
|
|
281
259
|
end
|
|
282
260
|
end
|
|
@@ -292,8 +270,6 @@ module Mongoid
|
|
|
292
270
|
# @param [ Object ] value The intended scope.
|
|
293
271
|
#
|
|
294
272
|
# @raise [ Errors::InvalidScope ] If the scope is not a valid object.
|
|
295
|
-
#
|
|
296
|
-
# @since 3.0.0
|
|
297
273
|
def check_scope_validity(value)
|
|
298
274
|
unless value.respond_to?(:call)
|
|
299
275
|
raise Errors::InvalidScope.new(self, value)
|
|
@@ -311,13 +287,11 @@ module Mongoid
|
|
|
311
287
|
# @param [ Symbol ] name The method/scope name.
|
|
312
288
|
#
|
|
313
289
|
# @return [ Method ] The defined method.
|
|
314
|
-
#
|
|
315
|
-
# @since 3.0.0
|
|
316
290
|
def define_scope_method(name)
|
|
317
291
|
singleton_class.class_eval do
|
|
318
|
-
define_method(name) do |*args|
|
|
292
|
+
define_method(name) do |*args, **kwargs|
|
|
319
293
|
scoping = _declared_scopes[name]
|
|
320
|
-
scope = instance_exec(*args, &scoping[:scope])
|
|
294
|
+
scope = instance_exec(*args, **kwargs, &scoping[:scope])
|
|
321
295
|
extension = scoping[:extension]
|
|
322
296
|
to_merge = scope || queryable
|
|
323
297
|
criteria = to_merge.empty_and_chainable? ? to_merge : with_default_scope.merge(to_merge)
|
|
@@ -335,9 +309,7 @@ module Mongoid
|
|
|
335
309
|
# @example Process the default scope.
|
|
336
310
|
# Model.process_default_scope(value)
|
|
337
311
|
#
|
|
338
|
-
# @param [ Criteria
|
|
339
|
-
#
|
|
340
|
-
# @since 3.0.5
|
|
312
|
+
# @param [ Criteria | Proc ] value The default scope value.
|
|
341
313
|
def process_default_scope(value)
|
|
342
314
|
if existing = default_scoping
|
|
343
315
|
->{ existing.call.merge(value.to_proc.call) }
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Mongoid
|
|
4
|
+
# Encapsulates behavior around managing search indexes. This feature
|
|
5
|
+
# is only supported when connected to an Atlas cluster.
|
|
6
|
+
module SearchIndexable
|
|
7
|
+
extend ActiveSupport::Concern
|
|
8
|
+
|
|
9
|
+
# Represents the status of the indexes returned by a search_indexes
|
|
10
|
+
# call.
|
|
11
|
+
#
|
|
12
|
+
# @api private
|
|
13
|
+
class Status
|
|
14
|
+
# @return [ Array<Hash> ] the raw index documents
|
|
15
|
+
attr_reader :indexes
|
|
16
|
+
|
|
17
|
+
# Create a new Status object.
|
|
18
|
+
#
|
|
19
|
+
# @param [ Array<Hash> ] indexes the raw index documents
|
|
20
|
+
def initialize(indexes)
|
|
21
|
+
@indexes = indexes
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Returns the subset of indexes that have status == 'READY'
|
|
25
|
+
#
|
|
26
|
+
# @return [ Array<Hash> ] index documents for "ready" indices
|
|
27
|
+
def ready
|
|
28
|
+
indexes.select { |i| i['status'] == 'READY' }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Returns the subset of indexes that have status == 'PENDING'
|
|
32
|
+
#
|
|
33
|
+
# @return [ Array<Hash> ] index documents for "pending" indices
|
|
34
|
+
def pending
|
|
35
|
+
indexes.select { |i| i['status'] == 'PENDING' }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Returns the subset of indexes that are marked 'queryable'
|
|
39
|
+
#
|
|
40
|
+
# @return [ Array<Hash> ] index documents for 'queryable' indices
|
|
41
|
+
def queryable
|
|
42
|
+
indexes.select { |i| i['queryable'] }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Returns true if all the given indexes are 'ready' and 'queryable'.
|
|
46
|
+
#
|
|
47
|
+
# @return [ true | false ] ready status of all indexes
|
|
48
|
+
def ready?
|
|
49
|
+
indexes.all? { |i| i['status'] == 'READY' && i['queryable'] }
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
included do
|
|
54
|
+
cattr_accessor :search_index_specs
|
|
55
|
+
self.search_index_specs = []
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Implementations for the feature's class-level methods.
|
|
59
|
+
module ClassMethods
|
|
60
|
+
# Request the creation of all registered search indices. Note
|
|
61
|
+
# that the search indexes are created asynchronously, and may take
|
|
62
|
+
# several minutes to be fully available.
|
|
63
|
+
#
|
|
64
|
+
# @return [ Array<String> ] The names of the search indexes.
|
|
65
|
+
def create_search_indexes
|
|
66
|
+
return if search_index_specs.empty?
|
|
67
|
+
|
|
68
|
+
collection.search_indexes.create_many(search_index_specs)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Waits for the named search indexes to be created.
|
|
72
|
+
#
|
|
73
|
+
# @param [ Array<String> ] names the list of index names to wait for
|
|
74
|
+
# @param [ Integer ] interval the number of seconds to wait before
|
|
75
|
+
# polling again (only used when a progress callback is given).
|
|
76
|
+
#
|
|
77
|
+
# @yield [ SearchIndexable::Status ] the status object
|
|
78
|
+
def wait_for_search_indexes(names, interval: 5)
|
|
79
|
+
loop do
|
|
80
|
+
status = Status.new(get_indexes(names))
|
|
81
|
+
yield status if block_given?
|
|
82
|
+
break if status.ready?
|
|
83
|
+
|
|
84
|
+
sleep interval
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# A convenience method for querying the search indexes available on the
|
|
89
|
+
# current model's collection.
|
|
90
|
+
#
|
|
91
|
+
# @param [ Hash ] options the options to pass through to the search
|
|
92
|
+
# index query.
|
|
93
|
+
#
|
|
94
|
+
# @option options [ String ] :id The id of the specific index to query (optional)
|
|
95
|
+
# @option options [ String ] :name The name of the specific index to query (optional)
|
|
96
|
+
# @option options [ Hash ] :aggregate The options hash to pass to the
|
|
97
|
+
# aggregate command (optional)
|
|
98
|
+
def search_indexes(options = {})
|
|
99
|
+
collection.search_indexes(options)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Removes the search index specified by the given name or id. Either
|
|
103
|
+
# name OR id must be given, but not both.
|
|
104
|
+
#
|
|
105
|
+
# @param [ String | nil ] name the name of the index to remove
|
|
106
|
+
# @param [ String | nil ] id the id of the index to remove
|
|
107
|
+
def remove_search_index(name: nil, id: nil)
|
|
108
|
+
logger.info(
|
|
109
|
+
"MONGOID: Removing search index '#{name || id}' " \
|
|
110
|
+
"on collection '#{collection.name}'."
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
collection.search_indexes.drop_one(name: name, id: id)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Request the removal of all registered search indexes. Note
|
|
117
|
+
# that the search indexes are removed asynchronously, and may take
|
|
118
|
+
# several minutes to be fully deleted.
|
|
119
|
+
#
|
|
120
|
+
# @note It would be nice if this could remove ONLY the search indexes
|
|
121
|
+
# that have been declared on the model, but because the model may not
|
|
122
|
+
# name the index, we can't guarantee that we'll know the name or id of
|
|
123
|
+
# the corresponding indexes. It is not unreasonable to assume, though,
|
|
124
|
+
# that the intention is for the model to declare, one-to-one, all
|
|
125
|
+
# desired search indexes, so removing all search indexes ought to suffice.
|
|
126
|
+
# If a specific index or set of indexes needs to be removed instead,
|
|
127
|
+
# consider using search_indexes.each with remove_search_index.
|
|
128
|
+
def remove_search_indexes
|
|
129
|
+
search_indexes.each do |spec|
|
|
130
|
+
remove_search_index id: spec['id']
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Adds an index definition for the provided single or compound keys.
|
|
135
|
+
#
|
|
136
|
+
# @example Create a basic index.
|
|
137
|
+
# class Person
|
|
138
|
+
# include Mongoid::Document
|
|
139
|
+
# field :name, type: String
|
|
140
|
+
# search_index({ ... })
|
|
141
|
+
# search_index :name_of_index, { ... }
|
|
142
|
+
# end
|
|
143
|
+
#
|
|
144
|
+
# @param [ Symbol | String | Hash ] name_or_defn Either the name of the index to
|
|
145
|
+
# define, or the index definition.
|
|
146
|
+
# @param [ Hash ] defn The search index definition.
|
|
147
|
+
def search_index(name_or_defn, defn = nil)
|
|
148
|
+
name = name_or_defn
|
|
149
|
+
name, defn = nil, name if name.is_a?(Hash)
|
|
150
|
+
|
|
151
|
+
spec = { definition: defn }.tap { |s| s[:name] = name.to_s if name }
|
|
152
|
+
search_index_specs.push(spec)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
private
|
|
156
|
+
|
|
157
|
+
# Retrieves the index records for the indexes with the given names.
|
|
158
|
+
#
|
|
159
|
+
# @param [ Array<String> ] names the index names to query
|
|
160
|
+
#
|
|
161
|
+
# @return [ Array<Hash> ] the raw index documents
|
|
162
|
+
def get_indexes(names)
|
|
163
|
+
collection.search_indexes.select { |i| names.include?(i['name']) }
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|