mongoid 7.0.0 → 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/LICENSE +1 -0
- data/README.md +34 -20
- data/Rakefile +75 -5
- 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 +31 -19
- data/lib/mongoid/association/eager_loadable.rb +2 -3
- data/lib/mongoid/association/embedded/batchable.rb +19 -45
- 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 +113 -93
- data/lib/mongoid/association/embedded/embeds_many.rb +8 -35
- 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 +45 -30
- data/lib/mongoid/association/embedded/embeds_one.rb +8 -31
- data/lib/mongoid/association/embedded.rb +2 -0
- data/lib/mongoid/association/macros.rb +44 -41
- data/lib/mongoid/association/many.rb +18 -32
- 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 +40 -36
- 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 +38 -56
- 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 +78 -111
- 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 +118 -78
- data/lib/mongoid/association.rb +8 -23
- 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 +3 -4
- data/lib/mongoid/atomic/paths/root.rb +4 -7
- data/lib/mongoid/atomic/paths.rb +2 -1
- data/lib/mongoid/atomic.rb +42 -47
- data/lib/mongoid/attributes/dynamic.rb +18 -32
- data/lib/mongoid/attributes/nested.rb +21 -13
- 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 +75 -81
- 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 +16 -17
- data/lib/mongoid/clients/sessions.rb +24 -12
- 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 +36 -14
- 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 +26 -27
- 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 +9 -37
- data/lib/mongoid/contextual/memory.rb +12 -65
- data/lib/mongoid/contextual/mongo.rb +163 -85
- 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 +16 -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 +15 -21
- data/lib/mongoid/criteria/options.rb +4 -5
- 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 +4 -13
- 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 +9 -16
- 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 +4 -9
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +13 -6
- data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
- data/lib/mongoid/criteria/queryable/key.rb +101 -27
- data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
- data/lib/mongoid/criteria/queryable/mergeable.rb +184 -44
- 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 +436 -158
- data/lib/mongoid/criteria/queryable/selector.rb +45 -55
- 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 +86 -73
- data/lib/mongoid/document.rb +37 -77
- 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 +3 -12
- 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 +51 -36
- 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 +4 -4
- data/lib/mongoid/extensions/set.rb +2 -7
- data/lib/mongoid/extensions/string.rb +24 -42
- 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 +115 -64
- 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 +10 -25
- 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 +3 -150
- 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 +6 -23
- data/lib/mongoid/persistable/deletable.rb +7 -23
- 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 +14 -10
- data/lib/mongoid/persistable/renamable.rb +10 -8
- data/lib/mongoid/persistable/savable.rb +3 -8
- data/lib/mongoid/persistable/settable.rb +61 -19
- data/lib/mongoid/persistable/unsettable.rb +8 -8
- data/lib/mongoid/persistable/updatable.rb +33 -21
- data/lib/mongoid/persistable/upsertable.rb +4 -9
- data/lib/mongoid/persistable.rb +134 -39
- data/lib/mongoid/persistence_context.rb +51 -45
- data/lib/mongoid/positional.rb +3 -6
- data/lib/mongoid/query_cache.rb +138 -106
- data/lib/mongoid/railtie.rb +20 -16
- data/lib/mongoid/railties/controller_runtime.rb +88 -0
- data/lib/mongoid/railties/database.rake +9 -0
- data/lib/mongoid/reloadable.rb +14 -19
- data/lib/mongoid/scopable.rb +11 -38
- 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 +87 -7
- data/lib/mongoid/threaded/lifecycle.rb +2 -21
- data/lib/mongoid/threaded.rb +38 -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 +132 -0
- 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 +3 -8
- data/lib/mongoid/validatable/presence.rb +8 -13
- data/lib/mongoid/validatable/queryable.rb +2 -3
- data/lib/mongoid/validatable/uniqueness.rb +21 -34
- data/lib/mongoid/validatable.rb +8 -27
- data/lib/mongoid/version.rb +3 -2
- data/lib/mongoid.rb +33 -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/model/templates/model.rb.tt +1 -1
- data/lib/rails/generators/mongoid_generator.rb +2 -1
- data/lib/rails/mongoid.rb +4 -5
- data/spec/README.md +33 -0
- data/spec/config/mongoid.yml +13 -3
- data/spec/integration/app_spec.rb +343 -0
- data/spec/integration/associations/belongs_to_spec.rb +15 -0
- data/spec/integration/associations/embedded_dirty_spec.rb +29 -0
- data/spec/integration/associations/embedded_spec.rb +268 -0
- 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 +40 -0
- 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 +142 -0
- data/spec/integration/discriminator_key_spec.rb +353 -0
- data/spec/integration/discriminator_value_spec.rb +206 -0
- data/spec/integration/document_spec.rb +51 -0
- data/spec/integration/i18n_fallbacks_spec.rb +89 -0
- data/spec/integration/matcher_examples_spec.rb +758 -0
- 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 +83 -0
- data/spec/mongoid/association/accessors_spec.rb +323 -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 +678 -332
- 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 +61 -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 +672 -144
- data/spec/mongoid/association/embedded/embeds_many_models.rb +69 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +51 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +13 -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 +8 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +54 -0
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +49 -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 +61 -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 +266 -17
- 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 +95 -12
- 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 +67 -4
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +76 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +351 -164
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +67 -0
- 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 +49 -5
- 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 +407 -121
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +681 -340
- data/spec/mongoid/association/referenced/has_many_models.rb +95 -0
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
- data/spec/mongoid/association/referenced/has_many_spec.rb +26 -3
- 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 +97 -0
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
- data/spec/mongoid/association/referenced/has_one_spec.rb +144 -5
- 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 +152 -0
- data/spec/mongoid/attributes/nested_spec.rb +87 -69
- 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 +382 -35
- data/spec/mongoid/cacheable_spec.rb +3 -1
- data/spec/mongoid/changeable_spec.rb +60 -35
- data/spec/mongoid/clients/factory_spec.rb +148 -34
- data/spec/mongoid/clients/options_spec.rb +102 -66
- data/spec/mongoid/clients/sessions_spec.rb +39 -29
- data/spec/mongoid/clients/transactions_spec.rb +415 -0
- data/spec/mongoid/clients_spec.rb +78 -16
- 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 +280 -2
- 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 +242 -81
- data/spec/mongoid/contextual/geo_near_spec.rb +31 -19
- data/spec/mongoid/contextual/map_reduce_spec.rb +24 -7
- data/spec/mongoid/contextual/memory_spec.rb +25 -23
- data/spec/mongoid/contextual/mongo_spec.rb +491 -144
- data/spec/mongoid/contextual/none_spec.rb +9 -81
- data/spec/mongoid/copyable_spec.rb +261 -30
- data/spec/mongoid/copyable_spec_models.rb +47 -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 +100 -48
- 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 +5 -3
- 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 +53 -0
- 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 +9 -7
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +42 -23
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +30 -1
- data/spec/mongoid/criteria/queryable/key_spec.rb +50 -6
- 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 +2069 -0
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +994 -2900
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +41 -2
- 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 +210 -0
- data/spec/mongoid/criteria_projection_spec.rb +410 -0
- data/spec/mongoid/criteria_spec.rb +807 -464
- data/spec/mongoid/document_fields_spec.rb +113 -0
- data/spec/mongoid/document_persistence_context_spec.rb +32 -0
- data/spec/mongoid/document_query_spec.rb +89 -0
- data/spec/mongoid/document_spec.rb +182 -28
- 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 +11 -9
- 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 +25 -0
- data/spec/mongoid/extensions/set_spec.rb +2 -0
- data/spec/mongoid/extensions/string_spec.rb +95 -34
- 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 +419 -37
- data/spec/mongoid/findable_spec.rb +54 -20
- data/spec/mongoid/indexable/specification_spec.rb +2 -0
- data/spec/mongoid/indexable_spec.rb +36 -6
- 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 +29 -13
- 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 +91 -7
- 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 +182 -17
- 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 +3 -1
- 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 +575 -48
- data/spec/mongoid/relations/proxy_spec.rb +9 -7
- data/spec/mongoid/reloadable_spec.rb +298 -20
- data/spec/mongoid/scopable_spec.rb +82 -22
- 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 +15 -13
- data/spec/mongoid/tasks/database_spec.rb +3 -1
- data/spec/mongoid/threaded_spec.rb +72 -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/{association/touchable_spec.rb → touchable_spec.rb} +206 -38
- 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 +102 -73
- data/spec/mongoid/validatable_spec.rb +5 -3
- data/spec/mongoid_spec.rb +2 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +112 -0
- 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 +69 -80
- data/spec/support/authorization.rb +2 -0
- data/spec/support/client_registry.rb +9 -0
- data/spec/support/constraints.rb +53 -0
- data/spec/support/expectations.rb +21 -3
- data/spec/support/helpers.rb +11 -0
- data/spec/support/macros.rb +42 -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/support/models/array_field.rb +7 -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/support/models/delegating_patient.rb +15 -0
- 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/support/models/minim.rb +6 -0
- 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/support/models/store_as_dup_test3.rb +7 -0
- data/spec/support/models/store_as_dup_test4.rb +7 -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/support/models/updatable.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 +60 -0
- data.tar.gz.sig +0 -0
- metadata +1131 -686
- metadata.gz.sig +0 -0
- data/lib/mongoid/association/touchable.rb +0 -97
- data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
- data/lib/mongoid/matchable/all.rb +0 -27
- data/lib/mongoid/matchable/and.rb +0 -30
- data/lib/mongoid/matchable/default.rb +0 -72
- data/lib/mongoid/matchable/elem_match.rb +0 -34
- 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/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/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 -130
- data/spec/mongoid/matchable/elem_match_spec.rb +0 -106
- 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/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 -828
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Mongoid
|
|
3
4
|
class Criteria
|
|
4
5
|
module Queryable
|
|
@@ -10,21 +11,15 @@ 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
|
-
# @attribute [rw] negating If the next
|
|
22
|
+
# @attribute [rw] negating If the next expression is negated.
|
|
28
23
|
# @attribute [rw] selector The query selector.
|
|
29
24
|
attr_accessor :negating, :selector
|
|
30
25
|
|
|
@@ -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,45 +172,74 @@ 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
|
-
# Add a $geoIntersects or $geoWithin selection. Symbol operators must
|
|
138
|
-
# the examples to expand the criteria.
|
|
188
|
+
# Add a $geoIntersects or $geoWithin selection. Symbol operators must
|
|
189
|
+
# be used as shown in the examples to expand the criteria.
|
|
139
190
|
#
|
|
140
191
|
# @note The only valid geometry shapes for a $geoIntersects are:
|
|
141
192
|
# :intersects_line, :intersects_point, and :intersects_polygon.
|
|
142
193
|
#
|
|
143
|
-
# @note The only valid
|
|
194
|
+
# @note The only valid options for a $geoWithin query are the geometry
|
|
195
|
+
# shape :within_polygon and the operator :within_box.
|
|
196
|
+
#
|
|
197
|
+
# @note The :within_box operator for the $geoWithin query expects the
|
|
198
|
+
# lower left (south west) coordinate pair as the first argument and
|
|
199
|
+
# the upper right (north east) as the second argument.
|
|
200
|
+
# Important: When latitude and longitude are passed, longitude is
|
|
201
|
+
# expected as the first element of the coordinate pair.
|
|
202
|
+
# Source: https://docs.mongodb.com/manual/reference/operator/query/box/
|
|
144
203
|
#
|
|
145
204
|
# @example Add a geo intersect criterion for a line.
|
|
146
|
-
# query.
|
|
205
|
+
# query.geo_spatial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
|
|
147
206
|
#
|
|
148
207
|
# @example Add a geo intersect criterion for a point.
|
|
149
|
-
# query.
|
|
208
|
+
# query.geo_spatial(:location.intersects_point => [[ 1, 10 ]])
|
|
150
209
|
#
|
|
151
210
|
# @example Add a geo intersect criterion for a polygon.
|
|
152
|
-
# query.
|
|
211
|
+
# query.geo_spatial(:location.intersects_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
|
|
153
212
|
#
|
|
154
213
|
# @example Add a geo within criterion for a polygon.
|
|
155
|
-
# query.
|
|
214
|
+
# query.geo_spatial(:location.within_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
|
|
215
|
+
#
|
|
216
|
+
# @example Add a geo within criterion for a box.
|
|
217
|
+
# query.geo_spatial(:location.within_box => [[ 1, 10 ], [ 2, 10 ])
|
|
156
218
|
#
|
|
157
219
|
# @param [ Hash ] criterion The criterion.
|
|
158
220
|
#
|
|
159
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+.
|
|
160
231
|
#
|
|
161
|
-
# @
|
|
162
|
-
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
|
+
|
|
163
240
|
__merge__(criterion)
|
|
164
241
|
end
|
|
242
|
+
|
|
165
243
|
key :intersects_line, :override, "$geoIntersects", "$geometry" do |value|
|
|
166
244
|
{ "type" => LINE_STRING, "coordinates" => value }
|
|
167
245
|
end
|
|
@@ -174,6 +252,27 @@ module Mongoid
|
|
|
174
252
|
key :within_polygon, :override, "$geoWithin", "$geometry" do |value|
|
|
175
253
|
{ "type" => POLYGON, "coordinates" => value }
|
|
176
254
|
end
|
|
255
|
+
key :within_box, :override, "$geoWithin", "$box"
|
|
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"
|
|
177
276
|
|
|
178
277
|
# Add the $gt criterion to the selector.
|
|
179
278
|
#
|
|
@@ -186,9 +285,11 @@ module Mongoid
|
|
|
186
285
|
# @param [ Hash ] criterion The field/value pairs to check.
|
|
187
286
|
#
|
|
188
287
|
# @return [ Selectable ] The cloned selectable.
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
288
|
+
def gt(criterion)
|
|
289
|
+
if criterion.nil?
|
|
290
|
+
raise Errors::CriteriaArgumentRequired, :gt
|
|
291
|
+
end
|
|
292
|
+
|
|
192
293
|
__override__(criterion, "$gt")
|
|
193
294
|
end
|
|
194
295
|
key :gt, :override, "$gt"
|
|
@@ -204,9 +305,11 @@ module Mongoid
|
|
|
204
305
|
# @param [ Hash ] criterion The field/value pairs to check.
|
|
205
306
|
#
|
|
206
307
|
# @return [ Selectable ] The cloned selectable.
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
308
|
+
def gte(criterion)
|
|
309
|
+
if criterion.nil?
|
|
310
|
+
raise Errors::CriteriaArgumentRequired, :gte
|
|
311
|
+
end
|
|
312
|
+
|
|
210
313
|
__override__(criterion, "$gte")
|
|
211
314
|
end
|
|
212
315
|
key :gte, :override, "$gte"
|
|
@@ -222,13 +325,27 @@ module Mongoid
|
|
|
222
325
|
# @example Execute an $in in a where query.
|
|
223
326
|
# selectable.where(:field.in => [ 1, 2, 3 ])
|
|
224
327
|
#
|
|
225
|
-
# @param [ Hash ]
|
|
328
|
+
# @param [ Hash ] condition The field/value criterion pairs.
|
|
226
329
|
#
|
|
227
330
|
# @return [ Selectable ] The cloned selectable.
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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
|
|
232
349
|
end
|
|
233
350
|
alias :any_in :in
|
|
234
351
|
key :in, :intersect, "$in"
|
|
@@ -244,9 +361,11 @@ module Mongoid
|
|
|
244
361
|
# @param [ Hash ] criterion The field/value pairs to check.
|
|
245
362
|
#
|
|
246
363
|
# @return [ Selectable ] The cloned selectable.
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
364
|
+
def lt(criterion)
|
|
365
|
+
if criterion.nil?
|
|
366
|
+
raise Errors::CriteriaArgumentRequired, :lt
|
|
367
|
+
end
|
|
368
|
+
|
|
250
369
|
__override__(criterion, "$lt")
|
|
251
370
|
end
|
|
252
371
|
key :lt, :override, "$lt"
|
|
@@ -262,9 +381,11 @@ module Mongoid
|
|
|
262
381
|
# @param [ Hash ] criterion The field/value pairs to check.
|
|
263
382
|
#
|
|
264
383
|
# @return [ Selectable ] The cloned selectable.
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
384
|
+
def lte(criterion)
|
|
385
|
+
if criterion.nil?
|
|
386
|
+
raise Errors::CriteriaArgumentRequired, :lte
|
|
387
|
+
end
|
|
388
|
+
|
|
268
389
|
__override__(criterion, "$lte")
|
|
269
390
|
end
|
|
270
391
|
key :lte, :override, "$lte"
|
|
@@ -277,9 +398,12 @@ module Mongoid
|
|
|
277
398
|
# @param [ Hash ] criterion The field/distance pairs.
|
|
278
399
|
#
|
|
279
400
|
# @return [ Selectable ] The cloned selectable.
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
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
|
|
283
407
|
__add__(criterion, "$maxDistance")
|
|
284
408
|
end
|
|
285
409
|
|
|
@@ -294,9 +418,11 @@ module Mongoid
|
|
|
294
418
|
# @param [ Hash ] criterion The field/mod selections.
|
|
295
419
|
#
|
|
296
420
|
# @return [ Selectable ] The cloned selectable.
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
421
|
+
def mod(criterion)
|
|
422
|
+
if criterion.nil?
|
|
423
|
+
raise Errors::CriteriaArgumentRequired, :mod
|
|
424
|
+
end
|
|
425
|
+
|
|
300
426
|
__override__(criterion, "$mod")
|
|
301
427
|
end
|
|
302
428
|
key :mod, :override, "$mod"
|
|
@@ -312,9 +438,11 @@ module Mongoid
|
|
|
312
438
|
# @param [ Hash ] criterion The field/ne selections.
|
|
313
439
|
#
|
|
314
440
|
# @return [ Selectable ] The cloned selectable.
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
441
|
+
def ne(criterion)
|
|
442
|
+
if criterion.nil?
|
|
443
|
+
raise Errors::CriteriaArgumentRequired, :ne
|
|
444
|
+
end
|
|
445
|
+
|
|
318
446
|
__override__(criterion, "$ne")
|
|
319
447
|
end
|
|
320
448
|
alias :excludes :ne
|
|
@@ -331,9 +459,11 @@ module Mongoid
|
|
|
331
459
|
# @param [ Hash ] criterion The field/location pair.
|
|
332
460
|
#
|
|
333
461
|
# @return [ Selectable ] The cloned selectable.
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
462
|
+
def near(criterion)
|
|
463
|
+
if criterion.nil?
|
|
464
|
+
raise Errors::CriteriaArgumentRequired, :near
|
|
465
|
+
end
|
|
466
|
+
|
|
337
467
|
__override__(criterion, "$near")
|
|
338
468
|
end
|
|
339
469
|
key :near, :override, "$near"
|
|
@@ -349,9 +479,11 @@ module Mongoid
|
|
|
349
479
|
# @param [ Hash ] criterion The field/location pair.
|
|
350
480
|
#
|
|
351
481
|
# @return [ Selectable ] The cloned selectable.
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
482
|
+
def near_sphere(criterion)
|
|
483
|
+
if criterion.nil?
|
|
484
|
+
raise Errors::CriteriaArgumentRequired, :near_sphere
|
|
485
|
+
end
|
|
486
|
+
|
|
355
487
|
__override__(criterion, "$nearSphere")
|
|
356
488
|
end
|
|
357
489
|
key :near_sphere, :override, "$nearSphere"
|
|
@@ -367,13 +499,27 @@ module Mongoid
|
|
|
367
499
|
# @example Execute an $nin in a where query.
|
|
368
500
|
# selectable.where(:field.nin => [ 1, 2, 3 ])
|
|
369
501
|
#
|
|
370
|
-
# @param [ Hash ]
|
|
502
|
+
# @param [ Hash ] condition The field/value criterion pairs.
|
|
371
503
|
#
|
|
372
504
|
# @return [ Selectable ] The cloned selectable.
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
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
|
|
377
523
|
end
|
|
378
524
|
alias :not_in :nin
|
|
379
525
|
key :nin, :intersect, "$nin"
|
|
@@ -383,13 +529,12 @@ module Mongoid
|
|
|
383
529
|
# @example Add the $nor selection.
|
|
384
530
|
# selectable.nor(field: 1, field: 2)
|
|
385
531
|
#
|
|
386
|
-
# @param [ Array
|
|
387
|
-
#
|
|
388
|
-
# @return [ Selectable ] The cloned selectable.
|
|
532
|
+
# @param [ Array<Hash | Criteria> ] criteria Multiple key/value pair
|
|
533
|
+
# matches or Criteria objects.
|
|
389
534
|
#
|
|
390
|
-
# @
|
|
391
|
-
def nor(*
|
|
392
|
-
|
|
535
|
+
# @return [ Selectable ] The new selectable.
|
|
536
|
+
def nor(*criteria)
|
|
537
|
+
_mongoid_add_top_level_operation('$nor', criteria)
|
|
393
538
|
end
|
|
394
539
|
|
|
395
540
|
# Is the current selectable negating the next selection?
|
|
@@ -398,15 +543,13 @@ module Mongoid
|
|
|
398
543
|
# selectable.negating?
|
|
399
544
|
#
|
|
400
545
|
# @return [ true, false ] If the selectable is negating.
|
|
401
|
-
#
|
|
402
|
-
# @since 1.0.0
|
|
403
546
|
def negating?
|
|
404
547
|
!!negating
|
|
405
548
|
end
|
|
406
549
|
|
|
407
|
-
# Negate the next selection.
|
|
550
|
+
# Negate the arguments, or the next selection if no arguments are given.
|
|
408
551
|
#
|
|
409
|
-
# @example Negate the selection.
|
|
552
|
+
# @example Negate the next selection.
|
|
410
553
|
# selectable.not.in(field: [ 1, 2 ])
|
|
411
554
|
#
|
|
412
555
|
# @example Add the $not criterion.
|
|
@@ -415,34 +558,139 @@ module Mongoid
|
|
|
415
558
|
# @example Execute a $not in a where query.
|
|
416
559
|
# selectable.where(:field.not => /Bob/)
|
|
417
560
|
#
|
|
418
|
-
# @param [ Hash ]
|
|
419
|
-
#
|
|
420
|
-
# @return [ Selectable ] The negated selectable.
|
|
561
|
+
# @param [ Array<Hash | Criteria> ] criteria Multiple key/value pair
|
|
562
|
+
# matches or Criteria objects to negate.
|
|
421
563
|
#
|
|
422
|
-
# @
|
|
423
|
-
def not(*
|
|
424
|
-
if
|
|
425
|
-
tap { |query| query.negating = true }
|
|
564
|
+
# @return [ Selectable ] The new selectable.
|
|
565
|
+
def not(*criteria)
|
|
566
|
+
if criteria.empty?
|
|
567
|
+
dup.tap { |query| query.negating = true }
|
|
426
568
|
else
|
|
427
|
-
|
|
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
|
|
428
592
|
end
|
|
429
593
|
end
|
|
430
594
|
key :not, :override, "$not"
|
|
431
595
|
|
|
432
|
-
#
|
|
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.
|
|
433
604
|
#
|
|
434
|
-
#
|
|
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.
|
|
608
|
+
#
|
|
609
|
+
# @example Add the $or selection where both fields must have the specified values.
|
|
435
610
|
# selectable.or(field: 1, field: 2)
|
|
436
611
|
#
|
|
437
|
-
# @
|
|
612
|
+
# @example Add the $or selection where either value match is sufficient.
|
|
613
|
+
# selectable.or({field: 1}, {field: 2})
|
|
438
614
|
#
|
|
439
|
-
# @
|
|
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}])
|
|
440
620
|
#
|
|
441
|
-
# @
|
|
442
|
-
|
|
443
|
-
|
|
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.
|
|
624
|
+
#
|
|
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
|
|
444
693
|
end
|
|
445
|
-
alias :any_of :or
|
|
446
694
|
|
|
447
695
|
# Add a $size selection for array fields.
|
|
448
696
|
#
|
|
@@ -458,9 +706,11 @@ module Mongoid
|
|
|
458
706
|
# @param [ Hash ] criterion The field/size pairs criterion.
|
|
459
707
|
#
|
|
460
708
|
# @return [ Selectable ] The cloned selectable.
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
709
|
+
def with_size(criterion)
|
|
710
|
+
if criterion.nil?
|
|
711
|
+
raise Errors::CriteriaArgumentRequired, :with_size
|
|
712
|
+
end
|
|
713
|
+
|
|
464
714
|
typed_override(criterion, "$size") do |value|
|
|
465
715
|
::Integer.evolve(value)
|
|
466
716
|
end
|
|
@@ -482,9 +732,11 @@ module Mongoid
|
|
|
482
732
|
# @param [ Hash ] criterion The field/type pairs.
|
|
483
733
|
#
|
|
484
734
|
# @return [ Selectable ] The cloned selectable.
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
735
|
+
def with_type(criterion)
|
|
736
|
+
if criterion.nil?
|
|
737
|
+
raise Errors::CriteriaArgumentRequired, :with_type
|
|
738
|
+
end
|
|
739
|
+
|
|
488
740
|
typed_override(criterion, "$type") do |value|
|
|
489
741
|
::Integer.evolve(value)
|
|
490
742
|
end
|
|
@@ -501,20 +753,35 @@ module Mongoid
|
|
|
501
753
|
# @example Construct a text search selector with options.
|
|
502
754
|
# selectable.text_search("testing", :$language => "fr")
|
|
503
755
|
#
|
|
756
|
+
# @note Per https://docs.mongodb.com/manual/reference/operator/query/text/
|
|
757
|
+
# it is not currently possible to supply multiple text search
|
|
758
|
+
# conditions in a query. Mongoid will build such a query but the
|
|
759
|
+
# server will return an error when trying to execute it.
|
|
760
|
+
#
|
|
504
761
|
# @param [ String, Symbol ] terms A string of terms that MongoDB parses
|
|
505
762
|
# and uses to query the text index.
|
|
506
763
|
# @param [ Hash ] opts Text search options. See MongoDB documentation
|
|
507
764
|
# for options.
|
|
508
765
|
#
|
|
509
766
|
# @return [ Selectable ] The cloned selectable.
|
|
510
|
-
#
|
|
511
|
-
# @since 2.2.0
|
|
512
767
|
def text_search(terms, opts = nil)
|
|
768
|
+
if terms.nil?
|
|
769
|
+
raise Errors::CriteriaArgumentRequired, :terms
|
|
770
|
+
end
|
|
771
|
+
|
|
513
772
|
clone.tap do |query|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
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)
|
|
518
785
|
end
|
|
519
786
|
end
|
|
520
787
|
end
|
|
@@ -532,20 +799,38 @@ module Mongoid
|
|
|
532
799
|
# @param [ String, Hash ] criterion The javascript or standard selection.
|
|
533
800
|
#
|
|
534
801
|
# @return [ Selectable ] The cloned selectable.
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
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!
|
|
542
821
|
end
|
|
543
822
|
|
|
544
823
|
private
|
|
545
824
|
|
|
546
|
-
#
|
|
825
|
+
# Adds the specified expression to the query.
|
|
547
826
|
#
|
|
548
|
-
#
|
|
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.
|
|
549
834
|
#
|
|
550
835
|
# @example Create the selection.
|
|
551
836
|
# selectable.expr_query(age: 50)
|
|
@@ -553,11 +838,27 @@ module Mongoid
|
|
|
553
838
|
# @param [ Hash ] criterion The field/value pairs.
|
|
554
839
|
#
|
|
555
840
|
# @return [ Selectable ] The cloned selectable.
|
|
556
|
-
#
|
|
557
|
-
# @since 1.0.0
|
|
841
|
+
# @api private
|
|
558
842
|
def expr_query(criterion)
|
|
559
|
-
|
|
560
|
-
|
|
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!
|
|
561
862
|
end
|
|
562
863
|
end
|
|
563
864
|
|
|
@@ -571,8 +872,6 @@ module Mongoid
|
|
|
571
872
|
# end
|
|
572
873
|
#
|
|
573
874
|
# @param [ Hash ] criterion The criterion.
|
|
574
|
-
#
|
|
575
|
-
# @since 1.0.0
|
|
576
875
|
def typed_override(criterion, operator)
|
|
577
876
|
if criterion
|
|
578
877
|
criterion.update_values do |value|
|
|
@@ -592,27 +891,28 @@ module Mongoid
|
|
|
592
891
|
# @param [ String ] criterion The javascript as a string.
|
|
593
892
|
#
|
|
594
893
|
# @return [ Selectable ] The cloned selectable
|
|
595
|
-
#
|
|
596
|
-
# @since 1.0.0
|
|
597
894
|
def js_query(criterion)
|
|
598
895
|
clone.tap do |query|
|
|
599
|
-
|
|
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!
|
|
600
903
|
end
|
|
601
904
|
end
|
|
602
905
|
|
|
603
906
|
# Take the provided criterion and store it as a selection in the query
|
|
604
907
|
# selector.
|
|
605
908
|
#
|
|
606
|
-
# @api private
|
|
607
|
-
#
|
|
608
909
|
# @example Store the selection.
|
|
609
910
|
# selectable.selection({ field: "value" })
|
|
610
911
|
#
|
|
611
912
|
# @param [ Hash ] criterion The selection to store.
|
|
612
913
|
#
|
|
613
914
|
# @return [ Selectable ] The cloned selectable.
|
|
614
|
-
#
|
|
615
|
-
# @since 1.0.0
|
|
915
|
+
# @api private
|
|
616
916
|
def selection(criterion = nil)
|
|
617
917
|
clone.tap do |query|
|
|
618
918
|
if criterion
|
|
@@ -624,26 +924,6 @@ module Mongoid
|
|
|
624
924
|
end
|
|
625
925
|
end
|
|
626
926
|
|
|
627
|
-
# Convert the criterion values to $in friendly values. This means you,
|
|
628
|
-
# array.
|
|
629
|
-
#
|
|
630
|
-
# @api private
|
|
631
|
-
#
|
|
632
|
-
# @example Convert all the values to arrays.
|
|
633
|
-
# selectable.with_array_values({ key: 1...4 })
|
|
634
|
-
#
|
|
635
|
-
# @param [ Hash ] criterion The criterion.
|
|
636
|
-
#
|
|
637
|
-
# @return [ Hash ] The $in friendly criterion (array values).
|
|
638
|
-
#
|
|
639
|
-
# @since 1.0.0
|
|
640
|
-
def with_array_values(criterion)
|
|
641
|
-
return nil unless criterion
|
|
642
|
-
criterion.each_pair do |key, value|
|
|
643
|
-
criterion[key] = value.__array__
|
|
644
|
-
end
|
|
645
|
-
end
|
|
646
|
-
|
|
647
927
|
class << self
|
|
648
928
|
|
|
649
929
|
# Get the methods on the selectable that can be forwarded to from a model.
|
|
@@ -652,8 +932,6 @@ module Mongoid
|
|
|
652
932
|
# Selectable.forwardables
|
|
653
933
|
#
|
|
654
934
|
# @return [ Array<Symbol> ] The names of the forwardable methods.
|
|
655
|
-
#
|
|
656
|
-
# @since 1.0.0
|
|
657
935
|
def forwardables
|
|
658
936
|
public_instance_methods(false) -
|
|
659
937
|
[ :negating, :negating=, :negating?, :selector, :selector= ]
|