mongoid 9.0.11 → 9.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -8
- data/README.md +5 -11
- data/Rakefile +35 -38
- data/lib/config/locales/en.yml +11 -0
- data/lib/mongoid/association/accessors.rb +19 -26
- data/lib/mongoid/association/bindable.rb +43 -45
- data/lib/mongoid/association/builders.rb +18 -15
- data/lib/mongoid/association/constrainable.rb +3 -5
- data/lib/mongoid/association/depending.rb +34 -38
- data/lib/mongoid/association/eager.rb +47 -13
- data/lib/mongoid/association/eager_loadable.rb +152 -24
- data/lib/mongoid/association/embedded/batchable.rb +28 -30
- data/lib/mongoid/association/embedded/cyclic.rb +8 -11
- data/lib/mongoid/association/embedded/eager.rb +1 -6
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +6 -9
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -3
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -0
- data/lib/mongoid/association/embedded/embedded_in.rb +25 -22
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +0 -2
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +2 -3
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_many.rb +24 -21
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +0 -2
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +2 -6
- data/lib/mongoid/association/embedded/embeds_one.rb +20 -18
- data/lib/mongoid/association/embedded.rb +0 -1
- data/lib/mongoid/association/macros.rb +3 -7
- data/lib/mongoid/association/many.rb +75 -3
- data/lib/mongoid/association/marshalable.rb +0 -3
- data/lib/mongoid/association/nested/many.rb +18 -13
- data/lib/mongoid/association/nested/nested_buildable.rb +6 -9
- data/lib/mongoid/association/nested/one.rb +4 -7
- data/lib/mongoid/association/nested.rb +1 -3
- data/lib/mongoid/association/one.rb +0 -3
- data/lib/mongoid/association/options.rb +8 -7
- data/lib/mongoid/association/referenced/auto_save.rb +0 -2
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +11 -15
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +23 -5
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +1 -3
- data/lib/mongoid/association/referenced/belongs_to.rb +48 -43
- data/lib/mongoid/association/referenced/counter_cache.rb +5 -10
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +0 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +8 -4
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +0 -3
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +52 -47
- data/lib/mongoid/association/referenced/has_many/binding.rb +0 -2
- data/lib/mongoid/association/referenced/has_many/buildable.rb +11 -5
- data/lib/mongoid/association/referenced/has_many/eager.rb +0 -3
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +107 -38
- data/lib/mongoid/association/referenced/has_many/proxy.rb +10 -6
- data/lib/mongoid/association/referenced/has_many.rb +30 -24
- data/lib/mongoid/association/referenced/has_one/binding.rb +0 -2
- data/lib/mongoid/association/referenced/has_one/buildable.rb +11 -9
- data/lib/mongoid/association/referenced/has_one/eager.rb +0 -3
- data/lib/mongoid/association/referenced/has_one.rb +26 -21
- data/lib/mongoid/association/referenced/syncable.rb +30 -34
- data/lib/mongoid/association/referenced.rb +0 -1
- data/lib/mongoid/association/reflections.rb +0 -3
- data/lib/mongoid/association/relatable.rb +69 -66
- data/lib/mongoid/association.rb +12 -15
- data/lib/mongoid/atomic/modifiers.rb +65 -25
- data/lib/mongoid/atomic/paths/embedded/many.rb +4 -7
- data/lib/mongoid/atomic/paths/embedded/one.rb +2 -4
- data/lib/mongoid/atomic/paths/embedded.rb +3 -6
- data/lib/mongoid/atomic/paths/root.rb +1 -4
- data/lib/mongoid/atomic/paths.rb +2 -3
- data/lib/mongoid/atomic.rb +0 -3
- data/lib/mongoid/attributes/dynamic.rb +6 -7
- data/lib/mongoid/attributes/nested.rb +8 -10
- data/lib/mongoid/attributes/projector.rb +7 -20
- data/lib/mongoid/attributes/readonly.rb +6 -11
- data/lib/mongoid/attributes.rb +18 -34
- data/lib/mongoid/cacheable.rb +24 -6
- data/lib/mongoid/clients/factory.rb +12 -15
- data/lib/mongoid/clients/options.rb +2 -5
- data/lib/mongoid/clients/sessions.rb +50 -60
- data/lib/mongoid/clients/storage_options.rb +1 -4
- data/lib/mongoid/clients/validators/storage.rb +2 -3
- data/lib/mongoid/clients/validators.rb +1 -2
- data/lib/mongoid/clients.rb +8 -11
- data/lib/mongoid/collection_configurable.rb +10 -14
- data/lib/mongoid/composable.rb +30 -34
- data/lib/mongoid/config/defaults.rb +7 -4
- data/lib/mongoid/config/encryption.rb +1 -3
- data/lib/mongoid/config/environment.rb +7 -16
- data/lib/mongoid/config/introspection.rb +14 -16
- data/lib/mongoid/config/options.rb +16 -10
- data/lib/mongoid/config/validators/async_query_executor.rb +3 -6
- data/lib/mongoid/config/validators/client.rb +12 -15
- data/lib/mongoid/config/validators/option.rb +3 -5
- data/lib/mongoid/config/validators.rb +3 -4
- data/lib/mongoid/config.rb +132 -42
- data/lib/mongoid/contextual/aggregable/memory.rb +2 -4
- data/lib/mongoid/contextual/aggregable/mongo.rb +20 -22
- data/lib/mongoid/contextual/aggregable/none.rb +2 -4
- data/lib/mongoid/contextual/aggregable.rb +5 -7
- data/lib/mongoid/contextual/atomic.rb +20 -24
- data/lib/mongoid/contextual/command.rb +0 -3
- data/lib/mongoid/contextual/map_reduce.rb +12 -16
- data/lib/mongoid/contextual/memory.rb +72 -65
- data/lib/mongoid/contextual/mongo/documents_loader.rb +2 -3
- data/lib/mongoid/contextual/mongo.rb +169 -85
- data/lib/mongoid/contextual/none.rb +9 -9
- data/lib/mongoid/contextual/queryable.rb +1 -4
- data/lib/mongoid/contextual.rb +18 -7
- data/lib/mongoid/copyable.rb +7 -9
- data/lib/mongoid/criteria/findable.rb +5 -7
- data/lib/mongoid/criteria/includable.rb +37 -8
- data/lib/mongoid/criteria/inspectable.rb +2 -5
- data/lib/mongoid/criteria/marshalable.rb +4 -8
- data/lib/mongoid/criteria/modifiable.rb +3 -11
- data/lib/mongoid/criteria/options.rb +0 -3
- data/lib/mongoid/criteria/permission.rb +34 -37
- data/lib/mongoid/criteria/queryable/aggregable.rb +9 -10
- data/lib/mongoid/criteria/queryable/expandable.rb +4 -9
- data/lib/mongoid/criteria/queryable/extensions/array.rb +7 -10
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -5
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -4
- data/lib/mongoid/criteria/queryable/extensions/date.rb +2 -6
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +3 -7
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -4
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +20 -11
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +15 -11
- data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -8
- data/lib/mongoid/criteria/queryable/extensions/range.rb +6 -9
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -12
- data/lib/mongoid/criteria/queryable/extensions/set.rb +4 -6
- data/lib/mongoid/criteria/queryable/extensions/string.rb +5 -9
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -7
- data/lib/mongoid/criteria/queryable/extensions/time.rb +2 -6
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +2 -12
- data/lib/mongoid/criteria/queryable/extensions.rb +18 -21
- data/lib/mongoid/criteria/queryable/key.rb +12 -18
- data/lib/mongoid/criteria/queryable/macroable.rb +0 -3
- data/lib/mongoid/criteria/queryable/mergeable.rb +31 -39
- data/lib/mongoid/criteria/queryable/optional.rb +17 -18
- data/lib/mongoid/criteria/queryable/options.rb +20 -9
- data/lib/mongoid/criteria/queryable/pipeline.rb +6 -9
- data/lib/mongoid/criteria/queryable/selectable.rb +131 -193
- data/lib/mongoid/criteria/queryable/selector.rb +20 -29
- data/lib/mongoid/criteria/queryable/smash.rb +1 -6
- data/lib/mongoid/criteria/queryable/storable.rb +20 -39
- data/lib/mongoid/criteria/queryable.rb +25 -15
- data/lib/mongoid/criteria/scopable.rb +5 -11
- data/lib/mongoid/criteria/translator.rb +5 -8
- data/lib/mongoid/criteria.rb +109 -54
- data/lib/mongoid/deprecable.rb +1 -4
- data/lib/mongoid/deprecation.rb +2 -6
- data/lib/mongoid/document.rb +1 -1
- data/lib/mongoid/encryptable.rb +1 -2
- data/lib/mongoid/equality.rb +4 -5
- data/lib/mongoid/errors/ambiguous_relationship.rb +2 -5
- data/lib/mongoid/errors/attribute_not_loaded.rb +1 -4
- data/lib/mongoid/errors/callback.rb +1 -4
- data/lib/mongoid/errors/create_collection_failure.rb +8 -11
- data/lib/mongoid/errors/criteria_argument_required.rb +2 -5
- data/lib/mongoid/errors/delete_restriction.rb +1 -4
- data/lib/mongoid/errors/document_not_destroyed.rb +1 -4
- data/lib/mongoid/errors/document_not_found.rb +16 -21
- data/lib/mongoid/errors/drop_collection_failure.rb +7 -10
- data/lib/mongoid/errors/empty_config_file.rb +1 -4
- data/lib/mongoid/errors/immutable_attribute.rb +1 -4
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -4
- data/lib/mongoid/errors/invalid_async_query_executor.rb +2 -5
- data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +2 -5
- data/lib/mongoid/errors/invalid_collection.rb +1 -3
- data/lib/mongoid/errors/invalid_config_file.rb +1 -4
- data/lib/mongoid/errors/invalid_config_option.rb +2 -5
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +6 -10
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +2 -4
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +1 -4
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +5 -9
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +1 -4
- data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +1 -4
- data/lib/mongoid/errors/invalid_expression_operator.rb +3 -7
- data/lib/mongoid/errors/invalid_field.rb +2 -5
- data/lib/mongoid/errors/invalid_field_operator.rb +5 -9
- data/lib/mongoid/errors/invalid_field_option.rb +2 -5
- data/lib/mongoid/errors/invalid_field_type.rb +1 -4
- data/lib/mongoid/errors/invalid_find.rb +1 -4
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +1 -4
- data/lib/mongoid/errors/invalid_includes.rb +3 -6
- data/lib/mongoid/errors/invalid_index.rb +1 -4
- data/lib/mongoid/errors/invalid_options.rb +1 -4
- data/lib/mongoid/errors/invalid_path.rb +1 -4
- data/lib/mongoid/errors/invalid_persistence_option.rb +4 -7
- data/lib/mongoid/errors/invalid_query.rb +6 -11
- data/lib/mongoid/errors/invalid_relation.rb +10 -13
- data/lib/mongoid/errors/invalid_relation_option.rb +4 -7
- data/lib/mongoid/errors/invalid_scope.rb +1 -4
- data/lib/mongoid/errors/invalid_session_nesting.rb +0 -3
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +2 -4
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -4
- data/lib/mongoid/errors/invalid_time.rb +1 -4
- data/lib/mongoid/errors/invalid_transaction_nesting.rb +0 -3
- data/lib/mongoid/errors/inverse_not_found.rb +1 -4
- data/lib/mongoid/errors/mixed_client_configuration.rb +1 -4
- data/lib/mongoid/errors/mixed_relations.rb +1 -3
- data/lib/mongoid/errors/mongoid_error.rb +7 -11
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -4
- data/lib/mongoid/errors/no_client_config.rb +1 -4
- data/lib/mongoid/errors/no_client_database.rb +1 -4
- data/lib/mongoid/errors/no_client_hosts.rb +1 -4
- data/lib/mongoid/errors/no_clients_config.rb +1 -4
- data/lib/mongoid/errors/no_default_client.rb +1 -4
- data/lib/mongoid/errors/no_environment.rb +1 -4
- data/lib/mongoid/errors/no_map_reduce_output.rb +1 -4
- data/lib/mongoid/errors/no_metadata.rb +1 -4
- data/lib/mongoid/errors/no_parent.rb +1 -4
- data/lib/mongoid/errors/readonly_attribute.rb +1 -4
- data/lib/mongoid/errors/readonly_document.rb +1 -4
- data/lib/mongoid/errors/rollback.rb +0 -2
- data/lib/mongoid/errors/scope_overwrite.rb +2 -4
- data/lib/mongoid/errors/sessions_not_supported.rb +0 -3
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -3
- data/lib/mongoid/errors/transaction_error.rb +0 -3
- data/lib/mongoid/errors/transactions_not_supported.rb +0 -3
- data/lib/mongoid/errors/unknown_attribute.rb +1 -4
- data/lib/mongoid/errors/unknown_model.rb +1 -4
- data/lib/mongoid/errors/unregistered_class.rb +1 -1
- data/lib/mongoid/errors/unsaved_document.rb +1 -3
- data/lib/mongoid/errors/unsupported_isolation_level.rb +22 -0
- data/lib/mongoid/errors/unsupported_javascript.rb +1 -4
- data/lib/mongoid/errors/validations.rb +3 -5
- data/lib/mongoid/errors.rb +72 -72
- data/lib/mongoid/evolvable.rb +0 -3
- data/lib/mongoid/extensions/array.rb +5 -7
- data/lib/mongoid/extensions/big_decimal.rb +6 -7
- data/lib/mongoid/extensions/binary.rb +3 -6
- data/lib/mongoid/extensions/boolean.rb +4 -7
- data/lib/mongoid/extensions/bson_document.rb +28 -0
- data/lib/mongoid/extensions/date.rb +10 -14
- data/lib/mongoid/extensions/date_time.rb +2 -6
- data/lib/mongoid/extensions/decimal128.rb +1 -5
- data/lib/mongoid/extensions/false_class.rb +3 -5
- data/lib/mongoid/extensions/float.rb +5 -10
- data/lib/mongoid/extensions/hash.rb +5 -10
- data/lib/mongoid/extensions/integer.rb +5 -10
- data/lib/mongoid/extensions/module.rb +1 -4
- data/lib/mongoid/extensions/nil_class.rb +0 -1
- data/lib/mongoid/extensions/object.rb +9 -14
- data/lib/mongoid/extensions/object_id.rb +2 -6
- data/lib/mongoid/extensions/range.rb +14 -15
- data/lib/mongoid/extensions/raw_value.rb +0 -3
- data/lib/mongoid/extensions/regexp.rb +3 -6
- data/lib/mongoid/extensions/set.rb +3 -4
- data/lib/mongoid/extensions/string.rb +8 -12
- data/lib/mongoid/extensions/symbol.rb +3 -7
- data/lib/mongoid/extensions/time.rb +24 -26
- data/lib/mongoid/extensions/time_with_zone.rb +4 -7
- data/lib/mongoid/extensions/true_class.rb +3 -5
- data/lib/mongoid/extensions.rb +26 -26
- data/lib/mongoid/factory.rb +5 -9
- data/lib/mongoid/fields/encrypted.rb +0 -1
- data/lib/mongoid/fields/foreign_key.rb +9 -10
- data/lib/mongoid/fields/localized.rb +12 -12
- data/lib/mongoid/fields/standard.rb +5 -7
- data/lib/mongoid/fields/validators/macro.rb +23 -34
- data/lib/mongoid/fields/validators.rb +1 -2
- data/lib/mongoid/fields.rb +151 -58
- data/lib/mongoid/findable.rb +82 -53
- data/lib/mongoid/indexable/specification.rb +20 -6
- data/lib/mongoid/indexable/validators/options.rb +33 -40
- data/lib/mongoid/indexable.rb +26 -25
- data/lib/mongoid/inspectable.rb +4 -7
- data/lib/mongoid/interceptable.rb +41 -40
- data/lib/mongoid/loadable.rb +17 -18
- data/lib/mongoid/loggable.rb +4 -8
- data/lib/mongoid/matchable.rb +0 -2
- data/lib/mongoid/matcher/all.rb +2 -5
- data/lib/mongoid/matcher/and.rb +0 -3
- data/lib/mongoid/matcher/bits.rb +13 -8
- data/lib/mongoid/matcher/bits_all_clear.rb +1 -3
- data/lib/mongoid/matcher/bits_all_set.rb +1 -3
- data/lib/mongoid/matcher/bits_any_clear.rb +1 -3
- data/lib/mongoid/matcher/bits_any_set.rb +1 -3
- data/lib/mongoid/matcher/elem_match.rb +13 -15
- data/lib/mongoid/matcher/elem_match_expression.rb +0 -3
- data/lib/mongoid/matcher/eq.rb +0 -3
- data/lib/mongoid/matcher/eq_impl.rb +12 -17
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +4 -7
- data/lib/mongoid/matcher/exists.rb +1 -4
- data/lib/mongoid/matcher/expression.rb +5 -10
- data/lib/mongoid/matcher/expression_operator.rb +1 -3
- data/lib/mongoid/matcher/field_expression.rb +10 -13
- data/lib/mongoid/matcher/field_operator.rb +4 -6
- data/lib/mongoid/matcher/gt.rb +0 -3
- data/lib/mongoid/matcher/gte.rb +0 -3
- data/lib/mongoid/matcher/in.rb +9 -12
- data/lib/mongoid/matcher/lt.rb +0 -3
- data/lib/mongoid/matcher/lte.rb +0 -3
- data/lib/mongoid/matcher/mod.rb +4 -8
- data/lib/mongoid/matcher/ne.rb +0 -3
- data/lib/mongoid/matcher/nin.rb +0 -3
- data/lib/mongoid/matcher/nor.rb +1 -6
- data/lib/mongoid/matcher/not.rb +0 -3
- data/lib/mongoid/matcher/or.rb +0 -3
- data/lib/mongoid/matcher/regex.rb +11 -14
- data/lib/mongoid/matcher/size.rb +2 -5
- data/lib/mongoid/matcher/type.rb +32 -37
- data/lib/mongoid/matcher.rb +7 -15
- data/lib/mongoid/model_resolver.rb +1 -0
- data/lib/mongoid/persistable/creatable.rb +23 -7
- data/lib/mongoid/persistable/deletable.rb +6 -7
- data/lib/mongoid/persistable/destroyable.rb +2 -6
- data/lib/mongoid/persistable/incrementable.rb +1 -3
- data/lib/mongoid/persistable/logical.rb +3 -5
- data/lib/mongoid/persistable/maxable.rb +2 -4
- data/lib/mongoid/persistable/minable.rb +2 -4
- data/lib/mongoid/persistable/multipliable.rb +1 -3
- data/lib/mongoid/persistable/poppable.rb +2 -4
- data/lib/mongoid/persistable/pullable.rb +3 -5
- data/lib/mongoid/persistable/pushable.rb +5 -7
- data/lib/mongoid/persistable/renamable.rb +1 -3
- data/lib/mongoid/persistable/savable.rb +0 -3
- data/lib/mongoid/persistable/settable.rb +4 -13
- data/lib/mongoid/persistable/unsettable.rb +1 -3
- data/lib/mongoid/persistable/updatable.rb +16 -24
- data/lib/mongoid/persistable/upsertable.rb +8 -10
- data/lib/mongoid/persistable.rb +28 -27
- data/lib/mongoid/persistence_context.rb +34 -41
- data/lib/mongoid/pluckable.rb +0 -2
- data/lib/mongoid/positional.rb +5 -11
- data/lib/mongoid/railtie.rb +16 -22
- data/lib/mongoid/railties/console_sandbox.rb +6 -8
- data/lib/mongoid/railties/controller_runtime.rb +7 -11
- data/lib/mongoid/railties/database.rake +42 -44
- data/lib/mongoid/scopable.rb +23 -31
- data/lib/mongoid/search_indexable.rb +330 -0
- data/lib/mongoid/selectable.rb +1 -3
- data/lib/mongoid/serializable.rb +6 -8
- data/lib/mongoid/shardable.rb +8 -17
- data/lib/mongoid/stateful.rb +5 -10
- data/lib/mongoid/stringified_symbol.rb +5 -9
- data/lib/mongoid/tasks/database.rake +31 -32
- data/lib/mongoid/tasks/database.rb +28 -30
- data/lib/mongoid/tasks/encryption.rb +10 -15
- data/lib/mongoid/threaded/lifecycle.rb +6 -9
- data/lib/mongoid/threaded.rb +132 -32
- data/lib/mongoid/timestamps/created/short.rb +2 -3
- data/lib/mongoid/timestamps/created.rb +1 -2
- data/lib/mongoid/timestamps/short.rb +0 -1
- data/lib/mongoid/timestamps/timeless.rb +8 -13
- data/lib/mongoid/timestamps/updated/short.rb +2 -3
- data/lib/mongoid/timestamps/updated.rb +2 -5
- data/lib/mongoid/timestamps.rb +4 -6
- data/lib/mongoid/touchable.rb +19 -11
- data/lib/mongoid/traversable.rb +3 -2
- data/lib/mongoid/validatable/associated.rb +1 -5
- data/lib/mongoid/validatable/format.rb +0 -2
- data/lib/mongoid/validatable/length.rb +0 -2
- data/lib/mongoid/validatable/localizable.rb +0 -3
- data/lib/mongoid/validatable/macros.rb +0 -2
- data/lib/mongoid/validatable/numericality.rb +24 -3
- data/lib/mongoid/validatable/presence.rb +8 -10
- data/lib/mongoid/validatable/queryable.rb +0 -3
- data/lib/mongoid/validatable/uniqueness.rb +12 -14
- data/lib/mongoid/validatable.rb +15 -20
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +10 -11
- data/lib/mongoid.rb +30 -34
- data/lib/rails/generators/mongoid/config/config_generator.rb +2 -4
- data/lib/rails/generators/mongoid/config/templates/mongoid.rb +4 -5
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +2 -2
- data/lib/rails/generators/mongoid/model/model_generator.rb +5 -8
- data/lib/rails/generators/mongoid_generator.rb +6 -10
- data/lib/rails/mongoid.rb +1 -3
- data/spec/integration/active_job_spec.rb +1 -2
- data/spec/integration/app_spec.rb +142 -178
- data/spec/integration/associations/belongs_to_spec.rb +30 -28
- data/spec/integration/associations/embedded_dirty_spec.rb +0 -1
- data/spec/integration/associations/embedded_spec.rb +41 -43
- data/spec/integration/associations/embeds_many_spec.rb +46 -29
- data/spec/integration/associations/embeds_one_spec.rb +2 -1
- data/spec/integration/associations/foreign_key_spec.rb +10 -11
- data/spec/integration/associations/foreign_key_spec_models.rb +8 -9
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +16 -13
- data/spec/integration/associations/has_many_spec.rb +17 -18
- data/spec/integration/associations/has_one_spec.rb +42 -45
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +36 -39
- data/spec/integration/associations/reverse_population_spec.rb +4 -5
- data/spec/integration/associations/reverse_population_spec_models.rb +0 -1
- data/spec/integration/associations/scope_option_spec.rb +18 -20
- data/spec/integration/atomic/modifiers_spec.rb +72 -52
- data/spec/integration/bson_regexp_raw_spec.rb +2 -3
- data/spec/integration/caching_spec.rb +68 -0
- data/spec/integration/callbacks_models.rb +11 -9
- data/spec/integration/callbacks_spec.rb +78 -80
- data/spec/integration/contextual/empty_spec.rb +19 -20
- data/spec/integration/criteria/alias_query_spec.rb +12 -19
- data/spec/integration/criteria/date_field_spec.rb +1 -2
- data/spec/integration/criteria/default_scope_spec.rb +23 -18
- data/spec/integration/criteria/logical_spec.rb +18 -19
- data/spec/integration/criteria/range_spec.rb +77 -86
- data/spec/integration/criteria/raw_value_spec.rb +122 -109
- data/spec/integration/criteria/time_with_zone_spec.rb +33 -24
- data/spec/integration/discriminator_key_spec.rb +85 -85
- data/spec/integration/discriminator_value_spec.rb +70 -73
- data/spec/integration/document_spec.rb +9 -10
- data/spec/integration/dots_and_dollars_spec.rb +104 -119
- data/spec/integration/encryption_spec.rb +8 -11
- data/spec/integration/i18n_fallbacks_spec.rb +7 -8
- data/spec/integration/isolation_state_spec.rb +241 -0
- data/spec/integration/matcher_examples_spec.rb +145 -168
- data/spec/integration/matcher_operator_data/in.yml +6 -6
- data/spec/integration/matcher_operator_spec.rb +16 -26
- data/spec/integration/matcher_spec.rb +31 -32
- data/spec/integration/persistence/collection_options_spec.rb +0 -2
- data/spec/integration/persistence/range_field_spec.rb +24 -2
- data/spec/integration/server_query_spec.rb +43 -37
- data/spec/integration/shardable_spec.rb +10 -11
- data/spec/integration/stringified_symbol_field_spec.rb +28 -43
- data/spec/lite_spec_helper.rb +11 -12
- data/spec/mongoid/association/accessors_spec.rb +197 -285
- data/spec/mongoid/association/auto_save_spec.rb +62 -93
- data/spec/mongoid/association/builders_spec.rb +121 -74
- data/spec/mongoid/association/constrainable_spec.rb +9 -22
- data/spec/mongoid/association/counter_cache_spec.rb +71 -104
- data/spec/mongoid/association/depending_spec.rb +166 -208
- data/spec/mongoid/association/eager_spec.rb +416 -80
- data/spec/mongoid/association/embedded/cyclic_spec.rb +36 -48
- data/spec/mongoid/association/embedded/dirty_spec.rb +15 -20
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +36 -54
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +8 -15
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +135 -175
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +25 -127
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +9 -14
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +38 -51
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +1151 -1340
- data/spec/mongoid/association/embedded/embeds_many_models.rb +17 -17
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +11 -11
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +25 -138
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +15 -23
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +18 -26
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +204 -273
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_one_models.rb +0 -1
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +5 -6
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -143
- data/spec/mongoid/association/macros_spec.rb +213 -300
- data/spec/mongoid/association/nested/many_spec.rb +51 -73
- data/spec/mongoid/association/nested/one_spec.rb +56 -80
- data/spec/mongoid/association/options_spec.rb +187 -310
- data/spec/mongoid/association/polymorphic_spec.rb +35 -53
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +55 -76
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +36 -41
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +81 -101
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +258 -345
- data/spec/mongoid/association/referenced/belongs_to_models.rb +4 -3
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +3 -4
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +91 -294
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +42 -56
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +41 -32
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +36 -42
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +8 -9
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +771 -975
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +9 -9
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +5 -6
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +59 -177
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +29 -43
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +53 -53
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +104 -67
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +431 -675
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -2
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +173 -11
- data/spec/mongoid/association/referenced/has_many_models.rb +1 -2
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +3 -4
- data/spec/mongoid/association/referenced/has_many_spec.rb +44 -188
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +26 -38
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +28 -29
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +29 -42
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +270 -332
- data/spec/mongoid/association/referenced/has_one_models.rb +1 -2
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +3 -4
- data/spec/mongoid/association/referenced/has_one_spec.rb +40 -188
- data/spec/mongoid/association/reflections_spec.rb +14 -24
- data/spec/mongoid/association/syncable_spec.rb +102 -125
- data/spec/mongoid/association_spec.rb +47 -70
- data/spec/mongoid/atomic/modifiers_spec.rb +184 -197
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +39 -52
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +35 -49
- data/spec/mongoid/atomic/paths/root_spec.rb +9 -15
- data/spec/mongoid/atomic/paths_spec.rb +81 -117
- data/spec/mongoid/atomic_spec.rb +156 -171
- data/spec/mongoid/attributes/dynamic_spec.rb +5 -6
- data/spec/mongoid/attributes/nested_spec.rb +1219 -1692
- data/spec/mongoid/attributes/nested_spec_models.rb +8 -9
- data/spec/mongoid/attributes/projector_spec.rb +2 -6
- data/spec/mongoid/attributes/readonly_spec.rb +73 -97
- data/spec/mongoid/attributes_spec.rb +669 -826
- data/spec/mongoid/cacheable_spec.rb +74 -44
- data/spec/mongoid/changeable_spec.rb +591 -733
- data/spec/mongoid/clients/factory_spec.rb +122 -154
- data/spec/mongoid/clients/options_spec.rb +40 -59
- data/spec/mongoid/clients/sessions_spec.rb +25 -44
- data/spec/mongoid/clients/transactions_spec.rb +33 -50
- data/spec/mongoid/clients/transactions_spec_models.rb +3 -4
- data/spec/mongoid/clients_spec.rb +265 -355
- data/spec/mongoid/collection_configurable_spec.rb +9 -12
- data/spec/mongoid/composable_spec.rb +2 -9
- data/spec/mongoid/config/defaults_spec.rb +24 -31
- data/spec/mongoid/config/encryption_spec.rb +54 -57
- data/spec/mongoid/config/environment_spec.rb +30 -40
- data/spec/mongoid/config/introspection_spec.rb +42 -37
- data/spec/mongoid/config/options_spec.rb +14 -21
- data/spec/mongoid/config_spec.rb +145 -195
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +98 -135
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +4 -7
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +149 -187
- data/spec/mongoid/contextual/aggregable/none_spec.rb +14 -16
- data/spec/mongoid/contextual/atomic_spec.rb +223 -271
- data/spec/mongoid/contextual/map_reduce_spec.rb +110 -138
- data/spec/mongoid/contextual/memory_spec.rb +706 -854
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +12 -13
- data/spec/mongoid/contextual/mongo_spec.rb +1008 -1213
- data/spec/mongoid/contextual/none_spec.rb +54 -59
- data/spec/mongoid/contextual/short_circuit_spec.rb +139 -0
- data/spec/mongoid/copyable_spec.rb +254 -300
- data/spec/mongoid/copyable_spec_models.rb +0 -1
- data/spec/mongoid/criteria/findable_spec.rb +322 -387
- data/spec/mongoid/criteria/includable_spec.rb +421 -372
- data/spec/mongoid/criteria/includable_spec_models.rb +16 -7
- data/spec/mongoid/criteria/inspectable_spec.rb +11 -14
- data/spec/mongoid/criteria/marshalable_spec.rb +11 -14
- data/spec/mongoid/criteria/modifiable_spec.rb +366 -512
- data/spec/mongoid/criteria/options_spec.rb +2 -7
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +112 -141
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +8 -11
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +127 -184
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +123 -60
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +84 -117
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +44 -65
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +86 -108
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +94 -33
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +103 -138
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +95 -34
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +25 -38
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +26 -28
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +32 -54
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +136 -130
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +16 -24
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +15 -24
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +12 -19
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +46 -63
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +28 -42
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +73 -96
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +71 -92
- data/spec/mongoid/criteria/queryable/key_spec.rb +32 -36
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +44 -49
- data/spec/mongoid/criteria/queryable/optional_spec.rb +373 -486
- data/spec/mongoid/criteria/queryable/options_spec.rb +172 -123
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +65 -87
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +41 -53
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +576 -680
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +7 -11
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +807 -998
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +154 -191
- data/spec/mongoid/criteria/queryable/selector_spec.rb +294 -390
- data/spec/mongoid/criteria/queryable/smash_spec.rb +6 -11
- data/spec/mongoid/criteria/queryable/storable_spec.rb +54 -81
- data/spec/mongoid/criteria/queryable_mql_spec.rb +92 -0
- data/spec/mongoid/criteria/scopable_spec.rb +102 -138
- data/spec/mongoid/criteria/translator_spec.rb +59 -60
- data/spec/mongoid/criteria_projection_spec.rb +81 -99
- data/spec/mongoid/criteria_spec.rb +935 -950
- data/spec/mongoid/document_fields_spec.rb +28 -30
- data/spec/mongoid/document_persistence_context_spec.rb +13 -15
- data/spec/mongoid/document_query_spec.rb +9 -12
- data/spec/mongoid/document_spec.rb +317 -409
- data/spec/mongoid/equality_spec.rb +69 -102
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +8 -11
- data/spec/mongoid/errors/attribute_not_loaded_spec.rb +7 -10
- data/spec/mongoid/errors/callback_spec.rb +8 -11
- data/spec/mongoid/errors/delete_restriction_spec.rb +5 -8
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +7 -10
- data/spec/mongoid/errors/document_not_found_spec.rb +51 -61
- data/spec/mongoid/errors/invalid_collection_spec.rb +9 -13
- data/spec/mongoid/errors/invalid_config_file_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_config_option_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_field_option_spec.rb +7 -10
- data/spec/mongoid/errors/invalid_field_spec.rb +10 -11
- data/spec/mongoid/errors/invalid_field_type_spec.rb +9 -12
- data/spec/mongoid/errors/invalid_find_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_includes_spec.rb +9 -13
- data/spec/mongoid/errors/invalid_index_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_options_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_path_spec.rb +7 -10
- data/spec/mongoid/errors/invalid_relation_spec.rb +15 -16
- data/spec/mongoid/errors/invalid_scope_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -6
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +8 -11
- data/spec/mongoid/errors/invalid_time_spec.rb +8 -11
- data/spec/mongoid/errors/inverse_not_found_spec.rb +9 -12
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +9 -12
- data/spec/mongoid/errors/mixed_relations_spec.rb +8 -11
- data/spec/mongoid/errors/mongoid_error_spec.rb +21 -24
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +6 -9
- data/spec/mongoid/errors/no_client_config_spec.rb +7 -10
- data/spec/mongoid/errors/no_client_database_spec.rb +9 -12
- data/spec/mongoid/errors/no_client_hosts_spec.rb +9 -12
- data/spec/mongoid/errors/no_clients_config_spec.rb +7 -10
- data/spec/mongoid/errors/no_environment_spec.rb +8 -11
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +8 -11
- data/spec/mongoid/errors/no_metadata_spec.rb +7 -10
- data/spec/mongoid/errors/no_parent_spec.rb +7 -10
- data/spec/mongoid/errors/readonly_attribute_spec.rb +7 -10
- data/spec/mongoid/errors/readonly_document_spec.rb +6 -9
- data/spec/mongoid/errors/scope_overwrite_spec.rb +9 -12
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +9 -12
- data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -8
- data/spec/mongoid/errors/unsaved_document_spec.rb +8 -11
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +9 -12
- data/spec/mongoid/errors/validations_spec.rb +11 -14
- data/spec/mongoid/extensions/array_spec.rb +70 -92
- data/spec/mongoid/extensions/big_decimal_spec.rb +233 -313
- data/spec/mongoid/extensions/binary_spec.rb +21 -32
- data/spec/mongoid/extensions/boolean_spec.rb +52 -75
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +43 -54
- data/spec/mongoid/extensions/date_spec.rb +26 -38
- data/spec/mongoid/extensions/date_time_spec.rb +22 -32
- data/spec/mongoid/extensions/decimal128_spec.rb +12 -18
- data/spec/mongoid/extensions/false_class_spec.rb +10 -17
- data/spec/mongoid/extensions/float_spec.rb +40 -61
- data/spec/mongoid/extensions/hash_spec.rb +46 -64
- data/spec/mongoid/extensions/integer_spec.rb +40 -61
- data/spec/mongoid/extensions/module_spec.rb +13 -18
- data/spec/mongoid/extensions/nil_class_spec.rb +2 -5
- data/spec/mongoid/extensions/object_id_spec.rb +159 -247
- data/spec/mongoid/extensions/object_spec.rb +31 -47
- data/spec/mongoid/extensions/range_spec.rb +112 -115
- data/spec/mongoid/extensions/raw_value_spec.rb +10 -12
- data/spec/mongoid/extensions/regexp_spec.rb +23 -36
- data/spec/mongoid/extensions/set_spec.rb +38 -49
- data/spec/mongoid/extensions/string_spec.rb +118 -167
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +29 -43
- data/spec/mongoid/extensions/symbol_spec.rb +12 -20
- data/spec/mongoid/extensions/time_spec.rb +160 -202
- data/spec/mongoid/extensions/time_with_zone_spec.rb +79 -105
- data/spec/mongoid/extensions/true_class_spec.rb +10 -17
- data/spec/mongoid/factory_spec.rb +125 -148
- data/spec/mongoid/fields/foreign_key_spec.rb +124 -169
- data/spec/mongoid/fields/localized_spec.rb +140 -185
- data/spec/mongoid/fields/standard_spec.rb +43 -59
- data/spec/mongoid/fields_spec.rb +751 -620
- data/spec/mongoid/findable_spec.rb +260 -228
- data/spec/mongoid/indexable/specification_spec.rb +42 -58
- data/spec/mongoid/indexable_spec.rb +260 -264
- data/spec/mongoid/inspectable_spec.rb +45 -55
- data/spec/mongoid/interceptable_spec.rb +784 -922
- data/spec/mongoid/interceptable_spec_models.rb +35 -35
- data/spec/mongoid/loading_spec.rb +47 -43
- data/spec/mongoid/loggable_spec.rb +3 -6
- data/spec/mongoid/matcher/extract_attribute_spec.rb +2 -6
- data/spec/mongoid/mongoizable_spec.rb +81 -90
- data/spec/mongoid/monkey_patches_spec.rb +4 -0
- data/spec/mongoid/persistable/creatable_spec.rb +181 -220
- data/spec/mongoid/persistable/deletable_spec.rb +139 -179
- data/spec/mongoid/persistable/destroyable_spec.rb +135 -164
- data/spec/mongoid/persistable/incrementable_spec.rb +65 -84
- data/spec/mongoid/persistable/logical_spec.rb +48 -61
- data/spec/mongoid/persistable/maxable_spec.rb +45 -44
- data/spec/mongoid/persistable/minable_spec.rb +45 -44
- data/spec/mongoid/persistable/multipliable_spec.rb +54 -69
- data/spec/mongoid/persistable/poppable_spec.rb +47 -60
- data/spec/mongoid/persistable/pullable_spec.rb +79 -103
- data/spec/mongoid/persistable/pushable_spec.rb +106 -131
- data/spec/mongoid/persistable/renamable_spec.rb +52 -65
- data/spec/mongoid/persistable/savable_spec.rb +152 -189
- data/spec/mongoid/persistable/settable_spec.rb +121 -145
- data/spec/mongoid/persistable/unsettable_spec.rb +56 -73
- data/spec/mongoid/persistable/updatable_spec.rb +185 -232
- data/spec/mongoid/persistable/upsertable_spec.rb +66 -77
- data/spec/mongoid/persistable_spec.rb +132 -139
- data/spec/mongoid/persistence_context_spec.rb +31 -89
- data/spec/mongoid/positional_spec.rb +67 -79
- data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +0 -3
- data/spec/mongoid/railties/console_sandbox_spec.rb +0 -1
- data/spec/mongoid/relations/proxy_spec.rb +0 -1
- data/spec/mongoid/reloadable_spec.rb +250 -145
- data/spec/mongoid/scopable_spec.rb +319 -398
- data/spec/mongoid/search_indexable_spec.rb +446 -41
- data/spec/mongoid/selectable_spec.rb +36 -51
- data/spec/mongoid/serializable_spec.rb +269 -312
- data/spec/mongoid/shardable_models.rb +5 -5
- data/spec/mongoid/shardable_spec.rb +44 -46
- data/spec/mongoid/stateful_spec.rb +55 -75
- data/spec/mongoid/tasks/database_rake_spec.rb +138 -141
- data/spec/mongoid/tasks/database_spec.rb +80 -80
- data/spec/mongoid/tasks/encryption_spec.rb +22 -20
- data/spec/mongoid/threaded_spec.rb +57 -83
- data/spec/mongoid/timestamps/created/short_spec.rb +12 -16
- data/spec/mongoid/timestamps/created_spec.rb +16 -20
- data/spec/mongoid/timestamps/timeless_spec.rb +31 -43
- data/spec/mongoid/timestamps/updated/short_spec.rb +21 -28
- data/spec/mongoid/timestamps/updated_spec.rb +18 -25
- data/spec/mongoid/timestamps_spec.rb +171 -188
- data/spec/mongoid/timestamps_spec_models.rb +12 -13
- data/spec/mongoid/touchable_spec.rb +330 -294
- data/spec/mongoid/touchable_spec_models.rb +35 -37
- data/spec/mongoid/traversable_spec.rb +435 -471
- data/spec/mongoid/validatable/associated_spec.rb +42 -60
- data/spec/mongoid/validatable/format_spec.rb +24 -34
- data/spec/mongoid/validatable/length_spec.rb +62 -86
- data/spec/mongoid/validatable/numericality_spec.rb +114 -23
- data/spec/mongoid/validatable/presence_spec.rb +149 -203
- data/spec/mongoid/validatable/uniqueness_spec.rb +632 -830
- data/spec/mongoid/validatable_spec.rb +71 -103
- data/spec/mongoid/warnings_spec.rb +5 -9
- data/spec/mongoid_spec.rb +25 -41
- data/spec/rails/controller_extension/controller_runtime_spec.rb +45 -49
- data/spec/rails/mongoid_spec.rb +15 -15
- data/spec/shared/lib/mrss/cluster_config.rb +5 -40
- data/spec/shared/lib/mrss/constraints.rb +7 -46
- data/spec/shared/lib/mrss/docker_runner.rb +10 -21
- data/spec/shared/lib/mrss/eg_config_utils.rb +0 -31
- data/spec/shared/lib/mrss/release/candidate.rb +18 -12
- data/spec/shared/lib/mrss/server_version_registry.rb +1 -5
- data/spec/shared/share/Dockerfile.erb +6 -8
- data/spec/shared/shlib/server.sh +0 -50
- data/spec/shared/shlib/set_env.sh +4 -10
- data/spec/spec_helper.rb +54 -31
- data/spec/support/authorization.rb +0 -1
- data/spec/support/client_registry.rb +1 -2
- data/spec/support/constraints.rb +8 -25
- data/spec/support/crypt/models.rb +7 -8
- data/spec/support/crypt.rb +6 -9
- data/spec/support/expectations.rb +21 -7
- data/spec/support/feature_sandbox.rb +1 -4
- data/spec/support/helpers.rb +0 -1
- data/spec/support/immutable_ids.rb +20 -21
- data/spec/support/macros.rb +1 -3
- data/spec/support/models/account.rb +4 -5
- data/spec/support/models/acolyte.rb +5 -5
- data/spec/support/models/actor.rb +3 -3
- data/spec/support/models/actress.rb +0 -1
- data/spec/support/models/address.rb +11 -11
- data/spec/support/models/address_component.rb +1 -1
- data/spec/support/models/address_number.rb +1 -1
- data/spec/support/models/agency.rb +1 -1
- data/spec/support/models/agent.rb +1 -1
- data/spec/support/models/album.rb +1 -2
- data/spec/support/models/alert.rb +1 -1
- data/spec/support/models/animal.rb +4 -5
- data/spec/support/models/answer.rb +1 -1
- data/spec/support/models/appointment.rb +2 -2
- data/spec/support/models/armrest.rb +0 -1
- data/spec/support/models/array_field.rb +0 -1
- data/spec/support/models/article.rb +0 -1
- data/spec/support/models/artist.rb +16 -12
- data/spec/support/models/artwork.rb +1 -1
- data/spec/support/models/audible_sound.rb +0 -1
- data/spec/support/models/audio.rb +2 -2
- data/spec/support/models/augmentation.rb +1 -2
- data/spec/support/models/author.rb +1 -1
- data/spec/support/models/baby.rb +1 -1
- data/spec/support/models/band.rb +0 -1
- data/spec/support/models/bar.rb +2 -2
- data/spec/support/models/basic.rb +0 -1
- data/spec/support/models/bed.rb +0 -1
- data/spec/support/models/big_palette.rb +0 -1
- data/spec/support/models/birthday.rb +3 -5
- data/spec/support/models/bolt.rb +0 -1
- data/spec/support/models/bomb.rb +1 -1
- data/spec/support/models/book.rb +1 -1
- data/spec/support/models/breed.rb +1 -1
- data/spec/support/models/browser.rb +1 -2
- data/spec/support/models/building.rb +0 -1
- data/spec/support/models/building_address.rb +1 -1
- data/spec/support/models/bus.rb +1 -1
- data/spec/support/models/business.rb +2 -2
- data/spec/support/models/callback_test.rb +1 -1
- data/spec/support/models/canvas.rb +5 -6
- data/spec/support/models/car.rb +0 -1
- data/spec/support/models/cat.rb +0 -2
- data/spec/support/models/catalog.rb +0 -1
- data/spec/support/models/category.rb +1 -1
- data/spec/support/models/child.rb +1 -1
- data/spec/support/models/child_doc.rb +5 -6
- data/spec/support/models/church.rb +1 -1
- data/spec/support/models/circle.rb +0 -1
- data/spec/support/models/circuit.rb +2 -2
- data/spec/support/models/circus.rb +0 -1
- data/spec/support/models/code.rb +2 -1
- data/spec/support/models/coding/pull_request.rb +0 -1
- data/spec/support/models/coding.rb +0 -1
- data/spec/support/models/comment.rb +0 -1
- data/spec/support/models/company.rb +0 -1
- data/spec/support/models/consumption_period.rb +0 -1
- data/spec/support/models/contextable_item.rb +1 -1
- data/spec/support/models/contractor.rb +1 -1
- data/spec/support/models/cookie.rb +0 -1
- data/spec/support/models/country_code.rb +2 -3
- data/spec/support/models/courier_job.rb +2 -2
- data/spec/support/models/cover.rb +0 -1
- data/spec/support/models/crate.rb +0 -1
- data/spec/support/models/customer.rb +0 -1
- data/spec/support/models/customer_address.rb +0 -1
- data/spec/support/models/deed.rb +1 -1
- data/spec/support/models/definition.rb +1 -1
- data/spec/support/models/delegating_patient.rb +0 -1
- data/spec/support/models/description.rb +0 -1
- data/spec/support/models/dictionary.rb +1 -1
- data/spec/support/models/division.rb +2 -2
- data/spec/support/models/doctor.rb +0 -1
- data/spec/support/models/dog.rb +2 -2
- data/spec/support/models/dokument.rb +1 -1
- data/spec/support/models/draft.rb +0 -1
- data/spec/support/models/dragon.rb +1 -1
- data/spec/support/models/driver.rb +2 -2
- data/spec/support/models/drug.rb +1 -1
- data/spec/support/models/dungeon.rb +1 -1
- data/spec/support/models/edit.rb +1 -1
- data/spec/support/models/email.rb +1 -1
- data/spec/support/models/employer.rb +1 -2
- data/spec/support/models/entry.rb +1 -1
- data/spec/support/models/eraser.rb +0 -1
- data/spec/support/models/even.rb +1 -1
- data/spec/support/models/event.rb +3 -4
- data/spec/support/models/exhibition.rb +1 -1
- data/spec/support/models/exhibitor.rb +1 -1
- data/spec/support/models/explosion.rb +1 -1
- data/spec/support/models/eye.rb +0 -1
- data/spec/support/models/eye_bowl.rb +2 -3
- data/spec/support/models/face.rb +2 -3
- data/spec/support/models/fanatic.rb +1 -1
- data/spec/support/models/favorite.rb +1 -1
- data/spec/support/models/filesystem.rb +1 -1
- data/spec/support/models/fire_hydrant.rb +1 -1
- data/spec/support/models/firefox.rb +0 -1
- data/spec/support/models/fish.rb +0 -1
- data/spec/support/models/folder.rb +0 -2
- data/spec/support/models/folder_item.rb +1 -3
- data/spec/support/models/fruits.rb +9 -5
- data/spec/support/models/game.rb +3 -4
- data/spec/support/models/ghost.rb +0 -1
- data/spec/support/models/guitar.rb +0 -1
- data/spec/support/models/hole.rb +0 -1
- data/spec/support/models/home.rb +1 -1
- data/spec/support/models/house.rb +2 -2
- data/spec/support/models/html_writer.rb +0 -1
- data/spec/support/models/id_key.rb +3 -3
- data/spec/support/models/idnodef.rb +0 -1
- data/spec/support/models/image.rb +0 -1
- data/spec/support/models/implant.rb +1 -2
- data/spec/support/models/instrument.rb +2 -3
- data/spec/support/models/item.rb +2 -2
- data/spec/support/models/jar.rb +1 -2
- data/spec/support/models/kaleidoscope.rb +1 -1
- data/spec/support/models/kangaroo.rb +1 -1
- data/spec/support/models/label.rb +2 -2
- data/spec/support/models/language.rb +1 -1
- data/spec/support/models/lat_lng.rb +0 -1
- data/spec/support/models/league.rb +1 -1
- data/spec/support/models/learner.rb +0 -1
- data/spec/support/models/line_item.rb +1 -1
- data/spec/support/models/location.rb +1 -1
- data/spec/support/models/login.rb +1 -2
- data/spec/support/models/manufacturer.rb +0 -1
- data/spec/support/models/meat.rb +1 -1
- data/spec/support/models/membership.rb +1 -1
- data/spec/support/models/message.rb +1 -2
- data/spec/support/models/minim.rb +0 -1
- data/spec/support/models/mixed_drink.rb +1 -1
- data/spec/support/models/modifier_models.rb +25 -0
- data/spec/support/models/mop.rb +0 -1
- data/spec/support/models/movie.rb +1 -1
- data/spec/support/models/my_hash.rb +1 -2
- data/spec/support/models/name.rb +4 -5
- data/spec/support/models/name_only.rb +0 -1
- data/spec/support/models/node.rb +1 -1
- data/spec/support/models/note.rb +3 -3
- data/spec/support/models/nut.rb +0 -1
- data/spec/support/models/odd.rb +1 -1
- data/spec/support/models/order.rb +1 -1
- data/spec/support/models/ordered_post.rb +1 -1
- data/spec/support/models/ordered_preference.rb +1 -1
- data/spec/support/models/oscar.rb +1 -1
- data/spec/support/models/other_owner_object.rb +0 -1
- data/spec/support/models/override.rb +3 -11
- data/spec/support/models/ownable.rb +1 -1
- data/spec/support/models/owner.rb +1 -1
- data/spec/support/models/pack.rb +0 -1
- data/spec/support/models/page.rb +3 -3
- data/spec/support/models/page_question.rb +1 -1
- data/spec/support/models/palette.rb +2 -2
- data/spec/support/models/parent.rb +2 -2
- data/spec/support/models/parent_doc.rb +1 -1
- data/spec/support/models/passport.rb +0 -1
- data/spec/support/models/patient.rb +2 -2
- data/spec/support/models/pdf_writer.rb +0 -1
- data/spec/support/models/pencil.rb +0 -1
- data/spec/support/models/person.rb +32 -28
- data/spec/support/models/pet.rb +1 -1
- data/spec/support/models/pet_owner.rb +1 -1
- data/spec/support/models/phone.rb +1 -2
- data/spec/support/models/piano.rb +0 -1
- data/spec/support/models/pizza.rb +1 -1
- data/spec/support/models/player.rb +5 -5
- data/spec/support/models/post.rb +12 -12
- data/spec/support/models/post_genre.rb +1 -1
- data/spec/support/models/powerup.rb +1 -2
- data/spec/support/models/preference.rb +2 -2
- data/spec/support/models/princess.rb +1 -1
- data/spec/support/models/product.rb +3 -3
- data/spec/support/models/profile.rb +2 -1
- data/spec/support/models/pronunciation.rb +1 -1
- data/spec/support/models/pub.rb +2 -2
- data/spec/support/models/publication/encyclopedia.rb +0 -1
- data/spec/support/models/publication/review.rb +0 -1
- data/spec/support/models/publication.rb +0 -1
- data/spec/support/models/purchase.rb +1 -1
- data/spec/support/models/purchased_item.rb +1 -1
- data/spec/support/models/question.rb +2 -2
- data/spec/support/models/quiz.rb +1 -1
- data/spec/support/models/rating.rb +1 -1
- data/spec/support/models/record.rb +2 -3
- data/spec/support/models/registry.rb +1 -1
- data/spec/support/models/role.rb +1 -1
- data/spec/support/models/root_category.rb +1 -1
- data/spec/support/models/sandbox/app/models/app_models_message.rb +0 -1
- data/spec/support/models/sandbox/lib/models/lib_models_message.rb +0 -1
- data/spec/support/models/sandbox/sandbox_message.rb +0 -1
- data/spec/support/models/sandbox/sandbox_user.rb +0 -1
- data/spec/support/models/sandbox/subdir/sandbox_comment.rb +0 -1
- data/spec/support/models/sandwich.rb +1 -1
- data/spec/support/models/scheduler.rb +0 -1
- data/spec/support/models/school.rb +0 -1
- data/spec/support/models/scribe.rb +1 -1
- data/spec/support/models/sealer.rb +0 -1
- data/spec/support/models/seat.rb +0 -1
- data/spec/support/models/seo.rb +1 -1
- data/spec/support/models/series.rb +1 -1
- data/spec/support/models/server.rb +1 -1
- data/spec/support/models/service.rb +2 -2
- data/spec/support/models/shape.rb +3 -3
- data/spec/support/models/shelf.rb +1 -1
- data/spec/support/models/shield.rb +2 -2
- data/spec/support/models/shipment_address.rb +0 -1
- data/spec/support/models/shipping_container.rb +1 -1
- data/spec/support/models/shipping_pack.rb +0 -1
- data/spec/support/models/shirt.rb +0 -1
- data/spec/support/models/shop.rb +2 -2
- data/spec/support/models/short_agent.rb +0 -1
- data/spec/support/models/short_quiz.rb +1 -1
- data/spec/support/models/simple.rb +1 -1
- data/spec/support/models/slave.rb +1 -1
- data/spec/support/models/song.rb +1 -2
- data/spec/support/models/sound.rb +2 -2
- data/spec/support/models/spacer.rb +0 -1
- data/spec/support/models/square.rb +0 -1
- data/spec/support/models/staff.rb +0 -1
- data/spec/support/models/store_as_dup_test1.rb +2 -2
- data/spec/support/models/store_as_dup_test2.rb +1 -1
- data/spec/support/models/store_as_dup_test3.rb +2 -2
- data/spec/support/models/store_as_dup_test4.rb +1 -1
- data/spec/support/models/strategy.rb +0 -1
- data/spec/support/models/student.rb +1 -2
- data/spec/support/models/sub_item.rb +0 -1
- data/spec/support/models/subscription.rb +2 -2
- data/spec/support/models/survey.rb +2 -2
- data/spec/support/models/symptom.rb +2 -2
- data/spec/support/models/system_role.rb +2 -3
- data/spec/support/models/tag.rb +2 -2
- data/spec/support/models/target.rb +1 -1
- data/spec/support/models/template.rb +1 -1
- data/spec/support/models/thing.rb +1 -1
- data/spec/support/models/threadlocker.rb +0 -1
- data/spec/support/models/title.rb +0 -1
- data/spec/support/models/tool.rb +3 -3
- data/spec/support/models/topping.rb +1 -1
- data/spec/support/models/toy.rb +0 -1
- data/spec/support/models/track.rb +1 -1
- data/spec/support/models/translation.rb +1 -1
- data/spec/support/models/tree.rb +2 -3
- data/spec/support/models/truck.rb +0 -1
- data/spec/support/models/updatable.rb +0 -1
- data/spec/support/models/user.rb +3 -4
- data/spec/support/models/user_account.rb +3 -3
- data/spec/support/models/validation_callback.rb +4 -4
- data/spec/support/models/vehicle.rb +2 -3
- data/spec/support/models/version.rb +1 -1
- data/spec/support/models/vertex.rb +0 -1
- data/spec/support/models/vet_visit.rb +1 -1
- data/spec/support/models/video.rb +2 -2
- data/spec/support/models/video_game.rb +0 -1
- data/spec/support/models/washer.rb +0 -1
- data/spec/support/models/weapon.rb +1 -2
- data/spec/support/models/wiki_page.rb +2 -3
- data/spec/support/models/word.rb +2 -2
- data/spec/support/models/word_origin.rb +1 -2
- data/spec/support/models/writer.rb +3 -3
- data/spec/support/rails_mock.rb +7 -12
- data/spec/support/shared/time.rb +0 -1
- data/spec/support/sinatra_mock.rb +4 -2
- data/spec/support/spec_config.rb +19 -18
- metadata +14 -2
|
@@ -1,28 +1,27 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
|
-
require
|
|
5
|
-
require_relative
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
require_relative 'includable_spec_models'
|
|
6
5
|
|
|
7
6
|
describe Mongoid::Criteria::Includable do
|
|
8
|
-
|
|
9
|
-
describe "#includes" do
|
|
10
|
-
|
|
7
|
+
shared_examples_for 'eager loading' do |method_name|
|
|
11
8
|
let!(:person) do
|
|
12
9
|
Person.create!(age: 1)
|
|
13
10
|
end
|
|
14
11
|
|
|
15
|
-
context
|
|
12
|
+
context 'when providing a name that is not a relation' do
|
|
13
|
+
let(:expected_error) do
|
|
14
|
+
(method_name == :eager_load) ? ArgumentError : Mongoid::Errors::InvalidIncludes
|
|
15
|
+
end
|
|
16
16
|
|
|
17
|
-
it
|
|
18
|
-
expect
|
|
19
|
-
Person.
|
|
20
|
-
|
|
17
|
+
it 'raises an error' do
|
|
18
|
+
expect do
|
|
19
|
+
Person.send(method_name, :members)
|
|
20
|
+
end.to raise_error(expected_error)
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
context
|
|
25
|
-
|
|
24
|
+
context 'when providing one association' do
|
|
26
25
|
let!(:user) do
|
|
27
26
|
User.create!(posts: [ post1 ])
|
|
28
27
|
end
|
|
@@ -32,20 +31,19 @@ describe Mongoid::Criteria::Includable do
|
|
|
32
31
|
end
|
|
33
32
|
|
|
34
33
|
let(:result) do
|
|
35
|
-
User.
|
|
34
|
+
User.send(method_name, :posts).first
|
|
36
35
|
end
|
|
37
36
|
|
|
38
|
-
it
|
|
37
|
+
it 'executes the query' do
|
|
39
38
|
expect(result).to eq(user)
|
|
40
39
|
end
|
|
41
40
|
|
|
42
|
-
it
|
|
41
|
+
it 'includes the related objects' do
|
|
43
42
|
expect(result.posts).to eq([ post1 ])
|
|
44
43
|
end
|
|
45
44
|
end
|
|
46
45
|
|
|
47
|
-
context
|
|
48
|
-
|
|
46
|
+
context 'when providing a list of associations' do
|
|
49
47
|
let!(:user) do
|
|
50
48
|
User.create!(posts: [ post1 ], descriptions: [ description1 ])
|
|
51
49
|
end
|
|
@@ -59,24 +57,26 @@ describe Mongoid::Criteria::Includable do
|
|
|
59
57
|
end
|
|
60
58
|
|
|
61
59
|
let(:result) do
|
|
62
|
-
User.
|
|
60
|
+
User.send(method_name, :posts, :descriptions).first
|
|
63
61
|
end
|
|
64
62
|
|
|
65
|
-
it
|
|
63
|
+
it 'executes the query' do
|
|
66
64
|
expect(result).to eq(user)
|
|
67
65
|
end
|
|
68
66
|
|
|
69
|
-
it
|
|
67
|
+
it 'includes the related objects' do
|
|
70
68
|
expect(result.posts).to eq([ post1 ])
|
|
71
69
|
expect(result.descriptions).to eq([ description1 ])
|
|
72
70
|
end
|
|
73
71
|
end
|
|
74
72
|
|
|
75
|
-
context
|
|
76
|
-
|
|
73
|
+
context 'when providing a nested association' do
|
|
77
74
|
let!(:user) do
|
|
78
75
|
User.create!
|
|
79
76
|
end
|
|
77
|
+
let(:result) do
|
|
78
|
+
User.send(method_name, posts: [ :alerts ]).first
|
|
79
|
+
end
|
|
80
80
|
|
|
81
81
|
before do
|
|
82
82
|
p = Post.create!(alerts: [ Alert.create! ])
|
|
@@ -84,37 +84,31 @@ describe Mongoid::Criteria::Includable do
|
|
|
84
84
|
user.save!
|
|
85
85
|
end
|
|
86
86
|
|
|
87
|
-
|
|
88
|
-
User.includes(:posts => [:alerts]).first
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
it "executes the query" do
|
|
87
|
+
it 'executes the query' do
|
|
92
88
|
expect(result).to eq(user)
|
|
93
89
|
end
|
|
94
90
|
|
|
95
|
-
it
|
|
91
|
+
it 'includes the related objects' do
|
|
96
92
|
expect(result.posts.size).to eq(1)
|
|
97
93
|
expect(result.posts.first.alerts.size).to eq(1)
|
|
98
94
|
end
|
|
99
95
|
end
|
|
100
96
|
|
|
101
|
-
context
|
|
102
|
-
|
|
97
|
+
context 'when providing a deeply nested association' do
|
|
103
98
|
let!(:user) do
|
|
104
99
|
User.create!
|
|
105
100
|
end
|
|
106
101
|
|
|
107
102
|
let(:results) do
|
|
108
|
-
User.
|
|
103
|
+
User.send(method_name, posts: [ { alerts: :items } ]).to_a
|
|
109
104
|
end
|
|
110
105
|
|
|
111
|
-
it
|
|
106
|
+
it 'executes the query' do
|
|
112
107
|
expect(results.first).to eq(user)
|
|
113
108
|
end
|
|
114
109
|
end
|
|
115
110
|
|
|
116
|
-
context
|
|
117
|
-
|
|
111
|
+
context 'when the models are inherited' do
|
|
118
112
|
before(:all) do
|
|
119
113
|
class A
|
|
120
114
|
include Mongoid::Document
|
|
@@ -126,6 +120,7 @@ describe Mongoid::Criteria::Includable do
|
|
|
126
120
|
|
|
127
121
|
class C
|
|
128
122
|
include Mongoid::Document
|
|
123
|
+
|
|
129
124
|
has_one :b
|
|
130
125
|
end
|
|
131
126
|
end
|
|
@@ -136,8 +131,7 @@ describe Mongoid::Criteria::Includable do
|
|
|
136
131
|
Object.send(:remove_const, :C)
|
|
137
132
|
end
|
|
138
133
|
|
|
139
|
-
context
|
|
140
|
-
|
|
134
|
+
context 'when the includes is on the subclass' do
|
|
141
135
|
let!(:c_one) do
|
|
142
136
|
C.create!
|
|
143
137
|
end
|
|
@@ -151,16 +145,16 @@ describe Mongoid::Criteria::Includable do
|
|
|
151
145
|
end
|
|
152
146
|
|
|
153
147
|
let!(:results) do
|
|
154
|
-
C.
|
|
148
|
+
C.send(method_name, :b).to_a.detect do |c|
|
|
155
149
|
c.id == c_two.id
|
|
156
150
|
end
|
|
157
151
|
end
|
|
158
152
|
|
|
159
|
-
it
|
|
153
|
+
it 'returns the correct documents' do
|
|
160
154
|
expect(results).to eq(c_two)
|
|
161
155
|
end
|
|
162
156
|
|
|
163
|
-
it
|
|
157
|
+
it 'does not query the db' do
|
|
164
158
|
expect_query(0) do
|
|
165
159
|
results.b
|
|
166
160
|
end
|
|
@@ -168,10 +162,8 @@ describe Mongoid::Criteria::Includable do
|
|
|
168
162
|
end
|
|
169
163
|
end
|
|
170
164
|
|
|
171
|
-
context
|
|
172
|
-
|
|
173
|
-
context "when the relation is a has_one" do
|
|
174
|
-
|
|
165
|
+
context 'when the models are inherited from another one model' do
|
|
166
|
+
context 'when the relation is a has_one' do
|
|
175
167
|
before(:all) do
|
|
176
168
|
class A
|
|
177
169
|
include Mongoid::Document
|
|
@@ -187,6 +179,7 @@ describe Mongoid::Criteria::Includable do
|
|
|
187
179
|
|
|
188
180
|
class D
|
|
189
181
|
include Mongoid::Document
|
|
182
|
+
|
|
190
183
|
has_one :b
|
|
191
184
|
has_one :c
|
|
192
185
|
end
|
|
@@ -199,8 +192,7 @@ describe Mongoid::Criteria::Includable do
|
|
|
199
192
|
Object.send(:remove_const, :D)
|
|
200
193
|
end
|
|
201
194
|
|
|
202
|
-
context
|
|
203
|
-
|
|
195
|
+
context 'when the includes is on the several relations' do
|
|
204
196
|
let!(:d_one) do
|
|
205
197
|
D.create!
|
|
206
198
|
end
|
|
@@ -218,31 +210,29 @@ describe Mongoid::Criteria::Includable do
|
|
|
218
210
|
end
|
|
219
211
|
|
|
220
212
|
let!(:results) do
|
|
221
|
-
D.
|
|
222
|
-
|
|
223
|
-
end
|
|
213
|
+
query = -> { D.send(method_name, :b, :c).entries.detect { |d| d.id == d_two.id } }
|
|
214
|
+
(method_name == :eager_load) ? expect_query(1, &query) : query.call
|
|
224
215
|
end
|
|
225
216
|
|
|
226
|
-
it
|
|
217
|
+
it 'returns the correct documents' do
|
|
227
218
|
expect(results).to eq(d_two)
|
|
228
219
|
end
|
|
229
220
|
|
|
230
|
-
it
|
|
221
|
+
it 'does not query the db on b' do
|
|
231
222
|
expect_query(0) do
|
|
232
223
|
results.b
|
|
233
224
|
end
|
|
234
225
|
end
|
|
235
226
|
|
|
236
|
-
it
|
|
227
|
+
it 'does not query the db on c' do
|
|
237
228
|
expect_query(0) do
|
|
238
|
-
results.
|
|
229
|
+
results.c
|
|
239
230
|
end
|
|
240
231
|
end
|
|
241
232
|
end
|
|
242
233
|
end
|
|
243
234
|
|
|
244
|
-
context
|
|
245
|
-
|
|
235
|
+
context 'when the relation is a has_many' do
|
|
246
236
|
before(:all) do
|
|
247
237
|
class A
|
|
248
238
|
include Mongoid::Document
|
|
@@ -258,6 +248,7 @@ describe Mongoid::Criteria::Includable do
|
|
|
258
248
|
|
|
259
249
|
class D
|
|
260
250
|
include Mongoid::Document
|
|
251
|
+
|
|
261
252
|
has_many :b
|
|
262
253
|
has_many :c
|
|
263
254
|
end
|
|
@@ -270,8 +261,7 @@ describe Mongoid::Criteria::Includable do
|
|
|
270
261
|
Object.send(:remove_const, :D)
|
|
271
262
|
end
|
|
272
263
|
|
|
273
|
-
context
|
|
274
|
-
|
|
264
|
+
context 'when the includes is on the several relations' do
|
|
275
265
|
let!(:d_one) do
|
|
276
266
|
D.create!
|
|
277
267
|
end
|
|
@@ -289,53 +279,50 @@ describe Mongoid::Criteria::Includable do
|
|
|
289
279
|
end
|
|
290
280
|
|
|
291
281
|
let!(:results) do
|
|
292
|
-
D.
|
|
293
|
-
|
|
294
|
-
end
|
|
282
|
+
query = -> { D.send(method_name, :b, :c).entries.detect { |d| d.id == d_two.id } }
|
|
283
|
+
(method_name == :eager_load) ? expect_query(1, &query) : query.call
|
|
295
284
|
end
|
|
296
285
|
|
|
297
|
-
it
|
|
286
|
+
it 'returns the correct documents' do
|
|
298
287
|
expect(results).to eq(d_two)
|
|
299
288
|
end
|
|
300
289
|
|
|
301
|
-
it
|
|
290
|
+
it 'does not query the db on b' do
|
|
302
291
|
expect_query(0) do
|
|
303
292
|
results.b
|
|
304
293
|
end
|
|
305
294
|
end
|
|
306
295
|
|
|
307
|
-
it
|
|
296
|
+
it 'does not query the db on c' do
|
|
308
297
|
expect_query(0) do
|
|
309
|
-
results.
|
|
298
|
+
results.c
|
|
310
299
|
end
|
|
311
300
|
end
|
|
312
301
|
end
|
|
313
302
|
end
|
|
314
303
|
end
|
|
315
304
|
|
|
316
|
-
context
|
|
317
|
-
|
|
305
|
+
context 'when including the same association multiple times' do
|
|
318
306
|
let(:criteria) do
|
|
319
|
-
Person.all.
|
|
307
|
+
Person.all.send(method_name, :posts, :posts).send(method_name, :posts)
|
|
320
308
|
end
|
|
321
309
|
|
|
322
310
|
let(:association) do
|
|
323
311
|
Person.reflect_on_association(:posts)
|
|
324
312
|
end
|
|
325
313
|
|
|
326
|
-
it
|
|
314
|
+
it 'does not duplicate the association in the inclusions' do
|
|
327
315
|
expect(criteria.inclusions).to eq([ association ])
|
|
328
316
|
end
|
|
329
317
|
end
|
|
330
318
|
|
|
331
|
-
context
|
|
332
|
-
|
|
319
|
+
context 'when mapping the results more than once' do
|
|
333
320
|
let!(:post) do
|
|
334
|
-
person.posts.create!(title:
|
|
321
|
+
person.posts.create!(title: 'one')
|
|
335
322
|
end
|
|
336
323
|
|
|
337
324
|
let(:criteria) do
|
|
338
|
-
Post.
|
|
325
|
+
Post.send(method_name, :person)
|
|
339
326
|
end
|
|
340
327
|
|
|
341
328
|
let!(:results) do
|
|
@@ -343,90 +330,86 @@ describe Mongoid::Criteria::Includable do
|
|
|
343
330
|
criteria.map { |doc| doc }
|
|
344
331
|
end
|
|
345
332
|
|
|
346
|
-
it
|
|
347
|
-
expect(results.first.title).to eq(
|
|
333
|
+
it 'returns the proper results' do
|
|
334
|
+
expect(results.first.title).to eq('one')
|
|
348
335
|
end
|
|
349
336
|
end
|
|
350
337
|
|
|
351
|
-
context
|
|
352
|
-
|
|
353
|
-
context "when the criteria is from the root" do
|
|
354
|
-
|
|
338
|
+
context 'when including a belongs to relation' do
|
|
339
|
+
context 'when the criteria is from the root' do
|
|
355
340
|
let!(:person_two) do
|
|
356
341
|
Person.create!(age: 2)
|
|
357
342
|
end
|
|
358
343
|
|
|
359
344
|
let!(:post_one) do
|
|
360
|
-
person.posts.create!(title:
|
|
345
|
+
person.posts.create!(title: 'one')
|
|
361
346
|
end
|
|
362
347
|
|
|
363
348
|
let!(:post_two) do
|
|
364
|
-
person_two.posts.create!(title:
|
|
349
|
+
person_two.posts.create!(title: 'two')
|
|
365
350
|
end
|
|
366
351
|
|
|
367
|
-
context
|
|
368
|
-
|
|
352
|
+
context 'when calling first' do
|
|
369
353
|
let(:criteria) do
|
|
370
|
-
Post.
|
|
354
|
+
Post.send(method_name, :person)
|
|
371
355
|
end
|
|
372
356
|
|
|
373
357
|
let!(:document) do
|
|
374
|
-
criteria.first
|
|
358
|
+
query = -> { criteria.first }
|
|
359
|
+
(method_name == :eager_load) ? expect_less_than_queries(3, &query) : query.call
|
|
375
360
|
end
|
|
376
361
|
|
|
377
|
-
it
|
|
362
|
+
it 'eager loads the first document' do
|
|
378
363
|
expect_query(0) do
|
|
379
364
|
expect(document.person).to eq(person)
|
|
380
365
|
end
|
|
381
366
|
end
|
|
382
367
|
|
|
383
|
-
it
|
|
368
|
+
it 'returns the first document' do
|
|
384
369
|
expect(document).to eq(post_one)
|
|
385
370
|
end
|
|
386
371
|
end
|
|
387
372
|
|
|
388
|
-
context
|
|
389
|
-
|
|
373
|
+
context 'when calling last' do
|
|
390
374
|
let!(:criteria) do
|
|
391
|
-
Post.asc(:_id).
|
|
375
|
+
Post.asc(:_id).send(method_name, :person)
|
|
392
376
|
end
|
|
393
377
|
|
|
394
378
|
let!(:document) do
|
|
395
379
|
criteria.last
|
|
396
380
|
end
|
|
397
381
|
|
|
398
|
-
it
|
|
382
|
+
it 'eager loads the last document' do
|
|
399
383
|
expect_query(0) do
|
|
400
384
|
expect(document.person).to eq(person_two)
|
|
401
385
|
end
|
|
402
386
|
end
|
|
403
387
|
|
|
404
|
-
it
|
|
388
|
+
it 'returns the last document' do
|
|
405
389
|
expect(document).to eq(post_two)
|
|
406
390
|
end
|
|
407
391
|
end
|
|
408
392
|
end
|
|
409
393
|
|
|
410
|
-
context
|
|
411
|
-
|
|
394
|
+
context 'when the criteria is from an embedded relation' do
|
|
412
395
|
let(:peep) do
|
|
413
396
|
Person.create!
|
|
414
397
|
end
|
|
415
398
|
|
|
416
399
|
let!(:address_one) do
|
|
417
|
-
peep.addresses.create!(street:
|
|
400
|
+
peep.addresses.create!(street: 'rosenthaler')
|
|
418
401
|
end
|
|
419
402
|
|
|
420
403
|
let!(:address_two) do
|
|
421
|
-
peep.addresses.create!(street:
|
|
404
|
+
peep.addresses.create!(street: 'weinmeister')
|
|
422
405
|
end
|
|
423
406
|
|
|
424
407
|
let!(:depeche) do
|
|
425
|
-
Band.create!(name:
|
|
408
|
+
Band.create!(name: 'Depeche Mode')
|
|
426
409
|
end
|
|
427
410
|
|
|
428
411
|
let!(:tool) do
|
|
429
|
-
Band.create!(name:
|
|
412
|
+
Band.create!(name: 'Tool')
|
|
430
413
|
end
|
|
431
414
|
|
|
432
415
|
before do
|
|
@@ -436,10 +419,9 @@ describe Mongoid::Criteria::Includable do
|
|
|
436
419
|
address_two.save!
|
|
437
420
|
end
|
|
438
421
|
|
|
439
|
-
context
|
|
440
|
-
|
|
422
|
+
context 'when calling first' do
|
|
441
423
|
let(:criteria) do
|
|
442
|
-
peep.reload.addresses.
|
|
424
|
+
peep.reload.addresses.send(method_name, :band)
|
|
443
425
|
end
|
|
444
426
|
|
|
445
427
|
let(:context) do
|
|
@@ -447,24 +429,25 @@ describe Mongoid::Criteria::Includable do
|
|
|
447
429
|
end
|
|
448
430
|
|
|
449
431
|
let!(:document) do
|
|
432
|
+
# Since this is called on an embedded criteria, we will be using the includes path
|
|
433
|
+
# rather than the $lookup path, so we do not need to check queries.
|
|
450
434
|
criteria.first
|
|
451
435
|
end
|
|
452
436
|
|
|
453
|
-
it
|
|
437
|
+
it 'eager loads the first document' do
|
|
454
438
|
expect_query(0) do
|
|
455
439
|
expect(document.band).to eq(depeche)
|
|
456
440
|
end
|
|
457
441
|
end
|
|
458
442
|
|
|
459
|
-
it
|
|
443
|
+
it 'returns the document' do
|
|
460
444
|
expect(document).to eq(address_one)
|
|
461
445
|
end
|
|
462
446
|
end
|
|
463
447
|
|
|
464
|
-
context
|
|
465
|
-
|
|
448
|
+
context 'when calling last' do
|
|
466
449
|
let(:criteria) do
|
|
467
|
-
peep.reload.addresses.
|
|
450
|
+
peep.reload.addresses.send(method_name, :band)
|
|
468
451
|
end
|
|
469
452
|
|
|
470
453
|
let(:context) do
|
|
@@ -472,24 +455,24 @@ describe Mongoid::Criteria::Includable do
|
|
|
472
455
|
end
|
|
473
456
|
|
|
474
457
|
let!(:document) do
|
|
475
|
-
criteria.last
|
|
458
|
+
query = -> { criteria.last }
|
|
459
|
+
(method_name == :eager_load) ? expect_query(2, &query) : query.call
|
|
476
460
|
end
|
|
477
461
|
|
|
478
|
-
it
|
|
462
|
+
it 'eager loads the last document' do
|
|
479
463
|
expect_query(0) do
|
|
480
464
|
expect(document.band).to eq(tool)
|
|
481
465
|
end
|
|
482
466
|
end
|
|
483
467
|
|
|
484
|
-
it
|
|
468
|
+
it 'returns the document' do
|
|
485
469
|
expect(document).to eq(address_two)
|
|
486
470
|
end
|
|
487
471
|
end
|
|
488
472
|
|
|
489
|
-
context
|
|
490
|
-
|
|
473
|
+
context 'when iterating all documents' do
|
|
491
474
|
let(:criteria) do
|
|
492
|
-
peep.reload.addresses.
|
|
475
|
+
peep.reload.addresses.send(method_name, :band)
|
|
493
476
|
end
|
|
494
477
|
|
|
495
478
|
let(:context) do
|
|
@@ -497,32 +480,32 @@ describe Mongoid::Criteria::Includable do
|
|
|
497
480
|
end
|
|
498
481
|
|
|
499
482
|
let!(:documents) do
|
|
500
|
-
criteria.to_a
|
|
483
|
+
query = -> { criteria.to_a }
|
|
484
|
+
(method_name == :eager_load) ? expect_query(2, &query) : query.call
|
|
501
485
|
end
|
|
502
486
|
|
|
503
|
-
it
|
|
487
|
+
it 'eager loads the first document' do
|
|
504
488
|
expect_query(0) do
|
|
505
489
|
expect(documents.first.band).to eq(depeche)
|
|
506
490
|
end
|
|
507
491
|
end
|
|
508
492
|
|
|
509
|
-
it
|
|
493
|
+
it 'eager loads the last document' do
|
|
510
494
|
expect_query(0) do
|
|
511
495
|
expect(documents.last.band).to eq(tool)
|
|
512
496
|
end
|
|
513
497
|
end
|
|
514
498
|
|
|
515
|
-
it
|
|
499
|
+
it 'returns the documents' do
|
|
516
500
|
expect(documents).to eq([ address_one, address_two ])
|
|
517
501
|
end
|
|
518
502
|
end
|
|
519
503
|
end
|
|
520
504
|
end
|
|
521
505
|
|
|
522
|
-
context
|
|
523
|
-
|
|
506
|
+
context 'when providing inclusions to the default scope' do
|
|
524
507
|
before do
|
|
525
|
-
Person.default_scope(->{ Person.
|
|
508
|
+
Person.default_scope(-> { Person.send(method_name, :posts) })
|
|
526
509
|
end
|
|
527
510
|
|
|
528
511
|
after do
|
|
@@ -530,65 +513,61 @@ describe Mongoid::Criteria::Includable do
|
|
|
530
513
|
end
|
|
531
514
|
|
|
532
515
|
let!(:post_one) do
|
|
533
|
-
person.posts.create!(title:
|
|
516
|
+
person.posts.create!(title: 'one')
|
|
534
517
|
end
|
|
535
518
|
|
|
536
519
|
let!(:post_two) do
|
|
537
|
-
person.posts.create!(title:
|
|
520
|
+
person.posts.create!(title: 'two')
|
|
538
521
|
end
|
|
539
522
|
|
|
540
|
-
context
|
|
541
|
-
|
|
523
|
+
context 'when the criteria has no options' do
|
|
542
524
|
let!(:criteria) do
|
|
543
525
|
Person.asc(:age).all
|
|
544
526
|
end
|
|
545
527
|
|
|
546
528
|
let!(:documents) do
|
|
547
|
-
criteria.entries
|
|
529
|
+
query = -> { criteria.entries }
|
|
530
|
+
(method_name == :eager_load) ? expect_less_than_queries(2, &query) : query.call
|
|
548
531
|
end
|
|
549
532
|
|
|
550
|
-
it
|
|
533
|
+
it 'returns the correct documents' do
|
|
551
534
|
expect(documents).to eq([ person ])
|
|
552
535
|
end
|
|
553
536
|
|
|
554
|
-
it
|
|
537
|
+
it 'eager loads the first document' do
|
|
555
538
|
expect_query(0) do
|
|
556
539
|
expect(documents.first.posts.first).to eq(post_one)
|
|
557
540
|
end
|
|
558
541
|
end
|
|
559
542
|
|
|
560
|
-
it
|
|
543
|
+
it 'eager loads the last document' do
|
|
561
544
|
expect_query(0) do
|
|
562
545
|
expect(documents.first.posts.last).to eq(post_two)
|
|
563
546
|
end
|
|
564
547
|
end
|
|
565
548
|
|
|
566
|
-
context
|
|
567
|
-
|
|
568
|
-
let
|
|
569
|
-
|
|
570
|
-
end
|
|
571
|
-
|
|
572
|
-
let!(:new_context) do
|
|
573
|
-
new_criteria.context
|
|
574
|
-
end
|
|
549
|
+
context 'when executing the query twice' do
|
|
550
|
+
let(:new_criteria) { Person.where(id: person.id) }
|
|
551
|
+
let(:from_db) { new_criteria.first }
|
|
552
|
+
let(:new_context) { new_criteria.context }
|
|
575
553
|
|
|
576
554
|
before do
|
|
577
|
-
|
|
578
|
-
|
|
555
|
+
if method_name == :eager_load
|
|
556
|
+
expect(new_context).to receive(:eager_load_with_lookup).once.and_call_original
|
|
557
|
+
else
|
|
558
|
+
expect(new_context).to receive(:eager_load).with([ person ]).once.and_call_original
|
|
559
|
+
end
|
|
579
560
|
|
|
580
|
-
|
|
581
|
-
new_criteria.first
|
|
561
|
+
from_db
|
|
582
562
|
end
|
|
583
563
|
|
|
584
|
-
it
|
|
564
|
+
it 'does not duplicate documents in the relation' do
|
|
585
565
|
expect(person.posts.size).to eq(2)
|
|
586
566
|
end
|
|
587
567
|
end
|
|
588
568
|
end
|
|
589
569
|
|
|
590
|
-
context
|
|
591
|
-
|
|
570
|
+
context 'when calling first on the criteria' do
|
|
592
571
|
let(:criteria) do
|
|
593
572
|
Person.asc(:age).all
|
|
594
573
|
end
|
|
@@ -597,66 +576,62 @@ describe Mongoid::Criteria::Includable do
|
|
|
597
576
|
criteria.first
|
|
598
577
|
end
|
|
599
578
|
|
|
600
|
-
it
|
|
579
|
+
it 'returns the correct documents' do
|
|
601
580
|
expect(from_db).to eq(person)
|
|
602
581
|
end
|
|
603
582
|
|
|
604
|
-
it
|
|
583
|
+
it 'eager loads the first document' do
|
|
605
584
|
expect_query(0) do
|
|
606
585
|
expect(from_db.posts.first).to eq(post_one)
|
|
607
586
|
end
|
|
608
587
|
end
|
|
609
588
|
|
|
610
|
-
it
|
|
589
|
+
it 'eager loads the last document' do
|
|
611
590
|
expect_query(0) do
|
|
612
591
|
expect(from_db.posts.last).to eq(post_two)
|
|
613
592
|
end
|
|
614
593
|
end
|
|
615
594
|
end
|
|
616
595
|
|
|
617
|
-
context
|
|
618
|
-
|
|
619
|
-
let(:
|
|
620
|
-
|
|
621
|
-
end
|
|
622
|
-
|
|
623
|
-
let!(:context) do
|
|
624
|
-
criteria.context
|
|
625
|
-
end
|
|
596
|
+
context 'when calling last on the criteria' do
|
|
597
|
+
let(:criteria) { Person.asc(:age).all }
|
|
598
|
+
let(:from_db) { criteria.last }
|
|
599
|
+
let(:context) { criteria.context }
|
|
626
600
|
|
|
627
601
|
before do
|
|
628
|
-
|
|
629
|
-
|
|
602
|
+
if method_name == :eager_load
|
|
603
|
+
expect(context).to receive(:eager_load_with_lookup).once.and_call_original
|
|
604
|
+
else
|
|
605
|
+
expect(context).to receive(:eager_load).with([ person ]).once.and_call_original
|
|
606
|
+
end
|
|
630
607
|
|
|
631
|
-
|
|
632
|
-
criteria.last
|
|
608
|
+
from_db
|
|
633
609
|
end
|
|
634
610
|
|
|
635
|
-
it
|
|
611
|
+
it 'returns the correct documents' do
|
|
636
612
|
expect(from_db).to eq(person)
|
|
637
613
|
end
|
|
638
614
|
|
|
639
|
-
it
|
|
615
|
+
it 'eager loads the first document' do
|
|
640
616
|
expect_query(0) do
|
|
641
617
|
expect(from_db.posts.first).to eq(post_one)
|
|
642
618
|
end
|
|
643
619
|
end
|
|
644
620
|
|
|
645
|
-
it
|
|
621
|
+
it 'eager loads the last document' do
|
|
646
622
|
expect_query(0) do
|
|
647
623
|
expect(from_db.posts.last).to eq(post_two)
|
|
648
624
|
end
|
|
649
625
|
end
|
|
650
626
|
end
|
|
651
627
|
|
|
652
|
-
context
|
|
653
|
-
|
|
628
|
+
context 'when the criteria has limiting options' do
|
|
654
629
|
let!(:person_two) do
|
|
655
630
|
Person.create!
|
|
656
631
|
end
|
|
657
632
|
|
|
658
633
|
let!(:post_three) do
|
|
659
|
-
person_two.posts.create!(title:
|
|
634
|
+
person_two.posts.create!(title: 'three')
|
|
660
635
|
end
|
|
661
636
|
|
|
662
637
|
let!(:criteria) do
|
|
@@ -664,20 +639,21 @@ describe Mongoid::Criteria::Includable do
|
|
|
664
639
|
end
|
|
665
640
|
|
|
666
641
|
let!(:documents) do
|
|
667
|
-
criteria.entries
|
|
642
|
+
query = -> { criteria.entries }
|
|
643
|
+
(method_name == :eager_load) ? expect_less_than_queries(3, &query) : query.call
|
|
668
644
|
end
|
|
669
645
|
|
|
670
|
-
it
|
|
646
|
+
it 'returns the correct documents' do
|
|
671
647
|
expect(criteria).to eq([ person ])
|
|
672
648
|
end
|
|
673
649
|
|
|
674
|
-
it
|
|
650
|
+
it 'eager loads the first document' do
|
|
675
651
|
expect_query(0) do
|
|
676
652
|
expect(documents.first.posts.first).to eq(post_one)
|
|
677
653
|
end
|
|
678
654
|
end
|
|
679
655
|
|
|
680
|
-
it
|
|
656
|
+
it 'eager loads the second document' do
|
|
681
657
|
expect_query(0) do
|
|
682
658
|
expect(documents.first.posts.last).to eq(post_two)
|
|
683
659
|
end
|
|
@@ -685,107 +661,106 @@ describe Mongoid::Criteria::Includable do
|
|
|
685
661
|
end
|
|
686
662
|
end
|
|
687
663
|
|
|
688
|
-
context
|
|
689
|
-
|
|
664
|
+
context 'when including a has and belongs to many' do
|
|
690
665
|
let!(:preference_one) do
|
|
691
|
-
person.preferences.create!(name:
|
|
666
|
+
person.preferences.create!(name: 'one')
|
|
692
667
|
end
|
|
693
668
|
|
|
694
669
|
let!(:preference_two) do
|
|
695
|
-
person.preferences.create!(name:
|
|
670
|
+
person.preferences.create!(name: 'two')
|
|
696
671
|
end
|
|
697
672
|
|
|
698
|
-
context
|
|
699
|
-
|
|
673
|
+
context 'when one of the related items is deleted' do
|
|
700
674
|
before do
|
|
701
675
|
person.preferences = [ preference_one, preference_two ]
|
|
702
676
|
preference_two.delete
|
|
703
677
|
end
|
|
704
678
|
|
|
705
679
|
let(:criteria) do
|
|
706
|
-
Person.where(id: person.id).
|
|
680
|
+
Person.where(id: person.id).send(method_name, :preferences)
|
|
707
681
|
end
|
|
708
682
|
|
|
709
|
-
it
|
|
683
|
+
it 'only loads the existing related items' do
|
|
710
684
|
expect(criteria.entries.first.preferences).to eq([ preference_one ])
|
|
711
685
|
end
|
|
712
686
|
end
|
|
713
687
|
|
|
714
|
-
context
|
|
715
|
-
|
|
688
|
+
context 'when the criteria has no options' do
|
|
716
689
|
let!(:criteria) do
|
|
717
|
-
Person.asc(:age).
|
|
690
|
+
Person.asc(:age).send(method_name, :preferences)
|
|
718
691
|
end
|
|
719
692
|
|
|
720
693
|
let!(:documents) do
|
|
721
|
-
criteria.entries
|
|
694
|
+
query = -> { criteria.entries }
|
|
695
|
+
(method_name == :eager_load) ? expect_less_than_queries(3, &query) : query.call
|
|
722
696
|
end
|
|
723
697
|
|
|
724
|
-
it
|
|
698
|
+
it 'returns the correct documents' do
|
|
725
699
|
expect(documents).to eq([ person ])
|
|
726
700
|
end
|
|
727
701
|
|
|
728
|
-
it
|
|
702
|
+
it 'eager loads the first document' do
|
|
729
703
|
expect_query(0) do
|
|
730
704
|
expect(documents.first.preferences.first).to eq(preference_one)
|
|
731
705
|
end
|
|
732
706
|
end
|
|
733
707
|
|
|
734
|
-
it
|
|
708
|
+
it 'eager loads the last document' do
|
|
735
709
|
expect_query(0) do
|
|
736
710
|
expect(documents.first.preferences.last).to eq(preference_two)
|
|
737
711
|
end
|
|
738
712
|
end
|
|
739
713
|
end
|
|
740
714
|
|
|
741
|
-
context
|
|
742
|
-
|
|
715
|
+
context 'when calling first on the criteria' do
|
|
743
716
|
let!(:criteria) do
|
|
744
|
-
Person.asc(:age).
|
|
717
|
+
Person.asc(:age).send(method_name, :preferences)
|
|
745
718
|
end
|
|
746
719
|
|
|
720
|
+
# here
|
|
747
721
|
let!(:from_db) do
|
|
748
|
-
criteria.first
|
|
722
|
+
query = -> { criteria.first }
|
|
723
|
+
(method_name == :eager_load) ? expect_less_than_queries(3, &query) : query.call
|
|
749
724
|
end
|
|
750
725
|
|
|
751
|
-
it
|
|
726
|
+
it 'returns the correct documents' do
|
|
752
727
|
expect(from_db).to eq(person)
|
|
753
728
|
end
|
|
754
729
|
|
|
755
|
-
it
|
|
730
|
+
it 'eager loads the first document' do
|
|
756
731
|
expect_query(0) do
|
|
757
732
|
expect(from_db.preferences.first).to eq(preference_one)
|
|
758
733
|
end
|
|
759
734
|
end
|
|
760
735
|
|
|
761
|
-
it
|
|
736
|
+
it 'eager loads the last document' do
|
|
762
737
|
expect_query(0) do
|
|
763
738
|
expect(from_db.preferences.last).to eq(preference_two)
|
|
764
739
|
end
|
|
765
740
|
end
|
|
766
741
|
end
|
|
767
742
|
|
|
768
|
-
context
|
|
769
|
-
|
|
743
|
+
context 'when calling last on the criteria' do
|
|
770
744
|
let!(:criteria) do
|
|
771
|
-
Person.asc(:age).
|
|
745
|
+
Person.asc(:age).send(method_name, :preferences)
|
|
772
746
|
end
|
|
773
747
|
|
|
774
748
|
let!(:from_db) do
|
|
775
|
-
criteria.last
|
|
749
|
+
query = -> { criteria.last }
|
|
750
|
+
(method_name == :eager_load) ? expect_less_than_queries(3, &query) : query.call
|
|
776
751
|
end
|
|
777
752
|
|
|
778
|
-
it
|
|
753
|
+
it 'returns the correct documents' do
|
|
779
754
|
expect(from_db).to eq(person)
|
|
780
755
|
end
|
|
781
756
|
|
|
782
|
-
it
|
|
757
|
+
it 'eager loads the first document' do
|
|
783
758
|
expect_query(0) do
|
|
784
759
|
expect(from_db.preferences.first).to eq(preference_one)
|
|
785
760
|
end
|
|
786
761
|
end
|
|
787
762
|
|
|
788
|
-
it
|
|
763
|
+
it 'eager loads the last document' do
|
|
789
764
|
expect_query(0) do
|
|
790
765
|
expect(from_db.preferences.last).to eq(preference_two)
|
|
791
766
|
end
|
|
@@ -793,107 +768,105 @@ describe Mongoid::Criteria::Includable do
|
|
|
793
768
|
end
|
|
794
769
|
end
|
|
795
770
|
|
|
796
|
-
context
|
|
797
|
-
|
|
771
|
+
context 'when including a has many' do
|
|
798
772
|
let!(:post_one) do
|
|
799
|
-
person.posts.create!(title:
|
|
773
|
+
person.posts.create!(title: 'one')
|
|
800
774
|
end
|
|
801
775
|
|
|
802
776
|
let!(:post_two) do
|
|
803
|
-
person.posts.create!(title:
|
|
777
|
+
person.posts.create!(title: 'two')
|
|
804
778
|
end
|
|
805
779
|
|
|
806
|
-
context
|
|
807
|
-
|
|
780
|
+
context 'when the criteria has no options' do
|
|
808
781
|
let!(:criteria) do
|
|
809
|
-
Person.asc(:age).
|
|
782
|
+
Person.asc(:age).send(method_name, :posts)
|
|
810
783
|
end
|
|
811
784
|
|
|
812
785
|
let!(:documents) do
|
|
813
|
-
criteria.entries
|
|
786
|
+
query = -> { criteria.entries }
|
|
787
|
+
(method_name == :eager_load) ? expect_less_than_queries(3, &query) : query.call
|
|
814
788
|
end
|
|
815
789
|
|
|
816
|
-
it
|
|
790
|
+
it 'returns the correct documents' do
|
|
817
791
|
expect(documents).to eq([ person ])
|
|
818
792
|
end
|
|
819
793
|
|
|
820
|
-
it
|
|
794
|
+
it 'eager loads the first document' do
|
|
821
795
|
expect_query(0) do
|
|
822
796
|
expect(documents.first.posts.first).to eq(post_one)
|
|
823
797
|
end
|
|
824
798
|
end
|
|
825
799
|
|
|
826
|
-
it
|
|
800
|
+
it 'eager loads the last document' do
|
|
827
801
|
expect_query(0) do
|
|
828
802
|
expect(documents.first.posts.last).to eq(post_two)
|
|
829
803
|
end
|
|
830
804
|
end
|
|
831
805
|
end
|
|
832
806
|
|
|
833
|
-
context
|
|
834
|
-
|
|
807
|
+
context 'when calling first on the criteria' do
|
|
835
808
|
let!(:criteria) do
|
|
836
|
-
Person.asc(:age).
|
|
809
|
+
Person.asc(:age).send(method_name, :posts)
|
|
837
810
|
end
|
|
838
811
|
|
|
839
812
|
let!(:from_db) do
|
|
840
813
|
criteria.first
|
|
841
814
|
end
|
|
842
815
|
|
|
843
|
-
it
|
|
816
|
+
it 'returns the correct documents' do
|
|
844
817
|
expect(from_db).to eq(person)
|
|
845
818
|
end
|
|
846
819
|
|
|
847
|
-
context
|
|
848
|
-
|
|
820
|
+
context 'when subsequently getting all documents' do
|
|
849
821
|
let!(:documents) do
|
|
850
822
|
criteria.entries
|
|
851
823
|
end
|
|
852
824
|
|
|
853
|
-
it
|
|
825
|
+
it 'returns the correct documents' do
|
|
854
826
|
expect(documents).to eq([ person ])
|
|
855
827
|
end
|
|
856
828
|
end
|
|
857
829
|
end
|
|
858
830
|
|
|
859
|
-
context
|
|
860
|
-
|
|
831
|
+
context 'when calling last on the criteria' do
|
|
861
832
|
let!(:criteria) do
|
|
862
|
-
Person.asc(:age).
|
|
833
|
+
Person.asc(:age).send(method_name, :posts)
|
|
863
834
|
end
|
|
864
835
|
|
|
865
836
|
let!(:from_db) do
|
|
866
837
|
criteria.last
|
|
867
838
|
end
|
|
868
839
|
|
|
869
|
-
it
|
|
840
|
+
it 'returns the correct documents' do
|
|
870
841
|
expect(from_db).to eq(person)
|
|
871
842
|
end
|
|
872
843
|
|
|
873
|
-
context
|
|
874
|
-
|
|
844
|
+
context 'when subsequently getting all documents' do
|
|
875
845
|
let!(:documents) do
|
|
876
846
|
criteria.entries
|
|
877
847
|
end
|
|
878
848
|
|
|
879
|
-
it
|
|
849
|
+
it 'returns the correct documents' do
|
|
880
850
|
expect(documents).to eq([ person ])
|
|
881
851
|
end
|
|
882
852
|
end
|
|
883
853
|
end
|
|
884
854
|
|
|
885
|
-
context
|
|
886
|
-
|
|
887
|
-
let!(:person_two) do
|
|
855
|
+
context 'when the criteria has limiting options' do
|
|
856
|
+
let(:person_two) do
|
|
888
857
|
Person.create!
|
|
889
858
|
end
|
|
890
859
|
|
|
891
|
-
let
|
|
892
|
-
|
|
860
|
+
let(:documents) do
|
|
861
|
+
criteria.entries
|
|
893
862
|
end
|
|
894
863
|
|
|
895
|
-
let
|
|
896
|
-
|
|
864
|
+
let(:post_three) do
|
|
865
|
+
person_two.posts.create!(title: 'three')
|
|
866
|
+
end
|
|
867
|
+
|
|
868
|
+
let(:criteria) do
|
|
869
|
+
Person.send(method_name, :posts).asc(:age).limit(1)
|
|
897
870
|
end
|
|
898
871
|
|
|
899
872
|
let(:context) do
|
|
@@ -901,33 +874,37 @@ describe Mongoid::Criteria::Includable do
|
|
|
901
874
|
end
|
|
902
875
|
|
|
903
876
|
before do
|
|
904
|
-
|
|
905
|
-
end
|
|
877
|
+
post_three
|
|
906
878
|
|
|
907
|
-
|
|
908
|
-
|
|
879
|
+
if method_name == :includes
|
|
880
|
+
expect(context).to receive(:eager_load).with([ person ]).once.and_call_original
|
|
881
|
+
else
|
|
882
|
+
expect(context).to receive(:eager_load_with_lookup).once.and_call_original
|
|
883
|
+
end
|
|
909
884
|
end
|
|
910
885
|
|
|
911
|
-
it
|
|
886
|
+
it 'returns the correct documents' do
|
|
912
887
|
expect(documents).to eq([ person ])
|
|
913
888
|
end
|
|
914
889
|
end
|
|
915
890
|
end
|
|
916
891
|
|
|
917
|
-
context
|
|
918
|
-
|
|
892
|
+
context 'when including a has one' do
|
|
919
893
|
let!(:game_one) do
|
|
920
|
-
person.create_game(name:
|
|
894
|
+
person.create_game(name: 'one')
|
|
921
895
|
end
|
|
922
896
|
|
|
923
897
|
let!(:game_two) do
|
|
924
|
-
person.create_game(name:
|
|
898
|
+
person.create_game(name: 'two')
|
|
925
899
|
end
|
|
926
900
|
|
|
927
|
-
context
|
|
901
|
+
context 'when the criteria has no options' do
|
|
902
|
+
let(:criteria) do
|
|
903
|
+
Person.asc(:age).send(method_name, :game)
|
|
904
|
+
end
|
|
928
905
|
|
|
929
|
-
let
|
|
930
|
-
|
|
906
|
+
let(:documents) do
|
|
907
|
+
criteria.entries
|
|
931
908
|
end
|
|
932
909
|
|
|
933
910
|
let(:context) do
|
|
@@ -935,30 +912,33 @@ describe Mongoid::Criteria::Includable do
|
|
|
935
912
|
end
|
|
936
913
|
|
|
937
914
|
before do
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
915
|
+
if method_name == :includes
|
|
916
|
+
expect(context).to receive(:eager_load).with([ person ]).once.and_call_original
|
|
917
|
+
else
|
|
918
|
+
expect(context).to receive(:eager_load_with_lookup).once.and_call_original
|
|
919
|
+
end
|
|
943
920
|
end
|
|
944
921
|
|
|
945
|
-
it
|
|
922
|
+
it 'returns the correct documents' do
|
|
946
923
|
expect(documents).to eq([ person ])
|
|
947
924
|
end
|
|
948
925
|
end
|
|
949
926
|
|
|
950
|
-
context
|
|
951
|
-
|
|
952
|
-
let!(:person_two) do
|
|
927
|
+
context 'when the criteria has limiting options' do
|
|
928
|
+
let(:person_two) do
|
|
953
929
|
Person.create!(age: 2)
|
|
954
930
|
end
|
|
955
931
|
|
|
956
|
-
let
|
|
957
|
-
|
|
932
|
+
let(:documents) do
|
|
933
|
+
criteria.entries
|
|
958
934
|
end
|
|
959
935
|
|
|
960
|
-
let
|
|
961
|
-
|
|
936
|
+
let(:game_three) do
|
|
937
|
+
person_two.create_game(name: 'Skyrim')
|
|
938
|
+
end
|
|
939
|
+
|
|
940
|
+
let(:criteria) do
|
|
941
|
+
Person.where(id: person.id).send(method_name, :game).asc(:age).limit(1)
|
|
962
942
|
end
|
|
963
943
|
|
|
964
944
|
let(:context) do
|
|
@@ -966,37 +946,42 @@ describe Mongoid::Criteria::Includable do
|
|
|
966
946
|
end
|
|
967
947
|
|
|
968
948
|
before do
|
|
969
|
-
|
|
970
|
-
|
|
949
|
+
person_two
|
|
950
|
+
game_three
|
|
971
951
|
|
|
972
|
-
|
|
973
|
-
|
|
952
|
+
if method_name == :includes
|
|
953
|
+
expect(context).to receive(:eager_load).with([ person ]).once.and_call_original
|
|
954
|
+
else
|
|
955
|
+
expect(context).to receive(:eager_load_with_lookup).once.and_call_original
|
|
956
|
+
end
|
|
974
957
|
end
|
|
975
958
|
|
|
976
|
-
it
|
|
959
|
+
it 'returns the correct documents' do
|
|
977
960
|
expect(documents).to eq([ person ])
|
|
978
961
|
end
|
|
979
962
|
end
|
|
980
963
|
end
|
|
981
964
|
|
|
982
|
-
context
|
|
983
|
-
|
|
965
|
+
context 'when including a belongs to' do
|
|
984
966
|
let(:person_two) do
|
|
985
967
|
Person.create!(age: 2)
|
|
986
968
|
end
|
|
987
969
|
|
|
988
970
|
let!(:game_one) do
|
|
989
|
-
person.create_game(name:
|
|
971
|
+
person.create_game(name: 'one')
|
|
990
972
|
end
|
|
991
973
|
|
|
992
974
|
let!(:game_two) do
|
|
993
|
-
person_two.create_game(name:
|
|
975
|
+
person_two.create_game(name: 'two')
|
|
994
976
|
end
|
|
995
977
|
|
|
996
|
-
context
|
|
978
|
+
context 'when providing no options' do
|
|
979
|
+
let(:criteria) do
|
|
980
|
+
Game.send(method_name, :person)
|
|
981
|
+
end
|
|
997
982
|
|
|
998
|
-
let
|
|
999
|
-
|
|
983
|
+
let(:documents) do
|
|
984
|
+
criteria.entries
|
|
1000
985
|
end
|
|
1001
986
|
|
|
1002
987
|
let(:context) do
|
|
@@ -1004,22 +989,27 @@ describe Mongoid::Criteria::Includable do
|
|
|
1004
989
|
end
|
|
1005
990
|
|
|
1006
991
|
before do
|
|
1007
|
-
|
|
1008
|
-
|
|
992
|
+
if method_name == :includes
|
|
993
|
+
expect(context).to receive(:preload).twice.and_call_original
|
|
994
|
+
else
|
|
995
|
+
expect(context).to receive(:preload_for_lookup).twice.and_call_original
|
|
996
|
+
end
|
|
1009
997
|
|
|
1010
|
-
|
|
1011
|
-
criteria.entries
|
|
998
|
+
documents
|
|
1012
999
|
end
|
|
1013
1000
|
|
|
1014
|
-
it
|
|
1001
|
+
it 'returns the correct documents' do
|
|
1015
1002
|
expect(criteria).to eq([ game_one, game_two ])
|
|
1016
1003
|
end
|
|
1017
1004
|
end
|
|
1018
1005
|
|
|
1019
|
-
context
|
|
1006
|
+
context 'when the criteria has limiting options' do
|
|
1007
|
+
let(:criteria) do
|
|
1008
|
+
Game.where(id: game_one.id).send(method_name, :person).asc(:_id).limit(1)
|
|
1009
|
+
end
|
|
1020
1010
|
|
|
1021
|
-
let
|
|
1022
|
-
|
|
1011
|
+
let(:documents) do
|
|
1012
|
+
criteria.entries
|
|
1023
1013
|
end
|
|
1024
1014
|
|
|
1025
1015
|
let(:context) do
|
|
@@ -1027,81 +1017,105 @@ describe Mongoid::Criteria::Includable do
|
|
|
1027
1017
|
end
|
|
1028
1018
|
|
|
1029
1019
|
before do
|
|
1030
|
-
|
|
1031
|
-
|
|
1020
|
+
if method_name == :includes
|
|
1021
|
+
expect(context).to receive(:eager_load).with([ game_one ]).once.and_call_original
|
|
1022
|
+
else
|
|
1023
|
+
expect(context).to receive(:eager_load_with_lookup).once.and_call_original
|
|
1024
|
+
end
|
|
1032
1025
|
|
|
1033
|
-
|
|
1034
|
-
criteria.entries
|
|
1026
|
+
documents
|
|
1035
1027
|
end
|
|
1036
1028
|
|
|
1037
|
-
it
|
|
1029
|
+
it 'returns the correct documents' do
|
|
1038
1030
|
expect(documents).to eq([ game_one ])
|
|
1039
1031
|
end
|
|
1040
1032
|
end
|
|
1041
1033
|
end
|
|
1042
1034
|
|
|
1043
|
-
context
|
|
1035
|
+
context 'when including multiples in the same criteria' do
|
|
1036
|
+
let(:documents) { criteria.entries }
|
|
1037
|
+
let(:post_one) { person.posts.create!(title: 'one') }
|
|
1038
|
+
let(:post_two) { person.posts.create!(title: 'two') }
|
|
1039
|
+
let(:game_one) { person.create_game(name: 'one') }
|
|
1040
|
+
let(:game_two) { person.create_game(name: 'two') }
|
|
1041
|
+
let(:criteria) { Person.send(method_name, :posts, :game).asc(:age) }
|
|
1042
|
+
let(:context) { criteria.context }
|
|
1044
1043
|
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1044
|
+
before do
|
|
1045
|
+
post_one
|
|
1046
|
+
post_two
|
|
1047
|
+
game_one
|
|
1048
|
+
game_two
|
|
1048
1049
|
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1050
|
+
if method_name == :includes
|
|
1051
|
+
expect(context).to receive(:preload).twice.and_call_original
|
|
1052
|
+
else
|
|
1053
|
+
expect(context).to receive(:preload_for_lookup).twice.and_call_original
|
|
1054
|
+
end
|
|
1052
1055
|
|
|
1053
|
-
|
|
1054
|
-
person.create_game(name: "one")
|
|
1056
|
+
documents
|
|
1055
1057
|
end
|
|
1056
1058
|
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
+
it 'returns the correct documents' do
|
|
1060
|
+
expect(criteria).to eq([ person ])
|
|
1059
1061
|
end
|
|
1062
|
+
end
|
|
1060
1063
|
|
|
1061
|
-
|
|
1062
|
-
|
|
1064
|
+
context 'when classes inherit from each other' do
|
|
1065
|
+
let!(:admin) do
|
|
1066
|
+
IncAdmin.create!(admin_level: 2)
|
|
1063
1067
|
end
|
|
1064
1068
|
|
|
1065
|
-
let(:
|
|
1066
|
-
|
|
1069
|
+
let!(:post) do
|
|
1070
|
+
admin.posts.create!
|
|
1067
1071
|
end
|
|
1068
1072
|
|
|
1069
|
-
|
|
1070
|
-
|
|
1073
|
+
let(:criteria) do
|
|
1074
|
+
IncUser.send(method_name, :posts)
|
|
1071
1075
|
end
|
|
1072
1076
|
|
|
1073
1077
|
let!(:documents) do
|
|
1074
|
-
criteria.entries
|
|
1078
|
+
query = -> { criteria.entries }
|
|
1079
|
+
(method_name == :eager_load) ? expect_less_than_queries(3, &query) : query.call
|
|
1075
1080
|
end
|
|
1076
1081
|
|
|
1077
|
-
it
|
|
1078
|
-
expect(
|
|
1082
|
+
it 'returns the correct documents' do
|
|
1083
|
+
expect(documents).to eq([ admin ])
|
|
1079
1084
|
end
|
|
1080
|
-
end
|
|
1081
1085
|
|
|
1082
|
-
|
|
1086
|
+
it 'eager loads the posts' do
|
|
1087
|
+
expect_query(0) do
|
|
1088
|
+
expect(documents.first.posts).to eq([ post ])
|
|
1089
|
+
end
|
|
1090
|
+
end
|
|
1091
|
+
end
|
|
1083
1092
|
|
|
1084
|
-
|
|
1093
|
+
context 'when including nested referenced associations' do
|
|
1094
|
+
context 'when using a has_one association' do
|
|
1085
1095
|
before(:all) do
|
|
1086
1096
|
class A
|
|
1087
1097
|
include Mongoid::Document
|
|
1098
|
+
|
|
1088
1099
|
has_one :b
|
|
1089
1100
|
end
|
|
1090
1101
|
|
|
1091
1102
|
class B
|
|
1092
1103
|
include Mongoid::Document
|
|
1104
|
+
|
|
1093
1105
|
belongs_to :a
|
|
1094
1106
|
has_one :c
|
|
1095
1107
|
end
|
|
1096
1108
|
|
|
1097
1109
|
class C
|
|
1098
1110
|
include Mongoid::Document
|
|
1111
|
+
|
|
1099
1112
|
belongs_to :b
|
|
1100
1113
|
has_one :d
|
|
1101
1114
|
end
|
|
1102
1115
|
|
|
1103
1116
|
class D
|
|
1104
1117
|
include Mongoid::Document
|
|
1118
|
+
|
|
1105
1119
|
belongs_to :c
|
|
1106
1120
|
end
|
|
1107
1121
|
end
|
|
@@ -1135,97 +1149,101 @@ describe Mongoid::Criteria::Includable do
|
|
|
1135
1149
|
a.b = b
|
|
1136
1150
|
end
|
|
1137
1151
|
|
|
1138
|
-
context
|
|
1152
|
+
context 'when including the belongs_to association' do
|
|
1139
1153
|
let!(:result) do
|
|
1140
|
-
C.
|
|
1154
|
+
C.send(method_name, b: :a).first
|
|
1141
1155
|
end
|
|
1142
1156
|
|
|
1143
|
-
it
|
|
1157
|
+
it 'finds the right document' do
|
|
1144
1158
|
expect(result).to eq(c)
|
|
1145
1159
|
expect(result.b).to eq(c.b)
|
|
1146
1160
|
expect(result.b.a).to eq(c.b.a)
|
|
1147
1161
|
end
|
|
1148
1162
|
|
|
1149
|
-
it
|
|
1150
|
-
|
|
1163
|
+
it 'does not execute a query' do
|
|
1164
|
+
expect_query(0) do
|
|
1151
1165
|
result.b.a
|
|
1152
1166
|
end
|
|
1153
1167
|
end
|
|
1154
1168
|
end
|
|
1155
1169
|
|
|
1156
|
-
context
|
|
1170
|
+
context 'when including a doubly-nested belongs_to association' do
|
|
1157
1171
|
let!(:result) do
|
|
1158
|
-
D.
|
|
1172
|
+
query = -> { D.send(method_name, c: { b: :a }).first }
|
|
1173
|
+
(method_name == :eager_load) ? expect_less_than_queries(3, &query) : query.call
|
|
1159
1174
|
end
|
|
1160
1175
|
|
|
1161
|
-
it
|
|
1176
|
+
it 'finds the right document' do
|
|
1162
1177
|
expect(result).to eq(d)
|
|
1163
1178
|
expect(result.c).to eq(d.c)
|
|
1164
1179
|
expect(result.c.b).to eq(d.c.b)
|
|
1165
1180
|
expect(result.c.b.a).to eq(d.c.b.a)
|
|
1166
1181
|
end
|
|
1167
1182
|
|
|
1168
|
-
it
|
|
1169
|
-
|
|
1183
|
+
it 'does not execute a query' do
|
|
1184
|
+
expect_query(0) do
|
|
1170
1185
|
result.c.b.a
|
|
1171
1186
|
end
|
|
1172
1187
|
end
|
|
1173
1188
|
end
|
|
1174
1189
|
|
|
1175
|
-
context
|
|
1190
|
+
context 'when including the has_many association' do
|
|
1176
1191
|
let!(:result) do
|
|
1177
|
-
A.
|
|
1192
|
+
query = -> { A.send(method_name, b: :c).first }
|
|
1193
|
+
(method_name == :eager_load) ? expect_less_than_queries(3, &query) : query.call
|
|
1178
1194
|
end
|
|
1179
1195
|
|
|
1180
|
-
it
|
|
1196
|
+
it 'finds the right document' do
|
|
1181
1197
|
expect(result).to eq(a)
|
|
1182
1198
|
expect(result.b).to eq(a.b)
|
|
1183
1199
|
expect(result.b.c).to eq(a.b.c)
|
|
1184
1200
|
end
|
|
1185
1201
|
|
|
1186
|
-
it
|
|
1187
|
-
|
|
1202
|
+
it 'does not executes a query' do
|
|
1203
|
+
expect_query(0) do
|
|
1188
1204
|
result.b.c
|
|
1189
1205
|
end
|
|
1190
1206
|
end
|
|
1191
1207
|
end
|
|
1192
1208
|
|
|
1193
|
-
context
|
|
1209
|
+
context 'when including a doubly-nested has_many association' do
|
|
1194
1210
|
let!(:result) do
|
|
1195
|
-
A.
|
|
1211
|
+
query = -> { A.send(method_name, b: { c: :d }).first }
|
|
1212
|
+
(method_name == :eager_load) ? expect_less_than_queries(3, &query) : query.call
|
|
1196
1213
|
end
|
|
1197
1214
|
|
|
1198
|
-
it
|
|
1215
|
+
it 'finds the right document' do
|
|
1199
1216
|
expect(result).to eq(a)
|
|
1200
1217
|
expect(result.b).to eq(a.b)
|
|
1201
1218
|
expect(result.b.c).to eq(a.b.c)
|
|
1202
1219
|
expect(result.b.c.d).to eq(a.b.c.d)
|
|
1203
1220
|
end
|
|
1204
1221
|
|
|
1205
|
-
it
|
|
1206
|
-
|
|
1222
|
+
it 'does not execute a query' do
|
|
1223
|
+
expect_query(0) do
|
|
1207
1224
|
result.b.c.d
|
|
1208
1225
|
end
|
|
1209
1226
|
end
|
|
1210
1227
|
end
|
|
1211
1228
|
|
|
1212
|
-
context
|
|
1229
|
+
context 'when there are multiple documents' do
|
|
1213
1230
|
let!(:as) do
|
|
1214
|
-
res = 9.times.map do |
|
|
1231
|
+
res = 9.times.map do |_i|
|
|
1215
1232
|
A.create!.tap do |a|
|
|
1216
1233
|
a.b = B.create!.tap do |b|
|
|
1217
1234
|
b.c = C.create!
|
|
1218
1235
|
end
|
|
1219
1236
|
end
|
|
1220
1237
|
end
|
|
1221
|
-
[a, *res]
|
|
1238
|
+
[ a, *res ]
|
|
1222
1239
|
end
|
|
1223
1240
|
|
|
1224
1241
|
let!(:results) do
|
|
1225
|
-
A.
|
|
1242
|
+
query = -> { A.send(method_name, b: :c).entries.sort }
|
|
1243
|
+
(method_name == :eager_load) ? expect_less_than_queries(3, &query) : query.call
|
|
1226
1244
|
end
|
|
1227
1245
|
|
|
1228
|
-
it
|
|
1246
|
+
it 'finds the right document' do
|
|
1229
1247
|
as.length.times do |i|
|
|
1230
1248
|
expect(as[i]).to eq(results[i])
|
|
1231
1249
|
expect(as[i].b).to eq(results[i].b)
|
|
@@ -1233,8 +1251,8 @@ describe Mongoid::Criteria::Includable do
|
|
|
1233
1251
|
end
|
|
1234
1252
|
end
|
|
1235
1253
|
|
|
1236
|
-
it
|
|
1237
|
-
|
|
1254
|
+
it 'does not execute a query' do
|
|
1255
|
+
expect_query(0) do
|
|
1238
1256
|
results.each do |a|
|
|
1239
1257
|
a.b.c
|
|
1240
1258
|
end
|
|
@@ -1242,7 +1260,7 @@ describe Mongoid::Criteria::Includable do
|
|
|
1242
1260
|
end
|
|
1243
1261
|
end
|
|
1244
1262
|
|
|
1245
|
-
context
|
|
1263
|
+
context 'when there are multiple associations' do
|
|
1246
1264
|
before(:all) do
|
|
1247
1265
|
class A
|
|
1248
1266
|
has_one :c
|
|
@@ -1256,16 +1274,18 @@ describe Mongoid::Criteria::Includable do
|
|
|
1256
1274
|
let(:c2) { C.create! }
|
|
1257
1275
|
let(:d2) { D.create! }
|
|
1258
1276
|
|
|
1277
|
+
let(:results) do
|
|
1278
|
+
query = -> { A.send(method_name, b: { c: :d }, c: :d).first }
|
|
1279
|
+
(method_name == :eager_load) ? expect_less_than_queries(3, &query) : query.call
|
|
1280
|
+
end
|
|
1281
|
+
|
|
1259
1282
|
before do
|
|
1260
1283
|
a.c = c2
|
|
1261
1284
|
a.c.d = d2
|
|
1285
|
+
results
|
|
1262
1286
|
end
|
|
1263
1287
|
|
|
1264
|
-
|
|
1265
|
-
A.includes(b: { c: :d }, c: :d).first
|
|
1266
|
-
end
|
|
1267
|
-
|
|
1268
|
-
it "finds the right document" do
|
|
1288
|
+
it 'finds the right document' do
|
|
1269
1289
|
expect(results).to eq(a)
|
|
1270
1290
|
expect(results.b).to eq(a.b)
|
|
1271
1291
|
expect(results.b.c).to eq(a.b.c)
|
|
@@ -1274,8 +1294,8 @@ describe Mongoid::Criteria::Includable do
|
|
|
1274
1294
|
expect(results.c.d).to eq(a.c.d)
|
|
1275
1295
|
end
|
|
1276
1296
|
|
|
1277
|
-
it
|
|
1278
|
-
|
|
1297
|
+
it 'does not execute a query' do
|
|
1298
|
+
expect_query(0) do
|
|
1279
1299
|
results.c.d
|
|
1280
1300
|
results.b.c.d
|
|
1281
1301
|
end
|
|
@@ -1284,8 +1304,28 @@ describe Mongoid::Criteria::Includable do
|
|
|
1284
1304
|
end
|
|
1285
1305
|
end
|
|
1286
1306
|
|
|
1287
|
-
context
|
|
1307
|
+
context 'when using a has_many association with an empty association' do
|
|
1308
|
+
let!(:user) do
|
|
1309
|
+
IncUser.create!
|
|
1310
|
+
end
|
|
1311
|
+
|
|
1312
|
+
let!(:result) do
|
|
1313
|
+
IncUser.send(method_name, :posts, :comments).where(id: user.id).first
|
|
1314
|
+
end
|
|
1315
|
+
|
|
1316
|
+
it 'executes the query' do
|
|
1317
|
+
expect(result).to eq(user)
|
|
1318
|
+
end
|
|
1319
|
+
|
|
1320
|
+
it 'does not issue extra queries' do
|
|
1321
|
+
expect_query(0) do
|
|
1322
|
+
result.posts.to_a
|
|
1323
|
+
result.comments.to_a
|
|
1324
|
+
end
|
|
1325
|
+
end
|
|
1326
|
+
end
|
|
1288
1327
|
|
|
1328
|
+
context 'when using a has_many association' do
|
|
1289
1329
|
let!(:user) do
|
|
1290
1330
|
IncUser.create!(posts: posts, comments: user_comments)
|
|
1291
1331
|
end
|
|
@@ -1295,19 +1335,20 @@ describe Mongoid::Criteria::Includable do
|
|
|
1295
1335
|
end
|
|
1296
1336
|
|
|
1297
1337
|
let!(:user_comments) do
|
|
1298
|
-
2.times.map{ IncComment.create! }
|
|
1338
|
+
2.times.map { IncComment.create! }
|
|
1299
1339
|
end
|
|
1300
1340
|
|
|
1301
1341
|
let!(:post_comments) do
|
|
1302
|
-
2.times.map{ IncComment.create! }
|
|
1342
|
+
2.times.map { IncComment.create! }
|
|
1303
1343
|
end
|
|
1304
1344
|
|
|
1305
|
-
context
|
|
1345
|
+
context 'when including the same class twice' do
|
|
1306
1346
|
let!(:results) do
|
|
1307
|
-
IncPost.
|
|
1347
|
+
query = -> { IncPost.send(method_name, { user: :comments }, :comments).entries.sort }
|
|
1348
|
+
(method_name == :eager_load) ? expect_less_than_queries(3, &query) : query.call
|
|
1308
1349
|
end
|
|
1309
1350
|
|
|
1310
|
-
it
|
|
1351
|
+
it 'finds the right documents' do
|
|
1311
1352
|
posts.length.times do |i|
|
|
1312
1353
|
expect(posts[i]).to eq(results[i])
|
|
1313
1354
|
expect(posts[i].user).to eq(results[i].user)
|
|
@@ -1316,8 +1357,8 @@ describe Mongoid::Criteria::Includable do
|
|
|
1316
1357
|
end
|
|
1317
1358
|
end
|
|
1318
1359
|
|
|
1319
|
-
it
|
|
1320
|
-
|
|
1360
|
+
it 'does not execute a query' do
|
|
1361
|
+
expect_query(0) do
|
|
1321
1362
|
results.each do |res|
|
|
1322
1363
|
res.user
|
|
1323
1364
|
res.user.comments.to_a
|
|
@@ -1327,14 +1368,15 @@ describe Mongoid::Criteria::Includable do
|
|
|
1327
1368
|
end
|
|
1328
1369
|
end
|
|
1329
1370
|
|
|
1330
|
-
context
|
|
1371
|
+
context 'when the association chain has a class name twice' do
|
|
1331
1372
|
let!(:thread) { IncThread.create!(comments: user_comments) }
|
|
1332
1373
|
|
|
1333
1374
|
let!(:result) do
|
|
1334
|
-
IncThread.
|
|
1375
|
+
query = -> { IncThread.send(method_name, comments: { user: { posts: :comments } }).first }
|
|
1376
|
+
(method_name == :eager_load) ? expect_less_than_queries(3, &query) : query.call
|
|
1335
1377
|
end
|
|
1336
1378
|
|
|
1337
|
-
it
|
|
1379
|
+
it 'finds the right document' do
|
|
1338
1380
|
expect(result).to eq(thread)
|
|
1339
1381
|
result.comments.length.times do |i|
|
|
1340
1382
|
c1 = result.comments[i]
|
|
@@ -1351,8 +1393,8 @@ describe Mongoid::Criteria::Includable do
|
|
|
1351
1393
|
end
|
|
1352
1394
|
end
|
|
1353
1395
|
|
|
1354
|
-
it
|
|
1355
|
-
|
|
1396
|
+
it 'does not execute a query' do
|
|
1397
|
+
expect_query(0) do
|
|
1356
1398
|
result.comments.each do |comment|
|
|
1357
1399
|
comment.user.posts.each do |post|
|
|
1358
1400
|
post.comments.to_a
|
|
@@ -1364,47 +1406,55 @@ describe Mongoid::Criteria::Includable do
|
|
|
1364
1406
|
end
|
|
1365
1407
|
end
|
|
1366
1408
|
|
|
1367
|
-
describe
|
|
1409
|
+
describe '#includes' do
|
|
1410
|
+
it_behaves_like 'eager loading', :includes
|
|
1411
|
+
end
|
|
1368
1412
|
|
|
1413
|
+
describe '#eager_load' do
|
|
1414
|
+
# 4.4 lookup does not support the lookup pipeline as it is currently written
|
|
1415
|
+
min_server_version '5.0'
|
|
1416
|
+
it_behaves_like 'eager loading', :eager_load
|
|
1417
|
+
end
|
|
1418
|
+
|
|
1419
|
+
describe '#inclusions' do
|
|
1369
1420
|
let(:criteria) do
|
|
1370
1421
|
Band.includes(:records)
|
|
1371
1422
|
end
|
|
1372
1423
|
|
|
1373
1424
|
let(:association) do
|
|
1374
|
-
Band.relations[
|
|
1425
|
+
Band.relations['records']
|
|
1375
1426
|
end
|
|
1376
1427
|
|
|
1377
|
-
it
|
|
1428
|
+
it 'returns the inclusions' do
|
|
1378
1429
|
expect(criteria.inclusions).to eq([ association ])
|
|
1379
1430
|
end
|
|
1380
1431
|
end
|
|
1381
1432
|
|
|
1382
|
-
describe
|
|
1383
|
-
|
|
1433
|
+
describe '#inclusions=' do
|
|
1384
1434
|
let(:criteria) do
|
|
1385
1435
|
Band.all
|
|
1386
1436
|
end
|
|
1387
1437
|
|
|
1388
1438
|
let(:association) do
|
|
1389
|
-
Band.relations[
|
|
1439
|
+
Band.relations['records']
|
|
1390
1440
|
end
|
|
1391
1441
|
|
|
1392
1442
|
before do
|
|
1393
1443
|
criteria.inclusions = [ association ]
|
|
1394
1444
|
end
|
|
1395
1445
|
|
|
1396
|
-
it
|
|
1446
|
+
it 'sets the inclusions' do
|
|
1397
1447
|
expect(criteria.inclusions).to eq([ association ])
|
|
1398
1448
|
end
|
|
1399
1449
|
end
|
|
1400
1450
|
|
|
1401
|
-
context
|
|
1451
|
+
context 'When multiple associations reference the same class' do
|
|
1402
1452
|
before do
|
|
1403
1453
|
IncBlog.create(
|
|
1404
1454
|
posts: [
|
|
1405
1455
|
IncBlogPost.create(author: IncAuthor.create),
|
|
1406
1456
|
IncBlogPost.create(author: IncAuthor.create),
|
|
1407
|
-
IncBlogPost.create(author: IncAuthor.create)
|
|
1457
|
+
IncBlogPost.create(author: IncAuthor.create)
|
|
1408
1458
|
],
|
|
1409
1459
|
highlighted_post: IncBlogPost.create(author: IncAuthor.create)
|
|
1410
1460
|
)
|
|
@@ -1414,14 +1464,14 @@ describe Mongoid::Criteria::Includable do
|
|
|
1414
1464
|
IncBlog.includes(:posts, highlighted_post: :author).first
|
|
1415
1465
|
end
|
|
1416
1466
|
|
|
1417
|
-
it
|
|
1418
|
-
|
|
1467
|
+
it 'does not execute a query' do
|
|
1468
|
+
expect_query(0) do
|
|
1419
1469
|
result.posts.to_a
|
|
1420
1470
|
result.highlighted_post
|
|
1421
1471
|
end
|
|
1422
1472
|
end
|
|
1423
1473
|
|
|
1424
|
-
it
|
|
1474
|
+
it 'executes a query for the non-retrieved elements' do
|
|
1425
1475
|
expect_query(3) do
|
|
1426
1476
|
result.posts.each do |post|
|
|
1427
1477
|
post.author
|
|
@@ -1430,13 +1480,13 @@ describe Mongoid::Criteria::Includable do
|
|
|
1430
1480
|
end
|
|
1431
1481
|
end
|
|
1432
1482
|
|
|
1433
|
-
context
|
|
1483
|
+
context 'When multiple parent_inclusions for the same association' do
|
|
1434
1484
|
before do
|
|
1435
1485
|
IncBlog.create(
|
|
1436
1486
|
posts: [
|
|
1437
1487
|
IncBlogPost.create(author: IncAuthor.create),
|
|
1438
1488
|
IncBlogPost.create(author: IncAuthor.create),
|
|
1439
|
-
IncBlogPost.create(author: IncAuthor.create)
|
|
1489
|
+
IncBlogPost.create(author: IncAuthor.create)
|
|
1440
1490
|
],
|
|
1441
1491
|
highlighted_post: IncBlogPost.create(author: IncAuthor.create),
|
|
1442
1492
|
pinned_post: IncBlogPost.create(author: IncAuthor.create)
|
|
@@ -1447,15 +1497,15 @@ describe Mongoid::Criteria::Includable do
|
|
|
1447
1497
|
IncBlog.includes(:posts, highlighted_post: :author, pinned_post: :author).first
|
|
1448
1498
|
end
|
|
1449
1499
|
|
|
1450
|
-
it
|
|
1451
|
-
|
|
1500
|
+
it 'does not execute a query' do
|
|
1501
|
+
expect_query(0) do
|
|
1452
1502
|
result.posts.to_a
|
|
1453
1503
|
result.highlighted_post
|
|
1454
1504
|
result.pinned_post
|
|
1455
1505
|
end
|
|
1456
1506
|
end
|
|
1457
1507
|
|
|
1458
|
-
it
|
|
1508
|
+
it 'executes a query for the non-retrieved elements' do
|
|
1459
1509
|
expect_query(3) do
|
|
1460
1510
|
result.posts.each do |post|
|
|
1461
1511
|
post.author
|
|
@@ -1463,13 +1513,12 @@ describe Mongoid::Criteria::Includable do
|
|
|
1463
1513
|
end
|
|
1464
1514
|
end
|
|
1465
1515
|
|
|
1466
|
-
context
|
|
1467
|
-
|
|
1516
|
+
context 'when including an association and using each twice on a criteria' do
|
|
1468
1517
|
let(:criteria) { IncPost.all.includes(:person) }
|
|
1469
1518
|
|
|
1470
1519
|
before do
|
|
1471
|
-
p = IncPerson.create!(name:
|
|
1472
|
-
4.times { IncPost.create!(person: p)}
|
|
1520
|
+
p = IncPerson.create!(name: 'name')
|
|
1521
|
+
4.times { IncPost.create!(person: p) }
|
|
1473
1522
|
criteria
|
|
1474
1523
|
expect_query(2) do
|
|
1475
1524
|
criteria.each(&:person)
|
|
@@ -1483,7 +1532,7 @@ describe Mongoid::Criteria::Includable do
|
|
|
1483
1532
|
# trying to retrieve their person.
|
|
1484
1533
|
# MONGOID-3942 reported that after iterating the criteria a second time,
|
|
1485
1534
|
# the posts would not get the eager loaded person.
|
|
1486
|
-
it
|
|
1535
|
+
it 'eager loads the criteria' do
|
|
1487
1536
|
expect_query(2) do
|
|
1488
1537
|
criteria.each(&:person)
|
|
1489
1538
|
end
|