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
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
#
|
|
2
|
+
# rubocop:todo all
|
|
3
3
|
|
|
4
4
|
require "mongoid/contextual/aggregable/memory"
|
|
5
5
|
require "mongoid/association/eager_loadable"
|
|
6
6
|
|
|
7
7
|
module Mongoid
|
|
8
8
|
module Contextual
|
|
9
|
+
|
|
10
|
+
# Context object used for performing bulk query and persistence
|
|
11
|
+
# operations on documents which have been loaded into application
|
|
12
|
+
# memory. The method interface of this class is consistent with
|
|
13
|
+
# Mongoid::Contextual::Mongo.
|
|
9
14
|
class Memory
|
|
10
15
|
include Enumerable
|
|
11
16
|
include Aggregable::Memory
|
|
@@ -26,9 +31,7 @@ module Mongoid
|
|
|
26
31
|
#
|
|
27
32
|
# @param [ Array ] other The other array.
|
|
28
33
|
#
|
|
29
|
-
# @return [ true
|
|
30
|
-
#
|
|
31
|
-
# @since 3.0.0
|
|
34
|
+
# @return [ true | false ] If the objects are equal.
|
|
32
35
|
def ==(other)
|
|
33
36
|
return false unless other.respond_to?(:entries)
|
|
34
37
|
entries == other.entries
|
|
@@ -40,8 +43,6 @@ module Mongoid
|
|
|
40
43
|
# context.delete
|
|
41
44
|
#
|
|
42
45
|
# @return [ nil ] Nil.
|
|
43
|
-
#
|
|
44
|
-
# @since 3.0.0
|
|
45
46
|
def delete
|
|
46
47
|
deleted = count
|
|
47
48
|
removed = map do |doc|
|
|
@@ -64,8 +65,6 @@ module Mongoid
|
|
|
64
65
|
# context.destroy
|
|
65
66
|
#
|
|
66
67
|
# @return [ nil ] Nil.
|
|
67
|
-
#
|
|
68
|
-
# @since 3.0.0
|
|
69
68
|
def destroy
|
|
70
69
|
deleted = count
|
|
71
70
|
each do |doc|
|
|
@@ -81,13 +80,11 @@ module Mongoid
|
|
|
81
80
|
# @example Get the distinct values.
|
|
82
81
|
# context.distinct(:name)
|
|
83
82
|
#
|
|
84
|
-
# @param [ String
|
|
83
|
+
# @param [ String | Symbol ] field The name of the field.
|
|
85
84
|
#
|
|
86
85
|
# @return [ Array<Object> ] The distinct values for the field.
|
|
87
|
-
#
|
|
88
|
-
# @since 3.0.0
|
|
89
86
|
def distinct(field)
|
|
90
|
-
|
|
87
|
+
pluck(field).uniq
|
|
91
88
|
end
|
|
92
89
|
|
|
93
90
|
# Iterate over the context. If provided a block, yield to a Mongoid
|
|
@@ -99,8 +96,6 @@ module Mongoid
|
|
|
99
96
|
# end
|
|
100
97
|
#
|
|
101
98
|
# @return [ Enumerator ] The enumerator.
|
|
102
|
-
#
|
|
103
|
-
# @since 3.0.0
|
|
104
99
|
def each
|
|
105
100
|
if block_given?
|
|
106
101
|
documents_for_iteration.each do |doc|
|
|
@@ -117,11 +112,24 @@ module Mongoid
|
|
|
117
112
|
# @example Do any documents exist for the context.
|
|
118
113
|
# context.exists?
|
|
119
114
|
#
|
|
120
|
-
# @
|
|
115
|
+
# @example Do any documents exist for given _id.
|
|
116
|
+
# context.exists?(BSON::ObjectId(...))
|
|
117
|
+
#
|
|
118
|
+
# @example Do any documents exist for given conditions.
|
|
119
|
+
# context.exists?(name: "...")
|
|
120
|
+
#
|
|
121
|
+
# @param [ Hash | Object | false ] id_or_conditions an _id to
|
|
122
|
+
# search for, a hash of conditions, nil or false.
|
|
121
123
|
#
|
|
122
|
-
# @
|
|
123
|
-
|
|
124
|
-
|
|
124
|
+
# @return [ true | false ] If the count is more than zero.
|
|
125
|
+
# Always false if passed nil or false.
|
|
126
|
+
def exists?(id_or_conditions = :none)
|
|
127
|
+
case id_or_conditions
|
|
128
|
+
when :none then any?
|
|
129
|
+
when nil, false then false
|
|
130
|
+
when Hash then Memory.new(criteria.where(id_or_conditions)).exists?
|
|
131
|
+
else Memory.new(criteria.where(_id: id_or_conditions)).exists?
|
|
132
|
+
end
|
|
125
133
|
end
|
|
126
134
|
|
|
127
135
|
# Get the first document in the database for the criteria's selector.
|
|
@@ -129,23 +137,39 @@ module Mongoid
|
|
|
129
137
|
# @example Get the first document.
|
|
130
138
|
# context.first
|
|
131
139
|
#
|
|
132
|
-
# @
|
|
140
|
+
# @param [ Integer ] limit The number of documents to return.
|
|
133
141
|
#
|
|
134
|
-
# @
|
|
135
|
-
def first(
|
|
136
|
-
|
|
142
|
+
# @return [ Document ] The first document.
|
|
143
|
+
def first(limit = nil)
|
|
144
|
+
if limit
|
|
145
|
+
eager_load(documents.first(limit))
|
|
146
|
+
else
|
|
147
|
+
eager_load([documents.first]).first
|
|
148
|
+
end
|
|
137
149
|
end
|
|
138
150
|
alias :one :first
|
|
139
151
|
alias :find_first :first
|
|
140
152
|
|
|
153
|
+
# Get the first document in the database for the criteria's selector or
|
|
154
|
+
# raise an error if none is found.
|
|
155
|
+
#
|
|
156
|
+
# @example Get the first document.
|
|
157
|
+
# context.first!
|
|
158
|
+
#
|
|
159
|
+
# @return [ Document ] The first document.
|
|
160
|
+
#
|
|
161
|
+
# @raise [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
162
|
+
# documents to take.
|
|
163
|
+
def first!
|
|
164
|
+
first || raise_document_not_found_error
|
|
165
|
+
end
|
|
166
|
+
|
|
141
167
|
# Create the new in memory context.
|
|
142
168
|
#
|
|
143
169
|
# @example Create the new context.
|
|
144
170
|
# Memory.new(criteria)
|
|
145
171
|
#
|
|
146
172
|
# @param [ Criteria ] criteria The criteria.
|
|
147
|
-
#
|
|
148
|
-
# @since 3.0.0
|
|
149
173
|
def initialize(criteria)
|
|
150
174
|
@criteria, @klass = criteria, criteria.klass
|
|
151
175
|
@documents = criteria.documents.select do |doc|
|
|
@@ -165,8 +189,6 @@ module Mongoid
|
|
|
165
189
|
# @param [ Hash ] incs The operations.
|
|
166
190
|
#
|
|
167
191
|
# @return [ Enumerator ] The enumerator.
|
|
168
|
-
#
|
|
169
|
-
# @since 7.0.0
|
|
170
192
|
def inc(incs)
|
|
171
193
|
each do |document|
|
|
172
194
|
document.inc(incs)
|
|
@@ -178,11 +200,29 @@ module Mongoid
|
|
|
178
200
|
# @example Get the last document.
|
|
179
201
|
# context.last
|
|
180
202
|
#
|
|
203
|
+
# @param [ Integer ] limit The number of documents to return.
|
|
204
|
+
#
|
|
205
|
+
# @return [ Document ] The last document.
|
|
206
|
+
def last(limit = nil)
|
|
207
|
+
if limit
|
|
208
|
+
eager_load(documents.last(limit))
|
|
209
|
+
else
|
|
210
|
+
eager_load([documents.last]).first
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
# Get the last document in the database for the criteria's selector or
|
|
215
|
+
# raise an error if none is found.
|
|
216
|
+
#
|
|
217
|
+
# @example Get the last document.
|
|
218
|
+
# context.last!
|
|
219
|
+
#
|
|
181
220
|
# @return [ Document ] The last document.
|
|
182
221
|
#
|
|
183
|
-
# @
|
|
184
|
-
|
|
185
|
-
|
|
222
|
+
# @raise [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
223
|
+
# documents to take.
|
|
224
|
+
def last!
|
|
225
|
+
last || raise_document_not_found_error
|
|
186
226
|
end
|
|
187
227
|
|
|
188
228
|
# Get the length of matching documents in the context.
|
|
@@ -191,8 +231,6 @@ module Mongoid
|
|
|
191
231
|
# context.length
|
|
192
232
|
#
|
|
193
233
|
# @return [ Integer ] The matching length.
|
|
194
|
-
#
|
|
195
|
-
# @since 3.0.0
|
|
196
234
|
def length
|
|
197
235
|
documents.length
|
|
198
236
|
end
|
|
@@ -205,23 +243,84 @@ module Mongoid
|
|
|
205
243
|
#
|
|
206
244
|
# @param [ Integer ] value The number of documents to return.
|
|
207
245
|
#
|
|
208
|
-
# @return [
|
|
209
|
-
#
|
|
210
|
-
# @since 3.0.0
|
|
246
|
+
# @return [ Memory ] The context.
|
|
211
247
|
def limit(value)
|
|
212
248
|
self.limiting = value
|
|
213
249
|
self
|
|
214
250
|
end
|
|
215
251
|
|
|
252
|
+
# Pluck the field values in memory.
|
|
253
|
+
#
|
|
254
|
+
# @example Get the values in memory.
|
|
255
|
+
# context.pluck(:name)
|
|
256
|
+
#
|
|
257
|
+
# @param [ [ String | Symbol ]... ] *fields Field(s) to pluck.
|
|
258
|
+
#
|
|
259
|
+
# @return [ Array<Object> | Array<Array<Object>> ] The plucked values.
|
|
216
260
|
def pluck(*fields)
|
|
217
|
-
fields = Array.wrap(fields)
|
|
218
261
|
documents.map do |doc|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
262
|
+
pluck_from_doc(doc, *fields)
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
# Pick the field values in memory.
|
|
267
|
+
#
|
|
268
|
+
# @example Get the values in memory.
|
|
269
|
+
# context.pick(:name)
|
|
270
|
+
#
|
|
271
|
+
# @param [ [ String | Symbol ]... ] *fields Field(s) to pick.
|
|
272
|
+
#
|
|
273
|
+
# @return [ Object | Array<Object> ] The picked values.
|
|
274
|
+
def pick(*fields)
|
|
275
|
+
if doc = documents.first
|
|
276
|
+
pluck_from_doc(doc, *fields)
|
|
277
|
+
end
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
# Tally the field values in memory.
|
|
281
|
+
#
|
|
282
|
+
# @example Get the counts of values in memory.
|
|
283
|
+
# context.tally(:name)
|
|
284
|
+
#
|
|
285
|
+
# @param [ String | Symbol ] field Field to tally.
|
|
286
|
+
#
|
|
287
|
+
# @return [ Hash ] The hash of counts.
|
|
288
|
+
def tally(field)
|
|
289
|
+
return documents.each_with_object({}) do |d, acc|
|
|
290
|
+
v = retrieve_value_at_path(d, field)
|
|
291
|
+
acc[v] ||= 0
|
|
292
|
+
acc[v] += 1
|
|
293
|
+
end
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
# Take the given number of documents from the database.
|
|
297
|
+
#
|
|
298
|
+
# @example Take a document.
|
|
299
|
+
# context.take
|
|
300
|
+
#
|
|
301
|
+
# @param [ Integer | nil ] limit The number of documents to take or nil.
|
|
302
|
+
#
|
|
303
|
+
# @return [ Document ] The document.
|
|
304
|
+
def take(limit = nil)
|
|
305
|
+
if limit
|
|
306
|
+
eager_load(documents.take(limit))
|
|
307
|
+
else
|
|
308
|
+
eager_load([documents.first]).first
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
# Take the given number of documents from the database or raise an error
|
|
313
|
+
# if none are found.
|
|
314
|
+
#
|
|
315
|
+
# @example Take a document.
|
|
316
|
+
# context.take
|
|
317
|
+
#
|
|
318
|
+
# @return [ Document ] The document.
|
|
319
|
+
#
|
|
320
|
+
# @raise [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
321
|
+
# documents to take.
|
|
322
|
+
def take!
|
|
323
|
+
take || raise_document_not_found_error
|
|
225
324
|
end
|
|
226
325
|
|
|
227
326
|
# Skips the provided number of documents.
|
|
@@ -231,9 +330,7 @@ module Mongoid
|
|
|
231
330
|
#
|
|
232
331
|
# @param [ Integer ] value The number of documents to skip.
|
|
233
332
|
#
|
|
234
|
-
# @return [
|
|
235
|
-
#
|
|
236
|
-
# @since 3.0.0
|
|
333
|
+
# @return [ Memory ] The context.
|
|
237
334
|
def skip(value)
|
|
238
335
|
self.skipping = value
|
|
239
336
|
self
|
|
@@ -247,9 +344,7 @@ module Mongoid
|
|
|
247
344
|
# @param [ Hash ] values The sorting values as field/direction(1/-1)
|
|
248
345
|
# pairs.
|
|
249
346
|
#
|
|
250
|
-
# @return [
|
|
251
|
-
#
|
|
252
|
-
# @since 3.0.0
|
|
347
|
+
# @return [ Memory ] The context.
|
|
253
348
|
def sort(values)
|
|
254
349
|
in_place_sort(values) and self
|
|
255
350
|
end
|
|
@@ -261,9 +356,7 @@ module Mongoid
|
|
|
261
356
|
#
|
|
262
357
|
# @param [ Hash ] attributes The new attributes for the document.
|
|
263
358
|
#
|
|
264
|
-
# @return [ nil
|
|
265
|
-
#
|
|
266
|
-
# @since 3.0.0
|
|
359
|
+
# @return [ nil | false ] False if no attributes were provided.
|
|
267
360
|
def update(attributes = nil)
|
|
268
361
|
update_documents(attributes, [ first ])
|
|
269
362
|
end
|
|
@@ -275,13 +368,155 @@ module Mongoid
|
|
|
275
368
|
#
|
|
276
369
|
# @param [ Hash ] attributes The new attributes for each document.
|
|
277
370
|
#
|
|
278
|
-
# @return [ nil
|
|
279
|
-
#
|
|
280
|
-
# @since 3.0.0
|
|
371
|
+
# @return [ nil | false ] False if no attributes were provided.
|
|
281
372
|
def update_all(attributes = nil)
|
|
282
373
|
update_documents(attributes, entries)
|
|
283
374
|
end
|
|
284
375
|
|
|
376
|
+
# Get the second document in the database for the criteria's selector.
|
|
377
|
+
#
|
|
378
|
+
# @example Get the second document.
|
|
379
|
+
# context.second
|
|
380
|
+
#
|
|
381
|
+
# @return [ Document ] The second document.
|
|
382
|
+
def second
|
|
383
|
+
eager_load([documents.second]).first
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
# Get the second document in the database for the criteria's selector or
|
|
387
|
+
# raise an error if none is found.
|
|
388
|
+
#
|
|
389
|
+
# @example Get the second document.
|
|
390
|
+
# context.second!
|
|
391
|
+
#
|
|
392
|
+
# @return [ Document ] The second document.
|
|
393
|
+
#
|
|
394
|
+
# @raise [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
395
|
+
# documents to take.
|
|
396
|
+
def second!
|
|
397
|
+
second || raise_document_not_found_error
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
# Get the third document in the database for the criteria's selector.
|
|
401
|
+
#
|
|
402
|
+
# @example Get the third document.
|
|
403
|
+
# context.third
|
|
404
|
+
#
|
|
405
|
+
# @return [ Document ] The third document.
|
|
406
|
+
def third
|
|
407
|
+
eager_load([documents.third]).first
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
# Get the third document in the database for the criteria's selector or
|
|
411
|
+
# raise an error if none is found.
|
|
412
|
+
#
|
|
413
|
+
# @example Get the third document.
|
|
414
|
+
# context.third!
|
|
415
|
+
#
|
|
416
|
+
# @return [ Document ] The third document.
|
|
417
|
+
#
|
|
418
|
+
# @raise [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
419
|
+
# documents to take.
|
|
420
|
+
def third!
|
|
421
|
+
third || raise_document_not_found_error
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
# Get the fourth document in the database for the criteria's selector.
|
|
425
|
+
#
|
|
426
|
+
# @example Get the fourth document.
|
|
427
|
+
# context.fourth
|
|
428
|
+
#
|
|
429
|
+
# @return [ Document ] The fourth document.
|
|
430
|
+
def fourth
|
|
431
|
+
eager_load([documents.fourth]).first
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
# Get the fourth document in the database for the criteria's selector or
|
|
435
|
+
# raise an error if none is found.
|
|
436
|
+
#
|
|
437
|
+
# @example Get the fourth document.
|
|
438
|
+
# context.fourth!
|
|
439
|
+
#
|
|
440
|
+
# @return [ Document ] The fourth document.
|
|
441
|
+
#
|
|
442
|
+
# @raise [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
443
|
+
# documents to take.
|
|
444
|
+
def fourth!
|
|
445
|
+
fourth || raise_document_not_found_error
|
|
446
|
+
end
|
|
447
|
+
|
|
448
|
+
# Get the fifth document in the database for the criteria's selector.
|
|
449
|
+
#
|
|
450
|
+
# @example Get the fifth document.
|
|
451
|
+
# context.fifth
|
|
452
|
+
#
|
|
453
|
+
# @return [ Document ] The fifth document.
|
|
454
|
+
def fifth
|
|
455
|
+
eager_load([documents.fifth]).first
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
# Get the fifth document in the database for the criteria's selector or
|
|
459
|
+
# raise an error if none is found.
|
|
460
|
+
#
|
|
461
|
+
# @example Get the fifth document.
|
|
462
|
+
# context.fifth!
|
|
463
|
+
#
|
|
464
|
+
# @return [ Document ] The fifth document.
|
|
465
|
+
#
|
|
466
|
+
# @raise [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
467
|
+
# documents to take.
|
|
468
|
+
def fifth!
|
|
469
|
+
fifth || raise_document_not_found_error
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
# Get the second to last document in the database for the criteria's selector.
|
|
473
|
+
#
|
|
474
|
+
# @example Get the second to last document.
|
|
475
|
+
# context.second_to_last
|
|
476
|
+
#
|
|
477
|
+
# @return [ Document ] The second to last document.
|
|
478
|
+
def second_to_last
|
|
479
|
+
eager_load([documents.second_to_last]).first
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
# Get the second to last document in the database for the criteria's selector or
|
|
483
|
+
# raise an error if none is found.
|
|
484
|
+
#
|
|
485
|
+
# @example Get the second to last document.
|
|
486
|
+
# context.second_to_last!
|
|
487
|
+
#
|
|
488
|
+
# @return [ Document ] The second to last document.
|
|
489
|
+
#
|
|
490
|
+
# @raise [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
491
|
+
# documents to take.
|
|
492
|
+
def second_to_last!
|
|
493
|
+
second_to_last || raise_document_not_found_error
|
|
494
|
+
end
|
|
495
|
+
|
|
496
|
+
# Get the third to last document in the database for the criteria's selector.
|
|
497
|
+
#
|
|
498
|
+
# @example Get the third to last document.
|
|
499
|
+
# context.third_to_last
|
|
500
|
+
#
|
|
501
|
+
# @return [ Document ] The third to last document.
|
|
502
|
+
def third_to_last
|
|
503
|
+
eager_load([documents.third_to_last]).first
|
|
504
|
+
end
|
|
505
|
+
|
|
506
|
+
# Get the third to last document in the database for the criteria's selector or
|
|
507
|
+
# raise an error if none is found.
|
|
508
|
+
#
|
|
509
|
+
# @example Get the third to last document.
|
|
510
|
+
# context.third_to_last!
|
|
511
|
+
#
|
|
512
|
+
# @return [ Document ] The third to last document.
|
|
513
|
+
#
|
|
514
|
+
# @raise [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
515
|
+
# documents to take.
|
|
516
|
+
def third_to_last!
|
|
517
|
+
third_to_last || raise_document_not_found_error
|
|
518
|
+
end
|
|
519
|
+
|
|
285
520
|
private
|
|
286
521
|
|
|
287
522
|
# Get the documents the context should iterate. This follows 3 rules:
|
|
@@ -292,8 +527,6 @@ module Mongoid
|
|
|
292
527
|
# context.documents_for_iteration
|
|
293
528
|
#
|
|
294
529
|
# @return [ Array<Document> ] The docs to iterate.
|
|
295
|
-
#
|
|
296
|
-
# @since 3.1.0
|
|
297
530
|
def documents_for_iteration
|
|
298
531
|
docs = documents[skipping || 0, limiting || documents.length] || []
|
|
299
532
|
if eager_loadable?
|
|
@@ -311,8 +544,6 @@ module Mongoid
|
|
|
311
544
|
#
|
|
312
545
|
# @param [ Hash ] attributes The attributes.
|
|
313
546
|
# @param [ Array<Document> ] docs The docs to update.
|
|
314
|
-
#
|
|
315
|
-
# @since 3.0.4
|
|
316
547
|
def update_documents(attributes, docs)
|
|
317
548
|
return false if !attributes || docs.empty?
|
|
318
549
|
updates = { "$set" => {}}
|
|
@@ -332,8 +563,6 @@ module Mongoid
|
|
|
332
563
|
# @example Get the limiting value.
|
|
333
564
|
#
|
|
334
565
|
# @return [ Integer ] The limit.
|
|
335
|
-
#
|
|
336
|
-
# @since 3.0.0
|
|
337
566
|
def limiting
|
|
338
567
|
defined?(@limiting) ? @limiting : nil
|
|
339
568
|
end
|
|
@@ -347,36 +576,30 @@ module Mongoid
|
|
|
347
576
|
# @param [ Integer ] value The limit.
|
|
348
577
|
#
|
|
349
578
|
# @return [ Integer ] The limit.
|
|
350
|
-
#
|
|
351
|
-
# @since 3.0.0
|
|
352
579
|
def limiting=(value)
|
|
353
580
|
@limiting = value
|
|
354
581
|
end
|
|
355
582
|
|
|
356
|
-
# Get the
|
|
583
|
+
# Get the skipping value.
|
|
357
584
|
#
|
|
358
585
|
# @api private
|
|
359
586
|
#
|
|
360
|
-
# @example Get the
|
|
587
|
+
# @example Get the skipping value.
|
|
361
588
|
#
|
|
362
589
|
# @return [ Integer ] The skip.
|
|
363
|
-
#
|
|
364
|
-
# @since 3.0.0
|
|
365
590
|
def skipping
|
|
366
591
|
defined?(@skipping) ? @skipping : nil
|
|
367
592
|
end
|
|
368
593
|
|
|
369
|
-
# Set the
|
|
594
|
+
# Set the skipping value.
|
|
370
595
|
#
|
|
371
596
|
# @api private
|
|
372
597
|
#
|
|
373
|
-
# @example Set the
|
|
598
|
+
# @example Set the skipping value.
|
|
374
599
|
#
|
|
375
600
|
# @param [ Integer ] value The skip.
|
|
376
601
|
#
|
|
377
602
|
# @return [ Integer ] The skip.
|
|
378
|
-
#
|
|
379
|
-
# @since 3.0.0
|
|
380
603
|
def skipping=(value)
|
|
381
604
|
@skipping = value
|
|
382
605
|
end
|
|
@@ -389,8 +612,6 @@ module Mongoid
|
|
|
389
612
|
# context.apply_options
|
|
390
613
|
#
|
|
391
614
|
# @return [ Memory ] self.
|
|
392
|
-
#
|
|
393
|
-
# @since 3.0.0
|
|
394
615
|
def apply_options
|
|
395
616
|
raise Errors::InMemoryCollationNotSupported.new if criteria.options[:collation]
|
|
396
617
|
skip(criteria.options[:skip]).limit(criteria.options[:limit])
|
|
@@ -400,15 +621,14 @@ module Mongoid
|
|
|
400
621
|
#
|
|
401
622
|
# @example Apply the sorting params.
|
|
402
623
|
# context.apply_sorting
|
|
403
|
-
#
|
|
404
|
-
# @since 3.0.0
|
|
405
624
|
def apply_sorting
|
|
406
625
|
if spec = criteria.options[:sort]
|
|
407
626
|
in_place_sort(spec)
|
|
408
627
|
end
|
|
409
628
|
end
|
|
410
629
|
|
|
411
|
-
# Compare two values,
|
|
630
|
+
# Compare two values, handling the cases when
|
|
631
|
+
# either value is nil.
|
|
412
632
|
#
|
|
413
633
|
# @api private
|
|
414
634
|
#
|
|
@@ -416,17 +636,15 @@ module Mongoid
|
|
|
416
636
|
# context.compare(a, b)
|
|
417
637
|
#
|
|
418
638
|
# @param [ Object ] a The first object.
|
|
419
|
-
# @param [ Object ] b The
|
|
639
|
+
# @param [ Object ] b The second object.
|
|
420
640
|
#
|
|
421
641
|
# @return [ Integer ] The comparison value.
|
|
422
|
-
#
|
|
423
|
-
# @since 3.0.0
|
|
424
642
|
def compare(a, b)
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
643
|
+
return 0 if a.nil? && b.nil?
|
|
644
|
+
return 1 if a.nil?
|
|
645
|
+
return -1 if b.nil?
|
|
646
|
+
|
|
647
|
+
compare_operand(a) <=> compare_operand(b)
|
|
430
648
|
end
|
|
431
649
|
|
|
432
650
|
# Sort the documents in place.
|
|
@@ -435,14 +653,11 @@ module Mongoid
|
|
|
435
653
|
# context.in_place_sort(name: 1)
|
|
436
654
|
#
|
|
437
655
|
# @param [ Hash ] values The field/direction sorting pairs.
|
|
438
|
-
#
|
|
439
|
-
# @since 3.0.0
|
|
440
656
|
def in_place_sort(values)
|
|
441
657
|
documents.sort! do |a, b|
|
|
442
658
|
values.map do |field, direction|
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
end.find { |value| !value.zero? } || 0
|
|
659
|
+
direction * compare(a[field], b[field])
|
|
660
|
+
end.detect { |value| !value.zero? } || 0
|
|
446
661
|
end
|
|
447
662
|
end
|
|
448
663
|
|
|
@@ -454,8 +669,6 @@ module Mongoid
|
|
|
454
669
|
# context.prepare_remove(doc)
|
|
455
670
|
#
|
|
456
671
|
# @param [ Document ] doc The document.
|
|
457
|
-
#
|
|
458
|
-
# @since 3.0.0
|
|
459
672
|
def prepare_remove(doc)
|
|
460
673
|
@selector ||= root.atomic_selector
|
|
461
674
|
@path ||= doc.atomic_path
|
|
@@ -469,6 +682,100 @@ module Mongoid
|
|
|
469
682
|
def _session
|
|
470
683
|
@criteria.send(:_session)
|
|
471
684
|
end
|
|
685
|
+
|
|
686
|
+
# Get the operand value to be used in comparison.
|
|
687
|
+
# Adds capability to sort boolean values.
|
|
688
|
+
#
|
|
689
|
+
# @example Get the comparison operand.
|
|
690
|
+
# compare_operand(true) #=> 1
|
|
691
|
+
#
|
|
692
|
+
# @param [ Object ] value The value to be used in comparison.
|
|
693
|
+
#
|
|
694
|
+
# @return [ Integer | Object ] The comparison operand.
|
|
695
|
+
def compare_operand(value)
|
|
696
|
+
case value
|
|
697
|
+
when TrueClass then 1
|
|
698
|
+
when FalseClass then 0
|
|
699
|
+
else value
|
|
700
|
+
end
|
|
701
|
+
end
|
|
702
|
+
|
|
703
|
+
# Retrieve the value for the current document at the given field path.
|
|
704
|
+
#
|
|
705
|
+
# For example, if I have the following models:
|
|
706
|
+
#
|
|
707
|
+
# User has_many Accounts
|
|
708
|
+
# address is a hash on Account
|
|
709
|
+
#
|
|
710
|
+
# u = User.new(accounts: [ Account.new(address: { street: "W 50th" }) ])
|
|
711
|
+
# retrieve_value_at_path(u, "user.accounts.address.street")
|
|
712
|
+
# # => [ "W 50th" ]
|
|
713
|
+
#
|
|
714
|
+
# Note that the result is in an array since accounts is an array. If it
|
|
715
|
+
# was nested in two arrays the result would be in a 2D array.
|
|
716
|
+
#
|
|
717
|
+
# @param [ Object ] document The object to traverse the field path.
|
|
718
|
+
# @param [ String ] field_path The dotted string that represents the path
|
|
719
|
+
# to the value.
|
|
720
|
+
#
|
|
721
|
+
# @return [ Object | nil ] The value at the given field path or nil if it
|
|
722
|
+
# doesn't exist.
|
|
723
|
+
def retrieve_value_at_path(document, field_path)
|
|
724
|
+
return if field_path.blank? || !document
|
|
725
|
+
segment, remaining = field_path.to_s.split('.', 2)
|
|
726
|
+
|
|
727
|
+
curr = if document.is_a?(Document)
|
|
728
|
+
# Retrieves field for segment to check localization. Only does one
|
|
729
|
+
# iteration since there's no dots
|
|
730
|
+
res = if remaining
|
|
731
|
+
field = document.class.traverse_association_tree(segment)
|
|
732
|
+
# If this is a localized field, and there are remaining, get the
|
|
733
|
+
# _translations hash so that we can get the specified translation in
|
|
734
|
+
# the remaining
|
|
735
|
+
if field&.localized?
|
|
736
|
+
document.send("#{segment}_translations")
|
|
737
|
+
end
|
|
738
|
+
end
|
|
739
|
+
meth = klass.aliased_associations[segment] || segment
|
|
740
|
+
res.nil? ? document.try(meth) : res
|
|
741
|
+
elsif document.is_a?(Hash)
|
|
742
|
+
# TODO: Remove the indifferent access when implementing MONGOID-5410.
|
|
743
|
+
document.key?(segment.to_s) ?
|
|
744
|
+
document[segment.to_s] :
|
|
745
|
+
document[segment.to_sym]
|
|
746
|
+
else
|
|
747
|
+
nil
|
|
748
|
+
end
|
|
749
|
+
|
|
750
|
+
return curr unless remaining
|
|
751
|
+
|
|
752
|
+
if curr.is_a?(Array)
|
|
753
|
+
# compact is used for consistency with server behavior.
|
|
754
|
+
curr.map { |d| retrieve_value_at_path(d, remaining) }.compact
|
|
755
|
+
else
|
|
756
|
+
retrieve_value_at_path(curr, remaining)
|
|
757
|
+
end
|
|
758
|
+
end
|
|
759
|
+
|
|
760
|
+
# Pluck the field values from the given document.
|
|
761
|
+
#
|
|
762
|
+
# @param [ Document ] doc The document to pluck from.
|
|
763
|
+
# @param [ [ String | Symbol ]... ] *fields Field(s) to pluck.
|
|
764
|
+
#
|
|
765
|
+
# @return [ Object | Array<Object> ] The plucked values.
|
|
766
|
+
def pluck_from_doc(doc, *fields)
|
|
767
|
+
if fields.length == 1
|
|
768
|
+
retrieve_value_at_path(doc, fields.first)
|
|
769
|
+
else
|
|
770
|
+
fields.map do |field|
|
|
771
|
+
retrieve_value_at_path(doc, field)
|
|
772
|
+
end
|
|
773
|
+
end
|
|
774
|
+
end
|
|
775
|
+
|
|
776
|
+
def raise_document_not_found_error
|
|
777
|
+
raise Errors::DocumentNotFound.new(klass, nil, nil)
|
|
778
|
+
end
|
|
472
779
|
end
|
|
473
780
|
end
|
|
474
781
|
end
|