mongoid 7.0.13 → 8.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +30 -30
- data/README.md +32 -19
- data/Rakefile +43 -0
- data/lib/config/locales/en.yml +178 -95
- data/lib/mongoid/association/accessors.rb +175 -83
- data/lib/mongoid/association/bindable.rb +57 -28
- data/lib/mongoid/association/builders.rb +8 -14
- data/lib/mongoid/association/constrainable.rb +5 -7
- data/lib/mongoid/association/depending.rb +9 -18
- data/lib/mongoid/association/eager_loadable.rb +31 -10
- data/lib/mongoid/association/embedded/batchable.rb +67 -53
- data/lib/mongoid/association/embedded/cyclic.rb +10 -17
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +27 -9
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +7 -4
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +14 -24
- data/lib/mongoid/association/embedded/embedded_in.rb +9 -28
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +5 -8
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +8 -5
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +143 -122
- data/lib/mongoid/association/embedded/embeds_many.rb +8 -36
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +4 -8
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +26 -9
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +63 -29
- data/lib/mongoid/association/embedded/embeds_one.rb +9 -33
- data/lib/mongoid/association/embedded.rb +2 -0
- data/lib/mongoid/association/macros.rb +71 -41
- data/lib/mongoid/association/many.rb +25 -35
- data/lib/mongoid/association/marshalable.rb +3 -6
- data/lib/mongoid/association/nested/many.rb +22 -30
- data/lib/mongoid/association/nested/nested_buildable.rb +9 -15
- data/lib/mongoid/association/nested/one.rb +19 -30
- data/lib/mongoid/association/nested.rb +3 -3
- data/lib/mongoid/association/one.rb +5 -12
- data/lib/mongoid/association/options.rb +16 -46
- data/lib/mongoid/association/proxy.rb +37 -38
- data/lib/mongoid/association/referenced/auto_save.rb +9 -14
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +5 -9
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +11 -9
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +40 -3
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +19 -31
- data/lib/mongoid/association/referenced/belongs_to.rb +16 -38
- data/lib/mongoid/association/referenced/counter_cache.rb +14 -25
- data/lib/mongoid/association/referenced/eager.rb +41 -40
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -11
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -5
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +105 -68
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +29 -46
- data/lib/mongoid/association/referenced/has_many/binding.rb +3 -6
- data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -5
- data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +440 -456
- data/lib/mongoid/association/referenced/has_many/proxy.rb +101 -124
- data/lib/mongoid/association/referenced/has_many.rb +21 -45
- data/lib/mongoid/association/referenced/has_one/binding.rb +4 -9
- data/lib/mongoid/association/referenced/has_one/buildable.rb +20 -6
- data/lib/mongoid/association/referenced/has_one/eager.rb +2 -1
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +16 -29
- data/lib/mongoid/association/referenced/has_one/proxy.rb +25 -30
- data/lib/mongoid/association/referenced/has_one.rb +16 -36
- data/lib/mongoid/association/referenced/syncable.rb +11 -26
- data/lib/mongoid/association/referenced.rb +2 -0
- data/lib/mongoid/association/reflections.rb +7 -6
- data/lib/mongoid/association/relatable.rb +62 -84
- data/lib/mongoid/association.rb +13 -27
- data/lib/mongoid/atomic/modifiers.rb +29 -53
- data/lib/mongoid/atomic/paths/embedded/many.rb +23 -7
- data/lib/mongoid/atomic/paths/embedded/one.rb +4 -7
- data/lib/mongoid/atomic/paths/embedded.rb +2 -3
- data/lib/mongoid/atomic/paths/root.rb +4 -7
- data/lib/mongoid/atomic/paths.rb +2 -1
- data/lib/mongoid/atomic.rb +45 -51
- data/lib/mongoid/attributes/dynamic.rb +6 -21
- data/lib/mongoid/attributes/nested.rb +11 -14
- data/lib/mongoid/attributes/processing.rb +46 -30
- data/lib/mongoid/attributes/projector.rb +119 -0
- data/lib/mongoid/attributes/readonly.rb +5 -8
- data/lib/mongoid/attributes.rb +80 -98
- data/lib/mongoid/cacheable.rb +7 -10
- data/lib/mongoid/changeable.rb +49 -70
- data/lib/mongoid/clients/factory.rb +42 -17
- data/lib/mongoid/clients/options.rb +15 -14
- data/lib/mongoid/clients/sessions.rb +4 -20
- data/lib/mongoid/clients/storage_options.rb +7 -12
- data/lib/mongoid/clients/validators/storage.rb +5 -12
- data/lib/mongoid/clients/validators.rb +2 -1
- data/lib/mongoid/clients.rb +3 -10
- data/lib/mongoid/composable.rb +5 -9
- data/lib/mongoid/config/environment.rb +30 -5
- data/lib/mongoid/config/options.rb +23 -23
- data/lib/mongoid/config/validators/client.rb +8 -23
- data/lib/mongoid/config/validators/option.rb +2 -3
- data/lib/mongoid/config/validators.rb +2 -1
- data/lib/mongoid/config.rb +164 -48
- data/lib/mongoid/contextual/aggregable/memory.rb +40 -27
- data/lib/mongoid/contextual/aggregable/mongo.rb +32 -33
- data/lib/mongoid/contextual/aggregable/none.rb +65 -0
- data/lib/mongoid/contextual/aggregable.rb +17 -0
- data/lib/mongoid/contextual/atomic.rb +29 -31
- data/lib/mongoid/contextual/command.rb +2 -5
- data/lib/mongoid/contextual/geo_near.rb +13 -44
- data/lib/mongoid/contextual/map_reduce.rb +7 -35
- data/lib/mongoid/contextual/memory.rb +187 -81
- data/lib/mongoid/contextual/mongo.rb +360 -239
- data/lib/mongoid/contextual/none.rb +109 -31
- data/lib/mongoid/contextual/queryable.rb +3 -4
- data/lib/mongoid/contextual.rb +9 -11
- data/lib/mongoid/copyable.rb +42 -17
- data/lib/mongoid/criteria/findable.rb +19 -19
- data/lib/mongoid/criteria/includable.rb +30 -33
- data/lib/mongoid/criteria/inspectable.rb +2 -3
- data/lib/mongoid/criteria/marshalable.rb +12 -7
- data/lib/mongoid/criteria/modifiable.rb +2 -19
- data/lib/mongoid/criteria/options.rb +2 -3
- data/lib/mongoid/criteria/permission.rb +3 -2
- data/lib/mongoid/criteria/queryable/aggregable.rb +4 -15
- data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +7 -41
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +28 -8
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -6
- data/lib/mongoid/criteria/queryable/extensions/date.rb +9 -9
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +11 -12
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +4 -41
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -21
- data/lib/mongoid/criteria/queryable/extensions/object.rb +6 -30
- data/lib/mongoid/criteria/queryable/extensions/range.rb +49 -17
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -16
- data/lib/mongoid/criteria/queryable/extensions/set.rb +4 -5
- data/lib/mongoid/criteria/queryable/extensions/string.rb +7 -32
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +7 -22
- data/lib/mongoid/criteria/queryable/extensions/time.rb +9 -9
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
- data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
- data/lib/mongoid/criteria/queryable/key.rb +39 -24
- data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
- data/lib/mongoid/criteria/queryable/mergeable.rb +200 -40
- data/lib/mongoid/criteria/queryable/optional.rb +10 -59
- data/lib/mongoid/criteria/queryable/options.rb +4 -21
- data/lib/mongoid/criteria/queryable/pipeline.rb +5 -15
- data/lib/mongoid/criteria/queryable/selectable.rb +417 -171
- data/lib/mongoid/criteria/queryable/selector.rb +127 -30
- data/lib/mongoid/criteria/queryable/smash.rb +42 -18
- data/lib/mongoid/criteria/queryable/storable.rb +237 -0
- data/lib/mongoid/criteria/queryable.rb +18 -15
- data/lib/mongoid/criteria/scopable.rb +29 -21
- data/lib/mongoid/criteria/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +95 -107
- data/lib/mongoid/deprecable.rb +37 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +148 -97
- data/lib/mongoid/equality.rb +35 -18
- data/lib/mongoid/errors/ambiguous_relationship.rb +4 -5
- data/lib/mongoid/errors/callback.rb +2 -3
- data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
- data/lib/mongoid/errors/delete_restriction.rb +10 -13
- data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
- data/lib/mongoid/errors/document_not_found.rb +35 -21
- data/lib/mongoid/errors/empty_config_file.rb +25 -0
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
- data/lib/mongoid/errors/invalid_collection.rb +2 -1
- data/lib/mongoid/errors/invalid_config_file.rb +25 -0
- data/lib/mongoid/errors/invalid_config_option.rb +3 -4
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +3 -4
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
- data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
- data/lib/mongoid/errors/invalid_field.rb +8 -7
- data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
- data/lib/mongoid/errors/invalid_field_option.rb +2 -3
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/invalid_find.rb +2 -3
- data/lib/mongoid/errors/invalid_includes.rb +2 -3
- data/lib/mongoid/errors/invalid_index.rb +2 -3
- data/lib/mongoid/errors/invalid_options.rb +4 -5
- data/lib/mongoid/errors/invalid_path.rb +2 -3
- data/lib/mongoid/errors/invalid_persistence_option.rb +2 -5
- data/lib/mongoid/errors/invalid_query.rb +40 -0
- data/lib/mongoid/errors/invalid_relation.rb +5 -10
- data/lib/mongoid/errors/invalid_relation_option.rb +4 -5
- data/lib/mongoid/errors/invalid_scope.rb +2 -3
- data/lib/mongoid/errors/invalid_session_use.rb +3 -6
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
- data/lib/mongoid/errors/invalid_storage_options.rb +3 -4
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
- data/lib/mongoid/errors/invalid_time.rb +2 -3
- data/lib/mongoid/errors/inverse_not_found.rb +3 -4
- data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
- data/lib/mongoid/errors/mixed_relations.rb +2 -3
- data/lib/mongoid/errors/mongoid_error.rb +6 -13
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
- data/lib/mongoid/errors/no_client_config.rb +4 -5
- data/lib/mongoid/errors/no_client_database.rb +3 -4
- data/lib/mongoid/errors/no_client_hosts.rb +3 -4
- data/lib/mongoid/errors/no_clients_config.rb +2 -3
- data/lib/mongoid/errors/no_default_client.rb +3 -4
- data/lib/mongoid/errors/no_environment.rb +2 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
- data/lib/mongoid/errors/no_metadata.rb +2 -3
- data/lib/mongoid/errors/no_parent.rb +2 -3
- data/lib/mongoid/errors/readonly_attribute.rb +3 -4
- data/lib/mongoid/errors/readonly_document.rb +3 -6
- data/lib/mongoid/errors/scope_overwrite.rb +2 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -1
- data/lib/mongoid/errors/unknown_attribute.rb +3 -4
- data/lib/mongoid/errors/unknown_model.rb +2 -3
- data/lib/mongoid/errors/unsaved_document.rb +3 -2
- data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
- data/lib/mongoid/errors/validations.rb +2 -1
- data/lib/mongoid/errors.rb +14 -3
- data/lib/mongoid/evolvable.rb +4 -5
- data/lib/mongoid/extensions/array.rb +37 -44
- data/lib/mongoid/extensions/big_decimal.rb +35 -21
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +10 -6
- data/lib/mongoid/extensions/date.rb +32 -25
- data/lib/mongoid/extensions/date_time.rb +5 -13
- data/lib/mongoid/extensions/decimal128.rb +2 -5
- data/lib/mongoid/extensions/false_class.rb +5 -8
- data/lib/mongoid/extensions/float.rb +12 -14
- data/lib/mongoid/extensions/hash.rb +87 -45
- data/lib/mongoid/extensions/integer.rb +12 -16
- data/lib/mongoid/extensions/module.rb +3 -4
- data/lib/mongoid/extensions/nil_class.rb +2 -5
- data/lib/mongoid/extensions/object.rb +25 -50
- data/lib/mongoid/extensions/object_id.rb +2 -7
- data/lib/mongoid/extensions/range.rb +42 -20
- data/lib/mongoid/extensions/regexp.rb +13 -7
- data/lib/mongoid/extensions/set.rb +13 -11
- data/lib/mongoid/extensions/string.rb +30 -61
- data/lib/mongoid/extensions/symbol.rb +6 -22
- data/lib/mongoid/extensions/time.rb +37 -23
- data/lib/mongoid/extensions/time_with_zone.rb +26 -9
- data/lib/mongoid/extensions/true_class.rb +5 -8
- data/lib/mongoid/extensions.rb +19 -3
- data/lib/mongoid/factory.rb +104 -17
- data/lib/mongoid/fields/foreign_key.rb +14 -26
- data/lib/mongoid/fields/localized.rb +11 -15
- data/lib/mongoid/fields/standard.rb +13 -43
- data/lib/mongoid/fields/validators/macro.rb +32 -20
- data/lib/mongoid/fields/validators.rb +2 -1
- data/lib/mongoid/fields.rb +328 -85
- data/lib/mongoid/findable.rb +90 -33
- data/lib/mongoid/indexable/specification.rb +5 -18
- data/lib/mongoid/indexable/validators/options.rb +8 -9
- data/lib/mongoid/indexable.rb +6 -21
- data/lib/mongoid/inspectable.rb +4 -11
- data/lib/mongoid/interceptable.rb +191 -41
- data/lib/mongoid/loggable.rb +13 -16
- data/lib/mongoid/matchable.rb +3 -154
- data/lib/mongoid/matcher/all.rb +22 -0
- data/lib/mongoid/matcher/and.rb +21 -0
- data/lib/mongoid/matcher/bits.rb +41 -0
- data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
- data/lib/mongoid/matcher/bits_all_set.rb +20 -0
- data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
- data/lib/mongoid/matcher/bits_any_set.rb +20 -0
- data/lib/mongoid/matcher/elem_match.rb +36 -0
- data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
- data/lib/mongoid/matcher/eq.rb +11 -0
- data/lib/mongoid/matcher/eq_impl.rb +67 -0
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
- data/lib/mongoid/matcher/exists.rb +15 -0
- data/lib/mongoid/matcher/expression.rb +35 -0
- data/lib/mongoid/matcher/expression_operator.rb +19 -0
- data/lib/mongoid/matcher/field_expression.rb +62 -0
- data/lib/mongoid/matcher/field_operator.rb +54 -0
- data/lib/mongoid/matcher/gt.rb +17 -0
- data/lib/mongoid/matcher/gte.rb +17 -0
- data/lib/mongoid/matcher/in.rb +25 -0
- data/lib/mongoid/matcher/lt.rb +17 -0
- data/lib/mongoid/matcher/lte.rb +17 -0
- data/lib/mongoid/matcher/mod.rb +17 -0
- data/lib/mongoid/matcher/ne.rb +16 -0
- data/lib/mongoid/matcher/nin.rb +11 -0
- data/lib/mongoid/matcher/nor.rb +25 -0
- data/lib/mongoid/matcher/not.rb +29 -0
- data/lib/mongoid/matcher/or.rb +21 -0
- data/lib/mongoid/matcher/regex.rb +41 -0
- data/lib/mongoid/matcher/size.rb +26 -0
- data/lib/mongoid/matcher/type.rb +99 -0
- data/lib/mongoid/matcher.rb +130 -0
- data/lib/mongoid/persistable/creatable.rb +22 -30
- data/lib/mongoid/persistable/deletable.rb +6 -22
- data/lib/mongoid/persistable/destroyable.rb +12 -11
- data/lib/mongoid/persistable/incrementable.rb +6 -7
- data/lib/mongoid/persistable/logical.rb +4 -6
- data/lib/mongoid/persistable/poppable.rb +3 -6
- data/lib/mongoid/persistable/pullable.rb +3 -8
- data/lib/mongoid/persistable/pushable.rb +3 -8
- data/lib/mongoid/persistable/renamable.rb +10 -8
- data/lib/mongoid/persistable/savable.rb +5 -10
- data/lib/mongoid/persistable/settable.rb +3 -6
- data/lib/mongoid/persistable/unsettable.rb +9 -9
- data/lib/mongoid/persistable/updatable.rb +50 -31
- data/lib/mongoid/persistable/upsertable.rb +5 -10
- data/lib/mongoid/persistable.rb +135 -40
- data/lib/mongoid/persistence_context.rb +85 -45
- data/lib/mongoid/positional.rb +2 -5
- data/lib/mongoid/query_cache.rb +13 -280
- data/lib/mongoid/railtie.rb +3 -16
- data/lib/mongoid/railties/controller_runtime.rb +4 -2
- data/lib/mongoid/railties/database.rake +9 -0
- data/lib/mongoid/reloadable.rb +19 -22
- data/lib/mongoid/scopable.rb +34 -57
- data/lib/mongoid/selectable.rb +8 -18
- data/lib/mongoid/serializable.rb +33 -34
- data/lib/mongoid/shardable.rb +108 -21
- data/lib/mongoid/stateful.rb +38 -19
- data/lib/mongoid/stringified_symbol.rb +52 -0
- data/lib/mongoid/tasks/database.rake +12 -5
- data/lib/mongoid/tasks/database.rb +85 -7
- data/lib/mongoid/threaded/lifecycle.rb +7 -26
- data/lib/mongoid/threaded.rb +44 -67
- data/lib/mongoid/timestamps/created/short.rb +2 -1
- data/lib/mongoid/timestamps/created.rb +4 -3
- data/lib/mongoid/timestamps/short.rb +2 -1
- data/lib/mongoid/timestamps/timeless.rb +6 -9
- data/lib/mongoid/timestamps/updated/short.rb +2 -1
- data/lib/mongoid/timestamps/updated.rb +5 -6
- data/lib/mongoid/timestamps.rb +3 -2
- data/lib/mongoid/touchable.rb +54 -25
- data/lib/mongoid/traversable.rb +185 -61
- data/lib/mongoid/validatable/associated.rb +99 -22
- data/lib/mongoid/validatable/format.rb +2 -1
- data/lib/mongoid/validatable/length.rb +2 -1
- data/lib/mongoid/validatable/localizable.rb +3 -4
- data/lib/mongoid/validatable/macros.rb +2 -9
- data/lib/mongoid/validatable/presence.rb +10 -15
- data/lib/mongoid/validatable/queryable.rb +2 -3
- data/lib/mongoid/validatable/uniqueness.rb +29 -41
- data/lib/mongoid/validatable.rb +22 -33
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/warnings.rb +28 -0
- data/lib/mongoid.rb +34 -15
- data/lib/rails/generators/mongoid/config/config_generator.rb +2 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +53 -32
- data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
- data/lib/rails/generators/mongoid_generator.rb +2 -1
- data/lib/rails/mongoid.rb +4 -5
- data/spec/README.md +19 -4
- data/spec/config/mongoid.yml +17 -0
- data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
- data/spec/integration/app_spec.rb +31 -27
- data/spec/integration/associations/belongs_to_spec.rb +20 -0
- data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
- data/spec/integration/associations/embedded_spec.rb +162 -55
- data/spec/integration/associations/embeds_many_spec.rb +219 -0
- data/spec/integration/associations/embeds_one_spec.rb +41 -0
- data/spec/integration/associations/foreign_key_spec.rb +107 -0
- data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
- data/spec/integration/associations/has_many_spec.rb +128 -0
- data/spec/integration/associations/has_one_spec.rb +272 -0
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
- data/spec/integration/associations/reverse_population_spec.rb +34 -0
- data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
- data/spec/integration/associations/scope_option_spec.rb +101 -0
- data/spec/integration/atomic/modifiers_spec.rb +116 -0
- data/spec/integration/bson_regexp_raw_spec.rb +19 -0
- data/spec/integration/callbacks_models.rb +107 -1
- data/spec/integration/callbacks_spec.rb +262 -8
- data/spec/integration/contextual/empty_spec.rb +141 -0
- data/spec/integration/criteria/alias_query_spec.rb +161 -0
- data/spec/integration/criteria/date_field_spec.rb +1 -2
- data/spec/integration/criteria/default_scope_spec.rb +72 -0
- data/spec/integration/criteria/logical_spec.rb +124 -0
- data/spec/integration/criteria/range_spec.rb +359 -0
- data/spec/integration/criteria/time_with_zone_spec.rb +125 -15
- data/spec/integration/discriminator_key_spec.rb +392 -0
- data/spec/integration/discriminator_value_spec.rb +206 -0
- data/spec/integration/document_spec.rb +30 -1
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +73 -0
- data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +130 -45
- data/spec/integration/matcher_operator_data/all.yml +140 -0
- data/spec/integration/matcher_operator_data/and.yml +93 -0
- data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
- data/spec/integration/matcher_operator_data/comment.yml +22 -0
- data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
- data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
- data/spec/integration/matcher_operator_data/eq.yml +191 -0
- data/spec/integration/matcher_operator_data/exists.yml +213 -0
- data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
- data/spec/integration/matcher_operator_data/gt.yml +132 -0
- data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
- data/spec/integration/matcher_operator_data/gte.yml +132 -0
- data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
- data/spec/integration/matcher_operator_data/implicit.yml +331 -0
- data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
- data/spec/integration/matcher_operator_data/in.yml +210 -0
- data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
- data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
- data/spec/integration/matcher_operator_data/lt.yml +132 -0
- data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
- data/spec/integration/matcher_operator_data/lte.yml +132 -0
- data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
- data/spec/integration/matcher_operator_data/mod.yml +55 -0
- data/spec/integration/matcher_operator_data/multiple.yml +29 -0
- data/spec/integration/matcher_operator_data/ne.yml +150 -0
- data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
- data/spec/integration/matcher_operator_data/nin.yml +114 -0
- data/spec/integration/matcher_operator_data/nor.yml +126 -0
- data/spec/integration/matcher_operator_data/not.yml +196 -0
- data/spec/integration/matcher_operator_data/or.yml +137 -0
- data/spec/integration/matcher_operator_data/regex.yml +174 -0
- data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
- data/spec/integration/matcher_operator_data/size.yml +174 -0
- data/spec/integration/matcher_operator_data/type.yml +70 -0
- data/spec/integration/matcher_operator_data/type_array.yml +16 -0
- data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
- data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
- data/spec/integration/matcher_operator_data/type_code.yml +26 -0
- data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
- data/spec/integration/matcher_operator_data/type_date.yml +39 -0
- data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
- data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
- data/spec/integration/matcher_operator_data/type_double.yml +15 -0
- data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
- data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
- data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_null.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
- data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
- data/spec/integration/matcher_operator_data/type_string.yml +15 -0
- data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
- data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
- data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
- data/spec/integration/matcher_operator_spec.rb +122 -0
- data/spec/integration/matcher_spec.rb +283 -0
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/integration/server_query_spec.rb +141 -0
- data/spec/integration/shardable_spec.rb +148 -0
- data/spec/integration/stringified_symbol_field_spec.rb +203 -0
- data/spec/lite_spec_helper.rb +18 -6
- data/spec/mongoid/association/accessors_spec.rb +284 -77
- data/spec/mongoid/association/auto_save_spec.rb +74 -33
- data/spec/mongoid/association/builders_spec.rb +3 -1
- data/spec/mongoid/association/constrainable_spec.rb +2 -0
- data/spec/mongoid/association/counter_cache_spec.rb +35 -33
- data/spec/mongoid/association/depending_spec.rb +431 -338
- data/spec/mongoid/association/eager_spec.rb +8 -5
- data/spec/mongoid/association/embedded/cyclic_spec.rb +4 -2
- data/spec/mongoid/association/embedded/dirty_spec.rb +4 -2
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +4 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +56 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +84 -22
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +3 -1
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +2 -0
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +114 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +687 -173
- data/spec/mongoid/association/embedded/embeds_many_models.rb +174 -1
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +63 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +71 -1
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +2 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +27 -0
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +23 -21
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +2 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +22 -0
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +31 -1
- data/spec/mongoid/association/macros_spec.rb +11 -9
- data/spec/mongoid/association/nested/many_spec.rb +2 -0
- data/spec/mongoid/association/nested/one_spec.rb +18 -12
- data/spec/mongoid/association/options_spec.rb +2 -0
- data/spec/mongoid/association/polymorphic_spec.rb +2 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +4 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +111 -16
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +242 -12
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +114 -58
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +26 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +3 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +46 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +25 -5
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +418 -361
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +68 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +81 -4
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -1
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +132 -0
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +40 -9
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +314 -133
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +848 -451
- data/spec/mongoid/association/referenced/has_many_models.rb +61 -1
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
- data/spec/mongoid/association/referenced/has_many_spec.rb +48 -0
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +2 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +55 -9
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +34 -4
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +135 -27
- data/spec/mongoid/association/referenced/has_one_models.rb +65 -0
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
- data/spec/mongoid/association/referenced/has_one_spec.rb +24 -1
- data/spec/mongoid/association/reflections_spec.rb +2 -0
- data/spec/mongoid/association/syncable_spec.rb +47 -31
- data/spec/mongoid/association_spec.rb +2 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +49 -0
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
- data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
- data/spec/mongoid/atomic/paths_spec.rb +66 -26
- data/spec/mongoid/atomic_spec.rb +53 -6
- data/spec/mongoid/attributes/dynamic_spec.rb +0 -1
- data/spec/mongoid/attributes/nested_spec.rb +149 -78
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
- data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
- data/spec/mongoid/attributes/projector_spec.rb +40 -0
- data/spec/mongoid/attributes/readonly_spec.rb +24 -22
- data/spec/mongoid/attributes_spec.rb +683 -65
- data/spec/mongoid/cacheable_spec.rb +6 -4
- data/spec/mongoid/changeable_spec.rb +185 -43
- data/spec/mongoid/clients/factory_spec.rb +128 -28
- data/spec/mongoid/clients/options_spec.rb +45 -26
- data/spec/mongoid/clients/sessions_spec.rb +25 -66
- data/spec/mongoid/clients/transactions_spec.rb +54 -29
- data/spec/mongoid/clients_spec.rb +65 -8
- data/spec/mongoid/composable_spec.rb +2 -0
- data/spec/mongoid/config/environment_spec.rb +126 -8
- data/spec/mongoid/config/options_spec.rb +22 -3
- data/spec/mongoid/config_spec.rb +377 -1
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +433 -153
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +122 -20
- data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
- data/spec/mongoid/contextual/atomic_spec.rb +205 -67
- data/spec/mongoid/contextual/geo_near_spec.rb +20 -18
- data/spec/mongoid/contextual/map_reduce_spec.rb +6 -18
- data/spec/mongoid/contextual/memory_spec.rb +1360 -91
- data/spec/mongoid/contextual/mongo_spec.rb +1871 -544
- data/spec/mongoid/contextual/none_spec.rb +39 -73
- data/spec/mongoid/copyable_spec.rb +657 -26
- data/spec/mongoid/copyable_spec_models.rb +30 -0
- data/spec/mongoid/criteria/findable_spec.rb +161 -228
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +20 -1
- data/spec/mongoid/criteria/modifiable_spec.rb +43 -40
- data/spec/mongoid/criteria/options_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +9 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +136 -26
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +13 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +46 -17
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +2 -15
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -8
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +239 -178
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +2 -59
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -59
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +34 -16
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +13 -0
- data/spec/mongoid/criteria/queryable/key_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +145 -12
- data/spec/mongoid/criteria/queryable/optional_spec.rb +18 -485
- data/spec/mongoid/criteria/queryable/options_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1643 -286
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +1191 -2752
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +91 -4
- data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/storable_spec.rb +298 -0
- data/spec/mongoid/criteria/scopable_spec.rb +129 -0
- data/spec/mongoid/criteria/translator_spec.rb +132 -0
- data/spec/mongoid/criteria_projection_spec.rb +409 -0
- data/spec/mongoid/criteria_spec.rb +1322 -1723
- data/spec/mongoid/document_fields_spec.rb +179 -5
- data/spec/mongoid/document_persistence_context_spec.rb +0 -1
- data/spec/mongoid/document_query_spec.rb +89 -0
- data/spec/mongoid/document_spec.rb +153 -87
- data/spec/mongoid/equality_spec.rb +144 -41
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
- data/spec/mongoid/errors/callback_spec.rb +2 -0
- data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +78 -0
- data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
- data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +7 -5
- data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_field_spec.rb +3 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
- data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_relation_spec.rb +4 -2
- data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
- data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
- data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +24 -8
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
- data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
- data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
- data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
- data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
- data/spec/mongoid/errors/no_environment_spec.rb +5 -3
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
- data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
- data/spec/mongoid/errors/no_parent_spec.rb +3 -1
- data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
- data/spec/mongoid/errors/readonly_document_spec.rb +2 -0
- data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -1
- data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
- data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
- data/spec/mongoid/errors/validations_spec.rb +2 -0
- data/spec/mongoid/extensions/array_spec.rb +41 -45
- data/spec/mongoid/extensions/big_decimal_spec.rb +714 -212
- data/spec/mongoid/extensions/binary_spec.rb +46 -9
- data/spec/mongoid/extensions/boolean_spec.rb +70 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +339 -0
- data/spec/mongoid/extensions/date_spec.rb +58 -140
- data/spec/mongoid/extensions/date_time_spec.rb +32 -69
- data/spec/mongoid/extensions/decimal128_spec.rb +2 -0
- data/spec/mongoid/extensions/false_class_spec.rb +3 -1
- data/spec/mongoid/extensions/float_spec.rb +66 -73
- data/spec/mongoid/extensions/hash_spec.rb +138 -3
- data/spec/mongoid/extensions/integer_spec.rb +61 -63
- data/spec/mongoid/extensions/module_spec.rb +2 -0
- data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
- data/spec/mongoid/extensions/object_id_spec.rb +2 -0
- data/spec/mongoid/extensions/object_spec.rb +13 -24
- data/spec/mongoid/extensions/range_spec.rb +257 -54
- data/spec/mongoid/extensions/regexp_spec.rb +60 -33
- data/spec/mongoid/extensions/set_spec.rb +108 -0
- data/spec/mongoid/extensions/string_spec.rb +111 -50
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
- data/spec/mongoid/extensions/symbol_spec.rb +20 -25
- data/spec/mongoid/extensions/time_spec.rb +663 -66
- data/spec/mongoid/extensions/time_with_zone_spec.rb +50 -31
- data/spec/mongoid/extensions/true_class_spec.rb +3 -1
- data/spec/mongoid/extensions_spec.rb +16 -2
- data/spec/mongoid/factory_spec.rb +347 -27
- data/spec/mongoid/fields/foreign_key_spec.rb +2 -0
- data/spec/mongoid/fields/localized_spec.rb +43 -16
- data/spec/mongoid/fields/standard_spec.rb +2 -0
- data/spec/mongoid/fields_spec.rb +776 -80
- data/spec/mongoid/findable_spec.rb +133 -34
- data/spec/mongoid/indexable/specification_spec.rb +4 -2
- data/spec/mongoid/indexable_spec.rb +65 -18
- data/spec/mongoid/inspectable_spec.rb +39 -2
- data/spec/mongoid/interceptable_spec.rb +955 -103
- data/spec/mongoid/interceptable_spec_models.rb +307 -0
- data/spec/mongoid/loggable_spec.rb +2 -0
- data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
- data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +114 -29
- data/spec/mongoid/persistable/deletable_spec.rb +274 -12
- data/spec/mongoid/persistable/destroyable_spec.rb +202 -12
- data/spec/mongoid/persistable/incrementable_spec.rb +23 -7
- data/spec/mongoid/persistable/logical_spec.rb +19 -3
- data/spec/mongoid/persistable/poppable_spec.rb +19 -3
- data/spec/mongoid/persistable/pullable_spec.rb +36 -6
- data/spec/mongoid/persistable/pushable_spec.rb +36 -6
- data/spec/mongoid/persistable/renamable_spec.rb +18 -2
- data/spec/mongoid/persistable/savable_spec.rb +188 -25
- data/spec/mongoid/persistable/settable_spec.rb +24 -8
- data/spec/mongoid/persistable/unsettable_spec.rb +19 -3
- data/spec/mongoid/persistable/updatable_spec.rb +45 -23
- data/spec/mongoid/persistable/upsertable_spec.rb +18 -2
- data/spec/mongoid/persistable_spec.rb +85 -9
- data/spec/mongoid/persistence_context_spec.rb +52 -1
- data/spec/mongoid/positional_spec.rb +2 -0
- data/spec/mongoid/query_cache_middleware_spec.rb +50 -0
- data/spec/mongoid/query_cache_spec.rb +339 -87
- data/spec/mongoid/relations/proxy_spec.rb +8 -6
- data/spec/mongoid/reloadable_spec.rb +357 -22
- data/spec/mongoid/scopable_spec.rb +121 -37
- data/spec/mongoid/selectable_spec.rb +8 -6
- data/spec/mongoid/serializable_spec.rb +160 -29
- data/spec/mongoid/shardable_models.rb +75 -0
- data/spec/mongoid/shardable_spec.rb +239 -34
- data/spec/mongoid/stateful_spec.rb +31 -1
- data/spec/mongoid/tasks/database_rake_spec.rb +2 -0
- data/spec/mongoid/tasks/database_spec.rb +2 -0
- data/spec/mongoid/threaded_spec.rb +4 -2
- data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
- data/spec/mongoid/timestamps/created_spec.rb +3 -1
- data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
- data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
- data/spec/mongoid/timestamps/updated_spec.rb +5 -3
- data/spec/mongoid/timestamps_spec.rb +398 -6
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +296 -33
- data/spec/mongoid/touchable_spec_models.rb +57 -0
- data/spec/mongoid/traversable_spec.rb +1160 -1
- data/spec/mongoid/validatable/associated_spec.rb +15 -30
- data/spec/mongoid/validatable/format_spec.rb +2 -0
- data/spec/mongoid/validatable/length_spec.rb +2 -0
- data/spec/mongoid/validatable/numericality_spec.rb +2 -0
- data/spec/mongoid/validatable/presence_spec.rb +28 -22
- data/spec/mongoid/validatable/uniqueness_spec.rb +128 -98
- data/spec/mongoid/validatable_spec.rb +5 -3
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/mongoid_spec.rb +3 -1
- data/spec/rails/controller_extension/controller_runtime_spec.rb +5 -3
- data/spec/rails/mongoid_spec.rb +8 -18
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/cluster_config.rb +14 -4
- data/spec/shared/lib/mrss/constraints.rb +51 -27
- data/spec/shared/lib/mrss/docker_runner.rb +37 -4
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +48 -1
- data/spec/shared/lib/mrss/server_version_registry.rb +16 -18
- data/spec/shared/lib/mrss/session_registry.rb +69 -0
- data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +18 -1
- data/spec/shared/lib/mrss/utils.rb +28 -6
- data/spec/shared/share/Dockerfile.erb +156 -66
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/distro.sh +2 -1
- data/spec/shared/shlib/server.sh +171 -45
- data/spec/shared/shlib/set_env.sh +47 -6
- data/spec/spec_helper.rb +38 -36
- data/spec/support/authorization.rb +2 -0
- data/spec/support/client_registry.rb +9 -0
- data/spec/support/constraints.rb +39 -8
- data/spec/support/expectations.rb +5 -1
- data/spec/support/helpers.rb +11 -0
- data/spec/support/macros.rb +77 -0
- data/spec/{app → support}/models/account.rb +3 -1
- data/spec/{app → support}/models/acolyte.rb +2 -0
- data/spec/{app → support}/models/actor.rb +3 -1
- data/spec/support/models/actress.rb +4 -0
- data/spec/{app → support}/models/address.rb +6 -0
- data/spec/{app → support}/models/address_component.rb +2 -0
- data/spec/{app → support}/models/address_number.rb +2 -0
- data/spec/{app → support}/models/agency.rb +2 -0
- data/spec/{app → support}/models/agent.rb +2 -0
- data/spec/{app → support}/models/album.rb +2 -0
- data/spec/{app → support}/models/alert.rb +2 -0
- data/spec/{app → support}/models/animal.rb +2 -0
- data/spec/{app → support}/models/answer.rb +2 -0
- data/spec/{app → support}/models/appointment.rb +2 -0
- data/spec/support/models/armrest.rb +9 -0
- data/spec/{app → support}/models/article.rb +2 -0
- data/spec/{app → support}/models/artist.rb +4 -0
- data/spec/{app → support}/models/artwork.rb +2 -0
- data/spec/support/models/audible_sound.rb +3 -0
- data/spec/{app → support}/models/audio.rb +2 -0
- data/spec/support/models/augmentation.rb +25 -0
- data/spec/{app → support}/models/author.rb +2 -0
- data/spec/{app → support}/models/baby.rb +2 -0
- data/spec/{app → support}/models/band.rb +9 -0
- data/spec/{app → support}/models/bar.rb +2 -0
- data/spec/{app → support}/models/basic.rb +2 -0
- data/spec/support/models/bed.rb +3 -0
- data/spec/{app → support}/models/big_palette.rb +2 -0
- data/spec/{app → support}/models/birthday.rb +2 -0
- data/spec/support/models/bolt.rb +7 -0
- data/spec/{app → support}/models/bomb.rb +2 -0
- data/spec/{app → support}/models/book.rb +2 -0
- data/spec/{app → support}/models/breed.rb +2 -0
- data/spec/{app → support}/models/browser.rb +3 -1
- data/spec/{app → support}/models/building.rb +2 -0
- data/spec/{app → support}/models/building_address.rb +2 -0
- data/spec/{app → support}/models/bus.rb +2 -0
- data/spec/{app → support}/models/business.rb +2 -0
- data/spec/{app → support}/models/callback_test.rb +2 -0
- data/spec/{app → support}/models/canvas.rb +3 -1
- data/spec/support/models/car.rb +3 -0
- data/spec/{app → support}/models/cat.rb +2 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/{app → support}/models/category.rb +2 -0
- data/spec/{app → support}/models/child.rb +2 -0
- data/spec/{app → support}/models/child_doc.rb +5 -3
- data/spec/{app → support}/models/church.rb +2 -0
- data/spec/{app → support}/models/circle.rb +2 -0
- data/spec/{app → support}/models/circuit.rb +2 -0
- data/spec/support/models/circus.rb +12 -0
- data/spec/{app → support}/models/code.rb +4 -0
- data/spec/support/models/coding/pull_request.rb +11 -0
- data/spec/support/models/coding.rb +3 -0
- data/spec/{app → support}/models/comment.rb +2 -0
- data/spec/{app → support}/models/company.rb +2 -0
- data/spec/{app → support}/models/consumption_period.rb +2 -0
- data/spec/{app → support}/models/contextable_item.rb +2 -0
- data/spec/{app → support}/models/contractor.rb +2 -0
- data/spec/{app → support}/models/cookie.rb +2 -0
- data/spec/{app → support}/models/country_code.rb +4 -0
- data/spec/{app → support}/models/courier_job.rb +2 -0
- data/spec/support/models/crate.rb +12 -0
- data/spec/{app → support}/models/customer.rb +0 -1
- data/spec/{app → support}/models/customer_address.rb +0 -1
- data/spec/support/models/deed.rb +7 -0
- data/spec/{app → support}/models/definition.rb +2 -0
- data/spec/{app → support}/models/delegating_patient.rb +0 -1
- data/spec/{app → support}/models/description.rb +2 -0
- data/spec/{app → support}/models/dictionary.rb +8 -0
- data/spec/{app → support}/models/division.rb +2 -0
- data/spec/{app → support}/models/doctor.rb +2 -0
- data/spec/{app → support}/models/dog.rb +2 -0
- data/spec/{app → support}/models/dokument.rb +2 -0
- data/spec/{app → support}/models/draft.rb +2 -0
- data/spec/{app → support}/models/dragon.rb +2 -0
- data/spec/{app → support}/models/driver.rb +3 -1
- data/spec/{app → support}/models/drug.rb +2 -0
- data/spec/{app → support}/models/dungeon.rb +2 -0
- data/spec/{app → support}/models/edit.rb +2 -0
- data/spec/{app → support}/models/email.rb +2 -0
- data/spec/{app → support}/models/employer.rb +2 -0
- data/spec/{app → support}/models/entry.rb +2 -0
- data/spec/support/models/eraser.rb +3 -0
- data/spec/{app → support}/models/even.rb +2 -0
- data/spec/{app → support}/models/event.rb +2 -0
- data/spec/{app → support}/models/exhibition.rb +2 -0
- data/spec/{app → support}/models/exhibitor.rb +2 -0
- data/spec/{app → support}/models/explosion.rb +2 -0
- data/spec/{app → support}/models/eye.rb +2 -0
- data/spec/{app → support}/models/eye_bowl.rb +2 -0
- data/spec/{app → support}/models/face.rb +2 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/{app → support}/models/favorite.rb +2 -0
- data/spec/{app → support}/models/filesystem.rb +2 -0
- data/spec/{app → support}/models/fire_hydrant.rb +2 -0
- data/spec/{app → support}/models/firefox.rb +2 -0
- data/spec/{app → support}/models/fish.rb +2 -0
- data/spec/{app → support}/models/folder.rb +2 -0
- data/spec/{app → support}/models/folder_item.rb +2 -0
- data/spec/{app → support}/models/fruits.rb +2 -0
- data/spec/{app → support}/models/game.rb +2 -0
- data/spec/{app → support}/models/ghost.rb +2 -0
- data/spec/support/models/guitar.rb +4 -0
- data/spec/support/models/hole.rb +12 -0
- data/spec/{app → support}/models/home.rb +2 -0
- data/spec/{app → support}/models/house.rb +2 -0
- data/spec/{app → support}/models/html_writer.rb +2 -0
- data/spec/{app → support}/models/id_key.rb +2 -0
- data/spec/support/models/idnodef.rb +7 -0
- data/spec/{app → support}/models/image.rb +2 -0
- data/spec/{app → support}/models/implant.rb +11 -0
- data/spec/support/models/instrument.rb +8 -0
- data/spec/{app → support}/models/item.rb +3 -1
- data/spec/{app → support}/models/jar.rb +2 -0
- data/spec/{app → support}/models/kaleidoscope.rb +2 -0
- data/spec/{app → support}/models/kangaroo.rb +3 -1
- data/spec/{app → support}/models/label.rb +6 -1
- data/spec/{app → support}/models/language.rb +2 -0
- data/spec/{app → support}/models/lat_lng.rb +2 -0
- data/spec/{app → support}/models/league.rb +2 -0
- data/spec/support/models/learner.rb +4 -0
- data/spec/{app → support}/models/line_item.rb +2 -0
- data/spec/{app → support}/models/location.rb +2 -0
- data/spec/{app → support}/models/login.rb +2 -0
- data/spec/{app → support}/models/manufacturer.rb +2 -0
- data/spec/{app → support}/models/meat.rb +2 -0
- data/spec/{app → support}/models/membership.rb +3 -0
- data/spec/{app → support}/models/message.rb +2 -0
- data/spec/{app → support}/models/minim.rb +0 -1
- data/spec/{app → support}/models/mixed_drink.rb +2 -0
- data/spec/support/models/mop.rb +24 -0
- data/spec/{app → support}/models/movie.rb +2 -0
- data/spec/support/models/my_hash.rb +4 -0
- data/spec/{app → support}/models/name.rb +12 -0
- data/spec/support/models/name_only.rb +8 -0
- data/spec/{app → support}/models/node.rb +2 -0
- data/spec/{app → support}/models/note.rb +2 -0
- data/spec/support/models/nut.rb +7 -0
- data/spec/{app → support}/models/odd.rb +2 -0
- data/spec/support/models/order.rb +12 -0
- data/spec/{app → support}/models/ordered_post.rb +3 -1
- data/spec/{app → support}/models/ordered_preference.rb +2 -0
- data/spec/{app → support}/models/oscar.rb +2 -0
- data/spec/support/models/other_owner_object.rb +4 -0
- data/spec/{app → support}/models/override.rb +2 -0
- data/spec/{app → support}/models/ownable.rb +2 -0
- data/spec/{app → support}/models/owner.rb +4 -0
- data/spec/{app → support}/models/pack.rb +2 -0
- data/spec/{app → support}/models/page.rb +2 -0
- data/spec/{app → support}/models/page_question.rb +2 -0
- data/spec/{app → support}/models/palette.rb +3 -1
- data/spec/{app → support}/models/parent.rb +2 -0
- data/spec/{app → support}/models/parent_doc.rb +2 -0
- data/spec/support/models/passport.rb +22 -0
- data/spec/{app → support}/models/patient.rb +2 -0
- data/spec/{app → support}/models/pdf_writer.rb +2 -0
- data/spec/support/models/pencil.rb +3 -0
- data/spec/{app → support}/models/person.rb +23 -1
- data/spec/{app → support}/models/pet.rb +2 -0
- data/spec/{app → support}/models/pet_owner.rb +2 -0
- data/spec/{app → support}/models/phone.rb +5 -1
- data/spec/support/models/piano.rb +4 -0
- data/spec/{app → support}/models/pizza.rb +2 -0
- data/spec/{app → support}/models/player.rb +4 -0
- data/spec/{app → support}/models/post.rb +2 -0
- data/spec/{app → support}/models/post_genre.rb +2 -0
- data/spec/support/models/powerup.rb +25 -0
- data/spec/{app → support}/models/preference.rb +2 -0
- data/spec/{app → support}/models/princess.rb +2 -0
- data/spec/{app → support}/models/product.rb +2 -0
- data/spec/support/models/profile.rb +17 -0
- data/spec/{app → support}/models/pronunciation.rb +2 -0
- data/spec/{app → support}/models/pub.rb +2 -0
- data/spec/support/models/publication/encyclopedia.rb +11 -0
- data/spec/support/models/publication/review.rb +13 -0
- data/spec/support/models/publication.rb +4 -0
- data/spec/{app → support}/models/purchase.rb +2 -0
- data/spec/support/models/purchased_item.rb +10 -0
- data/spec/support/models/purse.rb +9 -0
- data/spec/{app → support}/models/question.rb +2 -0
- data/spec/{app → support}/models/quiz.rb +2 -0
- data/spec/{app → support}/models/rating.rb +2 -0
- data/spec/{app → support}/models/record.rb +2 -0
- data/spec/{app → support}/models/registry.rb +3 -0
- data/spec/{app → support}/models/role.rb +2 -0
- data/spec/{app → support}/models/root_category.rb +2 -0
- data/spec/{app → support}/models/sandwich.rb +2 -0
- data/spec/{app → support}/models/scheduler.rb +2 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/scribe.rb +7 -0
- data/spec/support/models/sealer.rb +7 -0
- data/spec/support/models/seat.rb +24 -0
- data/spec/{app → support}/models/seo.rb +2 -0
- data/spec/support/models/series.rb +7 -0
- data/spec/{app → support}/models/server.rb +2 -0
- data/spec/{app → support}/models/service.rb +2 -0
- data/spec/{app → support}/models/shape.rb +4 -2
- data/spec/{app → support}/models/shelf.rb +2 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/{app → support}/models/shipment_address.rb +2 -0
- data/spec/{app → support}/models/shipping_container.rb +2 -0
- data/spec/{app → support}/models/shipping_pack.rb +2 -0
- data/spec/support/models/shirt.rb +11 -0
- data/spec/{app → support}/models/shop.rb +2 -0
- data/spec/{app → support}/models/short_agent.rb +2 -0
- data/spec/{app → support}/models/short_quiz.rb +2 -0
- data/spec/{app → support}/models/simple.rb +2 -0
- data/spec/{app → support}/models/slave.rb +2 -0
- data/spec/{app → support}/models/song.rb +2 -0
- data/spec/{app → support}/models/sound.rb +2 -0
- data/spec/support/models/spacer.rb +7 -0
- data/spec/{app → support}/models/square.rb +2 -0
- data/spec/{app → support}/models/staff.rb +2 -0
- data/spec/{app → support}/models/store_as_dup_test1.rb +2 -0
- data/spec/{app → support}/models/store_as_dup_test2.rb +2 -0
- data/spec/{app → support}/models/strategy.rb +2 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/{app → support}/models/sub_item.rb +2 -0
- data/spec/{app → support}/models/subscription.rb +2 -0
- data/spec/{app → support}/models/survey.rb +2 -0
- data/spec/{app → support}/models/symptom.rb +2 -0
- data/spec/support/models/system_role.rb +7 -0
- data/spec/{app → support}/models/tag.rb +2 -0
- data/spec/{app → support}/models/target.rb +2 -0
- data/spec/{app → support}/models/template.rb +2 -0
- data/spec/{app → support}/models/thing.rb +2 -0
- data/spec/support/models/threadlocker.rb +7 -0
- data/spec/{app → support}/models/title.rb +2 -0
- data/spec/{app → support}/models/tool.rb +4 -2
- data/spec/{app → support}/models/topping.rb +2 -0
- data/spec/support/models/toy.rb +9 -0
- data/spec/{app → support}/models/track.rb +2 -0
- data/spec/{app → support}/models/translation.rb +2 -0
- data/spec/{app → support}/models/tree.rb +2 -0
- data/spec/support/models/truck.rb +7 -0
- data/spec/{app → support}/models/user.rb +2 -0
- data/spec/{app → support}/models/user_account.rb +2 -0
- data/spec/{app → support}/models/validation_callback.rb +2 -0
- data/spec/support/models/vehicle.rb +18 -0
- data/spec/{app → support}/models/version.rb +2 -0
- data/spec/{app → support}/models/vertex.rb +3 -1
- data/spec/{app → support}/models/vet_visit.rb +2 -0
- data/spec/{app → support}/models/video.rb +2 -0
- data/spec/support/models/video_game.rb +3 -0
- data/spec/support/models/washer.rb +7 -0
- data/spec/support/models/weapon.rb +25 -0
- data/spec/{app → support}/models/wiki_page.rb +3 -0
- data/spec/{app → support}/models/word.rb +2 -0
- data/spec/{app → support}/models/word_origin.rb +2 -0
- data/spec/{app → support}/models/writer.rb +4 -2
- data/spec/support/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_local.json +18 -0
- data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/shared/time.rb +53 -0
- data/spec/support/spec_config.rb +12 -3
- data.tar.gz.sig +0 -0
- metadata +1162 -764
- metadata.gz.sig +0 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
- data/lib/mongoid/errors/eager_load.rb +0 -22
- data/lib/mongoid/errors/invalid_value.rb +0 -16
- data/lib/mongoid/matchable/all.rb +0 -28
- data/lib/mongoid/matchable/and.rb +0 -30
- data/lib/mongoid/matchable/default.rb +0 -119
- data/lib/mongoid/matchable/elem_match.rb +0 -34
- data/lib/mongoid/matchable/eq.rb +0 -22
- data/lib/mongoid/matchable/exists.rb +0 -23
- data/lib/mongoid/matchable/gt.rb +0 -23
- data/lib/mongoid/matchable/gte.rb +0 -23
- data/lib/mongoid/matchable/in.rb +0 -24
- data/lib/mongoid/matchable/lt.rb +0 -23
- data/lib/mongoid/matchable/lte.rb +0 -23
- data/lib/mongoid/matchable/ne.rb +0 -21
- data/lib/mongoid/matchable/nin.rb +0 -22
- data/lib/mongoid/matchable/nor.rb +0 -37
- data/lib/mongoid/matchable/or.rb +0 -33
- data/lib/mongoid/matchable/regexp.rb +0 -27
- data/lib/mongoid/matchable/size.rb +0 -21
- data/lib/support/ruby_version.rb +0 -26
- data/spec/app/models/actress.rb +0 -2
- data/spec/app/models/augmentation.rb +0 -11
- data/spec/app/models/bed.rb +0 -1
- data/spec/app/models/car.rb +0 -1
- data/spec/app/models/circus.rb +0 -7
- data/spec/app/models/eraser.rb +0 -1
- data/spec/app/models/learner.rb +0 -2
- data/spec/app/models/my_hash.rb +0 -2
- data/spec/app/models/other_owner_object.rb +0 -2
- data/spec/app/models/passport.rb +0 -5
- data/spec/app/models/pencil.rb +0 -1
- data/spec/app/models/powerup.rb +0 -11
- data/spec/app/models/profile.rb +0 -5
- data/spec/app/models/series.rb +0 -4
- data/spec/app/models/truck.rb +0 -3
- data/spec/app/models/vehicle.rb +0 -11
- data/spec/app/models/video_game.rb +0 -1
- data/spec/app/models/weapon.rb +0 -11
- data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
- data/spec/mongoid/matchable/all_spec.rb +0 -31
- data/spec/mongoid/matchable/and_spec.rb +0 -187
- data/spec/mongoid/matchable/default_spec.rb +0 -137
- data/spec/mongoid/matchable/elem_match_spec.rb +0 -106
- data/spec/mongoid/matchable/eq_spec.rb +0 -48
- data/spec/mongoid/matchable/exists_spec.rb +0 -57
- data/spec/mongoid/matchable/gt_spec.rb +0 -86
- data/spec/mongoid/matchable/gte_spec.rb +0 -84
- data/spec/mongoid/matchable/in_spec.rb +0 -49
- data/spec/mongoid/matchable/lt_spec.rb +0 -85
- data/spec/mongoid/matchable/lte_spec.rb +0 -85
- data/spec/mongoid/matchable/ne_spec.rb +0 -46
- data/spec/mongoid/matchable/nin_spec.rb +0 -48
- data/spec/mongoid/matchable/nor_spec.rb +0 -209
- data/spec/mongoid/matchable/or_spec.rb +0 -131
- data/spec/mongoid/matchable/regexp_spec.rb +0 -59
- data/spec/mongoid/matchable/size_spec.rb +0 -25
- data/spec/mongoid/matchable_spec.rb +0 -853
- data/spec/support/cluster_config.rb +0 -158
- data/spec/support/session_registry.rb +0 -50
- /data/spec/{app → support}/models/array_field.rb +0 -0
- /data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
- /data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
- /data/spec/{app → support}/models/updatable.rb +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Mongoid
|
|
3
4
|
class Criteria
|
|
4
5
|
module Queryable
|
|
@@ -12,16 +13,14 @@ module Mongoid
|
|
|
12
13
|
# @example Merge in another selector.
|
|
13
14
|
# selector.merge!(name: "test")
|
|
14
15
|
#
|
|
15
|
-
# @param [ Hash
|
|
16
|
+
# @param [ Hash | Selector ] other The object to merge in.
|
|
16
17
|
#
|
|
17
18
|
# @return [ Selector ] The selector.
|
|
18
|
-
#
|
|
19
|
-
# @since 1.0.0
|
|
20
19
|
def merge!(other)
|
|
21
20
|
other.each_pair do |key, value|
|
|
22
21
|
if value.is_a?(Hash) && self[key.to_s].is_a?(Hash)
|
|
23
22
|
value = self[key.to_s].merge(value) do |_key, old_val, new_val|
|
|
24
|
-
case _key
|
|
23
|
+
case _key.to_s
|
|
25
24
|
when '$in'
|
|
26
25
|
new_val & old_val
|
|
27
26
|
when '$nin'
|
|
@@ -44,20 +43,17 @@ module Mongoid
|
|
|
44
43
|
# @example Store a value in the selector.
|
|
45
44
|
# selector.store(:key, "testing")
|
|
46
45
|
#
|
|
47
|
-
# @param [ String
|
|
46
|
+
# @param [ String | Symbol ] key The name of the attribute.
|
|
48
47
|
# @param [ Object ] value The value to add.
|
|
49
48
|
#
|
|
50
49
|
# @return [ Object ] The stored object.
|
|
51
|
-
#
|
|
52
|
-
# @since 1.0.0
|
|
53
50
|
def store(key, value)
|
|
54
51
|
name, serializer = storage_pair(key)
|
|
55
52
|
if multi_selection?(name)
|
|
56
53
|
store_name = name
|
|
57
54
|
store_value = evolve_multi(value)
|
|
58
55
|
else
|
|
59
|
-
store_name =
|
|
60
|
-
store_value = evolve(serializer, value)
|
|
56
|
+
store_name, store_value = store_creds(name, serializer, value)
|
|
61
57
|
end
|
|
62
58
|
super(store_name, store_value)
|
|
63
59
|
end
|
|
@@ -69,8 +65,6 @@ module Mongoid
|
|
|
69
65
|
# selector.to_pipeline
|
|
70
66
|
#
|
|
71
67
|
# @return [ Array<Hash> ] The pipeline entry for the selector.
|
|
72
|
-
#
|
|
73
|
-
# @since 2.0.0
|
|
74
68
|
def to_pipeline
|
|
75
69
|
pipeline = []
|
|
76
70
|
pipeline.push({ "$match" => self }) unless empty?
|
|
@@ -79,25 +73,67 @@ module Mongoid
|
|
|
79
73
|
|
|
80
74
|
private
|
|
81
75
|
|
|
76
|
+
# Get the store name and store value. If the value is of type range,
|
|
77
|
+
# we need may need to change the store_name as well as the store_value,
|
|
78
|
+
# therefore, we cannot just use the evole method.
|
|
79
|
+
#
|
|
80
|
+
# @param [ String ] name The name of the field.
|
|
81
|
+
# @param [ Object ] serializer The optional serializer for the field.
|
|
82
|
+
# @param [ Object ] value The value to serialize.
|
|
83
|
+
#
|
|
84
|
+
# @return [ Array<String, String> ] The store name and store value.
|
|
85
|
+
def store_creds(name, serializer, value)
|
|
86
|
+
store_name = localized_key(name, serializer)
|
|
87
|
+
if Range === value
|
|
88
|
+
evolve_range(store_name, serializer, value)
|
|
89
|
+
else
|
|
90
|
+
[ store_name, evolve(serializer, value) ]
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
82
94
|
# Evolves a multi-list selection, like an $and or $or criterion, and
|
|
83
95
|
# performs the necessary serialization.
|
|
84
96
|
#
|
|
85
|
-
# @api private
|
|
86
|
-
#
|
|
87
97
|
# @example Evolve the multi-selection.
|
|
88
98
|
# selector.evolve_multi([{ field: "value" }])
|
|
89
99
|
#
|
|
90
|
-
# @param [ Array<Hash> ]
|
|
100
|
+
# @param [ Array<Hash> ] specs The multi-selection.
|
|
91
101
|
#
|
|
92
102
|
# @return [ Array<Hash> ] The serialized values.
|
|
93
103
|
#
|
|
94
|
-
# @
|
|
95
|
-
def evolve_multi(
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
104
|
+
# @api private
|
|
105
|
+
def evolve_multi(specs)
|
|
106
|
+
unless specs.is_a?(Array)
|
|
107
|
+
raise ArgumentError, "specs is not an array: #{specs.inspect}"
|
|
108
|
+
end
|
|
109
|
+
specs.map do |spec|
|
|
110
|
+
Hash[spec.map do |key, value|
|
|
111
|
+
# If an application nests conditionals, e.g.
|
|
112
|
+
# {'$or' => [{'$or' => {...}}]},
|
|
113
|
+
# when evolve_multi is called for the top level hash,
|
|
114
|
+
# this call recursively transforms the bottom level $or.
|
|
115
|
+
if multi_selection?(key)
|
|
116
|
+
value = evolve_multi(value)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# storage_pair handles field aliases but not localization for
|
|
120
|
+
# some reason, although per its documentation Smash supposedly
|
|
121
|
+
# owns both.
|
|
99
122
|
name, serializer = storage_pair(key)
|
|
100
|
-
|
|
123
|
+
# This performs type conversions on the value and transformations
|
|
124
|
+
# that depend on the type of the field that the value is stored
|
|
125
|
+
# in, but not transformations that have to do with query shape.
|
|
126
|
+
final_key, evolved_value = store_creds(name, serializer, value)
|
|
127
|
+
|
|
128
|
+
# This builds a query shape around the value, when the query
|
|
129
|
+
# involves complex keys. For example, {:foo.lt => 5} produces
|
|
130
|
+
# {'foo' => {'$lt' => 5}}. This step should be done after all
|
|
131
|
+
# value-based processing is complete.
|
|
132
|
+
if key.is_a?(Key)
|
|
133
|
+
evolved_value = key.transform_value(evolved_value)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
[ final_key, evolved_value ]
|
|
101
137
|
end]
|
|
102
138
|
end.uniq
|
|
103
139
|
end
|
|
@@ -113,14 +149,14 @@ module Mongoid
|
|
|
113
149
|
# @param [ Object ] value The value to serialize.
|
|
114
150
|
#
|
|
115
151
|
# @return [ Object ] The serialized object.
|
|
116
|
-
#
|
|
117
|
-
# @since 1.0.0
|
|
118
152
|
def evolve(serializer, value)
|
|
119
153
|
case value
|
|
120
154
|
when Hash
|
|
121
155
|
evolve_hash(serializer, value)
|
|
122
156
|
when Array
|
|
123
157
|
evolve_array(serializer, value)
|
|
158
|
+
when Range
|
|
159
|
+
value.__evolve_range__(serializer: serializer)
|
|
124
160
|
else
|
|
125
161
|
(serializer || value.class).evolve(value)
|
|
126
162
|
end
|
|
@@ -137,8 +173,6 @@ module Mongoid
|
|
|
137
173
|
# @param [ Array<Object> ] value The array to serialize.
|
|
138
174
|
#
|
|
139
175
|
# @return [ Object ] The serialized array.
|
|
140
|
-
#
|
|
141
|
-
# @since 1.0.0
|
|
142
176
|
def evolve_array(serializer, value)
|
|
143
177
|
value.map do |_value|
|
|
144
178
|
evolve(serializer, _value)
|
|
@@ -156,8 +190,6 @@ module Mongoid
|
|
|
156
190
|
# @param [ Hash ] value The hash to serialize.
|
|
157
191
|
#
|
|
158
192
|
# @return [ Object ] The serialized hash.
|
|
159
|
-
#
|
|
160
|
-
# @since 1.0.0
|
|
161
193
|
def evolve_hash(serializer, value)
|
|
162
194
|
value.each_pair do |operator, _value|
|
|
163
195
|
if operator =~ /exists|type|size/
|
|
@@ -168,6 +200,73 @@ module Mongoid
|
|
|
168
200
|
end
|
|
169
201
|
end
|
|
170
202
|
|
|
203
|
+
# Evolve a single key selection with range values. This method traverses
|
|
204
|
+
# the association tree to build a query for the given value and
|
|
205
|
+
# serializer. There are three parts to the query here:
|
|
206
|
+
#
|
|
207
|
+
# (1) "klass.child.gchild" => {
|
|
208
|
+
# "$elemMatch" => {
|
|
209
|
+
# (2) "ggchild.field" => (3) { "$gte" => 6, "$lte" => 10 }
|
|
210
|
+
# }
|
|
211
|
+
# }
|
|
212
|
+
# (1) The first n fields are dotted together until the last
|
|
213
|
+
# embeds_many or field of type array. In the above case, gchild
|
|
214
|
+
# would be an embeds_many or Array, and ggchild would be an
|
|
215
|
+
# embeds_one or a hash.
|
|
216
|
+
# (2) The last fields are used inside the $elemMatch. This one is
|
|
217
|
+
# actually optional, and will be ignored if the last field is an
|
|
218
|
+
# array or embeds_many. If the last field is an array (1), (2) and
|
|
219
|
+
# (3) will look like:
|
|
220
|
+
#
|
|
221
|
+
# "klass.child.gchild.ggchild.field" => {
|
|
222
|
+
# { "$elemMatch" => { "$gte" => 6, "$lte" => 10 } }
|
|
223
|
+
# }
|
|
224
|
+
#
|
|
225
|
+
# (3) This is calculated by:
|
|
226
|
+
#
|
|
227
|
+
# value.__evolve_range__(serializer: serializer).
|
|
228
|
+
#
|
|
229
|
+
# @api private
|
|
230
|
+
#
|
|
231
|
+
# @param [ String ] key The to store the range for.
|
|
232
|
+
# @param [ Object ] serializer The optional serializer for the field.
|
|
233
|
+
# @param [ Range ] value The Range to serialize.
|
|
234
|
+
#
|
|
235
|
+
# @return [ Array<String, Hash> ] The store name and serialized Range.
|
|
236
|
+
def evolve_range(key, serializer, value)
|
|
237
|
+
v = value.__evolve_range__(serializer: serializer)
|
|
238
|
+
assocs = []
|
|
239
|
+
Fields.traverse_association_tree(key, serializers, associations, aliased_associations) do |meth, obj, is_field|
|
|
240
|
+
assocs.push([meth, obj, is_field])
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
# Iterate backwards until you get a field with type
|
|
244
|
+
# Array or an embeds_many association.
|
|
245
|
+
inner_key = ""
|
|
246
|
+
loop do
|
|
247
|
+
# If there are no arrays or embeds_many associations, just return
|
|
248
|
+
# the key and value without $elemMatch.
|
|
249
|
+
return [ key, v ] if assocs.empty?
|
|
250
|
+
|
|
251
|
+
meth, obj, is_field = assocs.last
|
|
252
|
+
break if (is_field && obj.type == Array) || (!is_field && obj.is_a?(Association::Embedded::EmbedsMany))
|
|
253
|
+
|
|
254
|
+
assocs.pop
|
|
255
|
+
inner_key = "#{meth}.#{inner_key}"
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
# If the last array or embeds_many association is the last field,
|
|
259
|
+
# the inner key (2) is ignored, and the outer key (1) is the original
|
|
260
|
+
# key.
|
|
261
|
+
if inner_key.blank?
|
|
262
|
+
[ key, { "$elemMatch" => v }]
|
|
263
|
+
else
|
|
264
|
+
store_key = assocs.map(&:first).join('.')
|
|
265
|
+
store_value = { "$elemMatch" => { inner_key.chop => v } }
|
|
266
|
+
[ store_key, store_value ]
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
|
|
171
270
|
# Determines if the selection is a multi-select, like an $and or $or or $nor
|
|
172
271
|
# selection.
|
|
173
272
|
#
|
|
@@ -178,9 +277,7 @@ module Mongoid
|
|
|
178
277
|
#
|
|
179
278
|
# @param [ String ] key The key to check.
|
|
180
279
|
#
|
|
181
|
-
# @return [ true
|
|
182
|
-
#
|
|
183
|
-
# @since 1.0.0
|
|
280
|
+
# @return [ true | false ] If the key is for a multi-select.
|
|
184
281
|
def multi_selection?(key)
|
|
185
282
|
%w($and $or $nor).include?(key)
|
|
186
283
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Mongoid
|
|
3
4
|
class Criteria
|
|
4
5
|
module Queryable
|
|
@@ -7,8 +8,16 @@ module Mongoid
|
|
|
7
8
|
class Smash < Hash
|
|
8
9
|
|
|
9
10
|
# @attribute [r] aliases The aliases.
|
|
11
|
+
attr_reader :aliases
|
|
12
|
+
|
|
10
13
|
# @attribute [r] serializers The serializers.
|
|
11
|
-
attr_reader :
|
|
14
|
+
attr_reader :serializers
|
|
15
|
+
|
|
16
|
+
# @attribute [r] associations The associations.
|
|
17
|
+
attr_reader :associations
|
|
18
|
+
|
|
19
|
+
# @attribute [r] aliased_associations The aliased_associations.
|
|
20
|
+
attr_reader :aliased_associations
|
|
12
21
|
|
|
13
22
|
# Perform a deep copy of the smash.
|
|
14
23
|
#
|
|
@@ -16,10 +25,8 @@ module Mongoid
|
|
|
16
25
|
# smash.__deep_copy__
|
|
17
26
|
#
|
|
18
27
|
# @return [ Smash ] The copied hash.
|
|
19
|
-
#
|
|
20
|
-
# @since 1.0.0
|
|
21
28
|
def __deep_copy__
|
|
22
|
-
self.class.new(aliases, serializers) do |copy|
|
|
29
|
+
self.class.new(aliases, serializers, associations, aliased_associations) do |copy|
|
|
23
30
|
each_pair do |key, value|
|
|
24
31
|
copy.store(key, value.__deep_copy__)
|
|
25
32
|
end
|
|
@@ -37,10 +44,15 @@ module Mongoid
|
|
|
37
44
|
# responsible for serializing values. The keys of the hash must be
|
|
38
45
|
# strings that match the field name, and the values must respond to
|
|
39
46
|
# #localized? and #evolve(object).
|
|
40
|
-
#
|
|
41
|
-
#
|
|
42
|
-
|
|
43
|
-
|
|
47
|
+
# @param [ Hash ] associations An optional hash of names to association
|
|
48
|
+
# objects.
|
|
49
|
+
# @param [ Hash ] aliased_associations An optional hash of mappings from
|
|
50
|
+
# aliases for associations to their actual field names in the database.
|
|
51
|
+
def initialize(aliases = {}, serializers = {}, associations = {}, aliased_associations = {})
|
|
52
|
+
@aliases = aliases
|
|
53
|
+
@serializers = serializers
|
|
54
|
+
@associations = associations
|
|
55
|
+
@aliased_associations = aliased_associations
|
|
44
56
|
yield(self) if block_given?
|
|
45
57
|
end
|
|
46
58
|
|
|
@@ -52,8 +64,6 @@ module Mongoid
|
|
|
52
64
|
# @param [ String ] key The key.
|
|
53
65
|
#
|
|
54
66
|
# @return [ Object ] The found object.
|
|
55
|
-
#
|
|
56
|
-
# @since 2.0.0
|
|
57
67
|
def [](key)
|
|
58
68
|
fetch(aliases[key]) { super }
|
|
59
69
|
end
|
|
@@ -73,8 +83,6 @@ module Mongoid
|
|
|
73
83
|
# @param [ Object ] serializer The optional field serializer.
|
|
74
84
|
#
|
|
75
85
|
# @return [ String ] The normalized key.
|
|
76
|
-
#
|
|
77
|
-
# @since 1.0.0
|
|
78
86
|
def localized_key(name, serializer)
|
|
79
87
|
serializer && serializer.localized? ? "#{name}.#{::I18n.locale}" : name
|
|
80
88
|
end
|
|
@@ -87,16 +95,32 @@ module Mongoid
|
|
|
87
95
|
# @example Get the name and serializer.
|
|
88
96
|
# smash.storage_pair("id")
|
|
89
97
|
#
|
|
90
|
-
# @param [ Symbol
|
|
98
|
+
# @param [ Symbol | String ] key The key provided to the selection.
|
|
91
99
|
#
|
|
92
100
|
# @return [ Array<String, Object> ] The name of the db field and
|
|
93
101
|
# serializer.
|
|
94
|
-
#
|
|
95
|
-
# @since 1.0.0
|
|
96
102
|
def storage_pair(key)
|
|
97
103
|
field = key.to_s
|
|
98
|
-
name =
|
|
99
|
-
[ name,
|
|
104
|
+
name = Fields.database_field_name(field, associations, aliases, aliased_associations)
|
|
105
|
+
[ name, get_serializer(name) ]
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
private
|
|
109
|
+
|
|
110
|
+
# Retrieves the serializer for the given name. If the name exists in
|
|
111
|
+
# the serializers hash then return that immediately, otherwise
|
|
112
|
+
# recursively look through the associations and find the appropriate
|
|
113
|
+
# field.
|
|
114
|
+
#
|
|
115
|
+
# @param [ String ] name The name of the db field.
|
|
116
|
+
#
|
|
117
|
+
# @return [ Object ] The serializer.
|
|
118
|
+
def get_serializer(name)
|
|
119
|
+
if s = serializers[name]
|
|
120
|
+
s
|
|
121
|
+
else
|
|
122
|
+
Fields.traverse_association_tree(name, serializers, associations, aliased_associations)
|
|
123
|
+
end
|
|
100
124
|
end
|
|
101
125
|
end
|
|
102
126
|
end
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Mongoid
|
|
4
|
+
class Criteria
|
|
5
|
+
module Queryable
|
|
6
|
+
# This module encapsulates methods that write query expressions into
|
|
7
|
+
# the Criteria's selector.
|
|
8
|
+
#
|
|
9
|
+
# The query expressions must have already been expanded as necessary.
|
|
10
|
+
# The methods of this module do not perform processing on expression
|
|
11
|
+
# values.
|
|
12
|
+
#
|
|
13
|
+
# Methods in this module do not handle negation - if negation is needed,
|
|
14
|
+
# it must have already been handled upstream of these methods.
|
|
15
|
+
#
|
|
16
|
+
# @api private
|
|
17
|
+
module Storable
|
|
18
|
+
|
|
19
|
+
# Adds a field expression to the query.
|
|
20
|
+
#
|
|
21
|
+
# +field+ must be a field name, and it must be a string. The upstream
|
|
22
|
+
# code must have converted other field/key types to the simple string
|
|
23
|
+
# form by the time this method is invoked.
|
|
24
|
+
#
|
|
25
|
+
# +value+ can be of any type, it is written into the selector unchanged.
|
|
26
|
+
#
|
|
27
|
+
# This method performs no processing on the provided field value.
|
|
28
|
+
#
|
|
29
|
+
# Mutates the receiver.
|
|
30
|
+
#
|
|
31
|
+
# @param [ String ] field The field name.
|
|
32
|
+
# @param [ Object ] value The field value.
|
|
33
|
+
#
|
|
34
|
+
# @return [ Storable ] self.
|
|
35
|
+
def add_field_expression(field, value)
|
|
36
|
+
unless field.is_a?(String)
|
|
37
|
+
raise ArgumentError, "Field must be a string: #{field}"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
if field.start_with?('$')
|
|
41
|
+
raise ArgumentError, "Field cannot be an operator (i.e. begin with $): #{field}"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
if selector[field]
|
|
45
|
+
# We already have a restriction by the field we are trying
|
|
46
|
+
# to restrict, combine the restrictions.
|
|
47
|
+
if value.is_a?(Hash) && selector[field].is_a?(Hash) &&
|
|
48
|
+
value.keys.all? { |key|
|
|
49
|
+
key_s = key.to_s
|
|
50
|
+
key_s.start_with?('$') && !selector[field].keys.map(&:to_s).include?(key_s)
|
|
51
|
+
}
|
|
52
|
+
then
|
|
53
|
+
# Multiple operators can be combined on the same field by
|
|
54
|
+
# adding them to the existing hash.
|
|
55
|
+
new_value = selector[field].merge(value)
|
|
56
|
+
selector.store(field, new_value)
|
|
57
|
+
elsif selector[field] != value
|
|
58
|
+
add_operator_expression('$and', [{field => value}])
|
|
59
|
+
end
|
|
60
|
+
else
|
|
61
|
+
selector.store(field, value)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
self
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Adds a logical operator expression to the selector.
|
|
68
|
+
#
|
|
69
|
+
# This method only handles logical operators ($and, $nor and $or).
|
|
70
|
+
# It raises ArgumentError if called with another operator. Note that
|
|
71
|
+
# in MQL, $not is a field-level operator and not a query-level one,
|
|
72
|
+
# and therefore $not is not handled by this method.
|
|
73
|
+
#
|
|
74
|
+
# This method takes the operator and the operator value expression
|
|
75
|
+
# separately for callers' convenience. It can be considered to
|
|
76
|
+
# handle storing the hash +{operator => op_expr}+.
|
|
77
|
+
#
|
|
78
|
+
# If the selector consists of a single condition which is the specified
|
|
79
|
+
# operator (on the top level), the new condition given in op_expr is
|
|
80
|
+
# added to the existing conditions for the specified operator.
|
|
81
|
+
# For example, if the selector is currently:
|
|
82
|
+
#
|
|
83
|
+
# {'$or' => [{'hello' => 'world'}]}
|
|
84
|
+
#
|
|
85
|
+
# ... and operator is '$or' and op_expr is `[{'test' => 123'}]`,
|
|
86
|
+
# the resulting selector will be:
|
|
87
|
+
#
|
|
88
|
+
# {'$or' => [{'hello' => 'world'}, {'test' => 123}]}
|
|
89
|
+
#
|
|
90
|
+
# This method always adds the new conditions as additional requirements;
|
|
91
|
+
# in other words, it does not implement the ActiveRecord or/nor behavior
|
|
92
|
+
# where the receiver becomes one of the operands. It is expected that
|
|
93
|
+
# code upstream of this method implements such behavior.
|
|
94
|
+
#
|
|
95
|
+
# This method does not simplify values (i.e. if the selector is
|
|
96
|
+
# currently empty and operator is $and, op_expr is written to the
|
|
97
|
+
# selector with $and even if the $and can in principle be elided).
|
|
98
|
+
# Such simplification is also expected to have already been performed
|
|
99
|
+
# by the upstream code.
|
|
100
|
+
#
|
|
101
|
+
# This method mutates the receiver.
|
|
102
|
+
#
|
|
103
|
+
# @param [ String ] operator The operator to add.
|
|
104
|
+
# @param [ Array<Hash> ] op_expr Operator value to add.
|
|
105
|
+
#
|
|
106
|
+
# @return [ Storable ] self.
|
|
107
|
+
def add_logical_operator_expression(operator, op_expr)
|
|
108
|
+
unless operator.is_a?(String)
|
|
109
|
+
raise ArgumentError, "Operator must be a string: #{operator}"
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
unless %w($and $nor $or).include?(operator)
|
|
113
|
+
raise ArgumentError, "This method only handles logical operators ($and, $nor, $or). Operator given: #{operator}"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
unless op_expr.is_a?(Array)
|
|
117
|
+
raise Errors::InvalidQuery, "#{operator} argument must be an array: #{Errors::InvalidQuery.truncate_expr(op_expr)}"
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
if selector.length == 1 && selector.keys.first == operator
|
|
121
|
+
new_value = selector.values.first + op_expr
|
|
122
|
+
selector.store(operator, new_value)
|
|
123
|
+
elsif operator == '$and' || selector.empty?
|
|
124
|
+
# $and can always be added to top level and it will be combined
|
|
125
|
+
# with whatever other conditions exist.
|
|
126
|
+
if !Mongoid.broken_and && current_value = selector[operator]
|
|
127
|
+
new_value = current_value + op_expr
|
|
128
|
+
selector.store(operator, new_value)
|
|
129
|
+
else
|
|
130
|
+
selector.store(operator, op_expr)
|
|
131
|
+
end
|
|
132
|
+
else
|
|
133
|
+
# Other operators need to be added separately
|
|
134
|
+
if selector[operator]
|
|
135
|
+
add_logical_operator_expression('$and', [operator => op_expr])
|
|
136
|
+
else
|
|
137
|
+
selector.store(operator, op_expr)
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
self
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Adds an operator expression to the selector.
|
|
145
|
+
#
|
|
146
|
+
# This method takes the operator and the operator value expression
|
|
147
|
+
# separately for callers' convenience. It can be considered to
|
|
148
|
+
# handle storing the hash +{operator => op_expr}+.
|
|
149
|
+
#
|
|
150
|
+
# The operator value can be of any type.
|
|
151
|
+
#
|
|
152
|
+
# If the selector already has the specified operator in it (on the
|
|
153
|
+
# top level), the new condition given in op_expr is added to the
|
|
154
|
+
# existing conditions for the specified operator. This is
|
|
155
|
+
# straightforward for $and; for other logical operators, the behavior
|
|
156
|
+
# of this method is to add the new conditions to the existing operator.
|
|
157
|
+
# For example, if the selector is currently:
|
|
158
|
+
#
|
|
159
|
+
# {'foo' => 'bar', '$or' => [{'hello' => 'world'}]}
|
|
160
|
+
#
|
|
161
|
+
# ... and operator is '$or' and op_expr is `{'test' => 123'}`,
|
|
162
|
+
# the resulting selector will be:
|
|
163
|
+
#
|
|
164
|
+
# {'foo' => 'bar', '$or' => [{'hello' => 'world'}, {'test' => 123}]}
|
|
165
|
+
#
|
|
166
|
+
# This does not implement an OR between the existing selector and the
|
|
167
|
+
# new operator expression - handling this is the job of upstream
|
|
168
|
+
# methods. This method simply stores op_expr into the selector on the
|
|
169
|
+
# assumption that the existing selector is the correct left hand side
|
|
170
|
+
# of the operation already.
|
|
171
|
+
#
|
|
172
|
+
# For non-logical query-level operators like $where and $text, if
|
|
173
|
+
# there already is a top-level operator with the same name, the
|
|
174
|
+
# op_expr is added to the selector via a top-level $and operator,
|
|
175
|
+
# thus producing a selector having both operator values.
|
|
176
|
+
#
|
|
177
|
+
# This method does not simplify values (i.e. if the selector is
|
|
178
|
+
# currently empty and operator is $and, op_expr is written to the
|
|
179
|
+
# selector with $and even if the $and can in principle be elided).
|
|
180
|
+
#
|
|
181
|
+
# This method mutates the receiver.
|
|
182
|
+
#
|
|
183
|
+
# @param [ String ] operator The operator to add.
|
|
184
|
+
# @param [ Object ] op_expr Operator value to add.
|
|
185
|
+
#
|
|
186
|
+
# @return [ Storable ] self.
|
|
187
|
+
def add_operator_expression(operator, op_expr)
|
|
188
|
+
unless operator.is_a?(String)
|
|
189
|
+
raise ArgumentError, "Operator must be a string: #{operator}"
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
unless operator.start_with?('$')
|
|
193
|
+
raise ArgumentError, "Operator must begin with $: #{operator}"
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
if %w($and $nor $or).include?(operator)
|
|
197
|
+
return add_logical_operator_expression(operator, op_expr)
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# For other operators, if the operator already exists in the
|
|
201
|
+
# query, add the new condition with $and, otherwise add the
|
|
202
|
+
# new condition to the top level.
|
|
203
|
+
if selector[operator]
|
|
204
|
+
add_logical_operator_expression('$and', [{operator => op_expr}])
|
|
205
|
+
else
|
|
206
|
+
selector.store(operator, op_expr)
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
self
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
# Adds an arbitrary expression to the query.
|
|
213
|
+
#
|
|
214
|
+
# Field can either be a field name or an operator.
|
|
215
|
+
#
|
|
216
|
+
# Mutates the receiver.
|
|
217
|
+
#
|
|
218
|
+
# @param [ String ] field Field name or operator name.
|
|
219
|
+
# @param [ Object ] value Field value or operator expression.
|
|
220
|
+
#
|
|
221
|
+
# @return [ Storable ] self.
|
|
222
|
+
def add_one_expression(field, value)
|
|
223
|
+
unless field.is_a?(String)
|
|
224
|
+
raise ArgumentError, "Field must be a string: #{field}"
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
if field.start_with?('$')
|
|
228
|
+
add_operator_expression(field, value)
|
|
229
|
+
else
|
|
230
|
+
add_field_expression(field, value)
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "mongoid/criteria/queryable/expandable"
|
|
2
4
|
require "mongoid/criteria/queryable/extensions"
|
|
3
|
-
require "mongoid/criteria/queryable/forwardable"
|
|
4
5
|
require "mongoid/criteria/queryable/key"
|
|
5
6
|
require "mongoid/criteria/queryable/macroable"
|
|
6
7
|
require "mongoid/criteria/queryable/mergeable"
|
|
@@ -11,6 +12,7 @@ require "mongoid/criteria/queryable/optional"
|
|
|
11
12
|
require "mongoid/criteria/queryable/options"
|
|
12
13
|
require "mongoid/criteria/queryable/selectable"
|
|
13
14
|
require "mongoid/criteria/queryable/selector"
|
|
15
|
+
require "mongoid/criteria/queryable/storable"
|
|
14
16
|
|
|
15
17
|
module Mongoid
|
|
16
18
|
class Criteria
|
|
@@ -23,15 +25,18 @@ module Mongoid
|
|
|
23
25
|
# include Queryable
|
|
24
26
|
# end
|
|
25
27
|
module Queryable
|
|
28
|
+
include Storable
|
|
29
|
+
include Expandable
|
|
26
30
|
include Mergeable
|
|
27
31
|
include Aggregable
|
|
28
32
|
include Selectable
|
|
29
33
|
include Optional
|
|
30
34
|
|
|
31
35
|
# @attribute [r] aliases The aliases.
|
|
32
|
-
|
|
36
|
+
attr_reader :aliases
|
|
37
|
+
|
|
33
38
|
# @attribute [r] serializers The serializers.
|
|
34
|
-
attr_reader :
|
|
39
|
+
attr_reader :serializers
|
|
35
40
|
|
|
36
41
|
# Is this queryable equal to another object? Is true if the selector and
|
|
37
42
|
# options are equal.
|
|
@@ -41,29 +46,29 @@ module Mongoid
|
|
|
41
46
|
#
|
|
42
47
|
# @param [ Object ] other The object to compare against.
|
|
43
48
|
#
|
|
44
|
-
# @return [ true
|
|
45
|
-
#
|
|
46
|
-
# @since 1.0.0
|
|
49
|
+
# @return [ true | false ] If the objects are equal.
|
|
47
50
|
def ==(other)
|
|
48
51
|
return false unless other.is_a?(Queryable)
|
|
49
52
|
selector == other.selector && options == other.options
|
|
50
53
|
end
|
|
51
54
|
|
|
52
55
|
# Initialize the new queryable. Will yield itself to the block if a block
|
|
53
|
-
# is provided for objects that need additional
|
|
56
|
+
# is provided for objects that need additional behavior.
|
|
54
57
|
#
|
|
55
58
|
# @example Initialize the queryable.
|
|
56
59
|
# Queryable.new
|
|
57
60
|
#
|
|
58
61
|
# @param [ Hash ] aliases The optional field aliases.
|
|
59
62
|
# @param [ Hash ] serializers The optional field serializers.
|
|
63
|
+
# @param [ Hash ] associations The optional associations.
|
|
64
|
+
# @param [ Hash ] aliased_associations The optional aliased associations.
|
|
60
65
|
# @param [ Symbol ] driver The driver being used.
|
|
61
66
|
#
|
|
62
|
-
# @
|
|
63
|
-
def initialize(aliases = {}, serializers = {},
|
|
64
|
-
@aliases, @
|
|
65
|
-
@options = Options.new(aliases, serializers)
|
|
66
|
-
@selector = Selector.new(aliases, serializers)
|
|
67
|
+
# @api private
|
|
68
|
+
def initialize(aliases = {}, serializers = {}, associations = {}, aliased_associations = {})
|
|
69
|
+
@aliases, @serializers = aliases, serializers
|
|
70
|
+
@options = Options.new(aliases, serializers, associations, aliased_associations)
|
|
71
|
+
@selector = Selector.new(aliases, serializers, associations, aliased_associations)
|
|
67
72
|
@pipeline = Pipeline.new(aliases)
|
|
68
73
|
@aggregating = nil
|
|
69
74
|
yield(self) if block_given?
|
|
@@ -75,8 +80,6 @@ module Mongoid
|
|
|
75
80
|
# queryable.initialize_copy(criteria)
|
|
76
81
|
#
|
|
77
82
|
# @param [ Queryable ] other The original copy.
|
|
78
|
-
#
|
|
79
|
-
# @since 1.0.0
|
|
80
83
|
def initialize_copy(other)
|
|
81
84
|
@options = other.options.__deep_copy__
|
|
82
85
|
@selector = other.selector.__deep_copy__
|