mongoid 7.1.1 → 8.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +20 -20
- data/README.md +15 -8
- data/Rakefile +61 -5
- data/lib/config/locales/en.yml +162 -56
- data/lib/mongoid/association/accessors.rb +89 -40
- data/lib/mongoid/association/bindable.rb +50 -23
- data/lib/mongoid/association/builders.rb +5 -12
- data/lib/mongoid/association/constrainable.rb +1 -5
- data/lib/mongoid/association/depending.rb +5 -17
- data/lib/mongoid/association/eager_loadable.rb +29 -10
- data/lib/mongoid/association/embedded/batchable.rb +64 -52
- data/lib/mongoid/association/embedded/cyclic.rb +3 -12
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -9
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -5
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -16
- data/lib/mongoid/association/embedded/embedded_in.rb +4 -26
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -7
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -6
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +110 -92
- data/lib/mongoid/association/embedded/embeds_many.rb +4 -34
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +0 -7
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -8
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +50 -19
- data/lib/mongoid/association/embedded/embeds_one.rb +5 -31
- data/lib/mongoid/association/embedded.rb +0 -1
- data/lib/mongoid/association/macros.rb +27 -5
- data/lib/mongoid/association/many.rb +14 -27
- data/lib/mongoid/association/marshalable.rb +0 -5
- data/lib/mongoid/association/nested/many.rb +6 -16
- data/lib/mongoid/association/nested/nested_buildable.rb +4 -13
- data/lib/mongoid/association/nested/one.rb +48 -23
- data/lib/mongoid/association/nested.rb +0 -3
- data/lib/mongoid/association/one.rb +2 -11
- data/lib/mongoid/association/options.rb +9 -42
- data/lib/mongoid/association/proxy.rb +22 -27
- data/lib/mongoid/association/referenced/auto_save.rb +6 -14
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -8
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +5 -6
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +0 -1
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -19
- data/lib/mongoid/association/referenced/belongs_to.rb +11 -36
- data/lib/mongoid/association/referenced/counter_cache.rb +12 -25
- data/lib/mongoid/association/referenced/eager.rb +5 -26
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +0 -5
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +0 -3
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +0 -1
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +81 -51
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +17 -41
- data/lib/mongoid/association/referenced/has_many/binding.rb +0 -5
- data/lib/mongoid/association/referenced/has_many/buildable.rb +0 -3
- data/lib/mongoid/association/referenced/has_many/eager.rb +0 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +438 -461
- data/lib/mongoid/association/referenced/has_many/proxy.rb +58 -84
- data/lib/mongoid/association/referenced/has_many.rb +15 -42
- data/lib/mongoid/association/referenced/has_one/binding.rb +0 -7
- data/lib/mongoid/association/referenced/has_one/buildable.rb +12 -5
- data/lib/mongoid/association/referenced/has_one/eager.rb +0 -1
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +7 -22
- data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -16
- data/lib/mongoid/association/referenced/has_one.rb +12 -35
- data/lib/mongoid/association/referenced/syncable.rb +4 -21
- data/lib/mongoid/association/referenced.rb +0 -1
- data/lib/mongoid/association/reflections.rb +4 -5
- data/lib/mongoid/association/relatable.rb +46 -71
- data/lib/mongoid/association.rb +5 -22
- data/lib/mongoid/atomic/modifiers.rb +7 -54
- data/lib/mongoid/atomic/paths/embedded/many.rb +19 -5
- data/lib/mongoid/atomic/paths/embedded/one.rb +0 -5
- data/lib/mongoid/atomic/paths/embedded.rb +0 -3
- data/lib/mongoid/atomic/paths/root.rb +0 -5
- data/lib/mongoid/atomic/paths.rb +0 -1
- data/lib/mongoid/atomic.rb +40 -47
- data/lib/mongoid/attributes/dynamic.rb +5 -22
- data/lib/mongoid/attributes/nested.rb +6 -11
- data/lib/mongoid/attributes/processing.rb +11 -21
- data/lib/mongoid/attributes/projector.rb +119 -0
- data/lib/mongoid/attributes/readonly.rb +3 -8
- data/lib/mongoid/attributes.rb +82 -88
- data/lib/mongoid/cacheable.rb +4 -9
- data/lib/mongoid/changeable.rb +148 -69
- data/lib/mongoid/clients/factory.rb +41 -17
- data/lib/mongoid/clients/options.rb +13 -14
- data/lib/mongoid/clients/sessions.rb +8 -11
- data/lib/mongoid/clients/storage_options.rb +7 -17
- data/lib/mongoid/clients/validators/storage.rb +3 -24
- data/lib/mongoid/clients/validators.rb +0 -1
- data/lib/mongoid/clients.rb +1 -10
- data/lib/mongoid/collection_configurable.rb +58 -0
- data/lib/mongoid/composable.rb +3 -7
- data/lib/mongoid/config/defaults.rb +60 -0
- data/lib/mongoid/config/environment.rb +28 -5
- data/lib/mongoid/config/options.rb +0 -11
- data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
- data/lib/mongoid/config/validators/client.rb +6 -23
- data/lib/mongoid/config/validators/option.rb +0 -3
- data/lib/mongoid/config/validators.rb +1 -1
- data/lib/mongoid/config.rb +183 -39
- data/lib/mongoid/contextual/aggregable/memory.rb +37 -26
- data/lib/mongoid/contextual/aggregable/mongo.rb +29 -32
- data/lib/mongoid/contextual/aggregable/none.rb +65 -0
- data/lib/mongoid/contextual/aggregable.rb +17 -0
- data/lib/mongoid/contextual/atomic.rb +7 -27
- data/lib/mongoid/contextual/command.rb +0 -5
- data/lib/mongoid/contextual/geo_near.rb +8 -41
- data/lib/mongoid/contextual/map_reduce.rb +2 -33
- data/lib/mongoid/contextual/memory.rb +383 -79
- data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
- data/lib/mongoid/contextual/mongo.rb +636 -283
- data/lib/mongoid/contextual/none.rb +262 -31
- data/lib/mongoid/contextual/queryable.rb +1 -4
- data/lib/mongoid/contextual.rb +14 -7
- data/lib/mongoid/copyable.rb +39 -16
- data/lib/mongoid/criteria/findable.rb +9 -19
- data/lib/mongoid/criteria/includable.rb +27 -31
- data/lib/mongoid/criteria/inspectable.rb +0 -3
- data/lib/mongoid/criteria/marshalable.rb +10 -7
- data/lib/mongoid/criteria/modifiable.rb +2 -20
- data/lib/mongoid/criteria/options.rb +0 -3
- data/lib/mongoid/criteria/permission.rb +1 -2
- data/lib/mongoid/criteria/queryable/aggregable.rb +2 -15
- data/lib/mongoid/criteria/queryable/expandable.rb +0 -25
- data/lib/mongoid/criteria/queryable/extensions/array.rb +4 -40
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -7
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -6
- data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -8
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -6
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -40
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +0 -13
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -20
- data/lib/mongoid/criteria/queryable/extensions/object.rb +3 -29
- data/lib/mongoid/criteria/queryable/extensions/range.rb +46 -16
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -18
- data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -4
- data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -31
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -21
- data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -8
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +16 -6
- data/lib/mongoid/criteria/queryable/extensions.rb +0 -5
- data/lib/mongoid/criteria/queryable/key.rb +6 -19
- data/lib/mongoid/criteria/queryable/macroable.rb +0 -3
- data/lib/mongoid/criteria/queryable/mergeable.rb +123 -38
- data/lib/mongoid/criteria/queryable/optional.rb +11 -62
- data/lib/mongoid/criteria/queryable/options.rb +2 -21
- data/lib/mongoid/criteria/queryable/pipeline.rb +1 -14
- data/lib/mongoid/criteria/queryable/selectable.rb +138 -125
- data/lib/mongoid/criteria/queryable/selector.rb +94 -30
- data/lib/mongoid/criteria/queryable/smash.rb +40 -18
- data/lib/mongoid/criteria/queryable/storable.rb +14 -10
- data/lib/mongoid/criteria/queryable.rb +11 -13
- data/lib/mongoid/criteria/scopable.rb +27 -21
- data/lib/mongoid/criteria/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +88 -108
- data/lib/mongoid/deprecable.rb +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +149 -99
- data/lib/mongoid/equality.rb +32 -16
- data/lib/mongoid/errors/ambiguous_relationship.rb +2 -5
- data/lib/mongoid/errors/callback.rb +0 -3
- data/lib/mongoid/errors/create_collection_failure.rb +33 -0
- data/lib/mongoid/errors/criteria_argument_required.rb +0 -1
- data/lib/mongoid/errors/delete_restriction.rb +8 -12
- data/lib/mongoid/errors/document_not_destroyed.rb +2 -7
- data/lib/mongoid/errors/document_not_found.rb +33 -21
- data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
- data/lib/mongoid/errors/empty_config_file.rb +25 -0
- data/lib/mongoid/errors/immutable_attribute.rb +26 -0
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -3
- data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
- data/lib/mongoid/errors/invalid_collection.rb +0 -1
- data/lib/mongoid/errors/invalid_config_file.rb +25 -0
- data/lib/mongoid/errors/invalid_config_option.rb +1 -4
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -4
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
- data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
- data/lib/mongoid/errors/invalid_field.rb +6 -7
- data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
- data/lib/mongoid/errors/invalid_field_option.rb +0 -3
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/invalid_find.rb +0 -3
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
- data/lib/mongoid/errors/invalid_includes.rb +0 -3
- data/lib/mongoid/errors/invalid_index.rb +0 -3
- data/lib/mongoid/errors/invalid_options.rb +0 -3
- data/lib/mongoid/errors/invalid_path.rb +0 -3
- data/lib/mongoid/errors/invalid_persistence_option.rb +0 -5
- data/lib/mongoid/errors/invalid_query.rb +40 -0
- data/lib/mongoid/errors/invalid_relation.rb +1 -8
- data/lib/mongoid/errors/invalid_relation_option.rb +1 -4
- data/lib/mongoid/errors/invalid_scope.rb +0 -3
- data/lib/mongoid/errors/invalid_session_use.rb +1 -6
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +0 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -4
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
- data/lib/mongoid/errors/invalid_time.rb +0 -3
- data/lib/mongoid/errors/inverse_not_found.rb +0 -3
- data/lib/mongoid/errors/mixed_client_configuration.rb +0 -3
- data/lib/mongoid/errors/mixed_relations.rb +0 -3
- data/lib/mongoid/errors/mongoid_error.rb +4 -13
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -4
- data/lib/mongoid/errors/no_client_config.rb +2 -5
- data/lib/mongoid/errors/no_client_database.rb +1 -4
- data/lib/mongoid/errors/no_client_hosts.rb +1 -4
- data/lib/mongoid/errors/no_clients_config.rb +0 -3
- data/lib/mongoid/errors/no_default_client.rb +1 -4
- data/lib/mongoid/errors/no_environment.rb +0 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +0 -3
- data/lib/mongoid/errors/no_metadata.rb +0 -3
- data/lib/mongoid/errors/no_parent.rb +0 -3
- data/lib/mongoid/errors/readonly_attribute.rb +1 -4
- data/lib/mongoid/errors/readonly_document.rb +1 -6
- data/lib/mongoid/errors/scope_overwrite.rb +0 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -2
- data/lib/mongoid/errors/unknown_attribute.rb +1 -4
- data/lib/mongoid/errors/unknown_model.rb +0 -3
- data/lib/mongoid/errors/unsaved_document.rb +1 -2
- data/lib/mongoid/errors/unsupported_javascript.rb +0 -3
- data/lib/mongoid/errors/validations.rb +0 -1
- data/lib/mongoid/errors.rb +15 -4
- data/lib/mongoid/evolvable.rb +1 -4
- data/lib/mongoid/extensions/array.rb +12 -36
- data/lib/mongoid/extensions/big_decimal.rb +33 -21
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +8 -6
- data/lib/mongoid/extensions/date.rb +26 -29
- data/lib/mongoid/extensions/date_time.rb +1 -10
- data/lib/mongoid/extensions/decimal128.rb +0 -5
- data/lib/mongoid/extensions/false_class.rb +3 -8
- data/lib/mongoid/extensions/float.rb +7 -11
- data/lib/mongoid/extensions/hash.rb +19 -37
- data/lib/mongoid/extensions/integer.rb +7 -13
- data/lib/mongoid/extensions/module.rb +1 -4
- data/lib/mongoid/extensions/nil_class.rb +0 -5
- data/lib/mongoid/extensions/object.rb +11 -48
- data/lib/mongoid/extensions/object_id.rb +0 -7
- data/lib/mongoid/extensions/range.rb +40 -20
- data/lib/mongoid/extensions/regexp.rb +12 -8
- data/lib/mongoid/extensions/set.rb +11 -11
- data/lib/mongoid/extensions/string.rb +12 -52
- data/lib/mongoid/extensions/symbol.rb +4 -22
- data/lib/mongoid/extensions/time.rb +28 -26
- data/lib/mongoid/extensions/time_with_zone.rb +14 -11
- data/lib/mongoid/extensions/true_class.rb +3 -8
- data/lib/mongoid/extensions.rb +17 -3
- data/lib/mongoid/factory.rb +80 -16
- data/lib/mongoid/fields/foreign_key.rb +11 -25
- data/lib/mongoid/fields/localized.rb +19 -15
- data/lib/mongoid/fields/standard.rb +17 -40
- data/lib/mongoid/fields/validators/macro.rb +25 -24
- data/lib/mongoid/fields/validators.rb +0 -1
- data/lib/mongoid/fields.rb +346 -75
- data/lib/mongoid/findable.rb +107 -31
- data/lib/mongoid/indexable/specification.rb +2 -17
- data/lib/mongoid/indexable/validators/options.rb +6 -9
- data/lib/mongoid/indexable.rb +3 -20
- data/lib/mongoid/inspectable.rb +2 -11
- data/lib/mongoid/interceptable.rb +79 -41
- data/lib/mongoid/loggable.rb +0 -9
- data/lib/mongoid/matchable.rb +2 -155
- data/lib/mongoid/matcher/all.rb +22 -0
- data/lib/mongoid/matcher/and.rb +21 -0
- data/lib/mongoid/matcher/bits.rb +41 -0
- data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
- data/lib/mongoid/matcher/bits_all_set.rb +20 -0
- data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
- data/lib/mongoid/matcher/bits_any_set.rb +20 -0
- data/lib/mongoid/matcher/elem_match.rb +36 -0
- data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
- data/lib/mongoid/matcher/eq.rb +11 -0
- data/lib/mongoid/matcher/eq_impl.rb +67 -0
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
- data/lib/mongoid/matcher/exists.rb +15 -0
- data/lib/mongoid/matcher/expression.rb +35 -0
- data/lib/mongoid/matcher/expression_operator.rb +19 -0
- data/lib/mongoid/matcher/field_expression.rb +62 -0
- data/lib/mongoid/matcher/field_operator.rb +54 -0
- data/lib/mongoid/matcher/gt.rb +17 -0
- data/lib/mongoid/matcher/gte.rb +17 -0
- data/lib/mongoid/matcher/in.rb +25 -0
- data/lib/mongoid/matcher/lt.rb +17 -0
- data/lib/mongoid/matcher/lte.rb +17 -0
- data/lib/mongoid/matcher/mod.rb +17 -0
- data/lib/mongoid/matcher/ne.rb +16 -0
- data/lib/mongoid/matcher/nin.rb +11 -0
- data/lib/mongoid/matcher/nor.rb +25 -0
- data/lib/mongoid/matcher/not.rb +29 -0
- data/lib/mongoid/matcher/or.rb +21 -0
- data/lib/mongoid/matcher/regex.rb +41 -0
- data/lib/mongoid/matcher/size.rb +26 -0
- data/lib/mongoid/matcher/type.rb +99 -0
- data/lib/mongoid/matcher.rb +130 -0
- data/lib/mongoid/persistable/creatable.rb +20 -29
- data/lib/mongoid/persistable/deletable.rb +4 -22
- data/lib/mongoid/persistable/destroyable.rb +9 -10
- data/lib/mongoid/persistable/incrementable.rb +0 -5
- data/lib/mongoid/persistable/logical.rb +0 -5
- data/lib/mongoid/persistable/poppable.rb +0 -5
- data/lib/mongoid/persistable/pullable.rb +0 -7
- data/lib/mongoid/persistable/pushable.rb +4 -8
- data/lib/mongoid/persistable/renamable.rb +0 -5
- data/lib/mongoid/persistable/savable.rb +13 -8
- data/lib/mongoid/persistable/settable.rb +0 -5
- data/lib/mongoid/persistable/unsettable.rb +2 -7
- data/lib/mongoid/persistable/updatable.rb +96 -29
- data/lib/mongoid/persistable/upsertable.rb +20 -8
- data/lib/mongoid/persistable.rb +6 -26
- data/lib/mongoid/persistence_context.rb +71 -43
- data/lib/mongoid/positional.rb +0 -5
- data/lib/mongoid/query_cache.rb +16 -236
- data/lib/mongoid/railtie.rb +0 -15
- data/lib/mongoid/railties/controller_runtime.rb +1 -2
- data/lib/mongoid/railties/database.rake +7 -2
- data/lib/mongoid/reloadable.rb +17 -20
- data/lib/mongoid/scopable.rb +32 -56
- data/lib/mongoid/selectable.rb +5 -17
- data/lib/mongoid/serializable.rb +11 -22
- data/lib/mongoid/shardable.rb +49 -16
- data/lib/mongoid/stateful.rb +57 -19
- data/lib/mongoid/stringified_symbol.rb +52 -0
- data/lib/mongoid/tasks/database.rake +12 -0
- data/lib/mongoid/tasks/database.rb +59 -11
- data/lib/mongoid/threaded/lifecycle.rb +5 -26
- data/lib/mongoid/threaded.rb +42 -67
- data/lib/mongoid/timestamps/created/short.rb +0 -1
- data/lib/mongoid/timestamps/created.rb +1 -2
- data/lib/mongoid/timestamps/short.rb +0 -1
- data/lib/mongoid/timestamps/timeless.rb +0 -7
- data/lib/mongoid/timestamps/updated/short.rb +0 -1
- data/lib/mongoid/timestamps/updated.rb +2 -5
- data/lib/mongoid/timestamps.rb +0 -1
- data/lib/mongoid/touchable.rb +34 -13
- data/lib/mongoid/traversable.rb +181 -59
- data/lib/mongoid/utils.rb +22 -0
- data/lib/mongoid/validatable/associated.rb +1 -4
- data/lib/mongoid/validatable/format.rb +0 -1
- data/lib/mongoid/validatable/length.rb +0 -1
- data/lib/mongoid/validatable/localizable.rb +1 -4
- data/lib/mongoid/validatable/macros.rb +5 -14
- data/lib/mongoid/validatable/presence.rb +6 -13
- data/lib/mongoid/validatable/queryable.rb +0 -3
- data/lib/mongoid/validatable/uniqueness.rb +26 -40
- data/lib/mongoid/validatable.rb +9 -27
- data/lib/mongoid/version.rb +1 -2
- data/lib/mongoid/warnings.rb +44 -0
- data/lib/mongoid.rb +42 -18
- data/lib/rails/generators/mongoid/config/config_generator.rb +8 -2
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +12 -6
- data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
- data/lib/rails/generators/mongoid_generator.rb +0 -1
- data/lib/rails/mongoid.rb +0 -3
- data/spec/README.md +19 -4
- data/spec/config/mongoid.yml +16 -0
- data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
- data/spec/integration/app_spec.rb +345 -0
- data/spec/integration/associations/belongs_to_spec.rb +18 -1
- data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
- data/spec/integration/associations/embedded_spec.rb +163 -1
- data/spec/integration/associations/embeds_many_spec.rb +219 -0
- data/spec/integration/associations/embeds_one_spec.rb +41 -0
- data/spec/integration/associations/foreign_key_spec.rb +9 -1
- data/spec/integration/associations/foreign_key_spec_models.rb +0 -1
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
- data/spec/integration/associations/has_many_spec.rb +128 -0
- data/spec/integration/associations/has_one_spec.rb +272 -0
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
- data/spec/integration/associations/reverse_population_spec.rb +0 -1
- data/spec/integration/associations/reverse_population_spec_models.rb +0 -1
- data/spec/integration/associations/scope_option_spec.rb +101 -0
- data/spec/integration/atomic/modifiers_spec.rb +116 -0
- data/spec/integration/bson_regexp_raw_spec.rb +19 -0
- data/spec/integration/callbacks_models.rb +192 -0
- data/spec/integration/callbacks_spec.rb +584 -0
- data/spec/integration/contextual/empty_spec.rb +141 -0
- data/spec/integration/criteria/alias_query_spec.rb +161 -0
- data/spec/integration/criteria/date_field_spec.rb +40 -0
- data/spec/integration/criteria/default_scope_spec.rb +51 -0
- data/spec/integration/criteria/logical_spec.rb +43 -0
- data/spec/integration/criteria/range_spec.rb +359 -0
- data/spec/integration/criteria/time_with_zone_spec.rb +125 -15
- data/spec/integration/discriminator_key_spec.rb +391 -0
- data/spec/integration/discriminator_value_spec.rb +206 -0
- data/spec/integration/document_spec.rb +30 -1
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +3 -19
- data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +130 -45
- data/spec/integration/matcher_operator_data/all.yml +140 -0
- data/spec/integration/matcher_operator_data/and.yml +93 -0
- data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
- data/spec/integration/matcher_operator_data/comment.yml +22 -0
- data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
- data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
- data/spec/integration/matcher_operator_data/eq.yml +191 -0
- data/spec/integration/matcher_operator_data/exists.yml +213 -0
- data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
- data/spec/integration/matcher_operator_data/gt.yml +132 -0
- data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
- data/spec/integration/matcher_operator_data/gte.yml +132 -0
- data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
- data/spec/integration/matcher_operator_data/implicit.yml +331 -0
- data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
- data/spec/integration/matcher_operator_data/in.yml +210 -0
- data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
- data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
- data/spec/integration/matcher_operator_data/lt.yml +132 -0
- data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
- data/spec/integration/matcher_operator_data/lte.yml +132 -0
- data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
- data/spec/integration/matcher_operator_data/mod.yml +55 -0
- data/spec/integration/matcher_operator_data/multiple.yml +29 -0
- data/spec/integration/matcher_operator_data/ne.yml +150 -0
- data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
- data/spec/integration/matcher_operator_data/nin.yml +114 -0
- data/spec/integration/matcher_operator_data/nor.yml +126 -0
- data/spec/integration/matcher_operator_data/not.yml +196 -0
- data/spec/integration/matcher_operator_data/or.yml +137 -0
- data/spec/integration/matcher_operator_data/regex.yml +174 -0
- data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
- data/spec/integration/matcher_operator_data/size.yml +174 -0
- data/spec/integration/matcher_operator_data/type.yml +70 -0
- data/spec/integration/matcher_operator_data/type_array.yml +16 -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 +41 -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 +122 -0
- data/spec/integration/matcher_spec.rb +283 -0
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/integration/server_query_spec.rb +141 -0
- data/spec/integration/shardable_spec.rb +20 -5
- data/spec/integration/stringified_symbol_field_spec.rb +203 -0
- data/spec/lite_spec_helper.rb +25 -9
- data/spec/mongoid/association/accessors_spec.rb +282 -78
- data/spec/mongoid/association/auto_save_spec.rb +72 -34
- data/spec/mongoid/association/builders_spec.rb +1 -2
- data/spec/mongoid/association/constrainable_spec.rb +0 -1
- data/spec/mongoid/association/counter_cache_spec.rb +33 -34
- data/spec/mongoid/association/depending_spec.rb +429 -339
- data/spec/mongoid/association/eager_spec.rb +6 -6
- data/spec/mongoid/association/embedded/cyclic_spec.rb +2 -3
- data/spec/mongoid/association/embedded/dirty_spec.rb +2 -3
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -2
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -1
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +150 -14
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -1
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +704 -198
- data/spec/mongoid/association/embedded/embeds_many_models.rb +194 -1
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -1
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +78 -1
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -1
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +36 -24
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_one_models.rb +20 -1
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -3
- data/spec/mongoid/association/macros_spec.rb +9 -10
- data/spec/mongoid/association/nested/many_spec.rb +0 -1
- data/spec/mongoid/association/nested/one_spec.rb +16 -13
- data/spec/mongoid/association/options_spec.rb +0 -1
- data/spec/mongoid/association/polymorphic_spec.rb +0 -1
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -2
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +109 -17
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +50 -15
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +112 -59
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +20 -1
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +26 -22
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +26 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +31 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +0 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +523 -372
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +43 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +0 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +56 -3
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +130 -1
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +23 -7
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +413 -130
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +0 -1
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +857 -503
- data/spec/mongoid/association/referenced/has_many_models.rb +59 -2
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +0 -1
- data/spec/mongoid/association/referenced/has_many_spec.rb +46 -1
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +0 -1
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +53 -10
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +17 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +133 -28
- data/spec/mongoid/association/referenced/has_one_models.rb +63 -1
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +0 -1
- data/spec/mongoid/association/referenced/has_one_spec.rb +22 -2
- data/spec/mongoid/association/reflections_spec.rb +0 -1
- data/spec/mongoid/association/syncable_spec.rb +46 -33
- data/spec/mongoid/association_spec.rb +0 -1
- data/spec/mongoid/atomic/modifiers_spec.rb +47 -1
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +0 -1
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +0 -1
- data/spec/mongoid/atomic/paths/root_spec.rb +0 -1
- data/spec/mongoid/atomic/paths_spec.rb +91 -13
- data/spec/mongoid/atomic_spec.rb +51 -7
- data/spec/mongoid/attributes/dynamic_spec.rb +0 -1
- data/spec/mongoid/attributes/nested_spec.rb +147 -79
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -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 +40 -0
- data/spec/mongoid/attributes/readonly_spec.rb +22 -23
- data/spec/mongoid/attributes_spec.rb +888 -62
- data/spec/mongoid/cacheable_spec.rb +4 -5
- data/spec/mongoid/changeable_spec.rb +464 -73
- data/spec/mongoid/clients/factory_spec.rb +91 -9
- data/spec/mongoid/clients/options_spec.rb +27 -19
- data/spec/mongoid/clients/sessions_spec.rb +27 -67
- data/spec/mongoid/clients/transactions_spec.rb +69 -35
- data/spec/mongoid/clients_spec.rb +187 -24
- data/spec/mongoid/collection_configurable_spec.rb +158 -0
- data/spec/mongoid/composable_spec.rb +0 -1
- data/spec/mongoid/config/defaults_spec.rb +160 -0
- data/spec/mongoid/config/environment_spec.rb +124 -9
- data/spec/mongoid/config/options_spec.rb +0 -1
- data/spec/mongoid/config_spec.rb +465 -1
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +431 -154
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +120 -21
- data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
- data/spec/mongoid/contextual/atomic_spec.rb +148 -86
- data/spec/mongoid/contextual/geo_near_spec.rb +28 -20
- data/spec/mongoid/contextual/map_reduce_spec.rb +20 -20
- data/spec/mongoid/contextual/memory_spec.rb +1826 -304
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
- data/spec/mongoid/contextual/mongo_spec.rb +3501 -1272
- data/spec/mongoid/contextual/none_spec.rb +78 -68
- data/spec/mongoid/copyable_spec.rb +657 -37
- data/spec/mongoid/copyable_spec_models.rb +28 -1
- data/spec/mongoid/criteria/findable_spec.rb +109 -234
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/inspectable_spec.rb +0 -1
- data/spec/mongoid/criteria/marshalable_spec.rb +18 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +37 -38
- data/spec/mongoid/criteria/options_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +1 -2
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +0 -74
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -20
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -27
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -2
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -1
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -1
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -16
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -8
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +237 -179
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -2
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -8
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +5 -71
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -60
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +30 -8
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +39 -2
- data/spec/mongoid/criteria/queryable/key_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +143 -13
- data/spec/mongoid/criteria/queryable/optional_spec.rb +16 -486
- data/spec/mongoid/criteria/queryable/options_spec.rb +1 -2
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +1 -2
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1186 -195
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +307 -705
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -4
- data/spec/mongoid/criteria/queryable/smash_spec.rb +0 -1
- data/spec/mongoid/criteria/queryable/storable_spec.rb +37 -1
- data/spec/mongoid/criteria/scopable_spec.rb +127 -1
- data/spec/mongoid/criteria/translator_spec.rb +132 -0
- data/spec/mongoid/criteria_projection_spec.rb +406 -0
- data/spec/mongoid/criteria_spec.rb +1267 -1739
- data/spec/mongoid/document_fields_spec.rb +179 -5
- data/spec/mongoid/document_persistence_context_spec.rb +32 -0
- data/spec/mongoid/document_query_spec.rb +51 -1
- data/spec/mongoid/document_spec.rb +151 -88
- data/spec/mongoid/equality_spec.rb +142 -42
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +0 -1
- data/spec/mongoid/errors/callback_spec.rb +0 -1
- data/spec/mongoid/errors/delete_restriction_spec.rb +2 -3
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +0 -1
- data/spec/mongoid/errors/document_not_found_spec.rb +76 -1
- data/spec/mongoid/errors/invalid_collection_spec.rb +0 -1
- data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +5 -6
- data/spec/mongoid/errors/invalid_config_option_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_field_option_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_field_spec.rb +1 -2
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_includes_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_index_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_options_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_path_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_relation_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_scope_spec.rb +1 -2
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +0 -1
- data/spec/mongoid/errors/invalid_time_spec.rb +0 -1
- data/spec/mongoid/errors/inverse_not_found_spec.rb +0 -1
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +0 -1
- data/spec/mongoid/errors/mixed_relations_spec.rb +0 -1
- data/spec/mongoid/errors/mongoid_error_spec.rb +22 -9
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +0 -1
- data/spec/mongoid/errors/no_client_config_spec.rb +2 -3
- data/spec/mongoid/errors/no_client_database_spec.rb +3 -4
- data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -4
- data/spec/mongoid/errors/no_clients_config_spec.rb +0 -1
- data/spec/mongoid/errors/no_environment_spec.rb +3 -4
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +0 -1
- data/spec/mongoid/errors/no_metadata_spec.rb +0 -1
- data/spec/mongoid/errors/no_parent_spec.rb +0 -1
- data/spec/mongoid/errors/readonly_attribute_spec.rb +0 -1
- data/spec/mongoid/errors/readonly_document_spec.rb +2 -3
- data/spec/mongoid/errors/scope_overwrite_spec.rb +0 -1
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -2
- data/spec/mongoid/errors/unknown_attribute_spec.rb +2 -3
- data/spec/mongoid/errors/unsaved_document_spec.rb +0 -1
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +0 -1
- data/spec/mongoid/errors/validations_spec.rb +0 -1
- data/spec/mongoid/extensions/array_spec.rb +16 -3
- data/spec/mongoid/extensions/big_decimal_spec.rb +712 -213
- data/spec/mongoid/extensions/binary_spec.rb +44 -10
- data/spec/mongoid/extensions/boolean_spec.rb +68 -83
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -4
- data/spec/mongoid/extensions/date_spec.rb +71 -2
- data/spec/mongoid/extensions/date_time_spec.rb +15 -10
- data/spec/mongoid/extensions/decimal128_spec.rb +0 -1
- data/spec/mongoid/extensions/false_class_spec.rb +1 -2
- data/spec/mongoid/extensions/float_spec.rb +53 -75
- data/spec/mongoid/extensions/hash_spec.rb +30 -1
- data/spec/mongoid/extensions/integer_spec.rb +50 -65
- data/spec/mongoid/extensions/module_spec.rb +0 -1
- data/spec/mongoid/extensions/nil_class_spec.rb +0 -1
- data/spec/mongoid/extensions/object_id_spec.rb +0 -1
- data/spec/mongoid/extensions/object_spec.rb +0 -1
- data/spec/mongoid/extensions/range_spec.rb +255 -55
- data/spec/mongoid/extensions/regexp_spec.rb +58 -34
- data/spec/mongoid/extensions/set_spec.rb +106 -1
- data/spec/mongoid/extensions/string_spec.rb +58 -31
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
- data/spec/mongoid/extensions/symbol_spec.rb +18 -26
- data/spec/mongoid/extensions/time_spec.rb +639 -107
- data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -84
- data/spec/mongoid/extensions/true_class_spec.rb +1 -2
- data/spec/mongoid/extensions_spec.rb +14 -3
- data/spec/mongoid/factory_spec.rb +323 -30
- data/spec/mongoid/fields/foreign_key_spec.rb +0 -1
- data/spec/mongoid/fields/localized_spec.rb +84 -42
- data/spec/mongoid/fields/standard_spec.rb +0 -1
- data/spec/mongoid/fields_spec.rb +855 -118
- data/spec/mongoid/findable_spec.rb +518 -65
- data/spec/mongoid/indexable/specification_spec.rb +2 -3
- data/spec/mongoid/indexable_spec.rb +85 -33
- data/spec/mongoid/inspectable_spec.rb +37 -3
- data/spec/mongoid/interceptable_spec.rb +702 -104
- data/spec/mongoid/interceptable_spec_models.rb +235 -4
- data/spec/mongoid/loggable_spec.rb +0 -1
- data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
- data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +112 -30
- data/spec/mongoid/persistable/deletable_spec.rb +298 -19
- data/spec/mongoid/persistable/destroyable_spec.rb +226 -19
- data/spec/mongoid/persistable/incrementable_spec.rb +45 -9
- data/spec/mongoid/persistable/logical_spec.rb +41 -5
- data/spec/mongoid/persistable/poppable_spec.rb +40 -5
- data/spec/mongoid/persistable/pullable_spec.rb +80 -9
- data/spec/mongoid/persistable/pushable_spec.rb +80 -9
- data/spec/mongoid/persistable/renamable_spec.rb +39 -4
- data/spec/mongoid/persistable/savable_spec.rb +282 -26
- data/spec/mongoid/persistable/settable_spec.rb +76 -10
- data/spec/mongoid/persistable/unsettable_spec.rb +40 -5
- data/spec/mongoid/persistable/updatable_spec.rb +61 -50
- data/spec/mongoid/persistable/upsertable_spec.rb +91 -4
- data/spec/mongoid/persistable_spec.rb +3 -4
- data/spec/mongoid/persistence_context_spec.rb +57 -59
- data/spec/mongoid/positional_spec.rb +0 -1
- data/spec/mongoid/query_cache_middleware_spec.rb +7 -5
- data/spec/mongoid/query_cache_spec.rb +424 -68
- data/spec/mongoid/relations/proxy_spec.rb +7 -8
- data/spec/mongoid/reloadable_spec.rb +355 -27
- data/spec/mongoid/scopable_spec.rb +191 -39
- data/spec/mongoid/selectable_spec.rb +6 -7
- data/spec/mongoid/serializable_spec.rb +35 -39
- data/spec/mongoid/shardable_models.rb +15 -1
- data/spec/mongoid/shardable_spec.rb +181 -32
- data/spec/mongoid/stateful_spec.rb +151 -10
- data/spec/mongoid/tasks/database_rake_spec.rb +87 -14
- data/spec/mongoid/tasks/database_spec.rb +128 -2
- data/spec/mongoid/threaded_spec.rb +2 -3
- data/spec/mongoid/timestamps/created/short_spec.rb +1 -2
- data/spec/mongoid/timestamps/created_spec.rb +1 -2
- data/spec/mongoid/timestamps/timeless_spec.rb +2 -3
- data/spec/mongoid/timestamps/updated/short_spec.rb +3 -4
- data/spec/mongoid/timestamps/updated_spec.rb +3 -4
- data/spec/mongoid/timestamps_spec.rb +398 -11
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +525 -36
- data/spec/mongoid/touchable_spec_models.rb +59 -0
- data/spec/mongoid/traversable_spec.rb +1143 -2
- data/spec/mongoid/validatable/associated_spec.rb +0 -1
- data/spec/mongoid/validatable/format_spec.rb +0 -1
- data/spec/mongoid/validatable/length_spec.rb +0 -1
- data/spec/mongoid/validatable/numericality_spec.rb +0 -1
- data/spec/mongoid/validatable/presence_spec.rb +26 -23
- data/spec/mongoid/validatable/uniqueness_spec.rb +125 -99
- data/spec/mongoid/validatable_spec.rb +3 -4
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/mongoid_spec.rb +35 -10
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -3
- data/spec/rails/mongoid_spec.rb +4 -17
- data/spec/shared/LICENSE +20 -0
- 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/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +231 -0
- data/spec/shared/lib/mrss/constraints.rb +378 -0
- data/spec/shared/lib/mrss/docker_runner.rb +298 -0
- 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 +238 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
- 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 +179 -0
- data/spec/shared/lib/mrss/utils.rb +37 -0
- data/spec/shared/share/Dockerfile.erb +321 -0
- 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 +74 -0
- data/spec/shared/shlib/server.sh +416 -0
- data/spec/shared/shlib/set_env.sh +169 -0
- data/spec/spec_helper.rb +24 -54
- data/spec/support/authorization.rb +0 -1
- data/spec/support/client_registry.rb +9 -0
- data/spec/support/constraints.rb +34 -197
- data/spec/support/expectations.rb +0 -1
- data/spec/support/helpers.rb +1 -1
- data/spec/support/immutable_ids.rb +118 -0
- data/spec/support/macros.rb +109 -1
- data/spec/{app → support}/models/account.rb +1 -2
- data/spec/{app → support}/models/acolyte.rb +0 -1
- data/spec/{app → support}/models/actor.rb +1 -2
- data/spec/{app → support}/models/actress.rb +0 -1
- data/spec/{app → support}/models/address.rb +4 -1
- data/spec/{app → support}/models/address_component.rb +0 -1
- data/spec/{app → support}/models/address_number.rb +0 -1
- data/spec/{app → support}/models/agency.rb +0 -1
- data/spec/{app → support}/models/agent.rb +0 -1
- data/spec/{app → support}/models/album.rb +0 -1
- data/spec/{app → support}/models/alert.rb +0 -1
- data/spec/{app → support}/models/animal.rb +0 -1
- data/spec/{app → support}/models/answer.rb +0 -1
- data/spec/{app → support}/models/appointment.rb +0 -1
- data/spec/support/models/armrest.rb +9 -0
- data/spec/{app → support}/models/array_field.rb +0 -1
- data/spec/{app → support}/models/article.rb +0 -1
- data/spec/{app → support}/models/artist.rb +2 -2
- data/spec/{app → support}/models/artwork.rb +0 -1
- data/spec/support/models/audible_sound.rb +3 -0
- data/spec/{app → support}/models/audio.rb +0 -1
- data/spec/support/models/augmentation.rb +25 -0
- data/spec/{app → support}/models/author.rb +0 -1
- data/spec/{app → support}/models/baby.rb +0 -1
- data/spec/{app → support}/models/band.rb +8 -1
- data/spec/{app → support}/models/bar.rb +0 -1
- data/spec/{app → support}/models/basic.rb +0 -1
- data/spec/{app → support}/models/bed.rb +0 -1
- data/spec/{app → support}/models/big_palette.rb +0 -1
- data/spec/{app → support}/models/birthday.rb +0 -1
- data/spec/support/models/bolt.rb +7 -0
- data/spec/{app → support}/models/bomb.rb +0 -1
- data/spec/{app → support}/models/book.rb +1 -1
- data/spec/{app → support}/models/breed.rb +0 -1
- data/spec/{app → support}/models/browser.rb +1 -2
- data/spec/{app → support}/models/building.rb +2 -1
- data/spec/{app → support}/models/building_address.rb +0 -1
- data/spec/{app → support}/models/bus.rb +0 -1
- data/spec/{app → support}/models/business.rb +0 -1
- data/spec/{app → support}/models/callback_test.rb +0 -1
- data/spec/{app → support}/models/canvas.rb +1 -2
- data/spec/{app → support}/models/car.rb +0 -1
- data/spec/{app → support}/models/cat.rb +0 -1
- data/spec/support/models/catalog.rb +24 -0
- data/spec/{app → support}/models/category.rb +0 -1
- data/spec/{app → support}/models/child.rb +0 -1
- data/spec/{app → support}/models/child_doc.rb +3 -4
- data/spec/{app → support}/models/church.rb +0 -1
- data/spec/{app → support}/models/circle.rb +0 -1
- data/spec/{app → support}/models/circuit.rb +0 -1
- data/spec/{app → support}/models/circus.rb +3 -1
- data/spec/{app → support}/models/code.rb +2 -1
- data/spec/{app → support}/models/coding/pull_request.rb +0 -1
- data/spec/support/models/coding.rb +3 -0
- data/spec/{app → support}/models/comment.rb +0 -1
- data/spec/{app → support}/models/company.rb +0 -1
- data/spec/{app → support}/models/consumption_period.rb +0 -1
- data/spec/{app → support}/models/contextable_item.rb +0 -1
- data/spec/{app → support}/models/contractor.rb +0 -1
- data/spec/{app → support}/models/cookie.rb +0 -1
- data/spec/{app → support}/models/country_code.rb +2 -1
- data/spec/{app → support}/models/courier_job.rb +0 -1
- data/spec/support/models/cover.rb +10 -0
- data/spec/support/models/crate.rb +12 -0
- data/spec/support/models/customer.rb +10 -0
- data/spec/support/models/customer_address.rb +11 -0
- data/spec/support/models/deed.rb +7 -0
- data/spec/{app → support}/models/definition.rb +0 -1
- data/spec/{app → support}/models/delegating_patient.rb +0 -1
- data/spec/{app → support}/models/description.rb +0 -1
- data/spec/{app → support}/models/dictionary.rb +6 -1
- data/spec/{app → support}/models/division.rb +0 -1
- data/spec/{app → support}/models/doctor.rb +0 -1
- data/spec/{app → support}/models/dog.rb +0 -1
- data/spec/{app → support}/models/dokument.rb +0 -1
- data/spec/{app → support}/models/draft.rb +0 -1
- data/spec/{app → support}/models/dragon.rb +0 -1
- data/spec/{app → support}/models/driver.rb +1 -2
- data/spec/{app → support}/models/drug.rb +0 -1
- data/spec/{app → support}/models/dungeon.rb +0 -1
- data/spec/{app → support}/models/edit.rb +0 -1
- data/spec/{app → support}/models/email.rb +0 -1
- data/spec/{app → support}/models/employer.rb +0 -1
- data/spec/{app → support}/models/entry.rb +0 -1
- data/spec/{app → support}/models/eraser.rb +0 -1
- data/spec/{app → support}/models/even.rb +0 -1
- data/spec/{app → support}/models/event.rb +0 -1
- data/spec/{app → support}/models/exhibition.rb +0 -1
- data/spec/{app → support}/models/exhibitor.rb +0 -1
- data/spec/{app → support}/models/explosion.rb +0 -1
- data/spec/{app → support}/models/eye.rb +0 -1
- data/spec/{app → support}/models/eye_bowl.rb +0 -1
- data/spec/{app → support}/models/face.rb +0 -1
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/{app → support}/models/favorite.rb +0 -1
- data/spec/{app → support}/models/filesystem.rb +0 -1
- data/spec/{app → support}/models/fire_hydrant.rb +0 -1
- data/spec/{app → support}/models/firefox.rb +0 -1
- data/spec/{app → support}/models/fish.rb +0 -1
- data/spec/{app → support}/models/folder.rb +0 -1
- data/spec/{app → support}/models/folder_item.rb +0 -1
- data/spec/{app → support}/models/fruits.rb +0 -1
- data/spec/{app → support}/models/game.rb +0 -1
- data/spec/{app → support}/models/ghost.rb +0 -1
- data/spec/support/models/guitar.rb +4 -0
- data/spec/support/models/hole.rb +12 -0
- data/spec/{app → support}/models/home.rb +0 -1
- data/spec/{app → support}/models/house.rb +0 -1
- data/spec/{app → support}/models/html_writer.rb +0 -1
- data/spec/{app → support}/models/id_key.rb +0 -1
- data/spec/support/models/idnodef.rb +7 -0
- data/spec/{app → support}/models/image.rb +0 -1
- data/spec/{app → support}/models/implant.rb +9 -1
- data/spec/support/models/instrument.rb +8 -0
- data/spec/{app → support}/models/item.rb +1 -2
- data/spec/{app → support}/models/jar.rb +0 -1
- data/spec/{app → support}/models/kaleidoscope.rb +0 -1
- data/spec/{app → support}/models/kangaroo.rb +0 -1
- data/spec/{app → support}/models/label.rb +4 -2
- data/spec/{app → support}/models/language.rb +0 -1
- data/spec/{app → support}/models/lat_lng.rb +0 -1
- data/spec/{app → support}/models/league.rb +0 -1
- data/spec/{app → support}/models/learner.rb +0 -1
- data/spec/{app → support}/models/line_item.rb +0 -1
- data/spec/{app → support}/models/location.rb +0 -1
- data/spec/{app → support}/models/login.rb +0 -1
- data/spec/{app → support}/models/manufacturer.rb +0 -1
- data/spec/{app → support}/models/meat.rb +0 -1
- data/spec/{app → support}/models/membership.rb +1 -1
- data/spec/{app → support}/models/message.rb +0 -1
- data/spec/{app → support}/models/minim.rb +0 -1
- data/spec/{app → support}/models/mixed_drink.rb +0 -1
- data/spec/support/models/mop.rb +24 -0
- data/spec/{app → support}/models/movie.rb +0 -1
- data/spec/{app → support}/models/my_hash.rb +0 -1
- data/spec/{app → support}/models/name.rb +0 -1
- data/spec/{app → support}/models/name_only.rb +0 -1
- data/spec/{app → support}/models/node.rb +0 -1
- data/spec/{app → support}/models/note.rb +0 -1
- data/spec/support/models/nut.rb +7 -0
- data/spec/{app → support}/models/odd.rb +0 -1
- data/spec/support/models/order.rb +12 -0
- data/spec/{app → support}/models/ordered_post.rb +1 -2
- data/spec/{app → support}/models/ordered_preference.rb +0 -1
- data/spec/{app → support}/models/oscar.rb +0 -1
- data/spec/{app → support}/models/other_owner_object.rb +0 -1
- data/spec/{app → support}/models/override.rb +0 -1
- data/spec/{app → support}/models/ownable.rb +0 -1
- data/spec/{app → support}/models/owner.rb +2 -1
- data/spec/{app → support}/models/pack.rb +0 -1
- data/spec/{app → support}/models/page.rb +0 -1
- data/spec/{app → support}/models/page_question.rb +0 -1
- data/spec/{app → support}/models/palette.rb +1 -2
- data/spec/{app → support}/models/parent.rb +0 -1
- data/spec/{app → support}/models/parent_doc.rb +0 -1
- data/spec/support/models/passport.rb +22 -0
- data/spec/{app → support}/models/patient.rb +0 -1
- data/spec/{app → support}/models/pdf_writer.rb +0 -1
- data/spec/{app → support}/models/pencil.rb +0 -1
- data/spec/{app → support}/models/person.rb +20 -2
- data/spec/{app → support}/models/pet.rb +0 -1
- data/spec/{app → support}/models/pet_owner.rb +0 -1
- data/spec/{app → support}/models/phone.rb +3 -2
- data/spec/support/models/piano.rb +4 -0
- data/spec/{app → support}/models/pizza.rb +0 -1
- data/spec/{app → support}/models/player.rb +2 -1
- data/spec/{app → support}/models/post.rb +0 -1
- data/spec/{app → support}/models/post_genre.rb +0 -1
- data/spec/support/models/powerup.rb +25 -0
- data/spec/{app → support}/models/preference.rb +0 -1
- data/spec/{app → support}/models/princess.rb +0 -1
- data/spec/{app → support}/models/product.rb +1 -1
- data/spec/support/models/profile.rb +17 -0
- data/spec/{app → support}/models/pronunciation.rb +0 -1
- data/spec/{app → support}/models/pub.rb +0 -1
- data/spec/{app → support}/models/publication/encyclopedia.rb +0 -1
- data/spec/{app → support}/models/publication/review.rb +0 -1
- data/spec/support/models/publication.rb +4 -0
- data/spec/{app → support}/models/purchase.rb +0 -1
- data/spec/support/models/purchased_item.rb +10 -0
- data/spec/{app → support}/models/question.rb +0 -1
- data/spec/{app → support}/models/quiz.rb +0 -1
- data/spec/{app → support}/models/rating.rb +0 -1
- data/spec/{app → support}/models/record.rb +0 -1
- data/spec/{app → support}/models/registry.rb +1 -1
- data/spec/{app → support}/models/role.rb +0 -1
- data/spec/{app → support}/models/root_category.rb +0 -1
- data/spec/{app → support}/models/sandwich.rb +0 -1
- data/spec/{app → support}/models/scheduler.rb +0 -1
- data/spec/support/models/school.rb +14 -0
- data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -3
- data/spec/support/models/sealer.rb +7 -0
- data/spec/support/models/seat.rb +24 -0
- data/spec/{app → support}/models/seo.rb +0 -1
- data/spec/{app → support}/models/series.rb +1 -1
- data/spec/{app → support}/models/server.rb +0 -1
- data/spec/{app → support}/models/service.rb +0 -1
- data/spec/{app → support}/models/shape.rb +2 -3
- data/spec/{app → support}/models/shelf.rb +0 -1
- data/spec/support/models/shield.rb +18 -0
- data/spec/{app → support}/models/shipment_address.rb +0 -1
- data/spec/{app → support}/models/shipping_container.rb +0 -1
- data/spec/{app → support}/models/shipping_pack.rb +0 -1
- data/spec/support/models/shirt.rb +11 -0
- data/spec/{app → support}/models/shop.rb +0 -1
- data/spec/{app → support}/models/short_agent.rb +0 -1
- data/spec/{app → support}/models/short_quiz.rb +0 -1
- data/spec/{app → support}/models/simple.rb +0 -1
- data/spec/{app → support}/models/slave.rb +0 -1
- data/spec/{app → support}/models/song.rb +0 -1
- data/spec/{app → support}/models/sound.rb +0 -1
- data/spec/support/models/spacer.rb +7 -0
- data/spec/{app → support}/models/square.rb +0 -1
- data/spec/{app → support}/models/staff.rb +0 -1
- data/spec/{app → support}/models/store_as_dup_test1.rb +0 -1
- data/spec/{app → support}/models/store_as_dup_test2.rb +0 -1
- data/spec/{app → support}/models/store_as_dup_test3.rb +0 -1
- data/spec/{app → support}/models/store_as_dup_test4.rb +0 -1
- data/spec/{app → support}/models/strategy.rb +0 -1
- data/spec/support/models/student.rb +14 -0
- data/spec/{app → support}/models/sub_item.rb +0 -1
- data/spec/{app → support}/models/subscription.rb +0 -1
- data/spec/{app → support}/models/survey.rb +0 -1
- data/spec/{app → support}/models/symptom.rb +0 -1
- data/spec/support/models/system_role.rb +7 -0
- data/spec/{app → support}/models/tag.rb +0 -1
- data/spec/{app → support}/models/target.rb +0 -1
- data/spec/{app → support}/models/template.rb +0 -1
- data/spec/{app → support}/models/thing.rb +0 -1
- data/spec/support/models/threadlocker.rb +7 -0
- data/spec/{app → support}/models/title.rb +0 -1
- data/spec/{app → support}/models/tool.rb +2 -3
- data/spec/{app → support}/models/topping.rb +0 -1
- data/spec/support/models/toy.rb +9 -0
- data/spec/{app → support}/models/track.rb +0 -1
- data/spec/{app → support}/models/translation.rb +0 -1
- data/spec/{app → support}/models/tree.rb +0 -1
- data/spec/{app → support}/models/truck.rb +2 -1
- data/spec/{app → support}/models/updatable.rb +0 -1
- data/spec/{app → support}/models/user.rb +0 -1
- data/spec/{app → support}/models/user_account.rb +0 -1
- data/spec/{app → support}/models/validation_callback.rb +0 -1
- data/spec/{app → support}/models/vehicle.rb +7 -3
- data/spec/{app → support}/models/version.rb +0 -1
- data/spec/{app → support}/models/vertex.rb +0 -1
- data/spec/{app → support}/models/vet_visit.rb +0 -1
- data/spec/{app → support}/models/video.rb +0 -1
- data/spec/{app → support}/models/video_game.rb +0 -1
- data/spec/support/models/washer.rb +7 -0
- data/spec/support/models/weapon.rb +25 -0
- data/spec/{app → support}/models/wiki_page.rb +1 -1
- data/spec/{app → support}/models/word.rb +0 -1
- data/spec/{app → support}/models/word_origin.rb +0 -1
- data/spec/{app → support}/models/writer.rb +2 -3
- 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 +0 -1
- data/spec/support/spec_config.rb +28 -6
- data.tar.gz.sig +0 -0
- metadata +1216 -799
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -26
- data/lib/mongoid/errors/invalid_value.rb +0 -18
- data/lib/mongoid/matchable/all.rb +0 -30
- data/lib/mongoid/matchable/and.rb +0 -32
- data/lib/mongoid/matchable/default.rb +0 -121
- data/lib/mongoid/matchable/elem_match.rb +0 -36
- data/lib/mongoid/matchable/eq.rb +0 -23
- data/lib/mongoid/matchable/exists.rb +0 -25
- data/lib/mongoid/matchable/gt.rb +0 -25
- data/lib/mongoid/matchable/gte.rb +0 -25
- data/lib/mongoid/matchable/in.rb +0 -26
- data/lib/mongoid/matchable/lt.rb +0 -25
- data/lib/mongoid/matchable/lte.rb +0 -25
- data/lib/mongoid/matchable/ne.rb +0 -23
- data/lib/mongoid/matchable/nin.rb +0 -24
- data/lib/mongoid/matchable/nor.rb +0 -38
- data/lib/mongoid/matchable/or.rb +0 -35
- data/lib/mongoid/matchable/regexp.rb +0 -30
- data/lib/mongoid/matchable/size.rb +0 -23
- data/lib/support/ruby_version.rb +0 -29
- data/spec/app/models/augmentation.rb +0 -14
- data/spec/app/models/coding.rb +0 -4
- data/spec/app/models/passport.rb +0 -8
- data/spec/app/models/powerup.rb +0 -14
- data/spec/app/models/publication.rb +0 -5
- data/spec/app/models/weapon.rb +0 -14
- 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/matchable/all_spec.rb +0 -34
- data/spec/mongoid/matchable/and_spec.rb +0 -190
- data/spec/mongoid/matchable/default_spec.rb +0 -140
- data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
- data/spec/mongoid/matchable/eq_spec.rb +0 -49
- data/spec/mongoid/matchable/exists_spec.rb +0 -60
- data/spec/mongoid/matchable/gt_spec.rb +0 -89
- data/spec/mongoid/matchable/gte_spec.rb +0 -87
- data/spec/mongoid/matchable/in_spec.rb +0 -52
- data/spec/mongoid/matchable/lt_spec.rb +0 -88
- data/spec/mongoid/matchable/lte_spec.rb +0 -88
- data/spec/mongoid/matchable/ne_spec.rb +0 -49
- data/spec/mongoid/matchable/nin_spec.rb +0 -51
- data/spec/mongoid/matchable/nor_spec.rb +0 -210
- data/spec/mongoid/matchable/or_spec.rb +0 -134
- data/spec/mongoid/matchable/regexp_spec.rb +0 -62
- data/spec/mongoid/matchable/size_spec.rb +0 -28
- data/spec/mongoid/matchable_spec.rb +0 -856
- data/spec/support/cluster_config.rb +0 -158
- data/spec/support/lite_constraints.rb +0 -22
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# encoding: utf-8
|
|
3
2
|
|
|
3
|
+
require "mongoid/contextual/mongo/documents_loader"
|
|
4
4
|
require "mongoid/contextual/atomic"
|
|
5
5
|
require "mongoid/contextual/aggregable/mongo"
|
|
6
6
|
require "mongoid/contextual/command"
|
|
@@ -18,9 +18,9 @@ module Mongoid
|
|
|
18
18
|
include Association::EagerLoadable
|
|
19
19
|
include Queryable
|
|
20
20
|
|
|
21
|
+
Mongoid.deprecate(self, :geo_near)
|
|
22
|
+
|
|
21
23
|
# Options constant.
|
|
22
|
-
#
|
|
23
|
-
# @since 5.0.0
|
|
24
24
|
OPTIONS = [ :hint,
|
|
25
25
|
:limit,
|
|
26
26
|
:skip,
|
|
@@ -38,17 +38,17 @@ module Mongoid
|
|
|
38
38
|
# @attribute [r] view The Mongo collection view.
|
|
39
39
|
attr_reader :view
|
|
40
40
|
|
|
41
|
-
#
|
|
41
|
+
# Run an explain on the criteria.
|
|
42
42
|
#
|
|
43
|
-
# @example
|
|
44
|
-
#
|
|
43
|
+
# @example Explain the criteria.
|
|
44
|
+
# Band.where(name: "Depeche Mode").explain
|
|
45
45
|
#
|
|
46
|
-
# @
|
|
46
|
+
# @param [ Hash ] options customizable options (See Mongo::Collection::View::Explainable)
|
|
47
47
|
#
|
|
48
|
-
# @
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
# @return [ Hash ] The explain result.
|
|
49
|
+
def_delegator :view, :explain
|
|
50
|
+
|
|
51
|
+
attr_reader :documents_loader
|
|
52
52
|
|
|
53
53
|
# Get the number of documents matching the query.
|
|
54
54
|
#
|
|
@@ -67,11 +67,28 @@ module Mongoid
|
|
|
67
67
|
# into the count.
|
|
68
68
|
#
|
|
69
69
|
# @return [ Integer ] The number of matches.
|
|
70
|
-
#
|
|
71
|
-
# @since 3.0.0
|
|
72
70
|
def count(options = {}, &block)
|
|
73
71
|
return super(&block) if block_given?
|
|
74
|
-
|
|
72
|
+
view.count_documents(options)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Get the estimated number of documents matching the query.
|
|
76
|
+
#
|
|
77
|
+
# Unlike count, estimated_count does not take a block because it is not
|
|
78
|
+
# traditionally defined (with a block) on Enumarable like count is.
|
|
79
|
+
#
|
|
80
|
+
# @example Get the estimated number of matching documents.
|
|
81
|
+
# context.estimated_count
|
|
82
|
+
#
|
|
83
|
+
# @param [ Hash ] options The options, such as maxTimeMS to be factored
|
|
84
|
+
# into the count.
|
|
85
|
+
#
|
|
86
|
+
# @return [ Integer ] The number of matches.
|
|
87
|
+
def estimated_count(options = {})
|
|
88
|
+
unless self.criteria.selector.empty?
|
|
89
|
+
raise Mongoid::Errors::InvalidEstimatedCountCriteria.new(self.klass)
|
|
90
|
+
end
|
|
91
|
+
view.estimated_document_count(options)
|
|
75
92
|
end
|
|
76
93
|
|
|
77
94
|
# Delete all documents in the database that match the selector.
|
|
@@ -80,8 +97,6 @@ module Mongoid
|
|
|
80
97
|
# context.delete
|
|
81
98
|
#
|
|
82
99
|
# @return [ nil ] Nil.
|
|
83
|
-
#
|
|
84
|
-
# @since 3.0.0
|
|
85
100
|
def delete
|
|
86
101
|
view.delete_many.deleted_count
|
|
87
102
|
end
|
|
@@ -93,8 +108,6 @@ module Mongoid
|
|
|
93
108
|
# context.destroy
|
|
94
109
|
#
|
|
95
110
|
# @return [ nil ] Nil.
|
|
96
|
-
#
|
|
97
|
-
# @since 3.0.0
|
|
98
111
|
def destroy
|
|
99
112
|
each.inject(0) do |count, doc|
|
|
100
113
|
doc.destroy
|
|
@@ -109,14 +122,23 @@ module Mongoid
|
|
|
109
122
|
# @example Get the distinct values.
|
|
110
123
|
# context.distinct(:name)
|
|
111
124
|
#
|
|
112
|
-
# @param [ String
|
|
125
|
+
# @param [ String | Symbol ] field The name of the field.
|
|
113
126
|
#
|
|
114
127
|
# @return [ Array<Object> ] The distinct values for the field.
|
|
115
|
-
#
|
|
116
|
-
# @since 3.0.0
|
|
117
128
|
def distinct(field)
|
|
118
|
-
|
|
119
|
-
|
|
129
|
+
name = if Mongoid.legacy_pluck_distinct
|
|
130
|
+
klass.database_field_name(field)
|
|
131
|
+
else
|
|
132
|
+
klass.cleanse_localized_field_names(field)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
view.distinct(name).map do |value|
|
|
136
|
+
if Mongoid.legacy_pluck_distinct
|
|
137
|
+
value.class.demongoize(value)
|
|
138
|
+
else
|
|
139
|
+
is_translation = "#{name}_translations" == field.to_s
|
|
140
|
+
recursive_demongoize(name, value, is_translation)
|
|
141
|
+
end
|
|
120
142
|
end
|
|
121
143
|
end
|
|
122
144
|
|
|
@@ -129,14 +151,11 @@ module Mongoid
|
|
|
129
151
|
# end
|
|
130
152
|
#
|
|
131
153
|
# @return [ Enumerator ] The enumerator.
|
|
132
|
-
#
|
|
133
|
-
# @since 3.0.0
|
|
134
154
|
def each(&block)
|
|
135
155
|
if block_given?
|
|
136
156
|
documents_for_iteration.each do |doc|
|
|
137
157
|
yield_document(doc, &block)
|
|
138
158
|
end
|
|
139
|
-
@cache_loaded = true
|
|
140
159
|
self
|
|
141
160
|
else
|
|
142
161
|
to_enum
|
|
@@ -148,34 +167,30 @@ module Mongoid
|
|
|
148
167
|
# @example Do any documents exist for the context.
|
|
149
168
|
# context.exists?
|
|
150
169
|
#
|
|
151
|
-
# @
|
|
152
|
-
#
|
|
153
|
-
# used to determine the value.
|
|
170
|
+
# @example Do any documents exist for given _id.
|
|
171
|
+
# context.exists?(BSON::ObjectId(...))
|
|
154
172
|
#
|
|
155
|
-
# @
|
|
173
|
+
# @example Do any documents exist for given conditions.
|
|
174
|
+
# context.exists?(name: "...")
|
|
156
175
|
#
|
|
157
|
-
# @since
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
176
|
+
# @note We don't use count here since Mongo does not use counted
|
|
177
|
+
# b-tree indexes.
|
|
178
|
+
#
|
|
179
|
+
# @param [ Hash | Object | false ] id_or_conditions an _id to
|
|
180
|
+
# search for, a hash of conditions, nil or false.
|
|
181
|
+
#
|
|
182
|
+
# @return [ true | false ] If the count is more than zero.
|
|
183
|
+
# Always false if passed nil or false.
|
|
184
|
+
def exists?(id_or_conditions = :none)
|
|
185
|
+
return false if self.view.limit == 0
|
|
186
|
+
case id_or_conditions
|
|
187
|
+
when :none then !!(view.projection(_id: 1).limit(1).first)
|
|
188
|
+
when nil, false then false
|
|
189
|
+
when Hash then Mongo.new(criteria.where(id_or_conditions)).exists?
|
|
190
|
+
else Mongo.new(criteria.where(_id: id_or_conditions)).exists?
|
|
164
191
|
end
|
|
165
192
|
end
|
|
166
193
|
|
|
167
|
-
# Run an explain on the criteria.
|
|
168
|
-
#
|
|
169
|
-
# @example Explain the criteria.
|
|
170
|
-
# Band.where(name: "Depeche Mode").explain
|
|
171
|
-
#
|
|
172
|
-
# @return [ Hash ] The explain result.
|
|
173
|
-
#
|
|
174
|
-
# @since 3.0.0
|
|
175
|
-
def explain
|
|
176
|
-
view.explain
|
|
177
|
-
end
|
|
178
|
-
|
|
179
194
|
# Execute the find and modify command, used for MongoDB's
|
|
180
195
|
# $findAndModify.
|
|
181
196
|
#
|
|
@@ -185,13 +200,11 @@ module Mongoid
|
|
|
185
200
|
# @param [ Hash ] update The updates.
|
|
186
201
|
# @param [ Hash ] options The command options.
|
|
187
202
|
#
|
|
188
|
-
# @option options [ :before
|
|
203
|
+
# @option options [ :before | :after ] :return_document Return the updated document
|
|
189
204
|
# from before or after update.
|
|
190
|
-
# @option options [ true
|
|
205
|
+
# @option options [ true | false ] :upsert Create the document if it doesn't exist.
|
|
191
206
|
#
|
|
192
207
|
# @return [ Document ] The result of the command.
|
|
193
|
-
#
|
|
194
|
-
# @since 5.0.0
|
|
195
208
|
def find_one_and_update(update, options = {})
|
|
196
209
|
if doc = view.find_one_and_update(update, options)
|
|
197
210
|
Factory.from_db(klass, doc)
|
|
@@ -207,13 +220,11 @@ module Mongoid
|
|
|
207
220
|
# @param [ Hash ] replacement The replacement.
|
|
208
221
|
# @param [ Hash ] options The command options.
|
|
209
222
|
#
|
|
210
|
-
# @option options [ :before
|
|
223
|
+
# @option options [ :before | :after ] :return_document Return the updated document
|
|
211
224
|
# from before or after update.
|
|
212
|
-
# @option options [ true
|
|
225
|
+
# @option options [ true | false ] :upsert Create the document if it doesn't exist.
|
|
213
226
|
#
|
|
214
227
|
# @return [ Document ] The result of the command.
|
|
215
|
-
#
|
|
216
|
-
# @since 5.0.0
|
|
217
228
|
def find_one_and_replace(replacement, options = {})
|
|
218
229
|
if doc = view.find_one_and_replace(replacement, options)
|
|
219
230
|
Factory.from_db(klass, doc)
|
|
@@ -227,58 +238,16 @@ module Mongoid
|
|
|
227
238
|
# context.find_one_and_delete
|
|
228
239
|
#
|
|
229
240
|
# @return [ Document ] The result of the command.
|
|
230
|
-
#
|
|
231
|
-
# @since 5.0.0
|
|
232
241
|
def find_one_and_delete
|
|
233
242
|
if doc = view.find_one_and_delete
|
|
234
243
|
Factory.from_db(klass, doc)
|
|
235
244
|
end
|
|
236
245
|
end
|
|
237
246
|
|
|
238
|
-
# Get the first document in the database for the criteria's selector.
|
|
239
|
-
#
|
|
240
|
-
# @example Get the first document.
|
|
241
|
-
# context.first
|
|
242
|
-
#
|
|
243
|
-
# @note Automatically adding a sort on _id when no other sort is
|
|
244
|
-
# defined on the criteria has the potential to cause bad performance issues.
|
|
245
|
-
# If you experience unexpected poor performance when using #first or #last
|
|
246
|
-
# and have no sort defined on the criteria, use the option { id_sort: :none }.
|
|
247
|
-
# Be aware that #first/#last won't guarantee order in this case.
|
|
248
|
-
#
|
|
249
|
-
# @param [ Hash ] opts The options for the query returning the first document.
|
|
250
|
-
#
|
|
251
|
-
# @option opts [ :none ] :id_sort Don't apply a sort on _id if no other sort
|
|
252
|
-
# is defined on the criteria.
|
|
253
|
-
#
|
|
254
|
-
# @return [ Document ] The first document.
|
|
255
|
-
#
|
|
256
|
-
# @since 3.0.0
|
|
257
|
-
def first(opts = {})
|
|
258
|
-
return documents.first if cached? && cache_loaded?
|
|
259
|
-
try_cache(:first) do
|
|
260
|
-
if sort = view.sort || ({ _id: 1 } unless opts[:id_sort] == :none)
|
|
261
|
-
if raw_doc = view.sort(sort).limit(-1).first
|
|
262
|
-
doc = Factory.from_db(klass, raw_doc, criteria)
|
|
263
|
-
eager_load([doc]).first
|
|
264
|
-
end
|
|
265
|
-
else
|
|
266
|
-
if raw_doc = view.limit(-1).first
|
|
267
|
-
doc = Factory.from_db(klass, raw_doc, criteria)
|
|
268
|
-
eager_load([doc]).first
|
|
269
|
-
end
|
|
270
|
-
end
|
|
271
|
-
end
|
|
272
|
-
end
|
|
273
|
-
alias :one :first
|
|
274
|
-
|
|
275
247
|
# Return the first result without applying sort
|
|
276
248
|
#
|
|
277
249
|
# @api private
|
|
278
|
-
#
|
|
279
|
-
# @since 4.0.2
|
|
280
250
|
def find_first
|
|
281
|
-
return documents.first if cached? && cache_loaded?
|
|
282
251
|
if raw_doc = view.first
|
|
283
252
|
doc = Factory.from_db(klass, raw_doc, criteria)
|
|
284
253
|
eager_load([doc]).first
|
|
@@ -304,35 +273,10 @@ module Mongoid
|
|
|
304
273
|
# @return [ GeoNear ] The GeoNear command.
|
|
305
274
|
#
|
|
306
275
|
# @deprecated
|
|
307
|
-
#
|
|
308
|
-
# @since 3.1.0
|
|
309
276
|
def geo_near(coordinates)
|
|
310
277
|
GeoNear.new(collection, criteria, coordinates)
|
|
311
278
|
end
|
|
312
279
|
|
|
313
|
-
# Invoke the block for each element of Contextual. Create a new array
|
|
314
|
-
# containing the values returned by the block.
|
|
315
|
-
#
|
|
316
|
-
# If the symbol field name is passed instead of the block, additional
|
|
317
|
-
# optimizations would be used.
|
|
318
|
-
#
|
|
319
|
-
# @example Map by some field.
|
|
320
|
-
# context.map(:field1)
|
|
321
|
-
#
|
|
322
|
-
# @example Map with block.
|
|
323
|
-
# context.map(&:field1)
|
|
324
|
-
#
|
|
325
|
-
# @param [ Symbol ] field The field name.
|
|
326
|
-
#
|
|
327
|
-
# @return [ Array ] The result of mapping.
|
|
328
|
-
def map(field = nil, &block)
|
|
329
|
-
if block_given?
|
|
330
|
-
super(&block)
|
|
331
|
-
else
|
|
332
|
-
criteria.pluck(field)
|
|
333
|
-
end
|
|
334
|
-
end
|
|
335
|
-
|
|
336
280
|
# Create the new Mongo context. This delegates operations to the
|
|
337
281
|
# underlying driver.
|
|
338
282
|
#
|
|
@@ -340,10 +284,8 @@ module Mongoid
|
|
|
340
284
|
# Mongo.new(criteria)
|
|
341
285
|
#
|
|
342
286
|
# @param [ Criteria ] criteria The criteria.
|
|
343
|
-
#
|
|
344
|
-
# @since 3.0.0
|
|
345
287
|
def initialize(criteria)
|
|
346
|
-
@criteria, @klass
|
|
288
|
+
@criteria, @klass = criteria, criteria.klass
|
|
347
289
|
@collection = @klass.collection
|
|
348
290
|
criteria.send(:merge_type_selection)
|
|
349
291
|
@view = collection.find(criteria.selector, session: _session)
|
|
@@ -352,44 +294,15 @@ module Mongoid
|
|
|
352
294
|
|
|
353
295
|
def_delegator :@klass, :database_field_name
|
|
354
296
|
|
|
355
|
-
#
|
|
356
|
-
#
|
|
357
|
-
# @example Get the last document.
|
|
358
|
-
# context.last
|
|
359
|
-
#
|
|
360
|
-
# @note Automatically adding a sort on _id when no other sort is
|
|
361
|
-
# defined on the criteria has the potential to cause bad performance issues.
|
|
362
|
-
# If you experience unexpected poor performance when using #first or #last
|
|
363
|
-
# and have no sort defined on the criteria, use the option { id_sort: :none }.
|
|
364
|
-
# Be aware that #first/#last won't guarantee order in this case.
|
|
365
|
-
#
|
|
366
|
-
# @param [ Hash ] opts The options for the query returning the first document.
|
|
367
|
-
#
|
|
368
|
-
# @option opts [ :none ] :id_sort Don't apply a sort on _id if no other sort
|
|
369
|
-
# is defined on the criteria.
|
|
370
|
-
#
|
|
371
|
-
# @since 3.0.0
|
|
372
|
-
def last(opts = {})
|
|
373
|
-
try_cache(:last) do
|
|
374
|
-
with_inverse_sorting(opts) do
|
|
375
|
-
if raw_doc = view.limit(-1).first
|
|
376
|
-
doc = Factory.from_db(klass, raw_doc, criteria)
|
|
377
|
-
eager_load([doc]).first
|
|
378
|
-
end
|
|
379
|
-
end
|
|
380
|
-
end
|
|
381
|
-
end
|
|
382
|
-
|
|
383
|
-
# Get's the number of documents matching the query selector.
|
|
297
|
+
# Returns the number of documents in the database matching
|
|
298
|
+
# the query selector.
|
|
384
299
|
#
|
|
385
300
|
# @example Get the length.
|
|
386
301
|
# context.length
|
|
387
302
|
#
|
|
388
303
|
# @return [ Integer ] The number of documents.
|
|
389
|
-
#
|
|
390
|
-
# @since 3.0.0
|
|
391
304
|
def length
|
|
392
|
-
|
|
305
|
+
self.count
|
|
393
306
|
end
|
|
394
307
|
alias :size :length
|
|
395
308
|
|
|
@@ -401,8 +314,6 @@ module Mongoid
|
|
|
401
314
|
# @param [ Integer ] value The number of documents to return.
|
|
402
315
|
#
|
|
403
316
|
# @return [ Mongo ] The context.
|
|
404
|
-
#
|
|
405
|
-
# @since 3.0.0
|
|
406
317
|
def limit(value)
|
|
407
318
|
@view = view.limit(value) and self
|
|
408
319
|
end
|
|
@@ -416,40 +327,174 @@ module Mongoid
|
|
|
416
327
|
# @param [ String ] reduce The reduce js function.
|
|
417
328
|
#
|
|
418
329
|
# @return [ MapReduce ] The map/reduce lazy wrapper.
|
|
419
|
-
#
|
|
420
|
-
# @since 3.0.0
|
|
421
330
|
def map_reduce(map, reduce)
|
|
422
331
|
MapReduce.new(collection, criteria, map, reduce)
|
|
423
332
|
end
|
|
424
333
|
|
|
425
|
-
# Pluck the
|
|
426
|
-
#
|
|
334
|
+
# Pluck the field value(s) from the database. Returns one
|
|
335
|
+
# result for each document found in the database for
|
|
336
|
+
# the context. The results are normalized according to their
|
|
337
|
+
# Mongoid field types. Note that the results may include
|
|
338
|
+
# duplicates and nil values.
|
|
427
339
|
#
|
|
428
340
|
# @example Pluck a field.
|
|
429
341
|
# context.pluck(:_id)
|
|
430
342
|
#
|
|
431
|
-
# @
|
|
432
|
-
#
|
|
433
|
-
#
|
|
434
|
-
# @param [ String, Symbol, Array ] fields Fields to pluck.
|
|
435
|
-
#
|
|
436
|
-
# @return [ Array<Object, Array> ] The plucked values.
|
|
343
|
+
# @param [ [ String | Symbol ]... ] *fields Field(s) to pluck,
|
|
344
|
+
# which may include nested fields using dot-notation.
|
|
437
345
|
#
|
|
438
|
-
# @
|
|
346
|
+
# @return [ Array<Object> | Array<Array<Object>> ] The plucked values.
|
|
347
|
+
# If the *fields arg contains a single value, each result
|
|
348
|
+
# in the array will be a single value. Otherwise, each
|
|
349
|
+
# result in the array will be an array of values.
|
|
439
350
|
def pluck(*fields)
|
|
351
|
+
# Multiple fields can map to the same field name. For example, plucking
|
|
352
|
+
# a field and its _translations field map to the same field in the database.
|
|
353
|
+
# because of this, we need to keep track of the fields requested.
|
|
354
|
+
normalized_field_names = []
|
|
440
355
|
normalized_select = fields.inject({}) do |hash, f|
|
|
441
|
-
|
|
356
|
+
db_fn = klass.database_field_name(f)
|
|
357
|
+
normalized_field_names.push(db_fn)
|
|
358
|
+
|
|
359
|
+
if Mongoid.legacy_pluck_distinct
|
|
360
|
+
hash[db_fn] = true
|
|
361
|
+
else
|
|
362
|
+
hash[klass.cleanse_localized_field_names(f)] = true
|
|
363
|
+
end
|
|
442
364
|
hash
|
|
443
365
|
end
|
|
444
366
|
|
|
445
367
|
view.projection(normalized_select).reduce([]) do |plucked, doc|
|
|
446
|
-
values =
|
|
447
|
-
|
|
368
|
+
values = normalized_field_names.map do |n|
|
|
369
|
+
if Mongoid.legacy_pluck_distinct
|
|
370
|
+
n.include?('.') ? doc[n.partition('.')[0]] : doc[n]
|
|
371
|
+
else
|
|
372
|
+
extract_value(doc, n)
|
|
373
|
+
end
|
|
448
374
|
end
|
|
449
375
|
plucked << (values.size == 1 ? values.first : values)
|
|
450
376
|
end
|
|
451
377
|
end
|
|
452
378
|
|
|
379
|
+
# Pick the single field values from the database.
|
|
380
|
+
#
|
|
381
|
+
# @example Pick a field.
|
|
382
|
+
# context.pick(:_id)
|
|
383
|
+
#
|
|
384
|
+
# @param [ [ String | Symbol ]... ] *fields Field(s) to pick.
|
|
385
|
+
#
|
|
386
|
+
# @return [ Object | Array<Object> ] The picked values.
|
|
387
|
+
def pick(*fields)
|
|
388
|
+
limit(1).pluck(*fields).first
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
# Take the given number of documents from the database.
|
|
392
|
+
#
|
|
393
|
+
# @example Take 10 documents
|
|
394
|
+
# context.take(10)
|
|
395
|
+
#
|
|
396
|
+
# @param [ Integer | nil ] limit The number of documents to return or nil.
|
|
397
|
+
#
|
|
398
|
+
# @return [ Document | Array<Document> ] The list of documents, or one
|
|
399
|
+
# document if no value was given.
|
|
400
|
+
def take(limit = nil)
|
|
401
|
+
if limit
|
|
402
|
+
limit(limit).to_a
|
|
403
|
+
else
|
|
404
|
+
# Do to_a first so that the Mongo#first method is not used and the
|
|
405
|
+
# result is not sorted.
|
|
406
|
+
limit(1).to_a.first
|
|
407
|
+
end
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
# Take one document from the database and raise an error if there are none.
|
|
411
|
+
#
|
|
412
|
+
# @example Take a document
|
|
413
|
+
# context.take!
|
|
414
|
+
#
|
|
415
|
+
# @return [ Document ] The document.
|
|
416
|
+
#
|
|
417
|
+
# @raises [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
418
|
+
# documents to take.
|
|
419
|
+
def take!
|
|
420
|
+
# Do to_a first so that the Mongo#first method is not used and the
|
|
421
|
+
# result is not sorted.
|
|
422
|
+
if fst = limit(1).to_a.first
|
|
423
|
+
fst
|
|
424
|
+
else
|
|
425
|
+
raise Errors::DocumentNotFound.new(klass, nil, nil)
|
|
426
|
+
end
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
# Get a hash of counts for the values of a single field. For example,
|
|
430
|
+
# if the following documents were in the database:
|
|
431
|
+
#
|
|
432
|
+
# { _id: 1, age: 21 }
|
|
433
|
+
# { _id: 2, age: 21 }
|
|
434
|
+
# { _id: 3, age: 22 }
|
|
435
|
+
#
|
|
436
|
+
# Model.tally("age")
|
|
437
|
+
#
|
|
438
|
+
# would yield the following result:
|
|
439
|
+
#
|
|
440
|
+
# { 21 => 2, 22 => 1 }
|
|
441
|
+
#
|
|
442
|
+
# When tallying a field inside an array or embeds_many association:
|
|
443
|
+
#
|
|
444
|
+
# { _id: 1, array: [ { x: 1 }, { x: 2 } ] }
|
|
445
|
+
# { _id: 2, array: [ { x: 1 }, { x: 2 } ] }
|
|
446
|
+
# { _id: 3, array: [ { x: 1 }, { x: 3 } ] }
|
|
447
|
+
#
|
|
448
|
+
# Model.tally("array.x")
|
|
449
|
+
#
|
|
450
|
+
# The keys of the resulting hash are arrays:
|
|
451
|
+
#
|
|
452
|
+
# { [ 1, 2 ] => 2, [ 1, 3 ] => 1 }
|
|
453
|
+
#
|
|
454
|
+
# Note that if tallying an element in an array of hashes, and the key
|
|
455
|
+
# doesn't exist in some of the hashes, tally will not include those
|
|
456
|
+
# nil keys in the resulting hash:
|
|
457
|
+
#
|
|
458
|
+
# { _id: 1, array: [ { x: 1 }, { x: 2 }, { y: 3 } ] }
|
|
459
|
+
#
|
|
460
|
+
# Model.tally("array.x")
|
|
461
|
+
# # => { [ 1, 2 ] => 1 }
|
|
462
|
+
#
|
|
463
|
+
# @param [ String | Symbol ] field The field name.
|
|
464
|
+
#
|
|
465
|
+
# @return [ Hash ] The hash of counts.
|
|
466
|
+
def tally(field)
|
|
467
|
+
name = klass.cleanse_localized_field_names(field)
|
|
468
|
+
|
|
469
|
+
fld = klass.traverse_association_tree(name)
|
|
470
|
+
pipeline = [ { "$group" => { _id: "$#{name}", counts: { "$sum": 1 } } } ]
|
|
471
|
+
pipeline.unshift("$match" => view.filter) unless view.filter.blank?
|
|
472
|
+
|
|
473
|
+
collection.aggregate(pipeline).reduce({}) do |tallies, doc|
|
|
474
|
+
is_translation = "#{name}_translations" == field.to_s
|
|
475
|
+
val = doc["_id"]
|
|
476
|
+
|
|
477
|
+
key = if val.is_a?(Array)
|
|
478
|
+
val.map do |v|
|
|
479
|
+
demongoize_with_field(fld, v, is_translation)
|
|
480
|
+
end
|
|
481
|
+
else
|
|
482
|
+
demongoize_with_field(fld, val, is_translation)
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
# The only time where a key will already exist in the tallies hash
|
|
486
|
+
# is when the values are stored differently in the database, but
|
|
487
|
+
# demongoize to the same value. A good example of when this happens
|
|
488
|
+
# is when using localized fields. While the server query won't group
|
|
489
|
+
# together hashes that have other values in different languages, the
|
|
490
|
+
# demongoized value is just the translation in the current locale,
|
|
491
|
+
# which can be the same across multiple of those unequal hashes.
|
|
492
|
+
tallies[key] ||= 0
|
|
493
|
+
tallies[key] += doc["counts"]
|
|
494
|
+
tallies
|
|
495
|
+
end
|
|
496
|
+
end
|
|
497
|
+
|
|
453
498
|
# Skips the provided number of documents.
|
|
454
499
|
#
|
|
455
500
|
# @example Skip the documents.
|
|
@@ -458,8 +503,6 @@ module Mongoid
|
|
|
458
503
|
# @param [ Integer ] value The number of documents to skip.
|
|
459
504
|
#
|
|
460
505
|
# @return [ Mongo ] The context.
|
|
461
|
-
#
|
|
462
|
-
# @since 3.0.0
|
|
463
506
|
def skip(value)
|
|
464
507
|
@view = view.skip(value) and self
|
|
465
508
|
end
|
|
@@ -473,8 +516,6 @@ module Mongoid
|
|
|
473
516
|
# pairs.
|
|
474
517
|
#
|
|
475
518
|
# @return [ Mongo ] The context.
|
|
476
|
-
#
|
|
477
|
-
# @since 3.0.0
|
|
478
519
|
def sort(values = nil, &block)
|
|
479
520
|
if block_given?
|
|
480
521
|
super(&block)
|
|
@@ -497,9 +538,7 @@ module Mongoid
|
|
|
497
538
|
# @option opts [ Array ] :array_filters A set of filters specifying to which array elements
|
|
498
539
|
# an update should apply.
|
|
499
540
|
#
|
|
500
|
-
# @return [ nil
|
|
501
|
-
#
|
|
502
|
-
# @since 3.0.0
|
|
541
|
+
# @return [ nil | false ] False if no attributes were provided.
|
|
503
542
|
def update(attributes = nil, opts = {})
|
|
504
543
|
update_documents(attributes, :update_one, opts)
|
|
505
544
|
end
|
|
@@ -515,33 +554,257 @@ module Mongoid
|
|
|
515
554
|
# @option opts [ Array ] :array_filters A set of filters specifying to which array elements
|
|
516
555
|
# an update should apply.
|
|
517
556
|
#
|
|
518
|
-
# @return [ nil
|
|
519
|
-
#
|
|
520
|
-
# @since 3.0.0
|
|
557
|
+
# @return [ nil | false ] False if no attributes were provided.
|
|
521
558
|
def update_all(attributes = nil, opts = {})
|
|
522
559
|
update_documents(attributes, :update_many, opts)
|
|
523
560
|
end
|
|
524
561
|
|
|
525
|
-
|
|
562
|
+
# Get the first document in the database for the criteria's selector.
|
|
563
|
+
#
|
|
564
|
+
# @example Get the first document.
|
|
565
|
+
# context.first
|
|
566
|
+
#
|
|
567
|
+
# @note Automatically adding a sort on _id when no other sort is
|
|
568
|
+
# defined on the criteria has the potential to cause bad performance issues.
|
|
569
|
+
# If you experience unexpected poor performance when using #first or #last
|
|
570
|
+
# and have no sort defined on the criteria, use #take instead.
|
|
571
|
+
# Be aware that #take won't guarantee order.
|
|
572
|
+
#
|
|
573
|
+
# @param [ Integer ] limit The number of documents to return.
|
|
574
|
+
#
|
|
575
|
+
# @return [ Document | nil ] The first document or nil if none is found.
|
|
576
|
+
def first(limit = nil)
|
|
577
|
+
if limit.nil?
|
|
578
|
+
retrieve_nth(0)
|
|
579
|
+
else
|
|
580
|
+
retrieve_nth_with_limit(0, limit)
|
|
581
|
+
end
|
|
582
|
+
end
|
|
583
|
+
alias :one :first
|
|
526
584
|
|
|
527
|
-
#
|
|
585
|
+
# Get the first document in the database for the criteria's selector or
|
|
586
|
+
# raise an error if none is found.
|
|
528
587
|
#
|
|
529
|
-
# @
|
|
588
|
+
# @example Get the first document.
|
|
589
|
+
# context.first!
|
|
530
590
|
#
|
|
531
|
-
# @
|
|
591
|
+
# @note Automatically adding a sort on _id when no other sort is
|
|
592
|
+
# defined on the criteria has the potential to cause bad performance issues.
|
|
593
|
+
# If you experience unexpected poor performance when using #first! or #last!
|
|
594
|
+
# and have no sort defined on the criteria, use #take! instead.
|
|
595
|
+
# Be aware that #take! won't guarantee order.
|
|
596
|
+
#
|
|
597
|
+
# @return [ Document ] The first document.
|
|
532
598
|
#
|
|
533
|
-
# @
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
599
|
+
# @raises [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
600
|
+
# documents available.
|
|
601
|
+
def first!
|
|
602
|
+
first || raise_document_not_found_error
|
|
603
|
+
end
|
|
604
|
+
|
|
605
|
+
# Get the last document in the database for the criteria's selector.
|
|
606
|
+
#
|
|
607
|
+
# @example Get the last document.
|
|
608
|
+
# context.last
|
|
609
|
+
#
|
|
610
|
+
# @note Automatically adding a sort on _id when no other sort is
|
|
611
|
+
# defined on the criteria has the potential to cause bad performance issues.
|
|
612
|
+
# If you experience unexpected poor performance when using #first or #last
|
|
613
|
+
# and have no sort defined on the criteria, use #take instead.
|
|
614
|
+
# Be aware that #take won't guarantee order.
|
|
615
|
+
#
|
|
616
|
+
# @param [ Integer ] limit The number of documents to return.
|
|
617
|
+
#
|
|
618
|
+
# @return [ Document | nil ] The last document or nil if none is found.
|
|
619
|
+
def last(limit = nil)
|
|
620
|
+
if limit.nil?
|
|
621
|
+
retrieve_nth_to_last(0)
|
|
537
622
|
else
|
|
538
|
-
|
|
539
|
-
instance_variable_set("@#{key}", ret = yield)
|
|
540
|
-
end
|
|
541
|
-
ret
|
|
623
|
+
retrieve_nth_to_last_with_limit(0, limit)
|
|
542
624
|
end
|
|
543
625
|
end
|
|
544
626
|
|
|
627
|
+
# Get the last document in the database for the criteria's selector or
|
|
628
|
+
# raise an error if none is found.
|
|
629
|
+
#
|
|
630
|
+
# @example Get the last document.
|
|
631
|
+
# context.last!
|
|
632
|
+
#
|
|
633
|
+
# @note Automatically adding a sort on _id when no other sort is
|
|
634
|
+
# defined on the criteria has the potential to cause bad performance issues.
|
|
635
|
+
# If you experience unexpected poor performance when using #first! or #last!
|
|
636
|
+
# and have no sort defined on the criteria, use #take! instead.
|
|
637
|
+
# Be aware that #take! won't guarantee order.
|
|
638
|
+
#
|
|
639
|
+
# @return [ Document ] The last document.
|
|
640
|
+
#
|
|
641
|
+
# @raises [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
642
|
+
# documents available.
|
|
643
|
+
def last!
|
|
644
|
+
last || raise_document_not_found_error
|
|
645
|
+
end
|
|
646
|
+
|
|
647
|
+
# Get the second document in the database for the criteria's selector.
|
|
648
|
+
#
|
|
649
|
+
# @example Get the second document.
|
|
650
|
+
# context.second
|
|
651
|
+
#
|
|
652
|
+
# @return [ Document | nil ] The second document or nil if none is found.
|
|
653
|
+
def second
|
|
654
|
+
retrieve_nth(1)
|
|
655
|
+
end
|
|
656
|
+
|
|
657
|
+
# Get the second document in the database for the criteria's selector or
|
|
658
|
+
# raise an error if none is found.
|
|
659
|
+
#
|
|
660
|
+
# @example Get the second document.
|
|
661
|
+
# context.second!
|
|
662
|
+
#
|
|
663
|
+
# @return [ Document ] The second document.
|
|
664
|
+
#
|
|
665
|
+
# @raises [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
666
|
+
# documents available.
|
|
667
|
+
def second!
|
|
668
|
+
second || raise_document_not_found_error
|
|
669
|
+
end
|
|
670
|
+
|
|
671
|
+
# Get the third document in the database for the criteria's selector.
|
|
672
|
+
#
|
|
673
|
+
# @example Get the third document.
|
|
674
|
+
# context.third
|
|
675
|
+
#
|
|
676
|
+
# @return [ Document | nil ] The third document or nil if none is found.
|
|
677
|
+
def third
|
|
678
|
+
retrieve_nth(2)
|
|
679
|
+
end
|
|
680
|
+
|
|
681
|
+
# Get the third document in the database for the criteria's selector or
|
|
682
|
+
# raise an error if none is found.
|
|
683
|
+
#
|
|
684
|
+
# @example Get the third document.
|
|
685
|
+
# context.third!
|
|
686
|
+
#
|
|
687
|
+
# @return [ Document ] The third document.
|
|
688
|
+
#
|
|
689
|
+
# @raises [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
690
|
+
# documents available.
|
|
691
|
+
def third!
|
|
692
|
+
third || raise_document_not_found_error
|
|
693
|
+
end
|
|
694
|
+
|
|
695
|
+
# Get the fourth document in the database for the criteria's selector.
|
|
696
|
+
#
|
|
697
|
+
# @example Get the fourth document.
|
|
698
|
+
# context.fourth
|
|
699
|
+
#
|
|
700
|
+
# @return [ Document | nil ] The fourth document or nil if none is found.
|
|
701
|
+
def fourth
|
|
702
|
+
retrieve_nth(3)
|
|
703
|
+
end
|
|
704
|
+
|
|
705
|
+
# Get the fourth document in the database for the criteria's selector or
|
|
706
|
+
# raise an error if none is found.
|
|
707
|
+
#
|
|
708
|
+
# @example Get the fourth document.
|
|
709
|
+
# context.fourth!
|
|
710
|
+
#
|
|
711
|
+
# @return [ Document ] The fourth document.
|
|
712
|
+
#
|
|
713
|
+
# @raises [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
714
|
+
# documents available.
|
|
715
|
+
def fourth!
|
|
716
|
+
fourth || raise_document_not_found_error
|
|
717
|
+
end
|
|
718
|
+
|
|
719
|
+
# Get the fifth document in the database for the criteria's selector.
|
|
720
|
+
#
|
|
721
|
+
# @example Get the fifth document.
|
|
722
|
+
# context.fifth
|
|
723
|
+
#
|
|
724
|
+
# @return [ Document | nil ] The fifth document or nil if none is found.
|
|
725
|
+
def fifth
|
|
726
|
+
retrieve_nth(4)
|
|
727
|
+
end
|
|
728
|
+
|
|
729
|
+
# Get the fifth document in the database for the criteria's selector or
|
|
730
|
+
# raise an error if none is found.
|
|
731
|
+
#
|
|
732
|
+
# @example Get the fifth document.
|
|
733
|
+
# context.fifth!
|
|
734
|
+
#
|
|
735
|
+
# @return [ Document ] The fifth document.
|
|
736
|
+
#
|
|
737
|
+
# @raises [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
738
|
+
# documents available.
|
|
739
|
+
def fifth!
|
|
740
|
+
fifth || raise_document_not_found_error
|
|
741
|
+
end
|
|
742
|
+
|
|
743
|
+
# Get the second to last document in the database for the criteria's
|
|
744
|
+
# selector.
|
|
745
|
+
#
|
|
746
|
+
# @example Get the second to last document.
|
|
747
|
+
# context.second_to_last
|
|
748
|
+
#
|
|
749
|
+
# @return [ Document | nil ] The second to last document or nil if none
|
|
750
|
+
# is found.
|
|
751
|
+
def second_to_last
|
|
752
|
+
retrieve_nth_to_last(1)
|
|
753
|
+
end
|
|
754
|
+
|
|
755
|
+
# Get the second to last document in the database for the criteria's
|
|
756
|
+
# selector or raise an error if none is found.
|
|
757
|
+
#
|
|
758
|
+
# @example Get the second to last document.
|
|
759
|
+
# context.second_to_last!
|
|
760
|
+
#
|
|
761
|
+
# @return [ Document ] The second to last document.
|
|
762
|
+
#
|
|
763
|
+
# @raises [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
764
|
+
# documents available.
|
|
765
|
+
def second_to_last!
|
|
766
|
+
second_to_last || raise_document_not_found_error
|
|
767
|
+
end
|
|
768
|
+
|
|
769
|
+
# Get the third to last document in the database for the criteria's
|
|
770
|
+
# selector.
|
|
771
|
+
#
|
|
772
|
+
# @example Get the third to last document.
|
|
773
|
+
# context.third_to_last
|
|
774
|
+
#
|
|
775
|
+
# @return [ Document | nil ] The third to last document or nil if none
|
|
776
|
+
# is found.
|
|
777
|
+
def third_to_last
|
|
778
|
+
retrieve_nth_to_last(2)
|
|
779
|
+
end
|
|
780
|
+
|
|
781
|
+
# Get the third to last document in the database for the criteria's
|
|
782
|
+
# selector or raise an error if none is found.
|
|
783
|
+
#
|
|
784
|
+
# @example Get the third to last document.
|
|
785
|
+
# context.third_to_last!
|
|
786
|
+
#
|
|
787
|
+
# @return [ Document ] The third to last document.
|
|
788
|
+
#
|
|
789
|
+
# @raises [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
790
|
+
# documents available.
|
|
791
|
+
def third_to_last!
|
|
792
|
+
third_to_last || raise_document_not_found_error
|
|
793
|
+
end
|
|
794
|
+
|
|
795
|
+
# Schedule a task to load documents for the context.
|
|
796
|
+
#
|
|
797
|
+
# Depending on the Mongoid configuration, the scheduled task can be executed
|
|
798
|
+
# immediately on the caller's thread, or can be scheduled for an
|
|
799
|
+
# asynchronous execution.
|
|
800
|
+
#
|
|
801
|
+
# @api private
|
|
802
|
+
def load_async
|
|
803
|
+
@documents_loader ||= DocumentsLoader.new(view, klass, criteria)
|
|
804
|
+
end
|
|
805
|
+
|
|
806
|
+
private
|
|
807
|
+
|
|
545
808
|
# Update the documents for the provided method.
|
|
546
809
|
#
|
|
547
810
|
# @api private
|
|
@@ -552,9 +815,7 @@ module Mongoid
|
|
|
552
815
|
# @param [ Hash ] attributes The updates.
|
|
553
816
|
# @param [ Symbol ] method The method to use.
|
|
554
817
|
#
|
|
555
|
-
# @return [ true
|
|
556
|
-
#
|
|
557
|
-
# @since 3.0.4
|
|
818
|
+
# @return [ true | false ] If the update succeeded.
|
|
558
819
|
def update_documents(attributes, method = :update_one, opts = {})
|
|
559
820
|
return false unless attributes
|
|
560
821
|
attributes = Hash[attributes.map { |k, v| [klass.database_field_name(k.to_s), v] }]
|
|
@@ -567,8 +828,6 @@ module Mongoid
|
|
|
567
828
|
#
|
|
568
829
|
# @example Apply the field limitations.
|
|
569
830
|
# context.apply_fields
|
|
570
|
-
#
|
|
571
|
-
# @since 3.0.0
|
|
572
831
|
def apply_fields
|
|
573
832
|
if spec = criteria.options[:fields]
|
|
574
833
|
@view = view.projection(spec)
|
|
@@ -581,8 +840,6 @@ module Mongoid
|
|
|
581
840
|
#
|
|
582
841
|
# @example Apply all options.
|
|
583
842
|
# context.apply_options
|
|
584
|
-
#
|
|
585
|
-
# @since 3.1.0
|
|
586
843
|
def apply_options
|
|
587
844
|
apply_fields
|
|
588
845
|
OPTIONS.each do |name|
|
|
@@ -599,8 +856,6 @@ module Mongoid
|
|
|
599
856
|
#
|
|
600
857
|
# @example Apply the skip option.
|
|
601
858
|
# context.apply_option(:skip)
|
|
602
|
-
#
|
|
603
|
-
# @since 3.1.0
|
|
604
859
|
def apply_option(name)
|
|
605
860
|
if spec = criteria.options[name]
|
|
606
861
|
@view = view.send(name, spec)
|
|
@@ -610,115 +865,213 @@ module Mongoid
|
|
|
610
865
|
# Map the inverse sort symbols to the correct MongoDB values.
|
|
611
866
|
#
|
|
612
867
|
# @api private
|
|
868
|
+
def inverse_sorting
|
|
869
|
+
sort = view.sort || { _id: 1 }
|
|
870
|
+
Hash[sort.map{|k, v| [k, -1*v]}]
|
|
871
|
+
end
|
|
872
|
+
|
|
873
|
+
# Get the documents the context should iterate.
|
|
874
|
+
#
|
|
875
|
+
# If the documents have been already preloaded by `Document::Loader`
|
|
876
|
+
# instance, they will be used.
|
|
613
877
|
#
|
|
614
|
-
# @
|
|
615
|
-
# context.with_inverse_sorting
|
|
878
|
+
# @return [ Array<Document> | Mongo::Collection::View ] The docs to iterate.
|
|
616
879
|
#
|
|
617
|
-
# @
|
|
618
|
-
def
|
|
619
|
-
|
|
620
|
-
if
|
|
621
|
-
@
|
|
880
|
+
# @api private
|
|
881
|
+
def documents_for_iteration
|
|
882
|
+
if @documents_loader
|
|
883
|
+
if @documents_loader.started?
|
|
884
|
+
@documents_loader.value!
|
|
885
|
+
else
|
|
886
|
+
@documents_loader.unschedule
|
|
887
|
+
@documents_loader.execute
|
|
622
888
|
end
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
889
|
+
else
|
|
890
|
+
return view unless eager_loadable?
|
|
891
|
+
docs = view.map do |doc|
|
|
892
|
+
Factory.from_db(klass, doc, criteria)
|
|
893
|
+
end
|
|
894
|
+
eager_load(docs)
|
|
626
895
|
end
|
|
627
896
|
end
|
|
628
897
|
|
|
629
|
-
#
|
|
898
|
+
# Yield to the document.
|
|
630
899
|
#
|
|
631
900
|
# @api private
|
|
632
901
|
#
|
|
633
|
-
# @example
|
|
634
|
-
# context.
|
|
635
|
-
#
|
|
636
|
-
#
|
|
902
|
+
# @example Yield the document.
|
|
903
|
+
# context.yield_document(doc) do |doc|
|
|
904
|
+
# ...
|
|
905
|
+
# end
|
|
637
906
|
#
|
|
638
|
-
# @
|
|
639
|
-
def
|
|
640
|
-
|
|
907
|
+
# @param [ Document ] document The document to yield to.
|
|
908
|
+
def yield_document(document, &block)
|
|
909
|
+
doc = document.respond_to?(:_id) ?
|
|
910
|
+
document : Factory.from_db(klass, document, criteria)
|
|
911
|
+
yield(doc)
|
|
641
912
|
end
|
|
642
913
|
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
#
|
|
646
|
-
# @api private
|
|
647
|
-
#
|
|
648
|
-
# @example Is the cache loaded?
|
|
649
|
-
# context.cache_loaded?
|
|
650
|
-
#
|
|
651
|
-
# @return [ true, false ] If the cache is loaded.
|
|
652
|
-
#
|
|
653
|
-
# @since 3.0.0
|
|
654
|
-
def cache_loaded?
|
|
655
|
-
!!@cache_loaded
|
|
914
|
+
def _session
|
|
915
|
+
@criteria.send(:_session)
|
|
656
916
|
end
|
|
657
917
|
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
# @api private
|
|
661
|
-
#
|
|
662
|
-
# @example Get the cached documents.
|
|
663
|
-
# context.documents
|
|
664
|
-
#
|
|
665
|
-
# @return [ Array<Document> ] The documents.
|
|
666
|
-
#
|
|
667
|
-
# @since 3.0.0
|
|
668
|
-
def documents
|
|
669
|
-
@documents ||= []
|
|
918
|
+
def acknowledged_write?
|
|
919
|
+
collection.write_concern.nil? || collection.write_concern.acknowledged?
|
|
670
920
|
end
|
|
671
921
|
|
|
672
|
-
#
|
|
922
|
+
# Fetch the element from the given hash and demongoize it using the
|
|
923
|
+
# given field. If the obj is an array, map over it and call this method
|
|
924
|
+
# on all of its elements.
|
|
673
925
|
#
|
|
674
|
-
#
|
|
675
|
-
#
|
|
676
|
-
#
|
|
677
|
-
# those.
|
|
678
|
-
# 3. Use the query.
|
|
926
|
+
# @param [ Hash | Array<Hash> ] obj The hash or array of hashes to fetch from.
|
|
927
|
+
# @param [ String ] meth The key to fetch from the hash.
|
|
928
|
+
# @param [ Field ] field The field to use for demongoization.
|
|
679
929
|
#
|
|
680
|
-
# @
|
|
930
|
+
# @return [ Object ] The demongoized value.
|
|
681
931
|
#
|
|
682
|
-
# @
|
|
683
|
-
|
|
932
|
+
# @api private
|
|
933
|
+
def fetch_and_demongoize(obj, meth, field)
|
|
934
|
+
if obj.is_a?(Array)
|
|
935
|
+
obj.map { |doc| fetch_and_demongoize(doc, meth, field) }
|
|
936
|
+
else
|
|
937
|
+
res = obj.try(:fetch, meth, nil)
|
|
938
|
+
field ? field.demongoize(res) : res.class.demongoize(res)
|
|
939
|
+
end
|
|
940
|
+
end
|
|
941
|
+
|
|
942
|
+
# Extracts the value for the given field name from the given attribute
|
|
943
|
+
# hash.
|
|
684
944
|
#
|
|
685
|
-
# @
|
|
945
|
+
# @param [ Hash ] attrs The attributes hash.
|
|
946
|
+
# @param [ String ] field_name The name of the field to extract.
|
|
686
947
|
#
|
|
687
|
-
# @
|
|
688
|
-
def
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
948
|
+
# @param [ Object ] The value for the given field name
|
|
949
|
+
def extract_value(attrs, field_name)
|
|
950
|
+
i = 1
|
|
951
|
+
num_meths = field_name.count('.') + 1
|
|
952
|
+
curr = attrs.dup
|
|
953
|
+
|
|
954
|
+
klass.traverse_association_tree(field_name) do |meth, obj, is_field|
|
|
955
|
+
field = obj if is_field
|
|
956
|
+
is_translation = false
|
|
957
|
+
# If no association or field was found, check if the meth is an
|
|
958
|
+
# _translations field.
|
|
959
|
+
if obj.nil? & tr = meth.match(/(.*)_translations\z/)&.captures&.first
|
|
960
|
+
is_translation = true
|
|
961
|
+
meth = tr
|
|
962
|
+
end
|
|
963
|
+
|
|
964
|
+
# 1. If curr is an array fetch from all elements in the array.
|
|
965
|
+
# 2. If the field is localized, and is not an _translations field
|
|
966
|
+
# (_translations fields don't show up in the fields hash).
|
|
967
|
+
# - If this is the end of the methods, return the translation for
|
|
968
|
+
# the current locale.
|
|
969
|
+
# - Otherwise, return the whole translations hash so the next method
|
|
970
|
+
# can select the language it wants.
|
|
971
|
+
# 3. If the meth is an _translations field, do not demongoize the
|
|
972
|
+
# value so the full hash is returned.
|
|
973
|
+
# 4. Otherwise, fetch and demongoize the value for the key meth.
|
|
974
|
+
curr = if curr.is_a? Array
|
|
975
|
+
res = fetch_and_demongoize(curr, meth, field)
|
|
976
|
+
res.empty? ? nil : res
|
|
977
|
+
elsif !is_translation && field&.localized?
|
|
978
|
+
if i < num_meths
|
|
979
|
+
curr.try(:fetch, meth, nil)
|
|
980
|
+
else
|
|
981
|
+
fetch_and_demongoize(curr, meth, field)
|
|
982
|
+
end
|
|
983
|
+
elsif is_translation
|
|
984
|
+
curr.try(:fetch, meth, nil)
|
|
985
|
+
else
|
|
986
|
+
fetch_and_demongoize(curr, meth, field)
|
|
987
|
+
end
|
|
988
|
+
|
|
989
|
+
i += 1
|
|
990
|
+
end
|
|
991
|
+
curr
|
|
693
992
|
end
|
|
694
993
|
|
|
695
|
-
#
|
|
994
|
+
# Recursively demongoize the given value. This method recursively traverses
|
|
995
|
+
# the class tree to find the correct field to use to demongoize the value.
|
|
996
|
+
#
|
|
997
|
+
# @param [ String ] field_name The name of the field to demongoize.
|
|
998
|
+
# @param [ Object ] value The value to demongoize.
|
|
999
|
+
# @param [ true | false ] is_translation The field we are retrieving is an
|
|
1000
|
+
# _translations field.
|
|
1001
|
+
#
|
|
1002
|
+
# @return [ Object ] The demongoized value.
|
|
1003
|
+
def recursive_demongoize(field_name, value, is_translation)
|
|
1004
|
+
field = klass.traverse_association_tree(field_name)
|
|
1005
|
+
demongoize_with_field(field, value, is_translation)
|
|
1006
|
+
end
|
|
1007
|
+
|
|
1008
|
+
# Demongoize the value for the given field. If the field is nil or the
|
|
1009
|
+
# field is a translations field, the value is demongoized using its class.
|
|
696
1010
|
#
|
|
697
|
-
# @
|
|
1011
|
+
# @param [ Field ] field The field to use to demongoize.
|
|
1012
|
+
# @param [ Object ] value The value to demongoize.
|
|
1013
|
+
# @param [ true | false ] is_translation The field we are retrieving is an
|
|
1014
|
+
# _translations field.
|
|
698
1015
|
#
|
|
699
|
-
# @
|
|
700
|
-
# context.yield_document(doc) do |doc|
|
|
701
|
-
# ...
|
|
702
|
-
# end
|
|
1016
|
+
# @return [ Object ] The demongoized value.
|
|
703
1017
|
#
|
|
704
|
-
# @
|
|
1018
|
+
# @api private
|
|
1019
|
+
def demongoize_with_field(field, value, is_translation)
|
|
1020
|
+
if field
|
|
1021
|
+
# If it's a localized field that's not a hash, don't demongoize
|
|
1022
|
+
# again, we already have the translation. If it's an _translations
|
|
1023
|
+
# field, don't demongoize, we want the full hash not just a
|
|
1024
|
+
# specific translation.
|
|
1025
|
+
# If it is a hash, and it's not a translations field, we need to
|
|
1026
|
+
# demongoize to get the correct translation.
|
|
1027
|
+
if field.localized? && (!value.is_a?(Hash) || is_translation)
|
|
1028
|
+
value.class.demongoize(value)
|
|
1029
|
+
else
|
|
1030
|
+
field.demongoize(value)
|
|
1031
|
+
end
|
|
1032
|
+
else
|
|
1033
|
+
value.class.demongoize(value)
|
|
1034
|
+
end
|
|
1035
|
+
end
|
|
1036
|
+
|
|
1037
|
+
# Process the raw documents retrieved for #first/#last.
|
|
705
1038
|
#
|
|
706
|
-
# @
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
1039
|
+
# @return [ Array<Document> | Document ] The list of documents or a
|
|
1040
|
+
# single document.
|
|
1041
|
+
def process_raw_docs(raw_docs, limit)
|
|
1042
|
+
docs = raw_docs.map do |d|
|
|
1043
|
+
Factory.from_db(klass, d, criteria)
|
|
1044
|
+
end
|
|
1045
|
+
docs = eager_load(docs)
|
|
1046
|
+
limit ? docs : docs.first
|
|
712
1047
|
end
|
|
713
1048
|
|
|
714
|
-
|
|
1049
|
+
def raise_document_not_found_error
|
|
1050
|
+
raise Errors::DocumentNotFound.new(klass, nil, nil)
|
|
1051
|
+
end
|
|
715
1052
|
|
|
716
|
-
def
|
|
717
|
-
|
|
1053
|
+
def retrieve_nth(n)
|
|
1054
|
+
retrieve_nth_with_limit(n, 1).first
|
|
718
1055
|
end
|
|
719
1056
|
|
|
720
|
-
def
|
|
721
|
-
|
|
1057
|
+
def retrieve_nth_with_limit(n, limit)
|
|
1058
|
+
sort = view.sort || { _id: 1 }
|
|
1059
|
+
v = view.sort(sort).limit(limit || 1)
|
|
1060
|
+
v = v.skip(n) if n > 0
|
|
1061
|
+
if raw_docs = v.to_a
|
|
1062
|
+
process_raw_docs(raw_docs, limit)
|
|
1063
|
+
end
|
|
1064
|
+
end
|
|
1065
|
+
|
|
1066
|
+
def retrieve_nth_to_last(n)
|
|
1067
|
+
retrieve_nth_to_last_with_limit(n, 1).first
|
|
1068
|
+
end
|
|
1069
|
+
|
|
1070
|
+
def retrieve_nth_to_last_with_limit(n, limit)
|
|
1071
|
+
v = view.sort(inverse_sorting).skip(n).limit(limit || 1)
|
|
1072
|
+
v = v.skip(n) if n > 0
|
|
1073
|
+
raw_docs = v.to_a.reverse
|
|
1074
|
+
process_raw_docs(raw_docs, limit)
|
|
722
1075
|
end
|
|
723
1076
|
end
|
|
724
1077
|
end
|