mongoid 7.0.10 → 7.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +30 -30
- data/README.md +32 -19
- data/Rakefile +51 -7
- data/lib/config/locales/en.yml +129 -70
- data/lib/mongoid/association/accessors.rb +143 -80
- data/lib/mongoid/association/bindable.rb +7 -26
- data/lib/mongoid/association/builders.rb +4 -12
- data/lib/mongoid/association/constrainable.rb +5 -6
- data/lib/mongoid/association/depending.rb +9 -18
- data/lib/mongoid/association/eager_loadable.rb +2 -3
- data/lib/mongoid/association/embedded/batchable.rb +16 -42
- data/lib/mongoid/association/embedded/cyclic.rb +10 -17
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +3 -7
- 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 +6 -26
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -8
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +8 -5
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +90 -93
- data/lib/mongoid/association/embedded/embeds_many.rb +6 -34
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +4 -8
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +9 -6
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +42 -27
- data/lib/mongoid/association/embedded/embeds_one.rb +6 -30
- data/lib/mongoid/association/embedded.rb +2 -0
- data/lib/mongoid/association/macros.rb +44 -41
- data/lib/mongoid/association/many.rb +16 -30
- data/lib/mongoid/association/marshalable.rb +3 -6
- data/lib/mongoid/association/nested/many.rb +18 -27
- data/lib/mongoid/association/nested/nested_buildable.rb +5 -11
- data/lib/mongoid/association/nested/one.rb +16 -27
- data/lib/mongoid/association/nested.rb +3 -3
- data/lib/mongoid/association/one.rb +4 -11
- data/lib/mongoid/association/options.rb +8 -38
- data/lib/mongoid/association/proxy.rb +37 -36
- data/lib/mongoid/association/referenced/auto_save.rb +5 -11
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +4 -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 +16 -27
- data/lib/mongoid/association/referenced/belongs_to.rb +14 -36
- data/lib/mongoid/association/referenced/counter_cache.rb +4 -15
- data/lib/mongoid/association/referenced/eager.rb +39 -38
- 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 +37 -57
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -43
- 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 +444 -456
- data/lib/mongoid/association/referenced/has_many/proxy.rb +74 -107
- data/lib/mongoid/association/referenced/has_many.rb +18 -42
- 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 +13 -26
- data/lib/mongoid/association/referenced/has_one/proxy.rb +23 -25
- data/lib/mongoid/association/referenced/has_one.rb +13 -33
- data/lib/mongoid/association/referenced/syncable.rb +7 -22
- data/lib/mongoid/association/referenced.rb +2 -0
- data/lib/mongoid/association/reflections.rb +7 -6
- data/lib/mongoid/association/relatable.rb +18 -74
- data/lib/mongoid/association.rb +8 -22
- data/lib/mongoid/atomic/modifiers.rb +27 -51
- data/lib/mongoid/atomic/paths/embedded/many.rb +4 -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 +29 -44
- data/lib/mongoid/attributes/dynamic.rb +3 -18
- data/lib/mongoid/attributes/nested.rb +7 -10
- data/lib/mongoid/attributes/processing.rb +9 -24
- data/lib/mongoid/attributes/projector.rb +119 -0
- data/lib/mongoid/attributes/readonly.rb +3 -6
- data/lib/mongoid/attributes.rb +46 -60
- data/lib/mongoid/cacheable.rb +6 -9
- data/lib/mongoid/changeable.rb +6 -60
- data/lib/mongoid/clients/factory.rb +42 -17
- data/lib/mongoid/clients/options.rb +10 -13
- data/lib/mongoid/clients/sessions.rb +2 -6
- data/lib/mongoid/clients/storage_options.rb +7 -12
- data/lib/mongoid/clients/validators/storage.rb +2 -9
- 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 +15 -6
- data/lib/mongoid/config/options.rb +20 -23
- data/lib/mongoid/config/validators/client.rb +2 -17
- data/lib/mongoid/config/validators/option.rb +2 -3
- data/lib/mongoid/config/validators.rb +2 -1
- data/lib/mongoid/config.rb +112 -41
- data/lib/mongoid/contextual/aggregable/memory.rb +17 -12
- data/lib/mongoid/contextual/aggregable/mongo.rb +25 -26
- 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 +6 -37
- data/lib/mongoid/contextual/map_reduce.rb +5 -33
- data/lib/mongoid/contextual/memory.rb +8 -61
- data/lib/mongoid/contextual/mongo.rb +160 -82
- data/lib/mongoid/contextual/none.rb +44 -28
- data/lib/mongoid/contextual/queryable.rb +2 -3
- data/lib/mongoid/contextual.rb +7 -9
- data/lib/mongoid/copyable.rb +11 -10
- data/lib/mongoid/criteria/findable.rb +12 -15
- data/lib/mongoid/criteria/includable.rb +8 -15
- data/lib/mongoid/criteria/inspectable.rb +2 -3
- data/lib/mongoid/criteria/marshalable.rb +2 -5
- data/lib/mongoid/criteria/modifiable.rb +2 -19
- data/lib/mongoid/criteria/options.rb +2 -3
- data/lib/mongoid/criteria/permission.rb +2 -1
- data/lib/mongoid/criteria/queryable/aggregable.rb +2 -13
- data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +4 -27
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -4
- data/lib/mongoid/criteria/queryable/extensions/date.rb +3 -8
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +5 -11
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -26
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -12
- data/lib/mongoid/criteria/queryable/extensions/object.rb +4 -29
- data/lib/mongoid/criteria/queryable/extensions/range.rb +41 -17
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +6 -13
- data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -4
- data/lib/mongoid/criteria/queryable/extensions/string.rb +3 -18
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -10
- data/lib/mongoid/criteria/queryable/extensions/time.rb +3 -8
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +3 -8
- data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
- data/lib/mongoid/criteria/queryable/key.rb +36 -21
- data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
- data/lib/mongoid/criteria/queryable/mergeable.rb +179 -40
- data/lib/mongoid/criteria/queryable/optional.rb +5 -48
- data/lib/mongoid/criteria/queryable/options.rb +2 -19
- data/lib/mongoid/criteria/queryable/pipeline.rb +5 -15
- data/lib/mongoid/criteria/queryable/selectable.rb +414 -162
- data/lib/mongoid/criteria/queryable/selector.rb +36 -24
- data/lib/mongoid/criteria/queryable/smash.rb +2 -11
- data/lib/mongoid/criteria/queryable/storable.rb +237 -0
- data/lib/mongoid/criteria/queryable.rb +7 -9
- data/lib/mongoid/criteria/scopable.rb +27 -19
- data/lib/mongoid/criteria.rb +79 -72
- data/lib/mongoid/document.rb +24 -73
- data/lib/mongoid/equality.rb +29 -12
- 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 +2 -9
- data/lib/mongoid/errors/eager_load.rb +6 -5
- 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 +2 -3
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -3
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -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 +2 -5
- 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_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 +4 -9
- 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 +2 -3
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
- data/lib/mongoid/errors/invalid_time.rb +2 -3
- data/lib/mongoid/errors/invalid_value.rb +2 -1
- 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 +3 -10
- 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 +2 -3
- data/lib/mongoid/errors/no_client_hosts.rb +2 -3
- 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 +2 -3
- 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 +2 -0
- data/lib/mongoid/errors/unknown_attribute.rb +2 -3
- 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 +12 -1
- data/lib/mongoid/evolvable.rb +4 -5
- data/lib/mongoid/extensions/array.rb +28 -37
- data/lib/mongoid/extensions/big_decimal.rb +2 -11
- data/lib/mongoid/extensions/boolean.rb +3 -5
- data/lib/mongoid/extensions/date.rb +13 -12
- data/lib/mongoid/extensions/date_time.rb +4 -12
- data/lib/mongoid/extensions/decimal128.rb +2 -5
- data/lib/mongoid/extensions/false_class.rb +4 -7
- data/lib/mongoid/extensions/float.rb +5 -10
- data/lib/mongoid/extensions/hash.rb +47 -34
- data/lib/mongoid/extensions/integer.rb +5 -12
- data/lib/mongoid/extensions/module.rb +2 -3
- data/lib/mongoid/extensions/nil_class.rb +2 -5
- data/lib/mongoid/extensions/object.rb +17 -44
- data/lib/mongoid/extensions/object_id.rb +2 -7
- data/lib/mongoid/extensions/range.rb +2 -11
- data/lib/mongoid/extensions/regexp.rb +2 -3
- data/lib/mongoid/extensions/set.rb +2 -7
- data/lib/mongoid/extensions/string.rb +19 -39
- data/lib/mongoid/extensions/symbol.rb +2 -7
- data/lib/mongoid/extensions/time.rb +12 -9
- data/lib/mongoid/extensions/time_with_zone.rb +25 -7
- data/lib/mongoid/extensions/true_class.rb +4 -7
- data/lib/mongoid/extensions.rb +18 -3
- data/lib/mongoid/factory.rb +52 -13
- data/lib/mongoid/fields/foreign_key.rb +3 -22
- data/lib/mongoid/fields/localized.rb +2 -11
- data/lib/mongoid/fields/standard.rb +6 -36
- data/lib/mongoid/fields/validators/macro.rb +36 -18
- data/lib/mongoid/fields/validators.rb +2 -1
- data/lib/mongoid/fields.rb +113 -63
- data/lib/mongoid/findable.rb +59 -23
- data/lib/mongoid/indexable/specification.rb +3 -16
- data/lib/mongoid/indexable/validators/options.rb +2 -7
- data/lib/mongoid/indexable.rb +6 -21
- data/lib/mongoid/inspectable.rb +4 -11
- data/lib/mongoid/interceptable.rb +13 -30
- data/lib/mongoid/loggable.rb +13 -16
- data/lib/mongoid/matchable.rb +2 -153
- 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 +110 -0
- data/lib/mongoid/persistable/creatable.rb +4 -21
- data/lib/mongoid/persistable/deletable.rb +5 -21
- data/lib/mongoid/persistable/destroyable.rb +11 -10
- 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 +3 -8
- data/lib/mongoid/persistable/settable.rb +3 -6
- data/lib/mongoid/persistable/unsettable.rb +8 -8
- data/lib/mongoid/persistable/updatable.rb +32 -20
- data/lib/mongoid/persistable/upsertable.rb +3 -8
- data/lib/mongoid/persistable.rb +133 -38
- data/lib/mongoid/persistence_context.rb +23 -36
- data/lib/mongoid/positional.rb +2 -5
- data/lib/mongoid/query_cache.rb +118 -103
- data/lib/mongoid/railtie.rb +3 -16
- data/lib/mongoid/railties/controller_runtime.rb +3 -1
- data/lib/mongoid/railties/database.rake +9 -0
- data/lib/mongoid/reloadable.rb +14 -19
- data/lib/mongoid/scopable.rb +8 -35
- data/lib/mongoid/selectable.rb +8 -17
- data/lib/mongoid/serializable.rb +24 -29
- data/lib/mongoid/shardable.rb +80 -17
- data/lib/mongoid/stateful.rb +3 -10
- data/lib/mongoid/stringified_symbol.rb +52 -0
- data/lib/mongoid/tasks/database.rake +12 -5
- data/lib/mongoid/tasks/database.rb +85 -5
- data/lib/mongoid/threaded/lifecycle.rb +2 -21
- data/lib/mongoid/threaded.rb +2 -55
- data/lib/mongoid/timestamps/created/short.rb +2 -1
- data/lib/mongoid/timestamps/created.rb +3 -2
- 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 +3 -4
- data/lib/mongoid/timestamps.rb +3 -2
- data/lib/mongoid/touchable.rb +53 -23
- data/lib/mongoid/traversable.rb +177 -57
- data/lib/mongoid/validatable/associated.rb +5 -6
- data/lib/mongoid/validatable/format.rb +2 -1
- data/lib/mongoid/validatable/length.rb +2 -1
- data/lib/mongoid/validatable/localizable.rb +2 -3
- data/lib/mongoid/validatable/macros.rb +2 -7
- data/lib/mongoid/validatable/presence.rb +8 -13
- data/lib/mongoid/validatable/queryable.rb +2 -3
- data/lib/mongoid/validatable/uniqueness.rb +20 -33
- data/lib/mongoid/validatable.rb +8 -27
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid.rb +32 -15
- data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +45 -30
- 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 +1 -0
- data/spec/integration/app_spec.rb +246 -95
- data/spec/integration/associations/belongs_to_spec.rb +2 -0
- data/spec/integration/associations/embedded_dirty_spec.rb +29 -0
- data/spec/integration/associations/embedded_spec.rb +207 -1
- data/spec/integration/associations/embeds_many_spec.rb +206 -0
- data/spec/integration/associations/embeds_one_spec.rb +23 -0
- data/spec/integration/associations/foreign_key_spec.rb +98 -0
- data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
- data/spec/integration/associations/has_many_spec.rb +128 -0
- data/spec/integration/associations/has_one_spec.rb +176 -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 +61 -0
- data/spec/integration/callbacks_spec.rb +228 -0
- data/spec/integration/contextual/empty_spec.rb +141 -0
- data/spec/integration/criteria/alias_query_spec.rb +161 -0
- data/spec/integration/criteria/date_field_spec.rb +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 +265 -0
- data/spec/integration/criteria/time_with_zone_spec.rb +125 -15
- data/spec/integration/discriminator_key_spec.rb +353 -0
- data/spec/integration/discriminator_value_spec.rb +206 -0
- data/spec/integration/document_spec.rb +30 -1
- data/spec/integration/i18n_fallbacks_spec.rb +89 -0
- data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -42
- 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 +40 -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 +124 -0
- data/spec/integration/matcher_spec.rb +283 -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 +22 -5
- 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 +34 -32
- data/spec/mongoid/association/depending_spec.rb +426 -333
- data/spec/mongoid/association/eager_spec.rb +6 -4
- 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 +2 -0
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +2 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +65 -13
- 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 +2 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +431 -133
- data/spec/mongoid/association/embedded/embeds_many_models.rb +17 -1
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +51 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +3 -1
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +2 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +2 -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 +3 -0
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +3 -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 +2 -0
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +57 -16
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +242 -12
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +99 -58
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +24 -1
- 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 +215 -167
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +43 -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 +46 -2
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -1
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +23 -0
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +40 -9
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +306 -125
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +679 -339
- data/spec/mongoid/association/referenced/has_many_models.rb +58 -0
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
- data/spec/mongoid/association/referenced/has_many_spec.rb +23 -0
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +2 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +53 -7
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +34 -4
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +28 -26
- data/spec/mongoid/association/referenced/has_one_models.rb +49 -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 +33 -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 +107 -12
- data/spec/mongoid/atomic_spec.rb +31 -6
- data/spec/mongoid/attributes/dynamic_spec.rb +0 -1
- data/spec/mongoid/attributes/nested_spec.rb +69 -67
- 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 +44 -0
- data/spec/mongoid/attributes/readonly_spec.rb +24 -22
- data/spec/mongoid/attributes_spec.rb +363 -28
- data/spec/mongoid/cacheable_spec.rb +3 -1
- data/spec/mongoid/changeable_spec.rb +60 -35
- data/spec/mongoid/clients/factory_spec.rb +136 -28
- data/spec/mongoid/clients/options_spec.rb +44 -26
- data/spec/mongoid/clients/sessions_spec.rb +25 -28
- data/spec/mongoid/clients/transactions_spec.rb +54 -29
- data/spec/mongoid/clients_spec.rb +8 -6
- data/spec/mongoid/composable_spec.rb +2 -0
- data/spec/mongoid/config/environment_spec.rb +88 -8
- data/spec/mongoid/config/options_spec.rb +22 -3
- data/spec/mongoid/config_spec.rb +277 -1
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +53 -11
- 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 +222 -71
- data/spec/mongoid/contextual/geo_near_spec.rb +20 -18
- data/spec/mongoid/contextual/map_reduce_spec.rb +4 -2
- data/spec/mongoid/contextual/memory_spec.rb +25 -23
- data/spec/mongoid/contextual/mongo_spec.rb +413 -92
- data/spec/mongoid/contextual/none_spec.rb +9 -81
- data/spec/mongoid/copyable_spec.rb +207 -26
- data/spec/mongoid/copyable_spec_models.rb +30 -0
- data/spec/mongoid/criteria/findable_spec.rb +77 -20
- data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +2 -0
- 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 +2 -0
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +2 -0
- 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 +2 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +35 -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 -0
- 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 +0 -1
- 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 -0
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +23 -16
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +2 -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 +3 -1
- 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 +1593 -286
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +1010 -2736
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
- data/spec/mongoid/criteria/scopable_spec.rb +129 -0
- data/spec/mongoid/criteria_projection_spec.rb +410 -0
- data/spec/mongoid/criteria_spec.rb +782 -459
- data/spec/mongoid/document_fields_spec.rb +26 -1
- 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 +123 -48
- 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 +2 -0
- data/spec/mongoid/errors/eager_load_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_config_file_spec.rb +31 -0
- 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 +2 -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 +22 -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 +2 -0
- 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 +2 -0
- 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 +25 -43
- data/spec/mongoid/extensions/big_decimal_spec.rb +2 -0
- data/spec/mongoid/extensions/binary_spec.rb +2 -0
- data/spec/mongoid/extensions/boolean_spec.rb +2 -0
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +335 -0
- data/spec/mongoid/extensions/date_spec.rb +8 -160
- data/spec/mongoid/extensions/date_time_spec.rb +17 -60
- 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 +17 -3
- data/spec/mongoid/extensions/hash_spec.rb +105 -0
- data/spec/mongoid/extensions/integer_spec.rb +14 -2
- 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 +2 -0
- data/spec/mongoid/extensions/regexp_spec.rb +2 -0
- data/spec/mongoid/extensions/set_spec.rb +2 -0
- data/spec/mongoid/extensions/string_spec.rb +60 -27
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
- data/spec/mongoid/extensions/symbol_spec.rb +2 -0
- data/spec/mongoid/extensions/time_spec.rb +29 -0
- data/spec/mongoid/extensions/time_with_zone_spec.rb +33 -0
- data/spec/mongoid/extensions/true_class_spec.rb +3 -1
- data/spec/mongoid/extensions_spec.rb +16 -2
- data/spec/mongoid/factory_spec.rb +287 -27
- data/spec/mongoid/fields/foreign_key_spec.rb +2 -0
- data/spec/mongoid/fields/localized_spec.rb +6 -4
- data/spec/mongoid/fields/standard_spec.rb +2 -0
- data/spec/mongoid/fields_spec.rb +418 -36
- data/spec/mongoid/findable_spec.rb +53 -19
- data/spec/mongoid/indexable/specification_spec.rb +2 -0
- data/spec/mongoid/indexable_spec.rb +30 -2
- data/spec/mongoid/inspectable_spec.rb +39 -2
- data/spec/mongoid/interceptable_spec.rb +168 -96
- data/spec/mongoid/interceptable_spec_models.rb +76 -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 +40 -0
- data/spec/mongoid/persistable/creatable_spec.rb +112 -27
- data/spec/mongoid/persistable/deletable_spec.rb +273 -11
- data/spec/mongoid/persistable/destroyable_spec.rb +201 -11
- 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 +54 -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 +4 -2
- data/spec/mongoid/persistable_spec.rb +85 -9
- data/spec/mongoid/persistence_context_spec.rb +2 -0
- data/spec/mongoid/positional_spec.rb +2 -0
- data/spec/mongoid/query_cache_middleware_spec.rb +68 -0
- data/spec/mongoid/query_cache_spec.rb +501 -81
- data/spec/mongoid/relations/proxy_spec.rb +8 -6
- data/spec/mongoid/reloadable_spec.rb +298 -20
- data/spec/mongoid/scopable_spec.rb +67 -21
- data/spec/mongoid/selectable_spec.rb +8 -6
- data/spec/mongoid/serializable_spec.rb +160 -29
- data/spec/mongoid/shardable_models.rb +61 -0
- data/spec/mongoid/shardable_spec.rb +116 -17
- data/spec/mongoid/stateful_spec.rb +3 -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 +8 -6
- data/spec/mongoid/touchable_spec.rb +180 -33
- data/spec/mongoid/touchable_spec_models.rb +53 -0
- data/spec/mongoid/traversable_spec.rb +1167 -1
- data/spec/mongoid/validatable/associated_spec.rb +2 -0
- 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 +69 -67
- data/spec/mongoid/validatable_spec.rb +5 -3
- data/spec/mongoid_spec.rb +2 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -1
- data/spec/rails/mongoid_spec.rb +4 -2
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +231 -0
- data/spec/shared/lib/mrss/constraints.rb +386 -0
- data/spec/shared/lib/mrss/docker_runner.rb +271 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +199 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
- data/spec/shared/lib/mrss/session_registry.rb +69 -0
- data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
- data/spec/shared/lib/mrss/utils.rb +15 -0
- data/spec/shared/share/Dockerfile.erb +339 -0
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/distro.sh +74 -0
- data/spec/shared/shlib/server.sh +379 -0
- data/spec/shared/shlib/set_env.sh +132 -0
- data/spec/spec_helper.rb +39 -35
- data/spec/support/authorization.rb +2 -0
- data/spec/support/client_registry.rb +9 -0
- data/spec/support/constraints.rb +15 -234
- data/spec/support/expectations.rb +5 -1
- data/spec/support/helpers.rb +11 -0
- data/spec/support/macros.rb +22 -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/{app → support}/models/augmentation.rb +2 -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 +6 -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/{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/{app → support}/models/circus.rb +2 -0
- data/spec/{app → support}/models/code.rb +2 -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/support/models/customer.rb +10 -0
- data/spec/support/models/customer_address.rb +11 -0
- data/spec/support/models/deed.rb +7 -0
- data/spec/{app → support}/models/definition.rb +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/{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 +2 -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 +4 -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 +2 -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 +2 -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 +13 -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 +21 -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 +2 -0
- data/spec/{app → support}/models/post.rb +2 -0
- data/spec/{app → support}/models/post_genre.rb +2 -0
- data/spec/{app → support}/models/powerup.rb +2 -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/{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 +2 -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/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/{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/{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/{app → support}/models/weapon.rb +2 -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/shared/time.rb +53 -0
- data/spec/support/spec_config.rb +16 -3
- data.tar.gz.sig +0 -0
- metadata +1100 -738
- metadata.gz.sig +0 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
- 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/bed.rb +0 -1
- data/spec/app/models/car.rb +0 -1
- 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/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/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/child_process_helper.rb +0 -76
- data/spec/support/cluster_config.rb +0 -158
- /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
|
|
@@ -10,18 +11,12 @@ module Mongoid
|
|
|
10
11
|
extend Macroable
|
|
11
12
|
|
|
12
13
|
# Constant for a LineString $geometry.
|
|
13
|
-
#
|
|
14
|
-
# @since 2.0.0
|
|
15
14
|
LINE_STRING = "LineString"
|
|
16
15
|
|
|
17
16
|
# Constant for a Point $geometry.
|
|
18
|
-
#
|
|
19
|
-
# @since 2.0.0
|
|
20
17
|
POINT = "Point"
|
|
21
18
|
|
|
22
19
|
# Constant for a Polygon $geometry.
|
|
23
|
-
#
|
|
24
|
-
# @since 2.0.0
|
|
25
20
|
POLYGON = "Polygon"
|
|
26
21
|
|
|
27
22
|
# @attribute [rw] negating If the next expression is negated.
|
|
@@ -39,10 +34,32 @@ module Mongoid
|
|
|
39
34
|
# @param [ Hash ] criterion The key value pairs for $all matching.
|
|
40
35
|
#
|
|
41
36
|
# @return [ Selectable ] The cloned selectable.
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
37
|
+
def all(*criteria)
|
|
38
|
+
if criteria.empty?
|
|
39
|
+
return clone.tap do |query|
|
|
40
|
+
query.reset_strategies!
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
criteria.inject(clone) do |query, condition|
|
|
45
|
+
if condition.nil?
|
|
46
|
+
raise Errors::CriteriaArgumentRequired, :all
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
condition = expand_condition_to_array_values(condition)
|
|
50
|
+
|
|
51
|
+
if strategy
|
|
52
|
+
send(strategy, condition, "$all")
|
|
53
|
+
else
|
|
54
|
+
condition.inject(query) do |_query, (field, value)|
|
|
55
|
+
v = {'$all' => value}
|
|
56
|
+
if negating?
|
|
57
|
+
v = {'$not' => v}
|
|
58
|
+
end
|
|
59
|
+
_query.add_field_expression(field.to_s, v)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end.reset_strategies!
|
|
46
63
|
end
|
|
47
64
|
alias :all_in :all
|
|
48
65
|
key :all, :union, "$all"
|
|
@@ -52,14 +69,42 @@ module Mongoid
|
|
|
52
69
|
# @example Add the criterion.
|
|
53
70
|
# selectable.and({ field: value }, { other: value })
|
|
54
71
|
#
|
|
55
|
-
# @param [ Array<Hash> ]
|
|
56
|
-
# all must match to return results.
|
|
57
|
-
#
|
|
58
|
-
# @return [ Selectable ] The cloned selectable.
|
|
72
|
+
# @param [ Array<Hash | Criteria> ] criteria Multiple key/value pair
|
|
73
|
+
# matches or Criteria objects that all must match to return results.
|
|
59
74
|
#
|
|
60
|
-
# @
|
|
61
|
-
def and(*
|
|
62
|
-
|
|
75
|
+
# @return [ Selectable ] The new selectable.
|
|
76
|
+
def and(*criteria)
|
|
77
|
+
_mongoid_flatten_arrays(criteria).inject(self.clone) do |c, new_s|
|
|
78
|
+
if new_s.is_a?(Selectable)
|
|
79
|
+
new_s = new_s.selector
|
|
80
|
+
end
|
|
81
|
+
normalized = _mongoid_expand_keys(new_s)
|
|
82
|
+
normalized.each do |k, v|
|
|
83
|
+
k = k.to_s
|
|
84
|
+
if c.selector[k]
|
|
85
|
+
# There is already a condition on k.
|
|
86
|
+
# If v is an operator, and all existing conditions are
|
|
87
|
+
# also operators, and v isn't present in existing conditions,
|
|
88
|
+
# we can add to existing conditions.
|
|
89
|
+
# Otherwise use $and.
|
|
90
|
+
if v.is_a?(Hash) &&
|
|
91
|
+
v.length == 1 &&
|
|
92
|
+
(new_k = v.keys.first).start_with?('$') &&
|
|
93
|
+
(existing_kv = c.selector[k]).is_a?(Hash) &&
|
|
94
|
+
!existing_kv.key?(new_k) &&
|
|
95
|
+
existing_kv.keys.all? { |sub_k| sub_k.start_with?('$') }
|
|
96
|
+
then
|
|
97
|
+
merged_v = c.selector[k].merge(v)
|
|
98
|
+
c.selector.store(k, merged_v)
|
|
99
|
+
else
|
|
100
|
+
c = c.send(:__multi__, [k => v], '$and')
|
|
101
|
+
end
|
|
102
|
+
else
|
|
103
|
+
c.selector.store(k, v)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
c
|
|
107
|
+
end
|
|
63
108
|
end
|
|
64
109
|
alias :all_of :and
|
|
65
110
|
|
|
@@ -74,9 +119,11 @@ module Mongoid
|
|
|
74
119
|
# @param [ Hash ] criterion Multiple key/range pairs.
|
|
75
120
|
#
|
|
76
121
|
# @return [ Selectable ] The cloned selectable.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
122
|
+
def between(criterion)
|
|
123
|
+
if criterion.nil?
|
|
124
|
+
raise Errors::CriteriaArgumentRequired, :between
|
|
125
|
+
end
|
|
126
|
+
|
|
80
127
|
selection(criterion) do |selector, field, value|
|
|
81
128
|
selector.store(
|
|
82
129
|
field,
|
|
@@ -102,9 +149,11 @@ module Mongoid
|
|
|
102
149
|
# @param [ Hash ] criterion The field/match pairs.
|
|
103
150
|
#
|
|
104
151
|
# @return [ Selectable ] The cloned selectable.
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
152
|
+
def elem_match(criterion)
|
|
153
|
+
if criterion.nil?
|
|
154
|
+
raise Errors::CriteriaArgumentRequired, :elem_match
|
|
155
|
+
end
|
|
156
|
+
|
|
108
157
|
__override__(criterion, "$elemMatch")
|
|
109
158
|
end
|
|
110
159
|
key :elem_match, :override, "$elemMatch"
|
|
@@ -123,15 +172,17 @@ module Mongoid
|
|
|
123
172
|
# @param [ Hash ] criterion The field/boolean existence checks.
|
|
124
173
|
#
|
|
125
174
|
# @return [ Selectable ] The cloned selectable.
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
175
|
+
def exists(criterion)
|
|
176
|
+
if criterion.nil?
|
|
177
|
+
raise Errors::CriteriaArgumentRequired, :exists
|
|
178
|
+
end
|
|
179
|
+
|
|
129
180
|
typed_override(criterion, "$exists") do |value|
|
|
130
|
-
::Boolean.evolve(value)
|
|
181
|
+
Mongoid::Boolean.evolve(value)
|
|
131
182
|
end
|
|
132
183
|
end
|
|
133
184
|
key :exists, :override, "$exists" do |value|
|
|
134
|
-
::Boolean.evolve(value)
|
|
185
|
+
Mongoid::Boolean.evolve(value)
|
|
135
186
|
end
|
|
136
187
|
|
|
137
188
|
# Add a $geoIntersects or $geoWithin selection. Symbol operators must
|
|
@@ -151,28 +202,44 @@ module Mongoid
|
|
|
151
202
|
# Source: https://docs.mongodb.com/manual/reference/operator/query/box/
|
|
152
203
|
#
|
|
153
204
|
# @example Add a geo intersect criterion for a line.
|
|
154
|
-
# query.
|
|
205
|
+
# query.geo_spatial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
|
|
155
206
|
#
|
|
156
207
|
# @example Add a geo intersect criterion for a point.
|
|
157
|
-
# query.
|
|
208
|
+
# query.geo_spatial(:location.intersects_point => [[ 1, 10 ]])
|
|
158
209
|
#
|
|
159
210
|
# @example Add a geo intersect criterion for a polygon.
|
|
160
|
-
# query.
|
|
211
|
+
# query.geo_spatial(:location.intersects_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
|
|
161
212
|
#
|
|
162
213
|
# @example Add a geo within criterion for a polygon.
|
|
163
|
-
# query.
|
|
214
|
+
# query.geo_spatial(:location.within_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
|
|
164
215
|
#
|
|
165
216
|
# @example Add a geo within criterion for a box.
|
|
166
|
-
# query.
|
|
217
|
+
# query.geo_spatial(:location.within_box => [[ 1, 10 ], [ 2, 10 ])
|
|
167
218
|
#
|
|
168
219
|
# @param [ Hash ] criterion The criterion.
|
|
169
220
|
#
|
|
170
221
|
# @return [ Selectable ] The cloned selectable.
|
|
222
|
+
def geo_spatial(criterion)
|
|
223
|
+
if criterion.nil?
|
|
224
|
+
raise Errors::CriteriaArgumentRequired, :geo_spatial
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
__merge__(criterion)
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# Alias for +geo_spatial+.
|
|
171
231
|
#
|
|
172
|
-
# @
|
|
173
|
-
def geo_spacial(criterion
|
|
232
|
+
# @deprecated
|
|
233
|
+
def geo_spacial(criterion)
|
|
234
|
+
# Duplicate method body so that we can raise this exception with
|
|
235
|
+
# geo_spacial as the indicated operator rather than geo_spatial.
|
|
236
|
+
if criterion.nil?
|
|
237
|
+
raise Errors::CriteriaArgumentRequired, :geo_spacial
|
|
238
|
+
end
|
|
239
|
+
|
|
174
240
|
__merge__(criterion)
|
|
175
241
|
end
|
|
242
|
+
|
|
176
243
|
key :intersects_line, :override, "$geoIntersects", "$geometry" do |value|
|
|
177
244
|
{ "type" => LINE_STRING, "coordinates" => value }
|
|
178
245
|
end
|
|
@@ -187,6 +254,26 @@ module Mongoid
|
|
|
187
254
|
end
|
|
188
255
|
key :within_box, :override, "$geoWithin", "$box"
|
|
189
256
|
|
|
257
|
+
# Add the $eq criterion to the selector.
|
|
258
|
+
#
|
|
259
|
+
# @example Add the $eq criterion.
|
|
260
|
+
# selectable.eq(age: 60)
|
|
261
|
+
#
|
|
262
|
+
# @example Execute an $eq in a where query.
|
|
263
|
+
# selectable.where(:field.eq => 10)
|
|
264
|
+
#
|
|
265
|
+
# @param [ Hash ] criterion The field/value pairs to check.
|
|
266
|
+
#
|
|
267
|
+
# @return [ Selectable ] The cloned selectable.
|
|
268
|
+
def eq(criterion)
|
|
269
|
+
if criterion.nil?
|
|
270
|
+
raise Errors::CriteriaArgumentRequired, :eq
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
__override__(criterion, "$eq")
|
|
274
|
+
end
|
|
275
|
+
key :eq, :override, "$eq"
|
|
276
|
+
|
|
190
277
|
# Add the $gt criterion to the selector.
|
|
191
278
|
#
|
|
192
279
|
# @example Add the $gt criterion.
|
|
@@ -198,9 +285,11 @@ module Mongoid
|
|
|
198
285
|
# @param [ Hash ] criterion The field/value pairs to check.
|
|
199
286
|
#
|
|
200
287
|
# @return [ Selectable ] The cloned selectable.
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
288
|
+
def gt(criterion)
|
|
289
|
+
if criterion.nil?
|
|
290
|
+
raise Errors::CriteriaArgumentRequired, :gt
|
|
291
|
+
end
|
|
292
|
+
|
|
204
293
|
__override__(criterion, "$gt")
|
|
205
294
|
end
|
|
206
295
|
key :gt, :override, "$gt"
|
|
@@ -216,9 +305,11 @@ module Mongoid
|
|
|
216
305
|
# @param [ Hash ] criterion The field/value pairs to check.
|
|
217
306
|
#
|
|
218
307
|
# @return [ Selectable ] The cloned selectable.
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
308
|
+
def gte(criterion)
|
|
309
|
+
if criterion.nil?
|
|
310
|
+
raise Errors::CriteriaArgumentRequired, :gte
|
|
311
|
+
end
|
|
312
|
+
|
|
222
313
|
__override__(criterion, "$gte")
|
|
223
314
|
end
|
|
224
315
|
key :gte, :override, "$gte"
|
|
@@ -234,13 +325,27 @@ module Mongoid
|
|
|
234
325
|
# @example Execute an $in in a where query.
|
|
235
326
|
# selectable.where(:field.in => [ 1, 2, 3 ])
|
|
236
327
|
#
|
|
237
|
-
# @param [ Hash ]
|
|
328
|
+
# @param [ Hash ] condition The field/value criterion pairs.
|
|
238
329
|
#
|
|
239
330
|
# @return [ Selectable ] The cloned selectable.
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
331
|
+
def in(condition)
|
|
332
|
+
if condition.nil?
|
|
333
|
+
raise Errors::CriteriaArgumentRequired, :in
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
condition = expand_condition_to_array_values(condition)
|
|
337
|
+
|
|
338
|
+
if strategy
|
|
339
|
+
send(strategy, condition, "$in")
|
|
340
|
+
else
|
|
341
|
+
condition.inject(clone) do |query, (field, value)|
|
|
342
|
+
v = {'$in' => value}
|
|
343
|
+
if negating?
|
|
344
|
+
v = {'$not' => v}
|
|
345
|
+
end
|
|
346
|
+
query.add_field_expression(field.to_s, v)
|
|
347
|
+
end.reset_strategies!
|
|
348
|
+
end
|
|
244
349
|
end
|
|
245
350
|
alias :any_in :in
|
|
246
351
|
key :in, :intersect, "$in"
|
|
@@ -256,9 +361,11 @@ module Mongoid
|
|
|
256
361
|
# @param [ Hash ] criterion The field/value pairs to check.
|
|
257
362
|
#
|
|
258
363
|
# @return [ Selectable ] The cloned selectable.
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
364
|
+
def lt(criterion)
|
|
365
|
+
if criterion.nil?
|
|
366
|
+
raise Errors::CriteriaArgumentRequired, :lt
|
|
367
|
+
end
|
|
368
|
+
|
|
262
369
|
__override__(criterion, "$lt")
|
|
263
370
|
end
|
|
264
371
|
key :lt, :override, "$lt"
|
|
@@ -274,9 +381,11 @@ module Mongoid
|
|
|
274
381
|
# @param [ Hash ] criterion The field/value pairs to check.
|
|
275
382
|
#
|
|
276
383
|
# @return [ Selectable ] The cloned selectable.
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
384
|
+
def lte(criterion)
|
|
385
|
+
if criterion.nil?
|
|
386
|
+
raise Errors::CriteriaArgumentRequired, :lte
|
|
387
|
+
end
|
|
388
|
+
|
|
280
389
|
__override__(criterion, "$lte")
|
|
281
390
|
end
|
|
282
391
|
key :lte, :override, "$lte"
|
|
@@ -289,9 +398,12 @@ module Mongoid
|
|
|
289
398
|
# @param [ Hash ] criterion The field/distance pairs.
|
|
290
399
|
#
|
|
291
400
|
# @return [ Selectable ] The cloned selectable.
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
401
|
+
def max_distance(criterion)
|
|
402
|
+
if criterion.nil?
|
|
403
|
+
raise Errors::CriteriaArgumentRequired, :max_distance
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
# $maxDistance must be given together with $near
|
|
295
407
|
__add__(criterion, "$maxDistance")
|
|
296
408
|
end
|
|
297
409
|
|
|
@@ -306,9 +418,11 @@ module Mongoid
|
|
|
306
418
|
# @param [ Hash ] criterion The field/mod selections.
|
|
307
419
|
#
|
|
308
420
|
# @return [ Selectable ] The cloned selectable.
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
421
|
+
def mod(criterion)
|
|
422
|
+
if criterion.nil?
|
|
423
|
+
raise Errors::CriteriaArgumentRequired, :mod
|
|
424
|
+
end
|
|
425
|
+
|
|
312
426
|
__override__(criterion, "$mod")
|
|
313
427
|
end
|
|
314
428
|
key :mod, :override, "$mod"
|
|
@@ -324,9 +438,11 @@ module Mongoid
|
|
|
324
438
|
# @param [ Hash ] criterion The field/ne selections.
|
|
325
439
|
#
|
|
326
440
|
# @return [ Selectable ] The cloned selectable.
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
441
|
+
def ne(criterion)
|
|
442
|
+
if criterion.nil?
|
|
443
|
+
raise Errors::CriteriaArgumentRequired, :ne
|
|
444
|
+
end
|
|
445
|
+
|
|
330
446
|
__override__(criterion, "$ne")
|
|
331
447
|
end
|
|
332
448
|
alias :excludes :ne
|
|
@@ -343,9 +459,11 @@ module Mongoid
|
|
|
343
459
|
# @param [ Hash ] criterion The field/location pair.
|
|
344
460
|
#
|
|
345
461
|
# @return [ Selectable ] The cloned selectable.
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
462
|
+
def near(criterion)
|
|
463
|
+
if criterion.nil?
|
|
464
|
+
raise Errors::CriteriaArgumentRequired, :near
|
|
465
|
+
end
|
|
466
|
+
|
|
349
467
|
__override__(criterion, "$near")
|
|
350
468
|
end
|
|
351
469
|
key :near, :override, "$near"
|
|
@@ -361,9 +479,11 @@ module Mongoid
|
|
|
361
479
|
# @param [ Hash ] criterion The field/location pair.
|
|
362
480
|
#
|
|
363
481
|
# @return [ Selectable ] The cloned selectable.
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
482
|
+
def near_sphere(criterion)
|
|
483
|
+
if criterion.nil?
|
|
484
|
+
raise Errors::CriteriaArgumentRequired, :near_sphere
|
|
485
|
+
end
|
|
486
|
+
|
|
367
487
|
__override__(criterion, "$nearSphere")
|
|
368
488
|
end
|
|
369
489
|
key :near_sphere, :override, "$nearSphere"
|
|
@@ -379,13 +499,27 @@ module Mongoid
|
|
|
379
499
|
# @example Execute an $nin in a where query.
|
|
380
500
|
# selectable.where(:field.nin => [ 1, 2, 3 ])
|
|
381
501
|
#
|
|
382
|
-
# @param [ Hash ]
|
|
502
|
+
# @param [ Hash ] condition The field/value criterion pairs.
|
|
383
503
|
#
|
|
384
504
|
# @return [ Selectable ] The cloned selectable.
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
505
|
+
def nin(condition)
|
|
506
|
+
if condition.nil?
|
|
507
|
+
raise Errors::CriteriaArgumentRequired, :nin
|
|
508
|
+
end
|
|
509
|
+
|
|
510
|
+
condition = expand_condition_to_array_values(condition)
|
|
511
|
+
|
|
512
|
+
if strategy
|
|
513
|
+
send(strategy, condition, "$nin")
|
|
514
|
+
else
|
|
515
|
+
condition.inject(clone) do |query, (field, value)|
|
|
516
|
+
v = {'$nin' => value}
|
|
517
|
+
if negating?
|
|
518
|
+
v = {'$not' => v}
|
|
519
|
+
end
|
|
520
|
+
query.add_field_expression(field.to_s, v)
|
|
521
|
+
end.reset_strategies!
|
|
522
|
+
end
|
|
389
523
|
end
|
|
390
524
|
alias :not_in :nin
|
|
391
525
|
key :nin, :intersect, "$nin"
|
|
@@ -395,13 +529,12 @@ module Mongoid
|
|
|
395
529
|
# @example Add the $nor selection.
|
|
396
530
|
# selectable.nor(field: 1, field: 2)
|
|
397
531
|
#
|
|
398
|
-
# @param [ Array
|
|
532
|
+
# @param [ Array<Hash | Criteria> ] criteria Multiple key/value pair
|
|
533
|
+
# matches or Criteria objects.
|
|
399
534
|
#
|
|
400
|
-
# @return [ Selectable ] The
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
def nor(*criterion)
|
|
404
|
-
__multi__(criterion, "$nor")
|
|
535
|
+
# @return [ Selectable ] The new selectable.
|
|
536
|
+
def nor(*criteria)
|
|
537
|
+
_mongoid_add_top_level_operation('$nor', criteria)
|
|
405
538
|
end
|
|
406
539
|
|
|
407
540
|
# Is the current selectable negating the next selection?
|
|
@@ -410,15 +543,13 @@ module Mongoid
|
|
|
410
543
|
# selectable.negating?
|
|
411
544
|
#
|
|
412
545
|
# @return [ true, false ] If the selectable is negating.
|
|
413
|
-
#
|
|
414
|
-
# @since 1.0.0
|
|
415
546
|
def negating?
|
|
416
547
|
!!negating
|
|
417
548
|
end
|
|
418
549
|
|
|
419
|
-
# Negate the next selection.
|
|
550
|
+
# Negate the arguments, or the next selection if no arguments are given.
|
|
420
551
|
#
|
|
421
|
-
# @example Negate the selection.
|
|
552
|
+
# @example Negate the next selection.
|
|
422
553
|
# selectable.not.in(field: [ 1, 2 ])
|
|
423
554
|
#
|
|
424
555
|
# @example Add the $not criterion.
|
|
@@ -427,34 +558,139 @@ module Mongoid
|
|
|
427
558
|
# @example Execute a $not in a where query.
|
|
428
559
|
# selectable.where(:field.not => /Bob/)
|
|
429
560
|
#
|
|
430
|
-
# @param [ Hash ]
|
|
561
|
+
# @param [ Array<Hash | Criteria> ] criteria Multiple key/value pair
|
|
562
|
+
# matches or Criteria objects to negate.
|
|
431
563
|
#
|
|
432
|
-
# @return [ Selectable ] The
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
def not(*criterion)
|
|
436
|
-
if criterion.empty?
|
|
564
|
+
# @return [ Selectable ] The new selectable.
|
|
565
|
+
def not(*criteria)
|
|
566
|
+
if criteria.empty?
|
|
437
567
|
dup.tap { |query| query.negating = true }
|
|
438
568
|
else
|
|
439
|
-
|
|
569
|
+
criteria.compact.inject(self.clone) do |c, new_s|
|
|
570
|
+
if new_s.is_a?(Selectable)
|
|
571
|
+
new_s = new_s.selector
|
|
572
|
+
end
|
|
573
|
+
_mongoid_expand_keys(new_s).each do |k, v|
|
|
574
|
+
k = k.to_s
|
|
575
|
+
if c.selector[k] || k.start_with?('$')
|
|
576
|
+
c = c.send(:__multi__, [{'$nor' => [{k => v}]}], '$and')
|
|
577
|
+
else
|
|
578
|
+
if v.is_a?(Hash)
|
|
579
|
+
c = c.send(:__multi__, [{'$nor' => [{k => v}]}], '$and')
|
|
580
|
+
else
|
|
581
|
+
if v.is_a?(Regexp)
|
|
582
|
+
negated_operator = '$not'
|
|
583
|
+
else
|
|
584
|
+
negated_operator = '$ne'
|
|
585
|
+
end
|
|
586
|
+
c = c.send(:__override__, {k => v}, negated_operator)
|
|
587
|
+
end
|
|
588
|
+
end
|
|
589
|
+
end
|
|
590
|
+
c
|
|
591
|
+
end
|
|
440
592
|
end
|
|
441
593
|
end
|
|
442
594
|
key :not, :override, "$not"
|
|
443
595
|
|
|
444
|
-
#
|
|
596
|
+
# Creates a disjunction using $or from the existing criteria in the
|
|
597
|
+
# receiver and the provided arguments.
|
|
598
|
+
#
|
|
599
|
+
# This behavior (receiver becoming one of the disjunction operands)
|
|
600
|
+
# matches ActiveRecord's +or+ behavior.
|
|
601
|
+
#
|
|
602
|
+
# Use +any_of+ to add a disjunction of the arguments as an additional
|
|
603
|
+
# constraint to the criteria already existing in the receiver.
|
|
604
|
+
#
|
|
605
|
+
# Each argument can be a Hash, a Criteria object, an array of
|
|
606
|
+
# Hash or Criteria objects, or a nested array. Nested arrays will be
|
|
607
|
+
# flattened and can be of any depth. Passing arrays is deprecated.
|
|
445
608
|
#
|
|
446
|
-
# @example Add the $or selection.
|
|
609
|
+
# @example Add the $or selection where both fields must have the specified values.
|
|
447
610
|
# selectable.or(field: 1, field: 2)
|
|
448
611
|
#
|
|
449
|
-
# @
|
|
612
|
+
# @example Add the $or selection where either value match is sufficient.
|
|
613
|
+
# selectable.or({field: 1}, {field: 2})
|
|
450
614
|
#
|
|
451
|
-
# @
|
|
615
|
+
# @example Same as previous example but using the deprecated array wrap.
|
|
616
|
+
# selectable.or([{field: 1}, {field: 2}])
|
|
617
|
+
#
|
|
618
|
+
# @example Same as previous example, also deprecated.
|
|
619
|
+
# selectable.or([{field: 1}], [{field: 2}])
|
|
620
|
+
#
|
|
621
|
+
# @param [ Hash | Criteria | Array<Hash | Criteria>, ... ] criteria
|
|
622
|
+
# Multiple key/value pair matches or Criteria objects, or arrays
|
|
623
|
+
# thereof. Passing arrays is deprecated.
|
|
452
624
|
#
|
|
453
|
-
# @
|
|
454
|
-
def or(*
|
|
455
|
-
|
|
625
|
+
# @return [ Selectable ] The new selectable.
|
|
626
|
+
def or(*criteria)
|
|
627
|
+
_mongoid_add_top_level_operation('$or', criteria)
|
|
628
|
+
end
|
|
629
|
+
|
|
630
|
+
# Adds a disjunction of the arguments as an additional constraint
|
|
631
|
+
# to the criteria already existing in the receiver.
|
|
632
|
+
#
|
|
633
|
+
# Use +or+ to make the receiver one of the disjunction operands.
|
|
634
|
+
#
|
|
635
|
+
# Each argument can be a Hash, a Criteria object, an array of
|
|
636
|
+
# Hash or Criteria objects, or a nested array. Nested arrays will be
|
|
637
|
+
# flattened and can be of any depth. Passing arrays is deprecated.
|
|
638
|
+
#
|
|
639
|
+
# @example Add the $or selection where both fields must have the specified values.
|
|
640
|
+
# selectable.any_of(field: 1, field: 2)
|
|
641
|
+
#
|
|
642
|
+
# @example Add the $or selection where either value match is sufficient.
|
|
643
|
+
# selectable.any_of({field: 1}, {field: 2})
|
|
644
|
+
#
|
|
645
|
+
# @example Same as previous example but using the deprecated array wrap.
|
|
646
|
+
# selectable.any_of([{field: 1}, {field: 2}])
|
|
647
|
+
#
|
|
648
|
+
# @example Same as previous example, also deprecated.
|
|
649
|
+
# selectable.any_of([{field: 1}], [{field: 2}])
|
|
650
|
+
#
|
|
651
|
+
# @param [ Hash | Criteria | Array<Hash | Criteria>, ... ] criteria
|
|
652
|
+
# Multiple key/value pair matches or Criteria objects, or arrays
|
|
653
|
+
# thereof. Passing arrays is deprecated.
|
|
654
|
+
#
|
|
655
|
+
# @return [ Selectable ] The new selectable.
|
|
656
|
+
def any_of(*criteria)
|
|
657
|
+
criteria = _mongoid_flatten_arrays(criteria)
|
|
658
|
+
case criteria.length
|
|
659
|
+
when 0
|
|
660
|
+
clone
|
|
661
|
+
when 1
|
|
662
|
+
# When we have a single criteria, any_of behaves like and.
|
|
663
|
+
# Note: criteria can be a Query object, which #where method does
|
|
664
|
+
# not support.
|
|
665
|
+
self.and(*criteria)
|
|
666
|
+
else
|
|
667
|
+
# When we have multiple criteria, combine them all with $or
|
|
668
|
+
# and add the result to self.
|
|
669
|
+
exprs = criteria.map do |criterion|
|
|
670
|
+
if criterion.is_a?(Selectable)
|
|
671
|
+
_mongoid_expand_keys(criterion.selector)
|
|
672
|
+
else
|
|
673
|
+
Hash[criterion.map do |k, v|
|
|
674
|
+
if k.is_a?(Symbol)
|
|
675
|
+
[k.to_s, v]
|
|
676
|
+
else
|
|
677
|
+
[k, v]
|
|
678
|
+
end
|
|
679
|
+
end]
|
|
680
|
+
end
|
|
681
|
+
end
|
|
682
|
+
# Should be able to do:
|
|
683
|
+
#where('$or' => exprs)
|
|
684
|
+
# But since that is broken do instead:
|
|
685
|
+
clone.tap do |query|
|
|
686
|
+
if query.selector['$or']
|
|
687
|
+
query.selector.store('$or', query.selector['$or'] + exprs)
|
|
688
|
+
else
|
|
689
|
+
query.selector.store('$or', exprs)
|
|
690
|
+
end
|
|
691
|
+
end
|
|
692
|
+
end
|
|
456
693
|
end
|
|
457
|
-
alias :any_of :or
|
|
458
694
|
|
|
459
695
|
# Add a $size selection for array fields.
|
|
460
696
|
#
|
|
@@ -470,9 +706,11 @@ module Mongoid
|
|
|
470
706
|
# @param [ Hash ] criterion The field/size pairs criterion.
|
|
471
707
|
#
|
|
472
708
|
# @return [ Selectable ] The cloned selectable.
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
709
|
+
def with_size(criterion)
|
|
710
|
+
if criterion.nil?
|
|
711
|
+
raise Errors::CriteriaArgumentRequired, :with_size
|
|
712
|
+
end
|
|
713
|
+
|
|
476
714
|
typed_override(criterion, "$size") do |value|
|
|
477
715
|
::Integer.evolve(value)
|
|
478
716
|
end
|
|
@@ -494,9 +732,11 @@ module Mongoid
|
|
|
494
732
|
# @param [ Hash ] criterion The field/type pairs.
|
|
495
733
|
#
|
|
496
734
|
# @return [ Selectable ] The cloned selectable.
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
735
|
+
def with_type(criterion)
|
|
736
|
+
if criterion.nil?
|
|
737
|
+
raise Errors::CriteriaArgumentRequired, :with_type
|
|
738
|
+
end
|
|
739
|
+
|
|
500
740
|
typed_override(criterion, "$type") do |value|
|
|
501
741
|
::Integer.evolve(value)
|
|
502
742
|
end
|
|
@@ -524,24 +764,24 @@ module Mongoid
|
|
|
524
764
|
# for options.
|
|
525
765
|
#
|
|
526
766
|
# @return [ Selectable ] The cloned selectable.
|
|
527
|
-
#
|
|
528
|
-
# @since 2.2.0
|
|
529
767
|
def text_search(terms, opts = nil)
|
|
768
|
+
if terms.nil?
|
|
769
|
+
raise Errors::CriteriaArgumentRequired, :terms
|
|
770
|
+
end
|
|
771
|
+
|
|
530
772
|
clone.tap do |query|
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
query.selector = query.selector.merge(criterion)
|
|
544
|
-
end
|
|
773
|
+
criterion = {'$text' => { '$search' => terms }}
|
|
774
|
+
criterion['$text'].merge!(opts) if opts
|
|
775
|
+
if query.selector['$text']
|
|
776
|
+
# Per https://docs.mongodb.com/manual/reference/operator/query/text/
|
|
777
|
+
# multiple $text expressions are not currently supported by
|
|
778
|
+
# MongoDB server, but build the query correctly instead of
|
|
779
|
+
# overwriting previous text search condition with the currently
|
|
780
|
+
# given one.
|
|
781
|
+
Mongoid.logger.warn('Multiple $text expressions per query are not currently supported by the server')
|
|
782
|
+
query.selector = {'$and' => [query.selector]}.merge(criterion)
|
|
783
|
+
else
|
|
784
|
+
query.selector = query.selector.merge(criterion)
|
|
545
785
|
end
|
|
546
786
|
end
|
|
547
787
|
end
|
|
@@ -559,20 +799,38 @@ module Mongoid
|
|
|
559
799
|
# @param [ String, Hash ] criterion The javascript or standard selection.
|
|
560
800
|
#
|
|
561
801
|
# @return [ Selectable ] The cloned selectable.
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
802
|
+
def where(*criteria)
|
|
803
|
+
criteria.inject(clone) do |query, criterion|
|
|
804
|
+
if criterion.nil?
|
|
805
|
+
raise Errors::CriteriaArgumentRequired, :where
|
|
806
|
+
end
|
|
807
|
+
|
|
808
|
+
# We need to save the criterion in an instance variable so
|
|
809
|
+
# Modifiable methods know how to create a polymorphic object.
|
|
810
|
+
# Note that this method in principle accepts multiple criteria,
|
|
811
|
+
# but only the first one will be stored in @criterion. This
|
|
812
|
+
# works out to be fine because first_or_create etc. methods
|
|
813
|
+
# only ever specify one criterion to #where.
|
|
814
|
+
@criterion = criterion
|
|
815
|
+
if criterion.is_a?(String)
|
|
816
|
+
js_query(criterion)
|
|
817
|
+
else
|
|
818
|
+
expr_query(criterion)
|
|
819
|
+
end
|
|
820
|
+
end.reset_strategies!
|
|
569
821
|
end
|
|
570
822
|
|
|
571
823
|
private
|
|
572
824
|
|
|
573
|
-
#
|
|
825
|
+
# Adds the specified expression to the query.
|
|
574
826
|
#
|
|
575
|
-
#
|
|
827
|
+
# Criterion must be a hash in one of the following forms:
|
|
828
|
+
# - {field_name: value}
|
|
829
|
+
# - {'field_name' => value}
|
|
830
|
+
# - {key_instance: value}
|
|
831
|
+
# - {'$operator' => operator_value_expression}
|
|
832
|
+
#
|
|
833
|
+
# Field name and operator may be given as either strings or symbols.
|
|
576
834
|
#
|
|
577
835
|
# @example Create the selection.
|
|
578
836
|
# selectable.expr_query(age: 50)
|
|
@@ -580,11 +838,27 @@ module Mongoid
|
|
|
580
838
|
# @param [ Hash ] criterion The field/value pairs.
|
|
581
839
|
#
|
|
582
840
|
# @return [ Selectable ] The cloned selectable.
|
|
583
|
-
#
|
|
584
|
-
# @since 1.0.0
|
|
841
|
+
# @api private
|
|
585
842
|
def expr_query(criterion)
|
|
586
|
-
|
|
587
|
-
|
|
843
|
+
if criterion.nil?
|
|
844
|
+
raise ArgumentError, 'Criterion cannot be nil here'
|
|
845
|
+
end
|
|
846
|
+
unless Hash === criterion
|
|
847
|
+
raise Errors::InvalidQuery, "Expression must be a Hash: #{Errors::InvalidQuery.truncate_expr(criterion)}"
|
|
848
|
+
end
|
|
849
|
+
|
|
850
|
+
normalized = _mongoid_expand_keys(criterion)
|
|
851
|
+
clone.tap do |query|
|
|
852
|
+
normalized.each do |field, value|
|
|
853
|
+
field_s = field.to_s
|
|
854
|
+
if field_s.start_with?('$')
|
|
855
|
+
# Query expression-level operator, like $and or $where
|
|
856
|
+
query.add_operator_expression(field_s, value)
|
|
857
|
+
else
|
|
858
|
+
query.add_field_expression(field, value)
|
|
859
|
+
end
|
|
860
|
+
end
|
|
861
|
+
query.reset_strategies!
|
|
588
862
|
end
|
|
589
863
|
end
|
|
590
864
|
|
|
@@ -598,8 +872,6 @@ module Mongoid
|
|
|
598
872
|
# end
|
|
599
873
|
#
|
|
600
874
|
# @param [ Hash ] criterion The criterion.
|
|
601
|
-
#
|
|
602
|
-
# @since 1.0.0
|
|
603
875
|
def typed_override(criterion, operator)
|
|
604
876
|
if criterion
|
|
605
877
|
criterion.update_values do |value|
|
|
@@ -619,11 +891,15 @@ module Mongoid
|
|
|
619
891
|
# @param [ String ] criterion The javascript as a string.
|
|
620
892
|
#
|
|
621
893
|
# @return [ Selectable ] The cloned selectable
|
|
622
|
-
#
|
|
623
|
-
# @since 1.0.0
|
|
624
894
|
def js_query(criterion)
|
|
625
895
|
clone.tap do |query|
|
|
626
|
-
|
|
896
|
+
if negating?
|
|
897
|
+
query.add_operator_expression('$and',
|
|
898
|
+
[{'$nor' => [{'$where' => criterion}]}])
|
|
899
|
+
else
|
|
900
|
+
query.add_operator_expression('$where', criterion)
|
|
901
|
+
end
|
|
902
|
+
query.reset_strategies!
|
|
627
903
|
end
|
|
628
904
|
end
|
|
629
905
|
|
|
@@ -636,8 +912,6 @@ module Mongoid
|
|
|
636
912
|
# @param [ Hash ] criterion The selection to store.
|
|
637
913
|
#
|
|
638
914
|
# @return [ Selectable ] The cloned selectable.
|
|
639
|
-
#
|
|
640
|
-
# @since 1.0.0
|
|
641
915
|
# @api private
|
|
642
916
|
def selection(criterion = nil)
|
|
643
917
|
clone.tap do |query|
|
|
@@ -650,26 +924,6 @@ module Mongoid
|
|
|
650
924
|
end
|
|
651
925
|
end
|
|
652
926
|
|
|
653
|
-
# Convert the criterion values to $in friendly values. This means you,
|
|
654
|
-
# array.
|
|
655
|
-
#
|
|
656
|
-
# @api private
|
|
657
|
-
#
|
|
658
|
-
# @example Convert all the values to arrays.
|
|
659
|
-
# selectable.with_array_values({ key: 1...4 })
|
|
660
|
-
#
|
|
661
|
-
# @param [ Hash ] criterion The criterion.
|
|
662
|
-
#
|
|
663
|
-
# @return [ Hash ] The $in friendly criterion (array values).
|
|
664
|
-
#
|
|
665
|
-
# @since 1.0.0
|
|
666
|
-
def with_array_values(criterion)
|
|
667
|
-
return nil unless criterion
|
|
668
|
-
criterion.each_pair do |key, value|
|
|
669
|
-
criterion[key] = value.__array__
|
|
670
|
-
end
|
|
671
|
-
end
|
|
672
|
-
|
|
673
927
|
class << self
|
|
674
928
|
|
|
675
929
|
# Get the methods on the selectable that can be forwarded to from a model.
|
|
@@ -678,8 +932,6 @@ module Mongoid
|
|
|
678
932
|
# Selectable.forwardables
|
|
679
933
|
#
|
|
680
934
|
# @return [ Array<Symbol> ] The names of the forwardable methods.
|
|
681
|
-
#
|
|
682
|
-
# @since 1.0.0
|
|
683
935
|
def forwardables
|
|
684
936
|
public_instance_methods(false) -
|
|
685
937
|
[ :negating, :negating=, :negating?, :selector, :selector= ]
|