mongoid 7.5.4 → 8.1.7
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 +3 -3
- data/README.md +6 -6
- data/Rakefile +44 -46
- data/lib/config/locales/en.yml +92 -43
- data/lib/mongoid/association/accessors.rb +44 -11
- data/lib/mongoid/association/bindable.rb +50 -2
- data/lib/mongoid/association/builders.rb +5 -3
- data/lib/mongoid/association/constrainable.rb +0 -1
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +34 -11
- data/lib/mongoid/association/embedded/cyclic.rb +1 -1
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
- data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +85 -46
- data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
- data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
- data/lib/mongoid/association/macros.rb +8 -1
- data/lib/mongoid/association/many.rb +11 -7
- data/lib/mongoid/association/nested/many.rb +5 -4
- data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
- data/lib/mongoid/association/nested/one.rb +45 -7
- data/lib/mongoid/association/one.rb +2 -2
- data/lib/mongoid/association/options.rb +9 -9
- data/lib/mongoid/association/proxy.rb +15 -4
- data/lib/mongoid/association/referenced/auto_save.rb +4 -3
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
- data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
- data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
- data/lib/mongoid/association/referenced/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
- data/lib/mongoid/association/referenced/has_many/proxy.rb +40 -21
- data/lib/mongoid/association/referenced/has_many.rb +3 -3
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
- data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
- data/lib/mongoid/association/referenced/has_one.rb +3 -3
- data/lib/mongoid/association/referenced/syncable.rb +4 -4
- data/lib/mongoid/association/reflections.rb +4 -4
- data/lib/mongoid/association/relatable.rb +44 -10
- data/lib/mongoid/association.rb +5 -5
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic.rb +16 -7
- data/lib/mongoid/attributes/dynamic.rb +4 -4
- data/lib/mongoid/attributes/nested.rb +6 -6
- data/lib/mongoid/attributes/processing.rb +37 -6
- data/lib/mongoid/attributes/projector.rb +2 -2
- data/lib/mongoid/attributes/readonly.rb +3 -3
- data/lib/mongoid/attributes.rb +51 -42
- data/lib/mongoid/changeable.rb +147 -14
- data/lib/mongoid/clients/options.rb +5 -1
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/clients/storage_options.rb +2 -5
- data/lib/mongoid/clients/validators/storage.rb +3 -15
- data/lib/mongoid/collection_configurable.rb +58 -0
- data/lib/mongoid/composable.rb +2 -0
- data/lib/mongoid/config/defaults.rb +60 -0
- data/lib/mongoid/config/options.rb +3 -0
- data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
- data/lib/mongoid/config/validators/client.rb +6 -6
- data/lib/mongoid/config/validators.rb +1 -0
- data/lib/mongoid/config.rb +153 -18
- data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
- data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
- data/lib/mongoid/contextual/aggregable/none.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +1 -1
- data/lib/mongoid/contextual/geo_near.rb +7 -7
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +285 -58
- data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
- data/lib/mongoid/contextual/mongo.rb +540 -346
- data/lib/mongoid/contextual/none.rb +193 -20
- data/lib/mongoid/contextual/queryable.rb +1 -1
- data/lib/mongoid/contextual.rb +14 -2
- data/lib/mongoid/copyable.rb +32 -8
- data/lib/mongoid/criteria/findable.rb +8 -5
- data/lib/mongoid/criteria/includable.rb +27 -22
- data/lib/mongoid/criteria/marshalable.rb +10 -2
- data/lib/mongoid/criteria/permission.rb +1 -1
- data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +15 -9
- data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
- data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
- data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
- data/lib/mongoid/criteria/queryable/key.rb +4 -4
- data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
- data/lib/mongoid/criteria/queryable/optional.rb +11 -17
- data/lib/mongoid/criteria/queryable/options.rb +2 -2
- data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
- data/lib/mongoid/criteria/queryable/selector.rb +92 -7
- data/lib/mongoid/criteria/queryable/smash.rb +40 -7
- data/lib/mongoid/criteria/queryable.rb +12 -7
- data/lib/mongoid/criteria/scopable.rb +2 -2
- data/lib/mongoid/criteria/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +20 -40
- data/lib/mongoid/deprecable.rb +37 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +127 -35
- data/lib/mongoid/equality.rb +8 -8
- data/lib/mongoid/errors/create_collection_failure.rb +33 -0
- data/lib/mongoid/errors/document_not_found.rb +10 -6
- data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
- data/lib/mongoid/errors/immutable_attribute.rb +26 -0
- data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
- data/lib/mongoid/errors/invalid_config_option.rb +1 -1
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +6 -2
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
- data/lib/mongoid/errors/invalid_relation.rb +1 -1
- data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
- data/lib/mongoid/errors/invalid_session_use.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
- data/lib/mongoid/errors/mongoid_error.rb +3 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
- data/lib/mongoid/errors/no_client_database.rb +1 -1
- data/lib/mongoid/errors/no_client_hosts.rb +1 -1
- data/lib/mongoid/errors/readonly_attribute.rb +1 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors/unknown_attribute.rb +1 -1
- data/lib/mongoid/errors.rb +6 -3
- data/lib/mongoid/extensions/array.rb +9 -7
- data/lib/mongoid/extensions/big_decimal.rb +33 -10
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +8 -2
- data/lib/mongoid/extensions/date.rb +26 -20
- data/lib/mongoid/extensions/date_time.rb +1 -1
- data/lib/mongoid/extensions/false_class.rb +1 -1
- data/lib/mongoid/extensions/float.rb +7 -4
- data/lib/mongoid/extensions/hash.rb +38 -9
- data/lib/mongoid/extensions/integer.rb +7 -4
- data/lib/mongoid/extensions/module.rb +1 -1
- data/lib/mongoid/extensions/object.rb +10 -8
- data/lib/mongoid/extensions/range.rb +41 -10
- data/lib/mongoid/extensions/regexp.rb +11 -4
- data/lib/mongoid/extensions/set.rb +11 -4
- data/lib/mongoid/extensions/string.rb +11 -22
- data/lib/mongoid/extensions/symbol.rb +4 -15
- data/lib/mongoid/extensions/time.rb +29 -16
- data/lib/mongoid/extensions/time_with_zone.rb +1 -2
- data/lib/mongoid/extensions/true_class.rb +1 -1
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +55 -7
- data/lib/mongoid/fields/foreign_key.rb +11 -4
- data/lib/mongoid/fields/localized.rb +19 -4
- data/lib/mongoid/fields/standard.rb +17 -7
- data/lib/mongoid/fields/validators/macro.rb +3 -9
- data/lib/mongoid/fields.rb +142 -28
- data/lib/mongoid/findable.rb +54 -24
- data/lib/mongoid/indexable/specification.rb +2 -2
- data/lib/mongoid/indexable/validators/options.rb +6 -2
- data/lib/mongoid/interceptable.rb +186 -16
- data/lib/mongoid/matchable.rb +1 -1
- data/lib/mongoid/matcher/eq_impl.rb +1 -1
- data/lib/mongoid/matcher/type.rb +1 -1
- data/lib/mongoid/matcher.rb +48 -14
- data/lib/mongoid/persistable/creatable.rb +19 -9
- data/lib/mongoid/persistable/deletable.rb +2 -2
- data/lib/mongoid/persistable/destroyable.rb +1 -1
- data/lib/mongoid/persistable/savable.rb +14 -2
- data/lib/mongoid/persistable/unsettable.rb +2 -2
- data/lib/mongoid/persistable/updatable.rb +69 -12
- data/lib/mongoid/persistable/upsertable.rb +21 -2
- data/lib/mongoid/persistable.rb +6 -3
- data/lib/mongoid/persistence_context.rb +6 -4
- data/lib/mongoid/query_cache.rb +13 -261
- data/lib/mongoid/railties/controller_runtime.rb +1 -1
- data/lib/mongoid/railties/database.rake +7 -2
- data/lib/mongoid/reloadable.rb +10 -8
- data/lib/mongoid/scopable.rb +15 -13
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/serializable.rb +17 -13
- data/lib/mongoid/stateful.rb +57 -10
- data/lib/mongoid/tasks/database.rake +12 -0
- data/lib/mongoid/tasks/database.rb +20 -2
- data/lib/mongoid/threaded/lifecycle.rb +5 -5
- data/lib/mongoid/threaded.rb +42 -12
- data/lib/mongoid/timestamps/created.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +2 -2
- data/lib/mongoid/touchable.rb +3 -4
- data/lib/mongoid/traversable.rb +10 -5
- data/lib/mongoid/utils.rb +22 -0
- data/lib/mongoid/validatable/associated.rb +98 -17
- data/lib/mongoid/validatable/localizable.rb +1 -1
- data/lib/mongoid/validatable/macros.rb +5 -7
- data/lib/mongoid/validatable/presence.rb +2 -2
- data/lib/mongoid/validatable/uniqueness.rb +9 -8
- data/lib/mongoid/validatable.rb +17 -6
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +19 -4
- data/lib/mongoid.rb +17 -3
- data/spec/config/mongoid.yml +16 -0
- data/spec/integration/app_spec.rb +24 -19
- data/spec/integration/associations/belongs_to_spec.rb +18 -0
- data/spec/integration/associations/embedded_spec.rb +15 -0
- data/spec/integration/associations/embeds_many_spec.rb +15 -2
- data/spec/integration/associations/embeds_one_spec.rb +18 -0
- data/spec/integration/associations/foreign_key_spec.rb +9 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
- data/spec/integration/associations/has_one_spec.rb +97 -1
- data/spec/integration/associations/scope_option_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +132 -1
- data/spec/integration/callbacks_spec.rb +381 -4
- data/spec/integration/criteria/range_spec.rb +95 -1
- data/spec/integration/discriminator_key_spec.rb +118 -80
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +3 -32
- data/spec/integration/matcher_examples_spec.rb +20 -13
- data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
- data/spec/integration/matcher_operator_spec.rb +3 -5
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/mongoid/association/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +9 -9
- data/spec/mongoid/association/eager_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +290 -65
- data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +16 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
- data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +19 -0
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +215 -177
- data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
- data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
- data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
- data/spec/mongoid/association/syncable_spec.rb +15 -1
- data/spec/mongoid/atomic/paths_spec.rb +0 -14
- data/spec/mongoid/attributes/nested_spec.rb +80 -11
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_spec.rb +1 -5
- data/spec/mongoid/attributes_spec.rb +526 -33
- data/spec/mongoid/changeable_spec.rb +429 -37
- data/spec/mongoid/clients/factory_spec.rb +23 -30
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +149 -15
- data/spec/mongoid/collection_configurable_spec.rb +158 -0
- data/spec/mongoid/config/defaults_spec.rb +160 -0
- data/spec/mongoid/config_spec.rb +214 -31
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
- data/spec/mongoid/contextual/memory_spec.rb +850 -88
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
- data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
- data/spec/mongoid/contextual/none_spec.rb +60 -21
- data/spec/mongoid/copyable_spec.rb +453 -11
- data/spec/mongoid/criteria/findable_spec.rb +86 -210
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
- data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
- data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
- data/spec/mongoid/criteria/translator_spec.rb +132 -0
- data/spec/mongoid/criteria_projection_spec.rb +1 -5
- data/spec/mongoid/criteria_spec.rb +469 -1205
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
- data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +16 -2
- data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
- data/spec/mongoid/extensions/binary_spec.rb +44 -9
- data/spec/mongoid/extensions/boolean_spec.rb +68 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
- data/spec/mongoid/extensions/date_spec.rb +71 -1
- data/spec/mongoid/extensions/date_time_spec.rb +15 -9
- data/spec/mongoid/extensions/float_spec.rb +53 -74
- data/spec/mongoid/extensions/hash_spec.rb +33 -3
- data/spec/mongoid/extensions/integer_spec.rb +50 -64
- data/spec/mongoid/extensions/range_spec.rb +255 -54
- data/spec/mongoid/extensions/regexp_spec.rb +58 -33
- data/spec/mongoid/extensions/set_spec.rb +106 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -25
- data/spec/mongoid/extensions/symbol_spec.rb +18 -25
- data/spec/mongoid/extensions/time_spec.rb +639 -106
- data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
- data/spec/mongoid/factory_spec.rb +61 -1
- data/spec/mongoid/fields/localized_spec.rb +80 -37
- data/spec/mongoid/fields_spec.rb +503 -87
- data/spec/mongoid/findable_spec.rb +450 -58
- data/spec/mongoid/indexable/specification_spec.rb +2 -2
- data/spec/mongoid/indexable_spec.rb +55 -30
- data/spec/mongoid/interceptable_spec.rb +824 -22
- data/spec/mongoid/interceptable_spec_models.rb +235 -4
- data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +28 -8
- data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
- data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
- data/spec/mongoid/persistable/logical_spec.rb +37 -0
- data/spec/mongoid/persistable/poppable_spec.rb +36 -0
- data/spec/mongoid/persistable/pullable_spec.rb +72 -0
- data/spec/mongoid/persistable/pushable_spec.rb +72 -0
- data/spec/mongoid/persistable/renamable_spec.rb +36 -0
- data/spec/mongoid/persistable/savable_spec.rb +96 -0
- data/spec/mongoid/persistable/settable_spec.rb +37 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
- data/spec/mongoid/persistable/updatable_spec.rb +20 -28
- data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
- data/spec/mongoid/persistence_context_spec.rb +31 -57
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +56 -215
- data/spec/mongoid/reloadable_spec.rb +83 -6
- data/spec/mongoid/scopable_spec.rb +91 -1
- data/spec/mongoid/serializable_spec.rb +25 -39
- data/spec/mongoid/shardable_spec.rb +4 -4
- data/spec/mongoid/stateful_spec.rb +150 -8
- data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
- data/spec/mongoid/tasks/database_spec.rb +127 -0
- data/spec/mongoid/timestamps_spec.rb +392 -4
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +390 -2
- data/spec/mongoid/touchable_spec_models.rb +14 -8
- data/spec/mongoid/traversable_spec.rb +13 -35
- data/spec/mongoid/validatable/associated_spec.rb +27 -34
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/mongoid_spec.rb +34 -16
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/spec_helper.rb +5 -0
- data/spec/support/constraints.rb +24 -0
- data/spec/support/immutable_ids.rb +118 -0
- data/spec/support/macros.rb +78 -0
- data/spec/support/models/artist.rb +0 -1
- data/spec/support/models/augmentation.rb +12 -0
- data/spec/support/models/band.rb +5 -0
- data/spec/support/models/book.rb +1 -0
- data/spec/support/models/building.rb +2 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/support/models/circus.rb +3 -0
- data/spec/support/models/cover.rb +10 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/support/models/implant.rb +9 -0
- data/spec/support/models/label.rb +2 -0
- data/spec/support/models/lat_lng.rb +6 -0
- data/spec/support/models/name.rb +10 -0
- data/spec/support/models/passport.rb +9 -0
- data/spec/support/models/person.rb +2 -0
- data/spec/support/models/player.rb +2 -0
- data/spec/support/models/powerup.rb +12 -0
- data/spec/support/models/product.rb +1 -0
- data/spec/support/models/purse.rb +9 -0
- data/spec/support/models/registry.rb +1 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/support/models/weapon.rb +12 -0
- metadata +101 -96
- checksums.yaml.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
- data/spec/shared/LICENSE +0 -20
- data/spec/shared/bin/get-mongodb-download-url +0 -17
- data/spec/shared/bin/s3-copy +0 -45
- data/spec/shared/bin/s3-upload +0 -69
- data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
- data/spec/shared/lib/mrss/cluster_config.rb +0 -231
- data/spec/shared/lib/mrss/constraints.rb +0 -378
- data/spec/shared/lib/mrss/docker_runner.rb +0 -291
- data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
- data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
- data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
- data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
- data/spec/shared/lib/mrss/session_registry.rb +0 -69
- data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
- data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
- data/spec/shared/lib/mrss/utils.rb +0 -15
- data/spec/shared/share/Dockerfile.erb +0 -325
- data/spec/shared/share/haproxy-1.conf +0 -16
- data/spec/shared/share/haproxy-2.conf +0 -17
- data/spec/shared/shlib/config.sh +0 -27
- data/spec/shared/shlib/distro.sh +0 -74
- data/spec/shared/shlib/server.sh +0 -392
- data/spec/shared/shlib/set_env.sh +0 -169
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -3
@@ -1344,6 +1344,34 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
1344
1344
|
)
|
1345
1345
|
end
|
1346
1346
|
end
|
1347
|
+
|
1348
|
+
context 'when any_of has multiple arguments' do
|
1349
|
+
|
1350
|
+
let(:selection) do
|
1351
|
+
query.or(field: [ 1, 2 ]).where(foo: 'bar').any_of({a: 1}, {b: 2})
|
1352
|
+
end
|
1353
|
+
|
1354
|
+
it 'adds the new condition to top level' do
|
1355
|
+
expect(selection.selector).to eq(
|
1356
|
+
'$or' => [{'field' => [1, 2]}],
|
1357
|
+
'foo' => 'bar',
|
1358
|
+
'$and' => [{'$or' => [{'a' => 1}, {'b' => 2}]}],
|
1359
|
+
)
|
1360
|
+
end
|
1361
|
+
|
1362
|
+
context 'when query already has a top-level $and' do
|
1363
|
+
let(:selection) do
|
1364
|
+
query.or(field: [ 1, 2 ]).where('$and' => [foo: 'bar']).any_of({a: 1}, {b: 2})
|
1365
|
+
end
|
1366
|
+
|
1367
|
+
it 'adds the new condition to top level $and' do
|
1368
|
+
expect(selection.selector).to eq(
|
1369
|
+
'$or' => [{'field' => [1, 2]}],
|
1370
|
+
'$and' => [{'foo' => 'bar'}, {'$or' => [{'a' => 1}, {'b' => 2}]}],
|
1371
|
+
)
|
1372
|
+
end
|
1373
|
+
end
|
1374
|
+
end
|
1347
1375
|
end
|
1348
1376
|
|
1349
1377
|
context "when provided multiple criteria" do
|
@@ -2065,5 +2093,446 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
2065
2093
|
end
|
2066
2094
|
end
|
2067
2095
|
end
|
2096
|
+
|
2097
|
+
# This test confirms that MONGOID-5097 has been repaired.
|
2098
|
+
context "when using exists on a field of type Time" do
|
2099
|
+
let(:criteria) do
|
2100
|
+
Dictionary.any_of({:published.exists => true}, published: nil)
|
2101
|
+
end
|
2102
|
+
|
2103
|
+
it "doesn't raise an error" do
|
2104
|
+
expect do
|
2105
|
+
criteria
|
2106
|
+
end.to_not raise_error
|
2107
|
+
end
|
2108
|
+
|
2109
|
+
it "generates the correct selector" do
|
2110
|
+
expect(criteria.selector).to eq({
|
2111
|
+
"$or" => [ {
|
2112
|
+
"published" => { "$exists" => true }
|
2113
|
+
}, {
|
2114
|
+
"published" => nil
|
2115
|
+
} ] } )
|
2116
|
+
end
|
2117
|
+
end
|
2118
|
+
end
|
2119
|
+
|
2120
|
+
describe "#none_of" do
|
2121
|
+
context 'when argument is a mix of Criteria and hashes' do
|
2122
|
+
let(:query) { Mongoid::Query.new.where(hello: 'world') }
|
2123
|
+
let(:other1) { Mongoid::Query.new.where(foo: 'bar') }
|
2124
|
+
let(:other2) { { bar: 42 } }
|
2125
|
+
let(:other3) { Mongoid::Query.new.where(a: 2) }
|
2126
|
+
|
2127
|
+
let(:result) { query.none_of(other1, other2, other3) }
|
2128
|
+
|
2129
|
+
it 'combines' do
|
2130
|
+
expect(result.selector).to eq(
|
2131
|
+
'hello' => 'world',
|
2132
|
+
'$nor' => [
|
2133
|
+
{'foo' => 'bar'},
|
2134
|
+
{'bar' => 42},
|
2135
|
+
{'a' => 2},
|
2136
|
+
],
|
2137
|
+
)
|
2138
|
+
end
|
2139
|
+
end
|
2140
|
+
|
2141
|
+
context "when provided no arguments" do
|
2142
|
+
let(:selection) { query.none_of }
|
2143
|
+
|
2144
|
+
it_behaves_like 'returns a cloned query'
|
2145
|
+
|
2146
|
+
it "does not add any criteria" do
|
2147
|
+
expect(selection.selector).to eq({})
|
2148
|
+
end
|
2149
|
+
|
2150
|
+
it "returns the query" do
|
2151
|
+
expect(selection).to eq(query)
|
2152
|
+
end
|
2153
|
+
end
|
2154
|
+
|
2155
|
+
context "when provided nil" do
|
2156
|
+
let(:selection) { query.none_of(nil) }
|
2157
|
+
|
2158
|
+
it_behaves_like 'returns a cloned query'
|
2159
|
+
|
2160
|
+
it "does not add any criteria" do
|
2161
|
+
expect(selection.selector).to eq({})
|
2162
|
+
end
|
2163
|
+
|
2164
|
+
it "returns the query" do
|
2165
|
+
expect(selection).to eq(query)
|
2166
|
+
end
|
2167
|
+
end
|
2168
|
+
|
2169
|
+
context "when provided a single criterion" do
|
2170
|
+
let(:selection) { query.none_of(field: [ 1, 2 ]) }
|
2171
|
+
|
2172
|
+
it_behaves_like 'returns a cloned query'
|
2173
|
+
|
2174
|
+
it 'adds the $nor selector' do
|
2175
|
+
expect(selection.selector).to eq(
|
2176
|
+
'$nor' => [ { 'field' => [ 1, 2 ] } ],
|
2177
|
+
)
|
2178
|
+
end
|
2179
|
+
|
2180
|
+
context 'when the criterion is wrapped in array' do
|
2181
|
+
let(:selection) { query.none_of([{ field: [ 1, 2 ] }]) }
|
2182
|
+
|
2183
|
+
it_behaves_like 'returns a cloned query'
|
2184
|
+
|
2185
|
+
it 'adds the condition' do
|
2186
|
+
expect(selection.selector).to eq(
|
2187
|
+
'$nor' => [ { 'field' => [ 1, 2 ] } ],
|
2188
|
+
)
|
2189
|
+
end
|
2190
|
+
|
2191
|
+
context 'when the array has nil as one of the elements' do
|
2192
|
+
let(:selection) { query.none_of([{ field: [ 1, 2 ] }, nil]) }
|
2193
|
+
|
2194
|
+
it_behaves_like 'returns a cloned query'
|
2195
|
+
|
2196
|
+
it 'adds the $nor selector ignoring the nil element' do
|
2197
|
+
expect(selection.selector).to eq(
|
2198
|
+
'$nor' => [ { 'field' => [ 1, 2 ] } ],
|
2199
|
+
)
|
2200
|
+
end
|
2201
|
+
end
|
2202
|
+
end
|
2203
|
+
|
2204
|
+
context 'when query already has a condition on another field' do
|
2205
|
+
context 'when there is one argument' do
|
2206
|
+
let(:selection) { query.where(foo: 'bar').none_of(field: [ 1, 2 ]) }
|
2207
|
+
|
2208
|
+
it 'adds the new condition' do
|
2209
|
+
expect(selection.selector).to eq(
|
2210
|
+
'foo' => 'bar',
|
2211
|
+
'$nor' => [ { 'field' => [1, 2] } ],
|
2212
|
+
)
|
2213
|
+
end
|
2214
|
+
end
|
2215
|
+
|
2216
|
+
context 'when there are multiple arguments' do
|
2217
|
+
let(:selection) do
|
2218
|
+
query.where(foo: 'bar').none_of({ field: [ 1, 2 ] }, { hello: 'world' })
|
2219
|
+
end
|
2220
|
+
|
2221
|
+
it 'adds the new condition' do
|
2222
|
+
expect(selection.selector).to eq(
|
2223
|
+
'foo' => 'bar',
|
2224
|
+
'$nor' => [
|
2225
|
+
{ 'field' => [1, 2] },
|
2226
|
+
{ 'hello' => 'world' },
|
2227
|
+
],
|
2228
|
+
)
|
2229
|
+
end
|
2230
|
+
end
|
2231
|
+
end
|
2232
|
+
|
2233
|
+
context 'when query already has a $nor condition and another condition' do
|
2234
|
+
let(:selection) do
|
2235
|
+
query.nor(field: [ 1, 2 ]).where(foo: 'bar').none_of(test: 1)
|
2236
|
+
end
|
2237
|
+
|
2238
|
+
it 'adds the new condition' do
|
2239
|
+
expect(selection.selector).to eq(
|
2240
|
+
'$nor' => [ { 'field' => [1, 2] } ],
|
2241
|
+
'foo' => 'bar',
|
2242
|
+
'$and' => [ { '$nor' => [ { 'test' => 1 } ] } ]
|
2243
|
+
)
|
2244
|
+
end
|
2245
|
+
end
|
2246
|
+
|
2247
|
+
context 'when none_of has multiple arguments' do
|
2248
|
+
let(:selection) do
|
2249
|
+
query.nor(field: [ 1, 2 ]).where(foo: 'bar').none_of({a: 1}, {b: 2})
|
2250
|
+
end
|
2251
|
+
|
2252
|
+
it 'adds the new condition to top level' do
|
2253
|
+
expect(selection.selector).to eq(
|
2254
|
+
'foo' => 'bar',
|
2255
|
+
'$nor' => [ { 'field' => [1, 2] } ],
|
2256
|
+
'$and' => [ { '$nor' => [ { 'a' => 1 }, { 'b' => 2 } ] } ]
|
2257
|
+
)
|
2258
|
+
end
|
2259
|
+
|
2260
|
+
context 'when query already has a top-level $and' do
|
2261
|
+
let(:selection) do
|
2262
|
+
query.nor(field: [ 1, 2 ]).where('$and' => [foo: 'bar']).none_of({a: 1}, {b: 2})
|
2263
|
+
end
|
2264
|
+
|
2265
|
+
it 'adds the new condition to top level $and' do
|
2266
|
+
expect(selection.selector).to eq(
|
2267
|
+
'$nor' => [ { 'field' => [1, 2] } ],
|
2268
|
+
'$and' => [
|
2269
|
+
{ 'foo' => 'bar' },
|
2270
|
+
{ '$nor' => [ { 'a' => 1 }, { 'b' => 2 } ] }
|
2271
|
+
],
|
2272
|
+
)
|
2273
|
+
end
|
2274
|
+
end
|
2275
|
+
end
|
2276
|
+
end
|
2277
|
+
|
2278
|
+
context "when provided multiple criteria" do
|
2279
|
+
context "when the criteria are for different fields" do
|
2280
|
+
let(:selection) do
|
2281
|
+
query.none_of({ first: [ 1, 2 ] }, { second: [ 3, 4 ] })
|
2282
|
+
end
|
2283
|
+
|
2284
|
+
it_behaves_like 'returns a cloned query'
|
2285
|
+
|
2286
|
+
it "adds the $nor selector" do
|
2287
|
+
expect(selection.selector).to eq({
|
2288
|
+
"$nor" => [
|
2289
|
+
{ "first" => [ 1, 2 ] },
|
2290
|
+
{ "second" => [ 3, 4 ] }
|
2291
|
+
]
|
2292
|
+
})
|
2293
|
+
end
|
2294
|
+
end
|
2295
|
+
|
2296
|
+
context "when the criteria uses a Key instance" do
|
2297
|
+
let(:selection) do
|
2298
|
+
query.none_of({ first: [ 1, 2 ] }, { :second.gt => 3 })
|
2299
|
+
end
|
2300
|
+
|
2301
|
+
it "adds the $nor selector" do
|
2302
|
+
expect(selection.selector).to eq({
|
2303
|
+
"$nor" => [
|
2304
|
+
{ "first" => [ 1, 2 ] },
|
2305
|
+
{ "second" => { "$gt" => 3 }}
|
2306
|
+
]
|
2307
|
+
})
|
2308
|
+
end
|
2309
|
+
|
2310
|
+
it_behaves_like 'returns a cloned query'
|
2311
|
+
end
|
2312
|
+
|
2313
|
+
context 'when criteria are simple and handled via Key' do
|
2314
|
+
shared_examples_for 'adds conditions with $nor' do
|
2315
|
+
it "adds conditions with $nor" do
|
2316
|
+
expect(selection.selector).to eq({
|
2317
|
+
'$nor' => [
|
2318
|
+
{'field' => 3},
|
2319
|
+
{'field' => {'$lt' => 5}},
|
2320
|
+
],
|
2321
|
+
})
|
2322
|
+
end
|
2323
|
+
|
2324
|
+
it_behaves_like 'returns a cloned query'
|
2325
|
+
end
|
2326
|
+
|
2327
|
+
shared_examples_for 'combines conditions with $eq' do
|
2328
|
+
it "combines conditions with $eq" do
|
2329
|
+
expect(selection.selector).to eq({
|
2330
|
+
'$nor' => [ { 'field' => { '$eq' => 3, '$lt' => 5 } } ]
|
2331
|
+
})
|
2332
|
+
end
|
2333
|
+
|
2334
|
+
it_behaves_like 'returns a cloned query'
|
2335
|
+
end
|
2336
|
+
|
2337
|
+
shared_examples_for 'combines conditions with $regex' do
|
2338
|
+
it 'combines conditions with $regex' do
|
2339
|
+
expect(selection.selector).to eq({
|
2340
|
+
'$nor' => [ { 'field' => { '$regex' => /t/, '$lt' => 5 } } ]
|
2341
|
+
})
|
2342
|
+
end
|
2343
|
+
|
2344
|
+
it_behaves_like 'returns a cloned query'
|
2345
|
+
end
|
2346
|
+
|
2347
|
+
context 'criteria are provided in the same hash' do
|
2348
|
+
context 'non-regexp argument' do
|
2349
|
+
let(:selection) { query.none_of(:field => 3, :field.lt => 5) }
|
2350
|
+
it_behaves_like 'combines conditions with $eq'
|
2351
|
+
end
|
2352
|
+
|
2353
|
+
context 'regexp argument' do
|
2354
|
+
let(:selection) { query.none_of(:field => /t/, :field.lt => 5) }
|
2355
|
+
it_behaves_like 'combines conditions with $regex'
|
2356
|
+
end
|
2357
|
+
end
|
2358
|
+
|
2359
|
+
context 'criteria are provided in separate hashes' do
|
2360
|
+
let(:selection) { query.none_of({:field => 3}, {:field.lt => 5}) }
|
2361
|
+
it_behaves_like 'adds conditions with $nor'
|
2362
|
+
end
|
2363
|
+
|
2364
|
+
context 'when the criterion is wrapped in an array' do
|
2365
|
+
let(:selection) { query.none_of([:field => 3], [:field.lt => 5]) }
|
2366
|
+
it_behaves_like 'adds conditions with $nor'
|
2367
|
+
end
|
2368
|
+
end
|
2369
|
+
|
2370
|
+
context 'when criteria are handled via Key and simple' do
|
2371
|
+
shared_examples_for 'adds conditions with $nor' do
|
2372
|
+
it 'adds conditions with $nor' do
|
2373
|
+
expect(selection.selector).to eq({
|
2374
|
+
'$nor' => [
|
2375
|
+
{ 'field' => { '$gt' => 3 } },
|
2376
|
+
{ 'field' => 5 },
|
2377
|
+
],
|
2378
|
+
})
|
2379
|
+
end
|
2380
|
+
|
2381
|
+
it_behaves_like 'returns a cloned query'
|
2382
|
+
end
|
2383
|
+
|
2384
|
+
shared_examples_for 'combines conditions with $eq' do
|
2385
|
+
it 'combines conditions with $eq' do
|
2386
|
+
expect(selection.selector).to eq(
|
2387
|
+
'$nor' => [ { 'field' => {'$gt' => 3, '$eq' => 5} } ],
|
2388
|
+
)
|
2389
|
+
end
|
2390
|
+
|
2391
|
+
it_behaves_like 'returns a cloned query'
|
2392
|
+
end
|
2393
|
+
|
2394
|
+
shared_examples_for 'combines conditions with $regex' do
|
2395
|
+
it 'combines conditions with $regex' do
|
2396
|
+
expect(selection.selector).to eq(
|
2397
|
+
'$nor' => [ { 'field' => {'$gt' => 3, '$regex' => /t/} } ],
|
2398
|
+
)
|
2399
|
+
end
|
2400
|
+
|
2401
|
+
it_behaves_like 'returns a cloned query'
|
2402
|
+
end
|
2403
|
+
|
2404
|
+
context 'criteria are provided in the same hash' do
|
2405
|
+
context 'non-regexp argument' do
|
2406
|
+
let(:selection) { query.none_of(:field.gt => 3, :field => 5) }
|
2407
|
+
it_behaves_like 'combines conditions with $eq'
|
2408
|
+
end
|
2409
|
+
|
2410
|
+
context 'regexp argument' do
|
2411
|
+
let(:selection) { query.none_of(:field.gt => 3, :field => /t/) }
|
2412
|
+
it_behaves_like 'combines conditions with $regex'
|
2413
|
+
end
|
2414
|
+
end
|
2415
|
+
|
2416
|
+
context 'criteria are provided in separate hashes' do
|
2417
|
+
let(:selection) { query.none_of({:field.gt => 3}, {:field => 5}) }
|
2418
|
+
it_behaves_like 'adds conditions with $nor'
|
2419
|
+
end
|
2420
|
+
|
2421
|
+
context 'when the criterion is wrapped in an array' do
|
2422
|
+
let(:selection) { query.none_of([:field.gt => 3], [:field => 5]) }
|
2423
|
+
it_behaves_like 'adds conditions with $nor'
|
2424
|
+
end
|
2425
|
+
end
|
2426
|
+
|
2427
|
+
context 'when a criterion has an aliased field' do
|
2428
|
+
let(:selection) { query.none_of({ id: 1 }) }
|
2429
|
+
|
2430
|
+
it 'adds the $nor selector and aliases the field' do
|
2431
|
+
expect(selection.selector).to eq('$nor' => [{ '_id' => 1 }])
|
2432
|
+
end
|
2433
|
+
|
2434
|
+
it_behaves_like 'returns a cloned query'
|
2435
|
+
end
|
2436
|
+
|
2437
|
+
context 'when a criterion is wrapped in an array' do
|
2438
|
+
let(:selection) do
|
2439
|
+
query.none_of([{ first: [ 1, 2 ] }, { :second.gt => 3 }])
|
2440
|
+
end
|
2441
|
+
|
2442
|
+
it_behaves_like 'returns a cloned query'
|
2443
|
+
|
2444
|
+
it 'adds the $ nor selector' do
|
2445
|
+
expect(selection.selector).to eq({
|
2446
|
+
'$nor' => [
|
2447
|
+
{ 'first' => [ 1, 2 ] },
|
2448
|
+
{ 'second' => { '$gt' => 3 }}
|
2449
|
+
]
|
2450
|
+
})
|
2451
|
+
end
|
2452
|
+
end
|
2453
|
+
|
2454
|
+
context "when the criteria are on the same field" do
|
2455
|
+
let(:selection) do
|
2456
|
+
query.none_of({ first: [ 1, 2 ] }, { first: [ 3, 4 ] })
|
2457
|
+
end
|
2458
|
+
|
2459
|
+
it_behaves_like 'returns a cloned query'
|
2460
|
+
|
2461
|
+
it 'appends both $nor expressions' do
|
2462
|
+
expect(selection.selector).to eq({
|
2463
|
+
"$nor" => [
|
2464
|
+
{ "first" => [ 1, 2 ] },
|
2465
|
+
{ "first" => [ 3, 4 ] }
|
2466
|
+
]
|
2467
|
+
})
|
2468
|
+
end
|
2469
|
+
end
|
2470
|
+
end
|
2471
|
+
|
2472
|
+
context 'when chaining the criteria' do
|
2473
|
+
context 'when the criteria are for different fields' do
|
2474
|
+
let(:selection) do
|
2475
|
+
query.none_of(first: [ 1, 2 ]).none_of(second: [ 3, 4 ])
|
2476
|
+
end
|
2477
|
+
|
2478
|
+
it_behaves_like 'returns a cloned query'
|
2479
|
+
|
2480
|
+
it 'adds the conditions separately' do
|
2481
|
+
expect(selection.selector).to eq(
|
2482
|
+
'$nor' => [ { 'first' => [ 1, 2 ] } ],
|
2483
|
+
'$and' => [ { '$nor' => [ { 'second' => [ 3, 4 ] } ] } ],
|
2484
|
+
)
|
2485
|
+
end
|
2486
|
+
end
|
2487
|
+
|
2488
|
+
context "when the criteria are on the same field" do
|
2489
|
+
let(:selection) do
|
2490
|
+
query.none_of(first: [ 1, 2 ]).none_of(first: [ 3, 4 ])
|
2491
|
+
end
|
2492
|
+
|
2493
|
+
it_behaves_like 'returns a cloned query'
|
2494
|
+
|
2495
|
+
it 'adds the conditions separately' do
|
2496
|
+
expect(selection.selector).to eq(
|
2497
|
+
'$nor' => [ { 'first' => [ 1, 2 ] } ],
|
2498
|
+
'$and' => [ { '$nor' => [ { 'first' => [ 3, 4 ] } ] } ]
|
2499
|
+
)
|
2500
|
+
end
|
2501
|
+
end
|
2502
|
+
end
|
2503
|
+
|
2504
|
+
context 'when using multiple criteria and symbol operators' do
|
2505
|
+
context 'when using fields that meaningfully evolve values' do
|
2506
|
+
let(:query) do
|
2507
|
+
Dictionary.none_of({a: 1}, :published.gt => Date.new(2020, 2, 3))
|
2508
|
+
end
|
2509
|
+
|
2510
|
+
it 'generates the expected query' do
|
2511
|
+
query.selector.should == {'$nor' => [
|
2512
|
+
{'a' => 1},
|
2513
|
+
# Date instance is converted to a Time instance in local time,
|
2514
|
+
# because we are querying on a Time field and dates are interpreted
|
2515
|
+
# in local time when assigning to Time fields
|
2516
|
+
{'published' => {'$gt' => Time.local(2020, 2, 3) } },
|
2517
|
+
] }
|
2518
|
+
end
|
2519
|
+
end
|
2520
|
+
|
2521
|
+
context 'when using fields that do not meaningfully evolve values' do
|
2522
|
+
let(:query) do
|
2523
|
+
Dictionary.none_of({a: 1}, :submitted_on.gt => Date.new(2020, 2, 3))
|
2524
|
+
end
|
2525
|
+
|
2526
|
+
it 'generates the expected query' do
|
2527
|
+
query.selector.should == {'$nor' => [
|
2528
|
+
{'a' => 1},
|
2529
|
+
# Date instance is converted to a Time instance in UTC,
|
2530
|
+
# because we are querying on a Date field and dates are interpreted
|
2531
|
+
# in UTC when persisted as dates by Mongoid
|
2532
|
+
{'submitted_on' => {'$gt' => Time.utc(2020, 2, 3)}},
|
2533
|
+
]}
|
2534
|
+
end
|
2535
|
+
end
|
2536
|
+
end
|
2068
2537
|
end
|
2069
2538
|
end
|
@@ -754,127 +754,119 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
754
754
|
end
|
755
755
|
end
|
756
756
|
|
757
|
-
|
758
|
-
describe "#geo_spacial" do
|
757
|
+
describe "#geo_spatial" do
|
759
758
|
|
760
|
-
|
759
|
+
let(:query_method) { :geo_spatial }
|
761
760
|
|
762
|
-
|
763
|
-
|
761
|
+
it_behaves_like 'requires an argument'
|
762
|
+
it_behaves_like 'requires a non-nil argument'
|
764
763
|
|
765
|
-
|
764
|
+
context "when provided a criterion" do
|
766
765
|
|
767
|
-
|
766
|
+
context "when the geometry is a point intersection" do
|
768
767
|
|
769
|
-
|
770
|
-
|
771
|
-
|
768
|
+
let(:selection) do
|
769
|
+
query.geo_spatial(:location.intersects_point => [ 1, 10 ])
|
770
|
+
end
|
772
771
|
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
|
780
|
-
}
|
772
|
+
it "adds the $geoIntersects expression" do
|
773
|
+
expect(selection.selector).to eq({
|
774
|
+
"location" => {
|
775
|
+
"$geoIntersects" => {
|
776
|
+
"$geometry" => {
|
777
|
+
"type" => "Point",
|
778
|
+
"coordinates" => [ 1, 10 ]
|
781
779
|
}
|
782
780
|
}
|
783
|
-
}
|
784
|
-
|
785
|
-
|
786
|
-
it_behaves_like "returns a cloned query"
|
781
|
+
}
|
782
|
+
})
|
787
783
|
end
|
788
784
|
|
789
|
-
|
785
|
+
it_behaves_like "returns a cloned query"
|
786
|
+
end
|
787
|
+
|
788
|
+
context "when the geometry is a line intersection" do
|
790
789
|
|
791
|
-
|
792
|
-
|
793
|
-
|
790
|
+
let(:selection) do
|
791
|
+
query.geo_spatial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
|
792
|
+
end
|
794
793
|
|
795
|
-
|
796
|
-
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
}
|
794
|
+
it "adds the $geoIntersects expression" do
|
795
|
+
expect(selection.selector).to eq({
|
796
|
+
"location" => {
|
797
|
+
"$geoIntersects" => {
|
798
|
+
"$geometry" => {
|
799
|
+
"type" => "LineString",
|
800
|
+
"coordinates" => [[ 1, 10 ], [ 2, 10 ]]
|
803
801
|
}
|
804
802
|
}
|
805
|
-
}
|
806
|
-
|
807
|
-
|
808
|
-
it_behaves_like "returns a cloned query"
|
803
|
+
}
|
804
|
+
})
|
809
805
|
end
|
810
806
|
|
811
|
-
|
807
|
+
it_behaves_like "returns a cloned query"
|
808
|
+
end
|
812
809
|
|
813
|
-
|
814
|
-
query.public_send(query_method,
|
815
|
-
:location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
816
|
-
)
|
817
|
-
end
|
810
|
+
context "when the geometry is a polygon intersection" do
|
818
811
|
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
|
825
|
-
|
826
|
-
|
812
|
+
let(:selection) do
|
813
|
+
query.geo_spatial(:location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]])
|
814
|
+
end
|
815
|
+
|
816
|
+
it "adds the $geoIntersects expression" do
|
817
|
+
expect(selection.selector).to eq({
|
818
|
+
"location" => {
|
819
|
+
"$geoIntersects" => {
|
820
|
+
"$geometry" => {
|
821
|
+
"type" => "Polygon",
|
822
|
+
"coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
827
823
|
}
|
828
824
|
}
|
829
|
-
}
|
830
|
-
|
825
|
+
}
|
826
|
+
})
|
827
|
+
end
|
828
|
+
|
829
|
+
it_behaves_like "returns a cloned query"
|
830
|
+
end
|
831
831
|
|
832
|
-
|
832
|
+
context "when the geometry is within a polygon" do
|
833
|
+
|
834
|
+
let(:selection) do
|
835
|
+
query.geo_spatial(:location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]])
|
833
836
|
end
|
834
837
|
|
835
|
-
|
838
|
+
it "adds the $geoIntersects expression" do
|
839
|
+
expect(selection.selector).to eq({
|
840
|
+
"location" => {
|
841
|
+
"$geoWithin" => {
|
842
|
+
"$geometry" => {
|
843
|
+
"type" => "Polygon",
|
844
|
+
"coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
845
|
+
}
|
846
|
+
}
|
847
|
+
}
|
848
|
+
})
|
849
|
+
end
|
836
850
|
|
851
|
+
context "when used with the $box operator ($geoWithin query) " do
|
837
852
|
let(:selection) do
|
838
|
-
query.
|
839
|
-
:location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
840
|
-
)
|
853
|
+
query.geo_spatial(:location.within_box => [[ 1, 10 ], [ 2, 10 ]])
|
841
854
|
end
|
842
855
|
|
843
856
|
it "adds the $geoIntersects expression" do
|
844
857
|
expect(selection.selector).to eq({
|
845
858
|
"location" => {
|
846
859
|
"$geoWithin" => {
|
847
|
-
"$
|
848
|
-
|
849
|
-
|
850
|
-
}
|
860
|
+
"$box" => [
|
861
|
+
[ 1, 10 ], [ 2, 10 ]
|
862
|
+
]
|
851
863
|
}
|
852
864
|
}
|
853
865
|
})
|
854
866
|
end
|
855
|
-
|
856
|
-
context "when used with the $box operator ($geoWithin query) " do
|
857
|
-
let(:selection) do
|
858
|
-
query.public_send(query_method,
|
859
|
-
:location.within_box => [[ 1, 10 ], [ 2, 10 ]]
|
860
|
-
)
|
861
|
-
end
|
862
|
-
|
863
|
-
it "adds the $geoIntersects expression" do
|
864
|
-
expect(selection.selector).to eq({
|
865
|
-
"location" => {
|
866
|
-
"$geoWithin" => {
|
867
|
-
"$box" => [
|
868
|
-
[ 1, 10 ], [ 2, 10 ]
|
869
|
-
]
|
870
|
-
}
|
871
|
-
}
|
872
|
-
})
|
873
|
-
end
|
874
|
-
end
|
875
|
-
|
876
|
-
it_behaves_like "returns a cloned query"
|
877
867
|
end
|
868
|
+
|
869
|
+
it_behaves_like "returns a cloned query"
|
878
870
|
end
|
879
871
|
end
|
880
872
|
end
|
@@ -2053,7 +2045,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
2053
2045
|
end
|
2054
2046
|
|
2055
2047
|
# MongoDB server can only handle one text expression at a time,
|
2056
|
-
# per https://
|
2048
|
+
# per https://www.mongodb.com/docs/manual/reference/operator/query/text/.
|
2057
2049
|
# Nonetheless we test that the query is built correctly when
|
2058
2050
|
# a user supplies more than one text condition.
|
2059
2051
|
it 'merges conditions' do
|