mongoid 7.0.13 → 7.1.0.rc0
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.tar.gz.sig +0 -0
- data/CHANGELOG.md +7 -7
- data/LICENSE +1 -1
- data/README.md +24 -18
- data/Rakefile +7 -45
- data/lib/config/locales/en.yml +56 -47
- data/lib/mongoid.rb +8 -1
- data/lib/mongoid/association.rb +9 -6
- data/lib/mongoid/association/accessors.rb +95 -52
- data/lib/mongoid/association/bindable.rb +7 -5
- data/lib/mongoid/association/builders.rb +4 -3
- data/lib/mongoid/association/constrainable.rb +4 -2
- data/lib/mongoid/association/depending.rb +5 -2
- data/lib/mongoid/association/eager_loadable.rb +2 -0
- data/lib/mongoid/association/embedded.rb +3 -0
- data/lib/mongoid/association/embedded/batchable.rb +4 -2
- data/lib/mongoid/association/embedded/cyclic.rb +8 -6
- data/lib/mongoid/association/embedded/embedded_in.rb +6 -3
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +4 -1
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +8 -2
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +15 -12
- data/lib/mongoid/association/embedded/embeds_many.rb +8 -6
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +5 -2
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +9 -3
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +41 -38
- data/lib/mongoid/association/embedded/embeds_one.rb +8 -6
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +5 -2
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +10 -4
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +17 -14
- data/lib/mongoid/association/macros.rb +38 -36
- data/lib/mongoid/association/many.rb +11 -9
- data/lib/mongoid/association/marshalable.rb +3 -1
- data/lib/mongoid/association/nested.rb +4 -1
- data/lib/mongoid/association/nested/many.rb +17 -15
- data/lib/mongoid/association/nested/nested_buildable.rb +6 -3
- data/lib/mongoid/association/nested/one.rb +11 -9
- data/lib/mongoid/association/one.rb +3 -1
- data/lib/mongoid/association/options.rb +9 -6
- data/lib/mongoid/association/proxy.rb +12 -10
- data/lib/mongoid/association/referenced.rb +3 -0
- data/lib/mongoid/association/referenced/auto_save.rb +4 -1
- data/lib/mongoid/association/referenced/belongs_to.rb +6 -3
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +3 -1
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +6 -3
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -0
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +16 -14
- data/lib/mongoid/association/referenced/counter_cache.rb +2 -0
- data/lib/mongoid/association/referenced/eager.rb +9 -7
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +13 -6
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -6
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +25 -18
- data/lib/mongoid/association/referenced/has_many.rb +7 -4
- data/lib/mongoid/association/referenced/has_many/binding.rb +3 -1
- data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -2
- data/lib/mongoid/association/referenced/has_many/eager.rb +2 -0
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +30 -3
- data/lib/mongoid/association/referenced/has_many/proxy.rb +43 -41
- data/lib/mongoid/association/referenced/has_one.rb +5 -2
- data/lib/mongoid/association/referenced/has_one/binding.rb +4 -2
- data/lib/mongoid/association/referenced/has_one/buildable.rb +8 -1
- data/lib/mongoid/association/referenced/has_one/eager.rb +2 -0
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +11 -9
- data/lib/mongoid/association/referenced/has_one/proxy.rb +17 -15
- data/lib/mongoid/association/referenced/syncable.rb +7 -5
- data/lib/mongoid/association/reflections.rb +7 -5
- data/lib/mongoid/association/relatable.rb +17 -14
- data/lib/mongoid/atomic.rb +5 -13
- data/lib/mongoid/atomic/modifiers.rb +24 -1
- data/lib/mongoid/atomic/paths.rb +2 -0
- data/lib/mongoid/atomic/paths/embedded.rb +2 -0
- data/lib/mongoid/atomic/paths/embedded/many.rb +4 -2
- data/lib/mongoid/atomic/paths/embedded/one.rb +4 -2
- data/lib/mongoid/atomic/paths/root.rb +4 -2
- data/lib/mongoid/attributes.rb +35 -49
- data/lib/mongoid/attributes/dynamic.rb +2 -0
- data/lib/mongoid/attributes/nested.rb +7 -5
- data/lib/mongoid/attributes/processing.rb +8 -6
- data/lib/mongoid/attributes/readonly.rb +3 -1
- data/lib/mongoid/cacheable.rb +3 -1
- data/lib/mongoid/changeable.rb +3 -1
- data/lib/mongoid/clients.rb +2 -0
- data/lib/mongoid/clients/factory.rb +1 -0
- data/lib/mongoid/clients/options.rb +2 -0
- data/lib/mongoid/clients/sessions.rb +7 -20
- data/lib/mongoid/clients/storage_options.rb +2 -0
- data/lib/mongoid/clients/validators.rb +2 -0
- data/lib/mongoid/clients/validators/storage.rb +2 -0
- data/lib/mongoid/composable.rb +4 -2
- data/lib/mongoid/config.rb +15 -2
- data/lib/mongoid/config/environment.rb +2 -0
- data/lib/mongoid/config/options.rb +17 -12
- data/lib/mongoid/config/validators.rb +2 -0
- data/lib/mongoid/config/validators/client.rb +2 -0
- data/lib/mongoid/config/validators/option.rb +2 -0
- data/lib/mongoid/contextual.rb +2 -0
- data/lib/mongoid/contextual/aggregable/memory.rb +3 -1
- data/lib/mongoid/contextual/aggregable/mongo.rb +3 -1
- data/lib/mongoid/contextual/atomic.rb +24 -6
- data/lib/mongoid/contextual/command.rb +2 -0
- data/lib/mongoid/contextual/geo_near.rb +2 -1
- data/lib/mongoid/contextual/map_reduce.rb +2 -0
- data/lib/mongoid/contextual/memory.rb +4 -2
- data/lib/mongoid/contextual/mongo.rb +4 -0
- data/lib/mongoid/contextual/none.rb +2 -0
- data/lib/mongoid/contextual/queryable.rb +2 -0
- data/lib/mongoid/copyable.rb +3 -1
- data/lib/mongoid/criteria.rb +3 -7
- data/lib/mongoid/criteria/findable.rb +11 -1
- data/lib/mongoid/criteria/includable.rb +8 -6
- data/lib/mongoid/criteria/inspectable.rb +2 -0
- data/lib/mongoid/criteria/marshalable.rb +2 -0
- data/lib/mongoid/criteria/modifiable.rb +3 -2
- data/lib/mongoid/criteria/options.rb +2 -0
- data/lib/mongoid/criteria/permission.rb +2 -0
- data/lib/mongoid/criteria/queryable.rb +7 -2
- data/lib/mongoid/criteria/queryable/aggregable.rb +2 -0
- data/lib/mongoid/criteria/queryable/expandable.rb +93 -0
- data/lib/mongoid/criteria/queryable/extensions.rb +2 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -0
- data/lib/mongoid/criteria/queryable/extensions/date.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +5 -6
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -2
- data/lib/mongoid/criteria/queryable/extensions/object.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/range.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +7 -5
- data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/string.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/time.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +3 -13
- data/lib/mongoid/criteria/queryable/key.rb +34 -6
- data/lib/mongoid/criteria/queryable/macroable.rb +3 -1
- data/lib/mongoid/criteria/queryable/mergeable.rb +86 -11
- data/lib/mongoid/criteria/queryable/optional.rb +5 -3
- data/lib/mongoid/criteria/queryable/options.rb +2 -0
- data/lib/mongoid/criteria/queryable/pipeline.rb +2 -0
- data/lib/mongoid/criteria/queryable/selectable.rb +264 -87
- data/lib/mongoid/criteria/queryable/selector.rb +38 -5
- data/lib/mongoid/criteria/queryable/smash.rb +2 -0
- data/lib/mongoid/criteria/queryable/storable.rb +228 -0
- data/lib/mongoid/criteria/scopable.rb +2 -0
- data/lib/mongoid/document.rb +4 -3
- data/lib/mongoid/equality.rb +3 -2
- data/lib/mongoid/errors.rb +3 -0
- data/lib/mongoid/errors/ambiguous_relationship.rb +4 -2
- data/lib/mongoid/errors/callback.rb +2 -0
- data/lib/mongoid/errors/criteria_argument_required.rb +19 -0
- data/lib/mongoid/errors/delete_restriction.rb +3 -2
- data/lib/mongoid/errors/document_not_destroyed.rb +2 -0
- data/lib/mongoid/errors/document_not_found.rb +2 -0
- data/lib/mongoid/errors/eager_load.rb +4 -2
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -0
- data/lib/mongoid/errors/invalid_collection.rb +2 -0
- data/lib/mongoid/errors/invalid_config_option.rb +2 -0
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -0
- data/lib/mongoid/errors/invalid_field.rb +2 -0
- data/lib/mongoid/errors/invalid_field_option.rb +2 -0
- data/lib/mongoid/errors/invalid_find.rb +2 -0
- data/lib/mongoid/errors/invalid_includes.rb +2 -0
- data/lib/mongoid/errors/invalid_index.rb +2 -0
- data/lib/mongoid/errors/invalid_options.rb +4 -2
- data/lib/mongoid/errors/invalid_path.rb +2 -0
- data/lib/mongoid/errors/invalid_persistence_option.rb +2 -0
- data/lib/mongoid/errors/invalid_relation.rb +4 -2
- data/lib/mongoid/errors/invalid_relation_option.rb +4 -2
- data/lib/mongoid/errors/invalid_scope.rb +2 -0
- data/lib/mongoid/errors/invalid_session_use.rb +2 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -4
- data/lib/mongoid/errors/invalid_storage_options.rb +2 -0
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
- data/lib/mongoid/errors/invalid_time.rb +2 -0
- data/lib/mongoid/errors/invalid_value.rb +2 -0
- data/lib/mongoid/errors/inverse_not_found.rb +3 -1
- data/lib/mongoid/errors/mixed_client_configuration.rb +2 -0
- data/lib/mongoid/errors/mixed_relations.rb +2 -0
- data/lib/mongoid/errors/mongoid_error.rb +2 -0
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -1
- data/lib/mongoid/errors/no_client_config.rb +2 -0
- data/lib/mongoid/errors/no_client_database.rb +2 -0
- data/lib/mongoid/errors/no_client_hosts.rb +2 -0
- data/lib/mongoid/errors/no_clients_config.rb +2 -0
- data/lib/mongoid/errors/no_default_client.rb +2 -0
- data/lib/mongoid/errors/no_environment.rb +2 -0
- data/lib/mongoid/errors/no_map_reduce_output.rb +2 -0
- data/lib/mongoid/errors/no_metadata.rb +2 -0
- data/lib/mongoid/errors/no_parent.rb +2 -0
- data/lib/mongoid/errors/readonly_attribute.rb +2 -0
- data/lib/mongoid/errors/readonly_document.rb +2 -0
- data/lib/mongoid/errors/scope_overwrite.rb +2 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -0
- data/lib/mongoid/errors/unknown_attribute.rb +2 -0
- data/lib/mongoid/errors/unknown_model.rb +2 -0
- data/lib/mongoid/errors/unsaved_document.rb +2 -0
- data/lib/mongoid/errors/unsupported_javascript.rb +2 -0
- data/lib/mongoid/errors/validations.rb +2 -0
- data/lib/mongoid/evolvable.rb +3 -1
- data/lib/mongoid/extensions.rb +2 -0
- data/lib/mongoid/extensions/array.rb +23 -6
- data/lib/mongoid/extensions/big_decimal.rb +2 -0
- data/lib/mongoid/extensions/boolean.rb +2 -0
- data/lib/mongoid/extensions/date.rb +13 -3
- data/lib/mongoid/extensions/date_time.rb +4 -3
- data/lib/mongoid/extensions/decimal128.rb +2 -0
- data/lib/mongoid/extensions/false_class.rb +2 -0
- data/lib/mongoid/extensions/float.rb +5 -3
- data/lib/mongoid/extensions/hash.rb +49 -11
- data/lib/mongoid/extensions/integer.rb +5 -3
- data/lib/mongoid/extensions/module.rb +2 -0
- data/lib/mongoid/extensions/nil_class.rb +2 -0
- data/lib/mongoid/extensions/object.rb +16 -4
- data/lib/mongoid/extensions/object_id.rb +2 -0
- data/lib/mongoid/extensions/range.rb +2 -0
- data/lib/mongoid/extensions/regexp.rb +3 -1
- data/lib/mongoid/extensions/set.rb +2 -0
- data/lib/mongoid/extensions/string.rb +18 -9
- data/lib/mongoid/extensions/symbol.rb +2 -0
- data/lib/mongoid/extensions/time.rb +14 -0
- data/lib/mongoid/extensions/time_with_zone.rb +14 -0
- data/lib/mongoid/extensions/true_class.rb +2 -0
- data/lib/mongoid/factory.rb +28 -5
- data/lib/mongoid/fields.rb +4 -3
- data/lib/mongoid/fields/foreign_key.rb +3 -1
- data/lib/mongoid/fields/localized.rb +2 -0
- data/lib/mongoid/fields/standard.rb +4 -2
- data/lib/mongoid/fields/validators.rb +2 -0
- data/lib/mongoid/fields/validators/macro.rb +13 -2
- data/lib/mongoid/findable.rb +6 -2
- data/lib/mongoid/indexable.rb +3 -1
- data/lib/mongoid/indexable/specification.rb +3 -1
- data/lib/mongoid/indexable/validators/options.rb +2 -0
- data/lib/mongoid/inspectable.rb +3 -1
- data/lib/mongoid/interceptable.rb +5 -5
- data/lib/mongoid/loggable.rb +13 -7
- data/lib/mongoid/matchable.rb +2 -0
- data/lib/mongoid/matchable/all.rb +2 -0
- data/lib/mongoid/matchable/and.rb +2 -0
- data/lib/mongoid/matchable/default.rb +2 -0
- data/lib/mongoid/matchable/elem_match.rb +2 -0
- data/lib/mongoid/matchable/eq.rb +1 -0
- data/lib/mongoid/matchable/exists.rb +2 -0
- data/lib/mongoid/matchable/gt.rb +2 -0
- data/lib/mongoid/matchable/gte.rb +2 -0
- data/lib/mongoid/matchable/in.rb +2 -0
- data/lib/mongoid/matchable/lt.rb +2 -0
- data/lib/mongoid/matchable/lte.rb +2 -0
- data/lib/mongoid/matchable/ne.rb +2 -0
- data/lib/mongoid/matchable/nin.rb +2 -0
- data/lib/mongoid/matchable/nor.rb +2 -1
- data/lib/mongoid/matchable/or.rb +2 -0
- data/lib/mongoid/matchable/regexp.rb +5 -2
- data/lib/mongoid/matchable/size.rb +2 -0
- data/lib/mongoid/persistable.rb +133 -15
- data/lib/mongoid/persistable/creatable.rb +3 -1
- data/lib/mongoid/persistable/deletable.rb +3 -1
- data/lib/mongoid/persistable/destroyable.rb +3 -1
- data/lib/mongoid/persistable/incrementable.rb +6 -2
- data/lib/mongoid/persistable/logical.rb +4 -1
- data/lib/mongoid/persistable/poppable.rb +3 -1
- data/lib/mongoid/persistable/pullable.rb +3 -1
- data/lib/mongoid/persistable/pushable.rb +5 -12
- data/lib/mongoid/persistable/renamable.rb +10 -3
- data/lib/mongoid/persistable/savable.rb +3 -1
- data/lib/mongoid/persistable/settable.rb +3 -1
- data/lib/mongoid/persistable/unsettable.rb +8 -3
- data/lib/mongoid/persistable/updatable.rb +3 -1
- data/lib/mongoid/persistable/upsertable.rb +3 -1
- data/lib/mongoid/persistence_context.rb +27 -15
- data/lib/mongoid/positional.rb +2 -0
- data/lib/mongoid/query_cache.rb +26 -69
- data/lib/mongoid/railtie.rb +3 -1
- data/lib/mongoid/railties/controller_runtime.rb +4 -1
- data/lib/mongoid/railties/database.rake +2 -0
- data/lib/mongoid/reloadable.rb +4 -2
- data/lib/mongoid/scopable.rb +2 -1
- data/lib/mongoid/selectable.rb +3 -1
- data/lib/mongoid/serializable.rb +13 -11
- data/lib/mongoid/shardable.rb +3 -1
- data/lib/mongoid/stateful.rb +3 -1
- data/lib/mongoid/tasks/database.rake +2 -0
- data/lib/mongoid/tasks/database.rb +2 -0
- data/lib/mongoid/threaded.rb +2 -0
- data/lib/mongoid/threaded/lifecycle.rb +2 -0
- data/lib/mongoid/timestamps.rb +3 -1
- data/lib/mongoid/timestamps/created.rb +3 -1
- data/lib/mongoid/timestamps/created/short.rb +2 -0
- data/lib/mongoid/timestamps/short.rb +2 -0
- data/lib/mongoid/timestamps/timeless.rb +3 -1
- data/lib/mongoid/timestamps/updated.rb +3 -1
- data/lib/mongoid/timestamps/updated/short.rb +2 -0
- data/lib/mongoid/touchable.rb +20 -12
- data/lib/mongoid/traversable.rb +4 -2
- data/lib/mongoid/validatable.rb +7 -5
- data/lib/mongoid/validatable/associated.rb +4 -2
- data/lib/mongoid/validatable/format.rb +2 -0
- data/lib/mongoid/validatable/length.rb +2 -0
- data/lib/mongoid/validatable/localizable.rb +2 -0
- data/lib/mongoid/validatable/macros.rb +2 -0
- data/lib/mongoid/validatable/presence.rb +4 -2
- data/lib/mongoid/validatable/queryable.rb +2 -0
- data/lib/mongoid/validatable/uniqueness.rb +5 -3
- data/lib/mongoid/version.rb +2 -1
- data/lib/rails/generators/mongoid/config/config_generator.rb +3 -8
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +12 -6
- data/lib/rails/generators/mongoid/model/model_generator.rb +3 -1
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
- data/lib/rails/generators/mongoid_generator.rb +2 -0
- data/lib/rails/mongoid.rb +4 -2
- data/lib/support/ruby_version.rb +3 -0
- data/spec/app/models/account.rb +3 -0
- data/spec/app/models/acolyte.rb +3 -0
- data/spec/app/models/actor.rb +3 -0
- data/spec/app/models/actress.rb +3 -0
- data/spec/app/models/address.rb +3 -0
- data/spec/app/models/address_component.rb +3 -0
- data/spec/app/models/address_number.rb +3 -0
- data/spec/app/models/agency.rb +3 -0
- data/spec/app/models/agent.rb +3 -0
- data/spec/app/models/album.rb +3 -0
- data/spec/app/models/alert.rb +3 -0
- data/spec/app/models/animal.rb +3 -0
- data/spec/app/models/answer.rb +3 -0
- data/spec/app/models/appointment.rb +3 -0
- data/spec/app/models/array_field.rb +1 -0
- data/spec/app/models/article.rb +3 -0
- data/spec/app/models/artist.rb +3 -0
- data/spec/app/models/artwork.rb +3 -0
- data/spec/app/models/audio.rb +3 -0
- data/spec/app/models/augmentation.rb +3 -0
- data/spec/app/models/author.rb +3 -0
- data/spec/app/models/baby.rb +3 -0
- data/spec/app/models/band.rb +3 -0
- data/spec/app/models/bar.rb +3 -0
- data/spec/app/models/basic.rb +3 -0
- data/spec/app/models/bed.rb +3 -0
- data/spec/app/models/big_palette.rb +3 -0
- data/spec/app/models/birthday.rb +3 -0
- data/spec/app/models/bomb.rb +3 -0
- data/spec/app/models/book.rb +3 -0
- data/spec/app/models/breed.rb +3 -0
- data/spec/app/models/browser.rb +3 -0
- data/spec/app/models/building.rb +3 -0
- data/spec/app/models/building_address.rb +3 -0
- data/spec/app/models/bus.rb +3 -0
- data/spec/app/models/business.rb +3 -0
- data/spec/app/models/callback_test.rb +3 -0
- data/spec/app/models/canvas.rb +3 -0
- data/spec/app/models/car.rb +3 -0
- data/spec/app/models/cat.rb +3 -0
- data/spec/app/models/category.rb +3 -0
- data/spec/app/models/child.rb +3 -0
- data/spec/app/models/child_doc.rb +3 -0
- data/spec/app/models/church.rb +3 -0
- data/spec/app/models/circle.rb +3 -0
- data/spec/app/models/circuit.rb +3 -0
- data/spec/app/models/circus.rb +3 -0
- data/spec/app/models/code.rb +3 -0
- data/spec/app/models/comment.rb +3 -0
- data/spec/app/models/company.rb +3 -0
- data/spec/app/models/consumption_period.rb +3 -0
- data/spec/app/models/contextable_item.rb +3 -0
- data/spec/app/models/contractor.rb +3 -0
- data/spec/app/models/cookie.rb +3 -0
- data/spec/app/models/country_code.rb +3 -0
- data/spec/app/models/courier_job.rb +3 -0
- data/spec/app/models/definition.rb +3 -0
- data/spec/app/models/description.rb +3 -0
- data/spec/app/models/dictionary.rb +3 -0
- data/spec/app/models/division.rb +3 -0
- data/spec/app/models/doctor.rb +3 -0
- data/spec/app/models/dog.rb +3 -0
- data/spec/app/models/dokument.rb +3 -0
- data/spec/app/models/draft.rb +3 -0
- data/spec/app/models/dragon.rb +3 -0
- data/spec/app/models/driver.rb +3 -0
- data/spec/app/models/drug.rb +3 -0
- data/spec/app/models/dungeon.rb +3 -0
- data/spec/app/models/edit.rb +3 -0
- data/spec/app/models/email.rb +3 -0
- data/spec/app/models/employer.rb +3 -0
- data/spec/app/models/entry.rb +3 -0
- data/spec/app/models/eraser.rb +3 -0
- data/spec/app/models/even.rb +3 -0
- data/spec/app/models/event.rb +3 -0
- data/spec/app/models/exhibition.rb +3 -0
- data/spec/app/models/exhibitor.rb +3 -0
- data/spec/app/models/explosion.rb +3 -0
- data/spec/app/models/eye.rb +3 -0
- data/spec/app/models/eye_bowl.rb +3 -0
- data/spec/app/models/face.rb +3 -0
- data/spec/app/models/favorite.rb +3 -0
- data/spec/app/models/filesystem.rb +3 -0
- data/spec/app/models/fire_hydrant.rb +3 -0
- data/spec/app/models/firefox.rb +3 -0
- data/spec/app/models/fish.rb +3 -0
- data/spec/app/models/folder.rb +3 -0
- data/spec/app/models/folder_item.rb +3 -0
- data/spec/app/models/fruits.rb +3 -0
- data/spec/app/models/game.rb +3 -0
- data/spec/app/models/ghost.rb +3 -0
- data/spec/app/models/home.rb +3 -0
- data/spec/app/models/house.rb +3 -0
- data/spec/app/models/html_writer.rb +3 -0
- data/spec/app/models/id_key.rb +3 -0
- data/spec/app/models/image.rb +3 -0
- data/spec/app/models/implant.rb +3 -0
- data/spec/app/models/item.rb +3 -0
- data/spec/app/models/jar.rb +3 -0
- data/spec/app/models/kaleidoscope.rb +3 -0
- data/spec/app/models/kangaroo.rb +4 -1
- data/spec/app/models/label.rb +3 -0
- data/spec/app/models/language.rb +3 -0
- data/spec/app/models/lat_lng.rb +3 -0
- data/spec/app/models/league.rb +3 -0
- data/spec/app/models/learner.rb +3 -0
- data/spec/app/models/line_item.rb +3 -0
- data/spec/app/models/location.rb +3 -0
- data/spec/app/models/login.rb +3 -0
- data/spec/app/models/manufacturer.rb +3 -0
- data/spec/app/models/meat.rb +3 -0
- data/spec/app/models/membership.rb +3 -0
- data/spec/app/models/message.rb +3 -0
- data/spec/app/models/minim.rb +1 -1
- data/spec/app/models/mixed_drink.rb +3 -0
- data/spec/app/models/movie.rb +3 -0
- data/spec/app/models/my_hash.rb +3 -0
- data/spec/app/models/name.rb +3 -0
- data/spec/app/models/name_only.rb +9 -0
- data/spec/app/models/node.rb +3 -0
- data/spec/app/models/note.rb +3 -0
- data/spec/app/models/odd.rb +3 -0
- data/spec/app/models/ordered_post.rb +3 -0
- data/spec/app/models/ordered_preference.rb +3 -0
- data/spec/app/models/oscar.rb +3 -0
- data/spec/app/models/other_owner_object.rb +3 -0
- data/spec/app/models/override.rb +3 -0
- data/spec/app/models/ownable.rb +3 -0
- data/spec/app/models/owner.rb +3 -0
- data/spec/app/models/pack.rb +3 -0
- data/spec/app/models/page.rb +3 -0
- data/spec/app/models/page_question.rb +3 -0
- data/spec/app/models/palette.rb +3 -0
- data/spec/app/models/parent.rb +3 -0
- data/spec/app/models/parent_doc.rb +3 -0
- data/spec/app/models/passport.rb +3 -0
- data/spec/app/models/patient.rb +3 -0
- data/spec/app/models/pdf_writer.rb +3 -0
- data/spec/app/models/pencil.rb +3 -0
- data/spec/app/models/person.rb +3 -0
- data/spec/app/models/pet.rb +3 -0
- data/spec/app/models/pet_owner.rb +3 -0
- data/spec/app/models/phone.rb +3 -0
- data/spec/app/models/pizza.rb +3 -0
- data/spec/app/models/player.rb +3 -0
- data/spec/app/models/post.rb +3 -0
- data/spec/app/models/post_genre.rb +3 -0
- data/spec/app/models/powerup.rb +3 -0
- data/spec/app/models/preference.rb +3 -0
- data/spec/app/models/princess.rb +3 -0
- data/spec/app/models/product.rb +3 -0
- data/spec/app/models/profile.rb +3 -0
- data/spec/app/models/pronunciation.rb +3 -0
- data/spec/app/models/pub.rb +3 -0
- data/spec/app/models/purchase.rb +3 -0
- data/spec/app/models/question.rb +3 -0
- data/spec/app/models/quiz.rb +3 -0
- data/spec/app/models/rating.rb +3 -0
- data/spec/app/models/record.rb +3 -0
- data/spec/app/models/registry.rb +3 -0
- data/spec/app/models/role.rb +3 -0
- data/spec/app/models/root_category.rb +3 -0
- data/spec/app/models/sandwich.rb +3 -0
- data/spec/app/models/scheduler.rb +3 -0
- data/spec/app/models/seo.rb +3 -0
- data/spec/app/models/series.rb +3 -0
- data/spec/app/models/server.rb +3 -0
- data/spec/app/models/service.rb +3 -0
- data/spec/app/models/shape.rb +3 -0
- data/spec/app/models/shelf.rb +3 -0
- data/spec/app/models/shipment_address.rb +3 -0
- data/spec/app/models/shipping_container.rb +3 -0
- data/spec/app/models/shipping_pack.rb +3 -0
- data/spec/app/models/shop.rb +3 -0
- data/spec/app/models/short_agent.rb +3 -0
- data/spec/app/models/short_quiz.rb +3 -0
- data/spec/app/models/simple.rb +3 -0
- data/spec/app/models/slave.rb +3 -0
- data/spec/app/models/song.rb +3 -0
- data/spec/app/models/sound.rb +3 -0
- data/spec/app/models/square.rb +3 -0
- data/spec/app/models/staff.rb +3 -0
- data/spec/app/models/store_as_dup_test1.rb +3 -0
- data/spec/app/models/store_as_dup_test2.rb +3 -0
- data/spec/app/models/store_as_dup_test3.rb +1 -0
- data/spec/app/models/store_as_dup_test4.rb +1 -0
- data/spec/app/models/strategy.rb +3 -0
- data/spec/app/models/sub_item.rb +3 -0
- data/spec/app/models/subscription.rb +3 -0
- data/spec/app/models/survey.rb +3 -0
- data/spec/app/models/symptom.rb +3 -0
- data/spec/app/models/tag.rb +3 -0
- data/spec/app/models/target.rb +3 -0
- data/spec/app/models/template.rb +3 -0
- data/spec/app/models/thing.rb +3 -0
- data/spec/app/models/title.rb +3 -0
- data/spec/app/models/tool.rb +3 -0
- data/spec/app/models/topping.rb +3 -0
- data/spec/app/models/track.rb +3 -0
- data/spec/app/models/translation.rb +3 -0
- data/spec/app/models/tree.rb +3 -0
- data/spec/app/models/truck.rb +3 -0
- data/spec/app/models/updatable.rb +1 -0
- data/spec/app/models/user.rb +3 -0
- data/spec/app/models/user_account.rb +3 -0
- data/spec/app/models/validation_callback.rb +3 -0
- data/spec/app/models/vehicle.rb +3 -0
- data/spec/app/models/version.rb +3 -0
- data/spec/app/models/vertex.rb +4 -1
- data/spec/app/models/vet_visit.rb +3 -0
- data/spec/app/models/video.rb +3 -0
- data/spec/app/models/video_game.rb +3 -0
- data/spec/app/models/weapon.rb +3 -0
- data/spec/app/models/wiki_page.rb +3 -0
- data/spec/app/models/word.rb +3 -0
- data/spec/app/models/word_origin.rb +3 -0
- data/spec/app/models/writer.rb +3 -0
- data/spec/config/mongoid.yml +1 -0
- data/spec/integration/associations/belongs_to_spec.rb +3 -0
- data/spec/integration/associations/embedded_spec.rb +0 -55
- data/spec/integration/associations/foreign_key_spec.rb +99 -0
- data/spec/integration/associations/foreign_key_spec_models.rb +65 -0
- data/spec/integration/associations/reverse_population_spec.rb +35 -0
- data/spec/integration/associations/reverse_population_spec_models.rb +37 -0
- data/spec/integration/criteria/default_scope_spec.rb +21 -0
- data/spec/integration/criteria/logical_spec.rb +81 -0
- data/spec/integration/i18n_fallbacks_spec.rb +90 -0
- data/spec/lite_spec_helper.rb +11 -18
- data/spec/mongoid/association/accessors_spec.rb +3 -0
- data/spec/mongoid/association/auto_save_spec.rb +3 -0
- data/spec/mongoid/association/builders_spec.rb +3 -0
- data/spec/mongoid/association/constrainable_spec.rb +3 -0
- data/spec/mongoid/association/counter_cache_spec.rb +3 -0
- data/spec/mongoid/association/depending_spec.rb +3 -0
- data/spec/mongoid/association/eager_spec.rb +3 -0
- data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -0
- data/spec/mongoid/association/embedded/dirty_spec.rb +3 -0
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -0
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +3 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +3 -50
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +4 -1
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +3 -0
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +3 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +3 -0
- data/spec/mongoid/association/embedded/embeds_many_models.rb +0 -19
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +52 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +4 -11
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +3 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +3 -0
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +3 -0
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +3 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +3 -0
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +29 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +6 -1
- data/spec/mongoid/association/macros_spec.rb +3 -0
- data/spec/mongoid/association/nested/many_spec.rb +3 -0
- data/spec/mongoid/association/nested/one_spec.rb +3 -0
- data/spec/mongoid/association/options_spec.rb +3 -0
- data/spec/mongoid/association/polymorphic_spec.rb +3 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -0
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +3 -0
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +12 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +3 -0
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +38 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +3 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +3 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +3 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +16 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +26 -5
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +38 -154
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +40 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +26 -2
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -0
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +3 -0
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +18 -3
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +71 -146
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -0
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +4 -2
- data/spec/mongoid/association/referenced/has_many_models.rb +3 -0
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +38 -0
- data/spec/mongoid/association/referenced/has_many_spec.rb +3 -0
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +3 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +3 -0
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -3
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +3 -0
- data/spec/mongoid/association/referenced/has_one_models.rb +3 -0
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +38 -0
- data/spec/mongoid/association/referenced/has_one_spec.rb +3 -0
- data/spec/mongoid/association/reflections_spec.rb +3 -0
- data/spec/mongoid/association/syncable_spec.rb +3 -0
- data/spec/mongoid/association_spec.rb +3 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +3 -0
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +3 -0
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +3 -0
- data/spec/mongoid/atomic/paths/root_spec.rb +3 -0
- data/spec/mongoid/atomic/paths_spec.rb +3 -41
- data/spec/mongoid/atomic_spec.rb +3 -0
- data/spec/mongoid/attributes/nested_spec.rb +3 -0
- data/spec/mongoid/attributes/readonly_spec.rb +3 -0
- data/spec/mongoid/attributes_spec.rb +10 -260
- data/spec/mongoid/cacheable_spec.rb +3 -0
- data/spec/mongoid/changeable_spec.rb +3 -0
- data/spec/mongoid/clients/factory_spec.rb +38 -20
- data/spec/mongoid/clients/options_spec.rb +24 -13
- data/spec/mongoid/clients/sessions_spec.rb +7 -8
- data/spec/mongoid/clients/transactions_spec.rb +14 -23
- data/spec/mongoid/clients_spec.rb +5 -2
- data/spec/mongoid/composable_spec.rb +3 -0
- data/spec/mongoid/config/environment_spec.rb +3 -0
- data/spec/mongoid/config/options_spec.rb +23 -3
- data/spec/mongoid/config_spec.rb +39 -0
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +3 -0
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +3 -0
- data/spec/mongoid/contextual/atomic_spec.rb +113 -37
- data/spec/mongoid/contextual/geo_near_spec.rb +5 -11
- data/spec/mongoid/contextual/map_reduce_spec.rb +8 -20
- data/spec/mongoid/contextual/memory_spec.rb +3 -0
- data/spec/mongoid/contextual/mongo_spec.rb +58 -76
- data/spec/mongoid/contextual/none_spec.rb +3 -0
- data/spec/mongoid/copyable_spec.rb +3 -0
- data/spec/mongoid/copyable_spec_models.rb +3 -0
- data/spec/mongoid/criteria/findable_spec.rb +58 -0
- data/spec/mongoid/criteria/inspectable_spec.rb +3 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +3 -0
- data/spec/mongoid/criteria/modifiable_spec.rb +7 -3
- data/spec/mongoid/criteria/options_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +135 -0
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +36 -17
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +10 -7
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -1
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +31 -35
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +4 -28
- data/spec/mongoid/criteria/queryable/key_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/options_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +564 -156
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +950 -2165
- data/spec/mongoid/criteria/queryable/selector_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/smash_spec.rb +3 -0
- data/spec/mongoid/criteria/queryable/storable_spec.rb +112 -0
- data/spec/mongoid/criteria/scopable_spec.rb +3 -0
- data/spec/mongoid/criteria_spec.rb +39 -4
- data/spec/mongoid/document_fields_spec.rb +0 -29
- data/spec/mongoid/document_query_spec.rb +39 -0
- data/spec/mongoid/document_spec.rb +3 -0
- data/spec/mongoid/equality_spec.rb +3 -0
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +6 -3
- data/spec/mongoid/errors/callback_spec.rb +3 -0
- data/spec/mongoid/errors/delete_restriction_spec.rb +3 -0
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +3 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +3 -0
- data/spec/mongoid/errors/eager_load_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_collection_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_field_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_includes_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_index_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_options_spec.rb +5 -2
- data/spec/mongoid/errors/invalid_path_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_relation_spec.rb +5 -2
- data/spec/mongoid/errors/invalid_scope_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -0
- data/spec/mongoid/errors/invalid_time_spec.rb +3 -0
- data/spec/mongoid/errors/inverse_not_found_spec.rb +4 -1
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +3 -0
- data/spec/mongoid/errors/mixed_relations_spec.rb +3 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +3 -0
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +6 -3
- data/spec/mongoid/errors/no_client_config_spec.rb +3 -0
- data/spec/mongoid/errors/no_client_database_spec.rb +3 -0
- data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -0
- data/spec/mongoid/errors/no_clients_config_spec.rb +3 -0
- data/spec/mongoid/errors/no_environment_spec.rb +3 -0
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -0
- data/spec/mongoid/errors/no_metadata_spec.rb +5 -2
- data/spec/mongoid/errors/no_parent_spec.rb +4 -1
- data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -0
- data/spec/mongoid/errors/readonly_document_spec.rb +3 -0
- data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -0
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -0
- data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -0
- data/spec/mongoid/errors/unsaved_document_spec.rb +4 -1
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -0
- data/spec/mongoid/errors/validations_spec.rb +3 -0
- data/spec/mongoid/extensions/array_spec.rb +26 -43
- data/spec/mongoid/extensions/big_decimal_spec.rb +3 -0
- data/spec/mongoid/extensions/binary_spec.rb +3 -0
- data/spec/mongoid/extensions/boolean_spec.rb +3 -0
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +336 -0
- data/spec/mongoid/extensions/date_spec.rb +9 -160
- data/spec/mongoid/extensions/date_time_spec.rb +18 -60
- data/spec/mongoid/extensions/decimal128_spec.rb +3 -0
- data/spec/mongoid/extensions/false_class_spec.rb +3 -0
- data/spec/mongoid/extensions/float_spec.rb +18 -3
- data/spec/mongoid/extensions/hash_spec.rb +106 -0
- data/spec/mongoid/extensions/integer_spec.rb +15 -2
- data/spec/mongoid/extensions/module_spec.rb +3 -0
- data/spec/mongoid/extensions/nil_class_spec.rb +3 -0
- data/spec/mongoid/extensions/object_id_spec.rb +3 -0
- data/spec/mongoid/extensions/object_spec.rb +14 -24
- data/spec/mongoid/extensions/range_spec.rb +3 -0
- data/spec/mongoid/extensions/regexp_spec.rb +3 -0
- data/spec/mongoid/extensions/set_spec.rb +3 -0
- data/spec/mongoid/extensions/string_spec.rb +60 -26
- data/spec/mongoid/extensions/symbol_spec.rb +3 -0
- data/spec/mongoid/extensions/time_spec.rb +30 -0
- data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -0
- data/spec/mongoid/extensions/true_class_spec.rb +3 -0
- data/spec/mongoid/extensions_spec.rb +3 -0
- data/spec/mongoid/factory_spec.rb +29 -2
- data/spec/mongoid/fields/foreign_key_spec.rb +3 -0
- data/spec/mongoid/fields/localized_spec.rb +3 -0
- data/spec/mongoid/fields/standard_spec.rb +3 -0
- data/spec/mongoid/fields_spec.rb +18 -0
- data/spec/mongoid/findable_spec.rb +3 -0
- data/spec/mongoid/indexable/specification_spec.rb +3 -0
- data/spec/mongoid/indexable_spec.rb +7 -6
- data/spec/mongoid/inspectable_spec.rb +3 -0
- data/spec/mongoid/interceptable_spec.rb +3 -0
- data/spec/mongoid/loggable_spec.rb +3 -0
- data/spec/mongoid/matchable/all_spec.rb +3 -0
- data/spec/mongoid/matchable/and_spec.rb +3 -0
- data/spec/mongoid/matchable/default_spec.rb +4 -1
- data/spec/mongoid/matchable/elem_match_spec.rb +3 -0
- data/spec/mongoid/matchable/eq_spec.rb +1 -0
- data/spec/mongoid/matchable/exists_spec.rb +3 -0
- data/spec/mongoid/matchable/gt_spec.rb +3 -0
- data/spec/mongoid/matchable/gte_spec.rb +3 -0
- data/spec/mongoid/matchable/in_spec.rb +3 -0
- data/spec/mongoid/matchable/lt_spec.rb +3 -0
- data/spec/mongoid/matchable/lte_spec.rb +3 -0
- data/spec/mongoid/matchable/ne_spec.rb +3 -0
- data/spec/mongoid/matchable/nin_spec.rb +3 -0
- data/spec/mongoid/matchable/nor_spec.rb +1 -0
- data/spec/mongoid/matchable/or_spec.rb +3 -0
- data/spec/mongoid/matchable/regexp_spec.rb +5 -2
- data/spec/mongoid/matchable/size_spec.rb +3 -0
- data/spec/mongoid/matchable_spec.rb +5 -2
- data/spec/mongoid/persistable/creatable_spec.rb +3 -0
- data/spec/mongoid/persistable/deletable_spec.rb +3 -0
- data/spec/mongoid/persistable/destroyable_spec.rb +3 -0
- data/spec/mongoid/persistable/incrementable_spec.rb +17 -0
- data/spec/mongoid/persistable/logical_spec.rb +17 -0
- data/spec/mongoid/persistable/poppable_spec.rb +17 -0
- data/spec/mongoid/persistable/pullable_spec.rb +31 -0
- data/spec/mongoid/persistable/pushable_spec.rb +32 -55
- data/spec/mongoid/persistable/renamable_spec.rb +17 -0
- data/spec/mongoid/persistable/savable_spec.rb +7 -4
- data/spec/mongoid/persistable/settable_spec.rb +17 -30
- data/spec/mongoid/persistable/unsettable_spec.rb +17 -0
- data/spec/mongoid/persistable/updatable_spec.rb +3 -0
- data/spec/mongoid/persistable/upsertable_spec.rb +3 -0
- data/spec/mongoid/persistable_spec.rb +85 -8
- data/spec/mongoid/persistence_context_spec.rb +3 -0
- data/spec/mongoid/positional_spec.rb +3 -0
- data/spec/mongoid/query_cache_middleware_spec.rb +48 -0
- data/spec/mongoid/query_cache_spec.rb +12 -121
- data/spec/mongoid/relations/proxy_spec.rb +4 -1
- data/spec/mongoid/reloadable_spec.rb +3 -0
- data/spec/mongoid/scopable_spec.rb +4 -2
- data/spec/mongoid/selectable_spec.rb +3 -0
- data/spec/mongoid/serializable_spec.rb +3 -0
- data/spec/mongoid/shardable_spec.rb +3 -0
- data/spec/mongoid/stateful_spec.rb +3 -0
- data/spec/mongoid/tasks/database_rake_spec.rb +16 -13
- data/spec/mongoid/tasks/database_spec.rb +4 -1
- data/spec/mongoid/threaded_spec.rb +3 -0
- data/spec/mongoid/timestamps/created/short_spec.rb +3 -0
- data/spec/mongoid/timestamps/created_spec.rb +3 -0
- data/spec/mongoid/timestamps/timeless_spec.rb +3 -0
- data/spec/mongoid/timestamps/updated/short_spec.rb +3 -0
- data/spec/mongoid/timestamps/updated_spec.rb +3 -0
- data/spec/mongoid/timestamps_spec.rb +3 -0
- data/spec/mongoid/touchable_spec.rb +49 -3
- data/spec/mongoid/traversable_spec.rb +3 -0
- data/spec/mongoid/validatable/associated_spec.rb +3 -0
- data/spec/mongoid/validatable/format_spec.rb +3 -0
- data/spec/mongoid/validatable/length_spec.rb +3 -0
- data/spec/mongoid/validatable/numericality_spec.rb +3 -0
- data/spec/mongoid/validatable/presence_spec.rb +3 -0
- data/spec/mongoid/validatable/uniqueness_spec.rb +3 -0
- data/spec/mongoid/validatable_spec.rb +3 -0
- data/spec/mongoid_spec.rb +3 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +4 -1
- data/spec/rails/mongoid_spec.rb +5 -2
- data/spec/spec_helper.rb +50 -15
- data/spec/support/authorization.rb +3 -0
- data/spec/support/cluster_config.rb +3 -3
- data/spec/support/constraints.rb +211 -17
- data/spec/support/expectations.rb +3 -0
- data/spec/support/macros.rb +1 -0
- data/spec/support/shared/time.rb +54 -0
- data/spec/support/spec_config.rb +7 -20
- metadata +508 -515
- metadata.gz.sig +2 -1
- data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
- data/spec/app/models/customer.rb +0 -11
- data/spec/app/models/customer_address.rb +0 -12
- data/spec/app/models/delegating_patient.rb +0 -16
- data/spec/integration/app_spec.rb +0 -341
- data/spec/integration/callbacks_models.rb +0 -49
- data/spec/integration/callbacks_spec.rb +0 -216
- data/spec/integration/criteria/date_field_spec.rb +0 -41
- data/spec/integration/document_spec.rb +0 -22
- data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
- data/spec/mongoid/document_persistence_context_spec.rb +0 -33
- data/spec/shared/LICENSE +0 -20
- data/spec/shared/bin/get-mongodb-download-url +0 -17
- data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
- data/spec/shared/lib/mrss/cluster_config.rb +0 -221
- data/spec/shared/lib/mrss/constraints.rb +0 -354
- data/spec/shared/lib/mrss/docker_runner.rb +0 -265
- data/spec/shared/lib/mrss/lite_constraints.rb +0 -191
- data/spec/shared/lib/mrss/server_version_registry.rb +0 -115
- data/spec/shared/lib/mrss/spec_organizer.rb +0 -162
- data/spec/shared/lib/mrss/utils.rb +0 -15
- data/spec/shared/share/Dockerfile.erb +0 -231
- data/spec/shared/shlib/distro.sh +0 -73
- data/spec/shared/shlib/server.sh +0 -290
- data/spec/shared/shlib/set_env.sh +0 -128
- data/spec/support/session_registry.rb +0 -50
|
@@ -1,43 +1,299 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
1
4
|
require "spec_helper"
|
|
2
5
|
|
|
6
|
+
class FieldWithSerializer
|
|
7
|
+
def evolve(object)
|
|
8
|
+
Integer.evolve(object)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def localized?
|
|
12
|
+
false
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
3
16
|
describe Mongoid::Criteria::Queryable::Selectable do
|
|
4
17
|
|
|
5
18
|
let(:query) do
|
|
6
|
-
|
|
19
|
+
Mongoid::Query.new("id" => "_id")
|
|
7
20
|
end
|
|
8
21
|
|
|
9
|
-
shared_examples_for "a
|
|
22
|
+
shared_examples_for "returns a cloned query" do
|
|
10
23
|
|
|
11
24
|
it "returns a cloned query" do
|
|
12
25
|
expect(selection).to_not equal(query)
|
|
13
26
|
end
|
|
14
27
|
end
|
|
15
28
|
|
|
16
|
-
|
|
29
|
+
shared_examples_for 'requires an argument' do
|
|
30
|
+
context "when provided no argument" do
|
|
17
31
|
|
|
18
|
-
|
|
32
|
+
let(:selection) do
|
|
33
|
+
query.send(query_method)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "raises ArgumentError" do
|
|
37
|
+
expect do
|
|
38
|
+
selection.selector
|
|
39
|
+
end.to raise_error(ArgumentError)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
shared_examples_for 'requires a non-nil argument' do
|
|
45
|
+
context "when provided nil" do
|
|
19
46
|
|
|
20
47
|
let(:selection) do
|
|
21
|
-
query.
|
|
48
|
+
query.send(query_method, nil)
|
|
22
49
|
end
|
|
23
50
|
|
|
24
|
-
it "
|
|
25
|
-
expect
|
|
51
|
+
it "raises CriteriaArgumentRequired" do
|
|
52
|
+
expect do
|
|
53
|
+
selection.selector
|
|
54
|
+
end.to raise_error(Mongoid::Errors::CriteriaArgumentRequired, /#{query_method}/)
|
|
26
55
|
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
27
58
|
|
|
28
|
-
|
|
29
|
-
|
|
59
|
+
shared_examples_for 'supports merge strategies' do
|
|
60
|
+
|
|
61
|
+
context 'when the field is not aliased' do
|
|
62
|
+
|
|
63
|
+
context "when the strategy is not set" do
|
|
64
|
+
|
|
65
|
+
let(:selection) do
|
|
66
|
+
query.send(query_method, first: [ 1, 2 ]).send(query_method, first: [ 3, 4 ])
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "combines the conditions with $and" do
|
|
70
|
+
expect(selection.selector).to eq({
|
|
71
|
+
"first" => { operator => [ 1, 2 ] },
|
|
72
|
+
'$and' => [{'first' => {operator => [3, 4]}}],
|
|
73
|
+
})
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it_behaves_like "returns a cloned query"
|
|
30
77
|
end
|
|
31
78
|
|
|
32
|
-
|
|
33
|
-
|
|
79
|
+
context "when the strategy is intersect" do
|
|
80
|
+
|
|
81
|
+
let(:selection) do
|
|
82
|
+
query.send(query_method, first: [ 1, 2 ]).intersect.send(query_method, first: [ 2, 3 ])
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it "intersects the conditions" do
|
|
86
|
+
expect(selection.selector).to eq({
|
|
87
|
+
"first" => { operator => [ 2 ] }
|
|
88
|
+
})
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it_behaves_like "returns a cloned query"
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
context "when the strategy is override" do
|
|
95
|
+
|
|
96
|
+
let(:selection) do
|
|
97
|
+
query.send(query_method, first: [ 1, 2 ]).override.send(query_method, first: [ 3, 4 ])
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it "overwrites the first condition" do
|
|
101
|
+
expect(selection.selector).to eq({
|
|
102
|
+
"first" => { operator => [ 3, 4 ] }
|
|
103
|
+
})
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it_behaves_like "returns a cloned query"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
context "when the strategy is union" do
|
|
110
|
+
|
|
111
|
+
let(:selection) do
|
|
112
|
+
query.send(query_method, first: [ 1, 2 ]).union.send(query_method, first: [ 3, 4 ])
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it "unions the conditions" do
|
|
116
|
+
expect(selection.selector).to eq({
|
|
117
|
+
"first" => { operator => [ 1, 2, 3, 4 ] }
|
|
118
|
+
})
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it_behaves_like "returns a cloned query"
|
|
34
122
|
end
|
|
35
123
|
end
|
|
36
124
|
|
|
37
|
-
context
|
|
125
|
+
context 'when the field is aliased' do
|
|
126
|
+
|
|
127
|
+
context "when the strategy is not set" do
|
|
128
|
+
|
|
129
|
+
let(:selection) do
|
|
130
|
+
query.send(query_method, id: [ 1, 2 ]).send(query_method, _id: [ 3, 4 ])
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
it "combines the conditions with $and" do
|
|
134
|
+
expect(selection.selector).to eq({
|
|
135
|
+
"_id" => { operator => [ 1, 2 ] },
|
|
136
|
+
'$and' => [{'_id' => {operator => [3, 4]}}],
|
|
137
|
+
})
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it_behaves_like "returns a cloned query"
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
context "when the strategy is intersect" do
|
|
144
|
+
|
|
145
|
+
let(:selection) do
|
|
146
|
+
query.send(query_method, id: [ 1, 2 ]).intersect.send(query_method, _id: [ 2, 3 ])
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
it "intersects the conditions" do
|
|
150
|
+
expect(selection.selector).to eq({
|
|
151
|
+
"_id" => { operator => [ 2 ] }
|
|
152
|
+
})
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
it_behaves_like "returns a cloned query"
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
context "when the strategy is override" do
|
|
159
|
+
|
|
160
|
+
let(:selection) do
|
|
161
|
+
query.send(query_method, _id: [ 1, 2 ]).override.send(query_method, id: [ 3, 4 ])
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
it "overwrites the first condition" do
|
|
165
|
+
expect(selection.selector).to eq({
|
|
166
|
+
"_id" => { operator => [ 3, 4 ] }
|
|
167
|
+
})
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
it_behaves_like "returns a cloned query"
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
context "when the strategy is union" do
|
|
174
|
+
|
|
175
|
+
let(:selection) do
|
|
176
|
+
query.send(query_method, _id: [ 1, 2 ]).union.send(query_method, id: [ 3, 4 ])
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it "unions the conditions" do
|
|
180
|
+
expect(selection.selector).to eq({
|
|
181
|
+
"_id" => { operator => [ 1, 2, 3, 4 ] }
|
|
182
|
+
})
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
it_behaves_like "returns a cloned query"
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
context 'when the field uses a serializer' do
|
|
190
|
+
|
|
191
|
+
let(:query) do
|
|
192
|
+
Mongoid::Query.new({}, { "field" => FieldWithSerializer.new })
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
context "when the strategy is not set" do
|
|
197
|
+
|
|
198
|
+
let(:selection) do
|
|
199
|
+
query.send(query_method, field: [ '1', '2' ]).send(query_method, field: [ '3', '4' ])
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
it "combines the conditions with $and" do
|
|
203
|
+
expect(selection.selector).to eq({
|
|
204
|
+
"field" => { operator => [ 1, 2 ] },
|
|
205
|
+
'$and' => [{'field' => {operator => [3, 4]}}],
|
|
206
|
+
})
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
it_behaves_like "returns a cloned query"
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
context "when the strategy is set" do
|
|
213
|
+
|
|
214
|
+
let(:selection) do
|
|
215
|
+
query.send(query_method, field: [ '1', '2' ]).intersect.send(query_method, field: [ '2', '3' ])
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
it "intersects the conditions" do
|
|
219
|
+
expect(selection.selector).to eq({
|
|
220
|
+
"field" => { operator => [ 2 ] }
|
|
221
|
+
})
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
it_behaves_like "returns a cloned query"
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
context 'when operator value is a Range' do
|
|
229
|
+
|
|
230
|
+
context "when there is no existing condition and strategy is not specified" do
|
|
231
|
+
|
|
232
|
+
let(:selection) do
|
|
233
|
+
query.send(query_method, foo: 2..4)
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
it 'expands range to array' do
|
|
237
|
+
expect(selection.selector).to eq({
|
|
238
|
+
"foo" => { operator => [ 2, 3, 4 ] }
|
|
239
|
+
})
|
|
240
|
+
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
context "when there is no existing condition and strategy is specified" do
|
|
245
|
+
|
|
246
|
+
let(:selection) do
|
|
247
|
+
query.union.send(query_method, foo: 2..4)
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
it 'expands range to array' do
|
|
251
|
+
expect(selection.selector).to eq({
|
|
252
|
+
"foo" => { operator => [ 2, 3, 4 ] }
|
|
253
|
+
})
|
|
254
|
+
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
context "when existing condition has Array value" do
|
|
259
|
+
|
|
260
|
+
let(:selection) do
|
|
261
|
+
query.send(query_method, foo: [ 1, 2 ]).union.send(query_method, foo: 2..4)
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
it 'expands range to array' do
|
|
265
|
+
expect(selection.selector).to eq({
|
|
266
|
+
"foo" => { operator => [ 1, 2, 3, 4 ] }
|
|
267
|
+
})
|
|
268
|
+
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
context "when existing condition has Range value" do
|
|
273
|
+
|
|
274
|
+
let(:selection) do
|
|
275
|
+
query.send(query_method, foo: 1..2).union.send(query_method, foo: 2..4)
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
it 'expands range to array' do
|
|
279
|
+
expect(selection.selector).to eq({
|
|
280
|
+
"foo" => { operator => [ 1, 2, 3, 4 ] }
|
|
281
|
+
})
|
|
282
|
+
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
describe "#all" do
|
|
289
|
+
|
|
290
|
+
let(:query_method) { :all }
|
|
291
|
+
let(:operator) { '$all' }
|
|
292
|
+
|
|
293
|
+
context "when provided no criterion" do
|
|
38
294
|
|
|
39
295
|
let(:selection) do
|
|
40
|
-
query.all
|
|
296
|
+
query.all
|
|
41
297
|
end
|
|
42
298
|
|
|
43
299
|
it "does not add any criterion" do
|
|
@@ -53,6 +309,8 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
53
309
|
end
|
|
54
310
|
end
|
|
55
311
|
|
|
312
|
+
it_behaves_like 'requires a non-nil argument'
|
|
313
|
+
|
|
56
314
|
context "when provided a single criterion" do
|
|
57
315
|
|
|
58
316
|
context "when no serializers are provided" do
|
|
@@ -74,23 +332,6 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
74
332
|
end
|
|
75
333
|
end
|
|
76
334
|
|
|
77
|
-
context "when providing a range" do
|
|
78
|
-
|
|
79
|
-
let(:selection) do
|
|
80
|
-
query.all(field: 1..3)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
it "adds the $all selector with converted range" do
|
|
84
|
-
expect(selection.selector).to eq({
|
|
85
|
-
"field" => { "$all" => [ 1, 2, 3 ] }
|
|
86
|
-
})
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
it "returns a cloned query" do
|
|
90
|
-
expect(selection).to_not equal(query)
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
|
|
94
335
|
context "when providing a single value" do
|
|
95
336
|
|
|
96
337
|
let(:selection) do
|
|
@@ -147,23 +388,6 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
147
388
|
end
|
|
148
389
|
end
|
|
149
390
|
|
|
150
|
-
context "when providing a range" do
|
|
151
|
-
|
|
152
|
-
let(:selection) do
|
|
153
|
-
query.all(field: "1".."3")
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
it "adds the $all selector with converted range" do
|
|
157
|
-
expect(selection.selector).to eq({
|
|
158
|
-
"field" => { "$all" => [ 1, 2, 3 ] }
|
|
159
|
-
})
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
it "returns a cloned query" do
|
|
163
|
-
expect(selection).to_not equal(query)
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
|
|
167
391
|
context "when providing a single value" do
|
|
168
392
|
|
|
169
393
|
let(:selection) do
|
|
@@ -226,257 +450,120 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
226
450
|
|
|
227
451
|
context "when the criterion are on the same field" do
|
|
228
452
|
|
|
229
|
-
|
|
453
|
+
it_behaves_like 'supports merge strategies'
|
|
454
|
+
end
|
|
455
|
+
end
|
|
456
|
+
end
|
|
230
457
|
|
|
231
|
-
|
|
458
|
+
describe "#between" do
|
|
232
459
|
|
|
233
|
-
|
|
234
|
-
query.all(first: [ 1, 2 ]).all(first: [ 3, 4 ])
|
|
235
|
-
end
|
|
460
|
+
let(:query_method) { :between }
|
|
236
461
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
"first" => { "$all" => [ 1, 2, 3, 4 ] }
|
|
240
|
-
})
|
|
241
|
-
end
|
|
462
|
+
it_behaves_like 'requires an argument'
|
|
463
|
+
it_behaves_like 'requires a non-nil argument'
|
|
242
464
|
|
|
243
|
-
|
|
244
|
-
expect(selection).to_not equal(query)
|
|
245
|
-
end
|
|
246
|
-
end
|
|
465
|
+
context "when provided a single range" do
|
|
247
466
|
|
|
248
|
-
|
|
467
|
+
let(:selection) do
|
|
468
|
+
query.between(field: 1..10)
|
|
469
|
+
end
|
|
249
470
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
471
|
+
it "adds the $gte and $lte selectors" do
|
|
472
|
+
expect(selection.selector).to eq({
|
|
473
|
+
"field" => { "$gte" => 1, "$lte" => 10 }
|
|
474
|
+
})
|
|
475
|
+
end
|
|
253
476
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
end
|
|
477
|
+
it "returns a cloned query" do
|
|
478
|
+
expect(selection).to_not equal(query)
|
|
479
|
+
end
|
|
480
|
+
end
|
|
259
481
|
|
|
260
|
-
|
|
261
|
-
expect(selection).to_not equal(query)
|
|
262
|
-
end
|
|
263
|
-
end
|
|
482
|
+
context "when provided multiple ranges" do
|
|
264
483
|
|
|
265
|
-
|
|
484
|
+
context "when the ranges are on different fields" do
|
|
266
485
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
486
|
+
let(:selection) do
|
|
487
|
+
query.between(field: 1..10, key: 5..7)
|
|
488
|
+
end
|
|
270
489
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
490
|
+
it "adds the $gte and $lte selectors" do
|
|
491
|
+
expect(selection.selector).to eq({
|
|
492
|
+
"field" => { "$gte" => 1, "$lte" => 10 },
|
|
493
|
+
"key" => { "$gte" => 5, "$lte" => 7 }
|
|
494
|
+
})
|
|
495
|
+
end
|
|
276
496
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
497
|
+
it "returns a cloned query" do
|
|
498
|
+
expect(selection).to_not equal(query)
|
|
499
|
+
end
|
|
500
|
+
end
|
|
501
|
+
end
|
|
502
|
+
end
|
|
281
503
|
|
|
282
|
-
|
|
504
|
+
describe "#elem_match" do
|
|
283
505
|
|
|
284
|
-
|
|
285
|
-
query.all(first: [ 1, 2 ]).union.all(first: [ 3, 4 ])
|
|
286
|
-
end
|
|
506
|
+
let(:query_method) { :elem_match }
|
|
287
507
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
"first" => { "$all" => [ 1, 2, 3, 4 ] }
|
|
291
|
-
})
|
|
292
|
-
end
|
|
508
|
+
it_behaves_like 'requires an argument'
|
|
509
|
+
it_behaves_like 'requires a non-nil argument'
|
|
293
510
|
|
|
294
|
-
|
|
295
|
-
expect(selection).to_not equal(query)
|
|
296
|
-
end
|
|
297
|
-
end
|
|
298
|
-
end
|
|
299
|
-
|
|
300
|
-
context "when serializers are provided" do
|
|
301
|
-
|
|
302
|
-
before(:all) do
|
|
303
|
-
class Field
|
|
304
|
-
def evolve(object)
|
|
305
|
-
Integer.evolve(object)
|
|
306
|
-
end
|
|
307
|
-
def localized?
|
|
308
|
-
false
|
|
309
|
-
end
|
|
310
|
-
end
|
|
311
|
-
end
|
|
312
|
-
|
|
313
|
-
after(:all) do
|
|
314
|
-
Object.send(:remove_const, :Field)
|
|
315
|
-
end
|
|
316
|
-
|
|
317
|
-
let!(:query) do
|
|
318
|
-
Mongoid::Query.new({}, { "field" => Field.new })
|
|
319
|
-
end
|
|
320
|
-
|
|
321
|
-
context "when the strategy is the default (union)" do
|
|
322
|
-
|
|
323
|
-
let(:selection) do
|
|
324
|
-
query.all(field: [ "1", "2" ]).all(field: [ "3", "4" ])
|
|
325
|
-
end
|
|
326
|
-
|
|
327
|
-
it "overwrites the field $all selector" do
|
|
328
|
-
expect(selection.selector).to eq({
|
|
329
|
-
"field" => { "$all" => [ 1, 2, 3, 4 ] }
|
|
330
|
-
})
|
|
331
|
-
end
|
|
332
|
-
|
|
333
|
-
it "returns a cloned query" do
|
|
334
|
-
expect(selection).to_not equal(query)
|
|
335
|
-
end
|
|
336
|
-
end
|
|
337
|
-
|
|
338
|
-
context "when the strategy is intersect" do
|
|
339
|
-
|
|
340
|
-
let(:selection) do
|
|
341
|
-
query.all(field: [ "1", "2" ]).intersect.all(field: [ "2", "3" ])
|
|
342
|
-
end
|
|
343
|
-
|
|
344
|
-
it "intersects the $all selectors" do
|
|
345
|
-
expect(selection.selector).to eq({
|
|
346
|
-
"field" => { "$all" => [ 2 ] }
|
|
347
|
-
})
|
|
348
|
-
end
|
|
349
|
-
|
|
350
|
-
it "returns a cloned query" do
|
|
351
|
-
expect(selection).to_not equal(query)
|
|
352
|
-
end
|
|
353
|
-
end
|
|
354
|
-
|
|
355
|
-
context "when the strategy is override" do
|
|
356
|
-
|
|
357
|
-
let(:selection) do
|
|
358
|
-
query.all(field: [ "1", "2" ]).override.all(field: [ "3", "4" ])
|
|
359
|
-
end
|
|
360
|
-
|
|
361
|
-
it "overwrites the field $all selector" do
|
|
362
|
-
expect(selection.selector).to eq({
|
|
363
|
-
"field" => { "$all" => [ 3, 4 ] }
|
|
364
|
-
})
|
|
365
|
-
end
|
|
366
|
-
|
|
367
|
-
it "returns a cloned query" do
|
|
368
|
-
expect(selection).to_not equal(query)
|
|
369
|
-
end
|
|
370
|
-
end
|
|
371
|
-
|
|
372
|
-
context "when the strategy is union" do
|
|
373
|
-
|
|
374
|
-
let(:selection) do
|
|
375
|
-
query.all(field: [ "1", "2" ]).union.all(field: [ "3", "4" ])
|
|
376
|
-
end
|
|
511
|
+
context "when provided a criterion" do
|
|
377
512
|
|
|
378
|
-
|
|
379
|
-
expect(selection.selector).to eq({
|
|
380
|
-
"field" => { "$all" => [ 1, 2, 3, 4 ] }
|
|
381
|
-
})
|
|
382
|
-
end
|
|
513
|
+
context "when there are no nested complex keys" do
|
|
383
514
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
end
|
|
387
|
-
end
|
|
515
|
+
let(:selection) do
|
|
516
|
+
query.elem_match(users: { name: "value" })
|
|
388
517
|
end
|
|
389
|
-
end
|
|
390
|
-
end
|
|
391
|
-
end
|
|
392
|
-
|
|
393
|
-
describe "#and" do
|
|
394
|
-
|
|
395
|
-
context "when provided no criterion" do
|
|
396
|
-
|
|
397
|
-
let(:selection) do
|
|
398
|
-
query.and
|
|
399
|
-
end
|
|
400
|
-
|
|
401
|
-
it "does not add any criterion" do
|
|
402
|
-
expect(selection.selector).to eq({})
|
|
403
|
-
end
|
|
404
|
-
|
|
405
|
-
it "returns the query" do
|
|
406
|
-
expect(selection).to eq(query)
|
|
407
|
-
end
|
|
408
|
-
|
|
409
|
-
it "returns a cloned query" do
|
|
410
|
-
expect(selection).to_not equal(query)
|
|
411
|
-
end
|
|
412
|
-
end
|
|
413
|
-
|
|
414
|
-
context "when provided nil" do
|
|
415
|
-
|
|
416
|
-
let(:selection) do
|
|
417
|
-
query.and(nil)
|
|
418
|
-
end
|
|
419
|
-
|
|
420
|
-
it "does not add any criterion" do
|
|
421
|
-
expect(selection.selector).to eq({})
|
|
422
|
-
end
|
|
423
|
-
|
|
424
|
-
it "returns the query" do
|
|
425
|
-
expect(selection).to eq(query)
|
|
426
|
-
end
|
|
427
|
-
|
|
428
|
-
it "returns a cloned query" do
|
|
429
|
-
expect(selection).to_not equal(query)
|
|
430
|
-
end
|
|
431
|
-
end
|
|
432
518
|
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
519
|
+
it "adds the $elemMatch expression" do
|
|
520
|
+
expect(selection.selector).to eq({
|
|
521
|
+
"users" => { "$elemMatch" => { name: "value" }}
|
|
522
|
+
})
|
|
523
|
+
end
|
|
438
524
|
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
})
|
|
525
|
+
it "returns a cloned query" do
|
|
526
|
+
expect(selection).to_not equal(query)
|
|
527
|
+
end
|
|
443
528
|
end
|
|
444
529
|
|
|
445
|
-
|
|
446
|
-
expect(selection).to_not equal(query)
|
|
447
|
-
end
|
|
448
|
-
end
|
|
530
|
+
context "when there are nested complex keys" do
|
|
449
531
|
|
|
450
|
-
|
|
532
|
+
let(:time) do
|
|
533
|
+
Time.now
|
|
534
|
+
end
|
|
451
535
|
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
536
|
+
let(:selection) do
|
|
537
|
+
query.elem_match(users: { :time.gt => time })
|
|
538
|
+
end
|
|
455
539
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
540
|
+
it "adds the $elemMatch expression" do
|
|
541
|
+
expect(selection.selector).to eq({
|
|
542
|
+
"users" => { "$elemMatch" => { "time" => { "$gt" => time }}}
|
|
543
|
+
})
|
|
544
|
+
end
|
|
461
545
|
|
|
462
|
-
|
|
463
|
-
|
|
546
|
+
it "returns a cloned query" do
|
|
547
|
+
expect(selection).to_not equal(query)
|
|
548
|
+
end
|
|
464
549
|
end
|
|
465
550
|
end
|
|
466
551
|
|
|
467
|
-
context "when
|
|
552
|
+
context "when providing multiple criteria" do
|
|
468
553
|
|
|
469
|
-
context "when the
|
|
554
|
+
context "when the fields differ" do
|
|
470
555
|
|
|
471
556
|
let(:selection) do
|
|
472
|
-
query.
|
|
557
|
+
query.elem_match(
|
|
558
|
+
users: { name: "value" },
|
|
559
|
+
comments: { text: "value" }
|
|
560
|
+
)
|
|
473
561
|
end
|
|
474
562
|
|
|
475
|
-
it "
|
|
563
|
+
it "adds the $elemMatch expression" do
|
|
476
564
|
expect(selection.selector).to eq({
|
|
477
|
-
"$
|
|
478
|
-
|
|
479
|
-
]
|
|
565
|
+
"users" => { "$elemMatch" => { name: "value" }},
|
|
566
|
+
"comments" => { "$elemMatch" => { text: "value" }}
|
|
480
567
|
})
|
|
481
568
|
end
|
|
482
569
|
|
|
@@ -484,19 +571,22 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
484
571
|
expect(selection).to_not equal(query)
|
|
485
572
|
end
|
|
486
573
|
end
|
|
574
|
+
end
|
|
487
575
|
|
|
488
|
-
|
|
576
|
+
context "when chaining multiple criteria" do
|
|
577
|
+
|
|
578
|
+
context "when the fields differ" do
|
|
489
579
|
|
|
490
580
|
let(:selection) do
|
|
491
|
-
query.
|
|
581
|
+
query.
|
|
582
|
+
elem_match(users: { name: "value" }).
|
|
583
|
+
elem_match(comments: { text: "value" })
|
|
492
584
|
end
|
|
493
585
|
|
|
494
|
-
it "adds the $
|
|
586
|
+
it "adds the $elemMatch expression" do
|
|
495
587
|
expect(selection.selector).to eq({
|
|
496
|
-
"$
|
|
497
|
-
|
|
498
|
-
{ "second" => [ 3, 4 ] }
|
|
499
|
-
]
|
|
588
|
+
"users" => { "$elemMatch" => { name: "value" }},
|
|
589
|
+
"comments" => { "$elemMatch" => { text: "value" }}
|
|
500
590
|
})
|
|
501
591
|
end
|
|
502
592
|
|
|
@@ -505,18 +595,17 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
505
595
|
end
|
|
506
596
|
end
|
|
507
597
|
|
|
508
|
-
context "when the
|
|
598
|
+
context "when the fields are the same" do
|
|
509
599
|
|
|
510
600
|
let(:selection) do
|
|
511
|
-
query.
|
|
601
|
+
query.
|
|
602
|
+
elem_match(users: { name: "value" }).
|
|
603
|
+
elem_match(users: { state: "new" })
|
|
512
604
|
end
|
|
513
605
|
|
|
514
|
-
it "
|
|
606
|
+
it "overrides the $elemMatch expression" do
|
|
515
607
|
expect(selection.selector).to eq({
|
|
516
|
-
"$
|
|
517
|
-
{ "first" => [ 1, 2 ] },
|
|
518
|
-
{ "first" => [ 3, 4 ] }
|
|
519
|
-
]
|
|
608
|
+
"users" => { "$elemMatch" => { state: "new" }}
|
|
520
609
|
})
|
|
521
610
|
end
|
|
522
611
|
|
|
@@ -525,21 +614,26 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
525
614
|
end
|
|
526
615
|
end
|
|
527
616
|
end
|
|
617
|
+
end
|
|
528
618
|
|
|
529
|
-
|
|
619
|
+
describe "#exists" do
|
|
530
620
|
|
|
531
|
-
|
|
621
|
+
let(:query_method) { :exists }
|
|
622
|
+
|
|
623
|
+
it_behaves_like 'requires an argument'
|
|
624
|
+
it_behaves_like 'requires a non-nil argument'
|
|
625
|
+
|
|
626
|
+
context "when provided a criterion" do
|
|
627
|
+
|
|
628
|
+
context "when provided a boolean" do
|
|
532
629
|
|
|
533
630
|
let(:selection) do
|
|
534
|
-
query.
|
|
631
|
+
query.exists(users: true)
|
|
535
632
|
end
|
|
536
633
|
|
|
537
|
-
it "adds the $
|
|
634
|
+
it "adds the $exists expression" do
|
|
538
635
|
expect(selection.selector).to eq({
|
|
539
|
-
"$
|
|
540
|
-
{ "first" => [ 1, 2 ] },
|
|
541
|
-
{ "second" => [ 3, 4 ] }
|
|
542
|
-
]
|
|
636
|
+
"users" => { "$exists" => true }
|
|
543
637
|
})
|
|
544
638
|
end
|
|
545
639
|
|
|
@@ -548,18 +642,15 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
548
642
|
end
|
|
549
643
|
end
|
|
550
644
|
|
|
551
|
-
context "when
|
|
645
|
+
context "when provided a string" do
|
|
552
646
|
|
|
553
647
|
let(:selection) do
|
|
554
|
-
query.
|
|
648
|
+
query.exists(users: "yes")
|
|
555
649
|
end
|
|
556
650
|
|
|
557
|
-
it "
|
|
651
|
+
it "adds the $exists expression" do
|
|
558
652
|
expect(selection.selector).to eq({
|
|
559
|
-
"$
|
|
560
|
-
{ "first" => [ 1, 2 ] },
|
|
561
|
-
{ "first" => [ 3, 4 ] }
|
|
562
|
-
]
|
|
653
|
+
"users" => { "$exists" => true }
|
|
563
654
|
})
|
|
564
655
|
end
|
|
565
656
|
|
|
@@ -568,517 +659,183 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
568
659
|
end
|
|
569
660
|
end
|
|
570
661
|
end
|
|
571
|
-
end
|
|
572
662
|
|
|
573
|
-
|
|
663
|
+
context "when providing multiple criteria" do
|
|
574
664
|
|
|
575
|
-
|
|
665
|
+
context "when the fields differ" do
|
|
576
666
|
|
|
577
|
-
|
|
578
|
-
query.between
|
|
579
|
-
end
|
|
667
|
+
context "when providing boolean values" do
|
|
580
668
|
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
669
|
+
let(:selection) do
|
|
670
|
+
query.exists(
|
|
671
|
+
users: true,
|
|
672
|
+
comments: true
|
|
673
|
+
)
|
|
674
|
+
end
|
|
584
675
|
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
676
|
+
it "adds the $exists expression" do
|
|
677
|
+
expect(selection.selector).to eq({
|
|
678
|
+
"users" => { "$exists" => true },
|
|
679
|
+
"comments" => { "$exists" => true }
|
|
680
|
+
})
|
|
681
|
+
end
|
|
588
682
|
|
|
589
|
-
|
|
590
|
-
|
|
683
|
+
it "returns a cloned query" do
|
|
684
|
+
expect(selection).to_not equal(query)
|
|
685
|
+
end
|
|
686
|
+
end
|
|
687
|
+
|
|
688
|
+
context "when providing string values" do
|
|
689
|
+
|
|
690
|
+
let(:selection) do
|
|
691
|
+
query.exists(
|
|
692
|
+
users: "y",
|
|
693
|
+
comments: "true"
|
|
694
|
+
)
|
|
695
|
+
end
|
|
696
|
+
|
|
697
|
+
it "adds the $exists expression" do
|
|
698
|
+
expect(selection.selector).to eq({
|
|
699
|
+
"users" => { "$exists" => true },
|
|
700
|
+
"comments" => { "$exists" => true }
|
|
701
|
+
})
|
|
702
|
+
end
|
|
703
|
+
|
|
704
|
+
it "returns a cloned query" do
|
|
705
|
+
expect(selection).to_not equal(query)
|
|
706
|
+
end
|
|
707
|
+
end
|
|
591
708
|
end
|
|
592
709
|
end
|
|
593
710
|
|
|
594
|
-
context "when
|
|
711
|
+
context "when chaining multiple criteria" do
|
|
595
712
|
|
|
596
|
-
|
|
597
|
-
query.between(nil)
|
|
598
|
-
end
|
|
713
|
+
context "when the fields differ" do
|
|
599
714
|
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
715
|
+
let(:selection) do
|
|
716
|
+
query.
|
|
717
|
+
exists(users: true).
|
|
718
|
+
exists(comments: true)
|
|
719
|
+
end
|
|
603
720
|
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
721
|
+
it "adds the $exists expression" do
|
|
722
|
+
expect(selection.selector).to eq({
|
|
723
|
+
"users" => { "$exists" => true },
|
|
724
|
+
"comments" => { "$exists" => true }
|
|
725
|
+
})
|
|
726
|
+
end
|
|
607
727
|
|
|
608
|
-
|
|
609
|
-
|
|
728
|
+
it "returns a cloned query" do
|
|
729
|
+
expect(selection).to_not equal(query)
|
|
730
|
+
end
|
|
610
731
|
end
|
|
611
732
|
end
|
|
733
|
+
end
|
|
612
734
|
|
|
613
|
-
|
|
735
|
+
describe "#geo_spacial" do
|
|
614
736
|
|
|
615
|
-
|
|
616
|
-
query.between(field: 1..10)
|
|
617
|
-
end
|
|
737
|
+
let(:query_method) { :geo_spacial }
|
|
618
738
|
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
"field" => { "$gte" => 1, "$lte" => 10 }
|
|
622
|
-
})
|
|
623
|
-
end
|
|
624
|
-
|
|
625
|
-
it "returns a cloned query" do
|
|
626
|
-
expect(selection).to_not equal(query)
|
|
627
|
-
end
|
|
628
|
-
end
|
|
629
|
-
|
|
630
|
-
context "when provided multiple ranges" do
|
|
631
|
-
|
|
632
|
-
context "when the ranges are on different fields" do
|
|
633
|
-
|
|
634
|
-
let(:selection) do
|
|
635
|
-
query.between(field: 1..10, key: 5..7)
|
|
636
|
-
end
|
|
637
|
-
|
|
638
|
-
it "adds the $gte and $lte selectors" do
|
|
639
|
-
expect(selection.selector).to eq({
|
|
640
|
-
"field" => { "$gte" => 1, "$lte" => 10 },
|
|
641
|
-
"key" => { "$gte" => 5, "$lte" => 7 }
|
|
642
|
-
})
|
|
643
|
-
end
|
|
644
|
-
|
|
645
|
-
it "returns a cloned query" do
|
|
646
|
-
expect(selection).to_not equal(query)
|
|
647
|
-
end
|
|
648
|
-
end
|
|
649
|
-
end
|
|
650
|
-
end
|
|
651
|
-
|
|
652
|
-
describe "#elem_match" do
|
|
653
|
-
|
|
654
|
-
context "when provided no criterion" do
|
|
655
|
-
|
|
656
|
-
let(:selection) do
|
|
657
|
-
query.elem_match
|
|
658
|
-
end
|
|
659
|
-
|
|
660
|
-
it "does not add any criterion" do
|
|
661
|
-
expect(selection.selector).to eq({})
|
|
662
|
-
end
|
|
663
|
-
|
|
664
|
-
it "returns the query" do
|
|
665
|
-
expect(selection).to eq(query)
|
|
666
|
-
end
|
|
667
|
-
|
|
668
|
-
it "returns a cloned query" do
|
|
669
|
-
expect(selection).to_not equal(query)
|
|
670
|
-
end
|
|
671
|
-
end
|
|
672
|
-
|
|
673
|
-
context "when provided nil" do
|
|
674
|
-
|
|
675
|
-
let(:selection) do
|
|
676
|
-
query.elem_match(nil)
|
|
677
|
-
end
|
|
678
|
-
|
|
679
|
-
it "does not add any criterion" do
|
|
680
|
-
expect(selection.selector).to eq({})
|
|
681
|
-
end
|
|
682
|
-
|
|
683
|
-
it "returns the query" do
|
|
684
|
-
expect(selection).to eq(query)
|
|
685
|
-
end
|
|
686
|
-
|
|
687
|
-
it "returns a cloned query" do
|
|
688
|
-
expect(selection).to_not equal(query)
|
|
689
|
-
end
|
|
690
|
-
end
|
|
739
|
+
it_behaves_like 'requires an argument'
|
|
740
|
+
it_behaves_like 'requires a non-nil argument'
|
|
691
741
|
|
|
692
742
|
context "when provided a criterion" do
|
|
693
743
|
|
|
694
|
-
context "when
|
|
744
|
+
context "when the geometry is a point intersection" do
|
|
695
745
|
|
|
696
746
|
let(:selection) do
|
|
697
|
-
query.
|
|
747
|
+
query.geo_spacial(:location.intersects_point => [ 1, 10 ])
|
|
698
748
|
end
|
|
699
749
|
|
|
700
|
-
it "adds the $
|
|
750
|
+
it "adds the $geoIntersects expression" do
|
|
701
751
|
expect(selection.selector).to eq({
|
|
702
|
-
"
|
|
752
|
+
"location" => {
|
|
753
|
+
"$geoIntersects" => {
|
|
754
|
+
"$geometry" => {
|
|
755
|
+
"type" => "Point",
|
|
756
|
+
"coordinates" => [ 1, 10 ]
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
}
|
|
703
760
|
})
|
|
704
761
|
end
|
|
705
762
|
|
|
706
|
-
|
|
707
|
-
expect(selection).to_not equal(query)
|
|
708
|
-
end
|
|
763
|
+
it_behaves_like "returns a cloned query"
|
|
709
764
|
end
|
|
710
765
|
|
|
711
|
-
context "when
|
|
712
|
-
|
|
713
|
-
let(:time) do
|
|
714
|
-
Time.now
|
|
715
|
-
end
|
|
766
|
+
context "when the geometry is a line intersection" do
|
|
716
767
|
|
|
717
768
|
let(:selection) do
|
|
718
|
-
query.
|
|
769
|
+
query.geo_spacial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
|
|
719
770
|
end
|
|
720
771
|
|
|
721
|
-
it "adds the $
|
|
772
|
+
it "adds the $geoIntersects expression" do
|
|
722
773
|
expect(selection.selector).to eq({
|
|
723
|
-
"
|
|
774
|
+
"location" => {
|
|
775
|
+
"$geoIntersects" => {
|
|
776
|
+
"$geometry" => {
|
|
777
|
+
"type" => "LineString",
|
|
778
|
+
"coordinates" => [[ 1, 10 ], [ 2, 10 ]]
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
}
|
|
724
782
|
})
|
|
725
783
|
end
|
|
726
784
|
|
|
727
|
-
|
|
728
|
-
expect(selection).to_not equal(query)
|
|
729
|
-
end
|
|
785
|
+
it_behaves_like "returns a cloned query"
|
|
730
786
|
end
|
|
731
|
-
end
|
|
732
|
-
|
|
733
|
-
context "when providing multiple criteria" do
|
|
734
787
|
|
|
735
|
-
context "when the
|
|
788
|
+
context "when the geometry is a polygon intersection" do
|
|
736
789
|
|
|
737
790
|
let(:selection) do
|
|
738
|
-
query.
|
|
739
|
-
|
|
740
|
-
comments: { text: "value" }
|
|
791
|
+
query.geo_spacial(
|
|
792
|
+
:location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
|
741
793
|
)
|
|
742
794
|
end
|
|
743
795
|
|
|
744
|
-
it "adds the $
|
|
745
|
-
expect(selection.selector).to eq({
|
|
746
|
-
"users" => { "$elemMatch" => { name: "value" }},
|
|
747
|
-
"comments" => { "$elemMatch" => { text: "value" }}
|
|
748
|
-
})
|
|
749
|
-
end
|
|
750
|
-
|
|
751
|
-
it "returns a cloned query" do
|
|
752
|
-
expect(selection).to_not equal(query)
|
|
753
|
-
end
|
|
754
|
-
end
|
|
755
|
-
end
|
|
756
|
-
|
|
757
|
-
context "when chaining multiple criteria" do
|
|
758
|
-
|
|
759
|
-
context "when the fields differ" do
|
|
760
|
-
|
|
761
|
-
let(:selection) do
|
|
762
|
-
query.
|
|
763
|
-
elem_match(users: { name: "value" }).
|
|
764
|
-
elem_match(comments: { text: "value" })
|
|
765
|
-
end
|
|
766
|
-
|
|
767
|
-
it "adds the $elemMatch expression" do
|
|
768
|
-
expect(selection.selector).to eq({
|
|
769
|
-
"users" => { "$elemMatch" => { name: "value" }},
|
|
770
|
-
"comments" => { "$elemMatch" => { text: "value" }}
|
|
771
|
-
})
|
|
772
|
-
end
|
|
773
|
-
|
|
774
|
-
it "returns a cloned query" do
|
|
775
|
-
expect(selection).to_not equal(query)
|
|
776
|
-
end
|
|
777
|
-
end
|
|
778
|
-
|
|
779
|
-
context "when the fields are the same" do
|
|
780
|
-
|
|
781
|
-
let(:selection) do
|
|
782
|
-
query.
|
|
783
|
-
elem_match(users: { name: "value" }).
|
|
784
|
-
elem_match(users: { state: "new" })
|
|
785
|
-
end
|
|
786
|
-
|
|
787
|
-
it "overrides the $elemMatch expression" do
|
|
796
|
+
it "adds the $geoIntersects expression" do
|
|
788
797
|
expect(selection.selector).to eq({
|
|
789
|
-
"
|
|
798
|
+
"location" => {
|
|
799
|
+
"$geoIntersects" => {
|
|
800
|
+
"$geometry" => {
|
|
801
|
+
"type" => "Polygon",
|
|
802
|
+
"coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
}
|
|
790
806
|
})
|
|
791
807
|
end
|
|
792
808
|
|
|
793
|
-
|
|
794
|
-
expect(selection).to_not equal(query)
|
|
795
|
-
end
|
|
796
|
-
end
|
|
797
|
-
end
|
|
798
|
-
end
|
|
799
|
-
|
|
800
|
-
describe "#exists" do
|
|
801
|
-
|
|
802
|
-
context "when provided no criterion" do
|
|
803
|
-
|
|
804
|
-
let(:selection) do
|
|
805
|
-
query.exists
|
|
806
|
-
end
|
|
807
|
-
|
|
808
|
-
it "does not add any criterion" do
|
|
809
|
-
expect(selection.selector).to eq({})
|
|
810
|
-
end
|
|
811
|
-
|
|
812
|
-
it "returns the query" do
|
|
813
|
-
expect(selection).to eq(query)
|
|
814
|
-
end
|
|
815
|
-
|
|
816
|
-
it "returns a cloned query" do
|
|
817
|
-
expect(selection).to_not equal(query)
|
|
818
|
-
end
|
|
819
|
-
end
|
|
820
|
-
|
|
821
|
-
context "when provided nil" do
|
|
822
|
-
|
|
823
|
-
let(:selection) do
|
|
824
|
-
query.exists(nil)
|
|
825
|
-
end
|
|
826
|
-
|
|
827
|
-
it "does not add any criterion" do
|
|
828
|
-
expect(selection.selector).to eq({})
|
|
829
|
-
end
|
|
830
|
-
|
|
831
|
-
it "returns the query" do
|
|
832
|
-
expect(selection).to eq(query)
|
|
833
|
-
end
|
|
834
|
-
|
|
835
|
-
it "returns a cloned query" do
|
|
836
|
-
expect(selection).to_not equal(query)
|
|
809
|
+
it_behaves_like "returns a cloned query"
|
|
837
810
|
end
|
|
838
|
-
end
|
|
839
811
|
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
context "when provided a boolean" do
|
|
812
|
+
context "when the geometry is within a polygon" do
|
|
843
813
|
|
|
844
814
|
let(:selection) do
|
|
845
|
-
query.
|
|
815
|
+
query.geo_spacial(
|
|
816
|
+
:location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
|
817
|
+
)
|
|
846
818
|
end
|
|
847
819
|
|
|
848
|
-
it "adds the $
|
|
820
|
+
it "adds the $geoIntersects expression" do
|
|
849
821
|
expect(selection.selector).to eq({
|
|
850
|
-
"
|
|
822
|
+
"location" => {
|
|
823
|
+
"$geoWithin" => {
|
|
824
|
+
"$geometry" => {
|
|
825
|
+
"type" => "Polygon",
|
|
826
|
+
"coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
}
|
|
851
830
|
})
|
|
852
831
|
end
|
|
853
832
|
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
let(:selection) do
|
|
862
|
-
query.exists(users: "yes")
|
|
863
|
-
end
|
|
864
|
-
|
|
865
|
-
it "adds the $exists expression" do
|
|
866
|
-
expect(selection.selector).to eq({
|
|
867
|
-
"users" => { "$exists" => true }
|
|
868
|
-
})
|
|
869
|
-
end
|
|
870
|
-
|
|
871
|
-
it "returns a cloned query" do
|
|
872
|
-
expect(selection).to_not equal(query)
|
|
873
|
-
end
|
|
874
|
-
end
|
|
875
|
-
end
|
|
876
|
-
|
|
877
|
-
context "when providing multiple criteria" do
|
|
878
|
-
|
|
879
|
-
context "when the fields differ" do
|
|
880
|
-
|
|
881
|
-
context "when providing boolean values" do
|
|
882
|
-
|
|
883
|
-
let(:selection) do
|
|
884
|
-
query.exists(
|
|
885
|
-
users: true,
|
|
886
|
-
comments: true
|
|
887
|
-
)
|
|
888
|
-
end
|
|
889
|
-
|
|
890
|
-
it "adds the $exists expression" do
|
|
891
|
-
expect(selection.selector).to eq({
|
|
892
|
-
"users" => { "$exists" => true },
|
|
893
|
-
"comments" => { "$exists" => true }
|
|
894
|
-
})
|
|
895
|
-
end
|
|
896
|
-
|
|
897
|
-
it "returns a cloned query" do
|
|
898
|
-
expect(selection).to_not equal(query)
|
|
899
|
-
end
|
|
900
|
-
end
|
|
901
|
-
|
|
902
|
-
context "when providing string values" do
|
|
903
|
-
|
|
904
|
-
let(:selection) do
|
|
905
|
-
query.exists(
|
|
906
|
-
users: "y",
|
|
907
|
-
comments: "true"
|
|
908
|
-
)
|
|
909
|
-
end
|
|
910
|
-
|
|
911
|
-
it "adds the $exists expression" do
|
|
912
|
-
expect(selection.selector).to eq({
|
|
913
|
-
"users" => { "$exists" => true },
|
|
914
|
-
"comments" => { "$exists" => true }
|
|
915
|
-
})
|
|
916
|
-
end
|
|
917
|
-
|
|
918
|
-
it "returns a cloned query" do
|
|
919
|
-
expect(selection).to_not equal(query)
|
|
920
|
-
end
|
|
921
|
-
end
|
|
922
|
-
end
|
|
923
|
-
end
|
|
924
|
-
|
|
925
|
-
context "when chaining multiple criteria" do
|
|
926
|
-
|
|
927
|
-
context "when the fields differ" do
|
|
928
|
-
|
|
929
|
-
let(:selection) do
|
|
930
|
-
query.
|
|
931
|
-
exists(users: true).
|
|
932
|
-
exists(comments: true)
|
|
933
|
-
end
|
|
934
|
-
|
|
935
|
-
it "adds the $exists expression" do
|
|
936
|
-
expect(selection.selector).to eq({
|
|
937
|
-
"users" => { "$exists" => true },
|
|
938
|
-
"comments" => { "$exists" => true }
|
|
939
|
-
})
|
|
940
|
-
end
|
|
941
|
-
|
|
942
|
-
it "returns a cloned query" do
|
|
943
|
-
expect(selection).to_not equal(query)
|
|
944
|
-
end
|
|
945
|
-
end
|
|
946
|
-
end
|
|
947
|
-
end
|
|
948
|
-
|
|
949
|
-
describe "#geo_spacial" do
|
|
950
|
-
|
|
951
|
-
context "when provided no criterion" do
|
|
952
|
-
|
|
953
|
-
let(:selection) do
|
|
954
|
-
query.geo_spacial
|
|
955
|
-
end
|
|
956
|
-
|
|
957
|
-
it "does not add any criterion" do
|
|
958
|
-
expect(selection.selector).to be_empty
|
|
959
|
-
end
|
|
960
|
-
|
|
961
|
-
it "returns the query" do
|
|
962
|
-
expect(selection).to eq(query)
|
|
963
|
-
end
|
|
964
|
-
|
|
965
|
-
it_behaves_like "a cloning selection"
|
|
966
|
-
end
|
|
967
|
-
|
|
968
|
-
context "when provided nil" do
|
|
969
|
-
|
|
970
|
-
let(:selection) do
|
|
971
|
-
query.geo_spacial(nil)
|
|
972
|
-
end
|
|
973
|
-
|
|
974
|
-
it "does not add any criterion" do
|
|
975
|
-
expect(selection.selector).to be_empty
|
|
976
|
-
end
|
|
977
|
-
|
|
978
|
-
it "returns the query" do
|
|
979
|
-
expect(selection).to eq(query)
|
|
980
|
-
end
|
|
981
|
-
|
|
982
|
-
it_behaves_like "a cloning selection"
|
|
983
|
-
end
|
|
984
|
-
|
|
985
|
-
context "when provided a criterion" do
|
|
986
|
-
|
|
987
|
-
context "when the geometry is a point intersection" do
|
|
988
|
-
|
|
989
|
-
let(:selection) do
|
|
990
|
-
query.geo_spacial(:location.intersects_point => [ 1, 10 ])
|
|
991
|
-
end
|
|
992
|
-
|
|
993
|
-
it "adds the $geoIntersects expression" do
|
|
994
|
-
expect(selection.selector).to eq({
|
|
995
|
-
"location" => {
|
|
996
|
-
"$geoIntersects" => {
|
|
997
|
-
"$geometry" => {
|
|
998
|
-
"type" => "Point",
|
|
999
|
-
"coordinates" => [ 1, 10 ]
|
|
1000
|
-
}
|
|
1001
|
-
}
|
|
1002
|
-
}
|
|
1003
|
-
})
|
|
1004
|
-
end
|
|
1005
|
-
|
|
1006
|
-
it_behaves_like "a cloning selection"
|
|
1007
|
-
end
|
|
1008
|
-
|
|
1009
|
-
context "when the geometry is a line intersection" do
|
|
1010
|
-
|
|
1011
|
-
let(:selection) do
|
|
1012
|
-
query.geo_spacial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
|
|
1013
|
-
end
|
|
1014
|
-
|
|
1015
|
-
it "adds the $geoIntersects expression" do
|
|
1016
|
-
expect(selection.selector).to eq({
|
|
1017
|
-
"location" => {
|
|
1018
|
-
"$geoIntersects" => {
|
|
1019
|
-
"$geometry" => {
|
|
1020
|
-
"type" => "LineString",
|
|
1021
|
-
"coordinates" => [[ 1, 10 ], [ 2, 10 ]]
|
|
1022
|
-
}
|
|
1023
|
-
}
|
|
1024
|
-
}
|
|
1025
|
-
})
|
|
1026
|
-
end
|
|
1027
|
-
|
|
1028
|
-
it_behaves_like "a cloning selection"
|
|
1029
|
-
end
|
|
1030
|
-
|
|
1031
|
-
context "when the geometry is a polygon intersection" do
|
|
1032
|
-
|
|
1033
|
-
let(:selection) do
|
|
1034
|
-
query.geo_spacial(
|
|
1035
|
-
:location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
|
1036
|
-
)
|
|
1037
|
-
end
|
|
1038
|
-
|
|
1039
|
-
it "adds the $geoIntersects expression" do
|
|
1040
|
-
expect(selection.selector).to eq({
|
|
1041
|
-
"location" => {
|
|
1042
|
-
"$geoIntersects" => {
|
|
1043
|
-
"$geometry" => {
|
|
1044
|
-
"type" => "Polygon",
|
|
1045
|
-
"coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
|
1046
|
-
}
|
|
1047
|
-
}
|
|
1048
|
-
}
|
|
1049
|
-
})
|
|
1050
|
-
end
|
|
1051
|
-
|
|
1052
|
-
it_behaves_like "a cloning selection"
|
|
1053
|
-
end
|
|
1054
|
-
|
|
1055
|
-
context "when the geometry is within a polygon" do
|
|
1056
|
-
|
|
1057
|
-
let(:selection) do
|
|
1058
|
-
query.geo_spacial(
|
|
1059
|
-
:location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
|
1060
|
-
)
|
|
1061
|
-
end
|
|
1062
|
-
|
|
1063
|
-
it "adds the $geoIntersects expression" do
|
|
1064
|
-
expect(selection.selector).to eq({
|
|
1065
|
-
"location" => {
|
|
1066
|
-
"$geoWithin" => {
|
|
1067
|
-
"$geometry" => {
|
|
1068
|
-
"type" => "Polygon",
|
|
1069
|
-
"coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
|
1070
|
-
}
|
|
1071
|
-
}
|
|
1072
|
-
}
|
|
1073
|
-
})
|
|
1074
|
-
end
|
|
1075
|
-
|
|
1076
|
-
context "when used with the $box operator ($geoWithin query) " do
|
|
1077
|
-
let(:selection) do
|
|
1078
|
-
query.geo_spacial(
|
|
1079
|
-
:location.within_box => [[ 1, 10 ], [ 2, 10 ]]
|
|
1080
|
-
)
|
|
1081
|
-
end
|
|
833
|
+
context "when used with the $box operator ($geoWithin query) " do
|
|
834
|
+
let(:selection) do
|
|
835
|
+
query.geo_spacial(
|
|
836
|
+
:location.within_box => [[ 1, 10 ], [ 2, 10 ]]
|
|
837
|
+
)
|
|
838
|
+
end
|
|
1082
839
|
|
|
1083
840
|
it "adds the $geoIntersects expression" do
|
|
1084
841
|
expect(selection.selector).to eq({
|
|
@@ -1087,937 +844,33 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
1087
844
|
"$box" => [
|
|
1088
845
|
[ 1, 10 ], [ 2, 10 ]
|
|
1089
846
|
]
|
|
1090
|
-
}
|
|
1091
|
-
}
|
|
1092
|
-
})
|
|
1093
|
-
end
|
|
1094
|
-
end
|
|
1095
|
-
|
|
1096
|
-
it_behaves_like "a cloning selection"
|
|
1097
|
-
end
|
|
1098
|
-
end
|
|
1099
|
-
end
|
|
1100
|
-
|
|
1101
|
-
describe "#gt" do
|
|
1102
|
-
|
|
1103
|
-
context "when provided no criterion" do
|
|
1104
|
-
|
|
1105
|
-
let(:selection) do
|
|
1106
|
-
query.gt
|
|
1107
|
-
end
|
|
1108
|
-
|
|
1109
|
-
it "does not add any criterion" do
|
|
1110
|
-
expect(selection.selector).to eq({})
|
|
1111
|
-
end
|
|
1112
|
-
|
|
1113
|
-
it "returns the query" do
|
|
1114
|
-
expect(selection).to eq(query)
|
|
1115
|
-
end
|
|
1116
|
-
|
|
1117
|
-
it "returns a cloned query" do
|
|
1118
|
-
expect(selection).to_not equal(query)
|
|
1119
|
-
end
|
|
1120
|
-
end
|
|
1121
|
-
|
|
1122
|
-
context "when provided nil" do
|
|
1123
|
-
|
|
1124
|
-
let(:selection) do
|
|
1125
|
-
query.gt(nil)
|
|
1126
|
-
end
|
|
1127
|
-
|
|
1128
|
-
it "does not add any criterion" do
|
|
1129
|
-
expect(selection.selector).to eq({})
|
|
1130
|
-
end
|
|
1131
|
-
|
|
1132
|
-
it "returns the query" do
|
|
1133
|
-
expect(selection).to eq(query)
|
|
1134
|
-
end
|
|
1135
|
-
|
|
1136
|
-
it "returns a cloned query" do
|
|
1137
|
-
expect(selection).to_not equal(query)
|
|
1138
|
-
end
|
|
1139
|
-
end
|
|
1140
|
-
|
|
1141
|
-
context "when provided a single criterion" do
|
|
1142
|
-
|
|
1143
|
-
let(:selection) do
|
|
1144
|
-
query.gt(field: 10)
|
|
1145
|
-
end
|
|
1146
|
-
|
|
1147
|
-
it "adds the $gt selector" do
|
|
1148
|
-
expect(selection.selector).to eq({
|
|
1149
|
-
"field" => { "$gt" => 10 }
|
|
1150
|
-
})
|
|
1151
|
-
end
|
|
1152
|
-
|
|
1153
|
-
it "returns a cloned query" do
|
|
1154
|
-
expect(selection).to_not equal(query)
|
|
1155
|
-
end
|
|
1156
|
-
end
|
|
1157
|
-
|
|
1158
|
-
context "when provided multiple criterion" do
|
|
1159
|
-
|
|
1160
|
-
context "when the criterion are for different fields" do
|
|
1161
|
-
|
|
1162
|
-
let(:selection) do
|
|
1163
|
-
query.gt(first: 10, second: 15)
|
|
1164
|
-
end
|
|
1165
|
-
|
|
1166
|
-
it "adds the $gt selectors" do
|
|
1167
|
-
expect(selection.selector).to eq({
|
|
1168
|
-
"first" => { "$gt" => 10 },
|
|
1169
|
-
"second" => { "$gt" => 15 }
|
|
1170
|
-
})
|
|
1171
|
-
end
|
|
1172
|
-
|
|
1173
|
-
it "returns a cloned query" do
|
|
1174
|
-
expect(selection).to_not equal(query)
|
|
1175
|
-
end
|
|
1176
|
-
end
|
|
1177
|
-
end
|
|
1178
|
-
|
|
1179
|
-
context "when chaining the criterion" do
|
|
1180
|
-
|
|
1181
|
-
context "when the criterion are for different fields" do
|
|
1182
|
-
|
|
1183
|
-
let(:selection) do
|
|
1184
|
-
query.gt(first: 10).gt(second: 15)
|
|
1185
|
-
end
|
|
1186
|
-
|
|
1187
|
-
it "adds the $gt selectors" do
|
|
1188
|
-
expect(selection.selector).to eq({
|
|
1189
|
-
"first" => { "$gt" => 10 },
|
|
1190
|
-
"second" => { "$gt" => 15 }
|
|
1191
|
-
})
|
|
1192
|
-
end
|
|
1193
|
-
|
|
1194
|
-
it "returns a cloned query" do
|
|
1195
|
-
expect(selection).to_not equal(query)
|
|
1196
|
-
end
|
|
1197
|
-
end
|
|
1198
|
-
|
|
1199
|
-
context "when the criterion are on the same field" do
|
|
1200
|
-
|
|
1201
|
-
let(:selection) do
|
|
1202
|
-
query.gt(first: 10).gt(first: 15)
|
|
1203
|
-
end
|
|
1204
|
-
|
|
1205
|
-
it "overwrites the first $gt selector" do
|
|
1206
|
-
expect(selection.selector).to eq({
|
|
1207
|
-
"first" => { "$gt" => 15 }
|
|
1208
|
-
})
|
|
1209
|
-
end
|
|
1210
|
-
|
|
1211
|
-
it "returns a cloned query" do
|
|
1212
|
-
expect(selection).to_not equal(query)
|
|
1213
|
-
end
|
|
1214
|
-
end
|
|
1215
|
-
end
|
|
1216
|
-
end
|
|
1217
|
-
|
|
1218
|
-
describe "#gte" do
|
|
1219
|
-
|
|
1220
|
-
context "when provided no criterion" do
|
|
1221
|
-
|
|
1222
|
-
let(:selection) do
|
|
1223
|
-
query.gte
|
|
1224
|
-
end
|
|
1225
|
-
|
|
1226
|
-
it "does not add any criterion" do
|
|
1227
|
-
expect(selection.selector).to eq({})
|
|
1228
|
-
end
|
|
1229
|
-
|
|
1230
|
-
it "returns the query" do
|
|
1231
|
-
expect(selection).to eq(query)
|
|
1232
|
-
end
|
|
1233
|
-
|
|
1234
|
-
it "returns a cloned query" do
|
|
1235
|
-
expect(selection).to_not equal(query)
|
|
1236
|
-
end
|
|
1237
|
-
end
|
|
1238
|
-
|
|
1239
|
-
context "when provided nil" do
|
|
1240
|
-
|
|
1241
|
-
let(:selection) do
|
|
1242
|
-
query.gte(nil)
|
|
1243
|
-
end
|
|
1244
|
-
|
|
1245
|
-
it "does not add any criterion" do
|
|
1246
|
-
expect(selection.selector).to eq({})
|
|
1247
|
-
end
|
|
1248
|
-
|
|
1249
|
-
it "returns the query" do
|
|
1250
|
-
expect(selection).to eq(query)
|
|
1251
|
-
end
|
|
1252
|
-
|
|
1253
|
-
it "returns a cloned query" do
|
|
1254
|
-
expect(selection).to_not equal(query)
|
|
1255
|
-
end
|
|
1256
|
-
end
|
|
1257
|
-
|
|
1258
|
-
context "when provided a single criterion" do
|
|
1259
|
-
|
|
1260
|
-
let(:selection) do
|
|
1261
|
-
query.gte(field: 10)
|
|
1262
|
-
end
|
|
1263
|
-
|
|
1264
|
-
it "adds the $gte selector" do
|
|
1265
|
-
expect(selection.selector).to eq({
|
|
1266
|
-
"field" => { "$gte" => 10 }
|
|
1267
|
-
})
|
|
1268
|
-
end
|
|
1269
|
-
|
|
1270
|
-
it "returns a cloned query" do
|
|
1271
|
-
expect(selection).to_not equal(query)
|
|
1272
|
-
end
|
|
1273
|
-
end
|
|
1274
|
-
|
|
1275
|
-
context "when provided multiple criterion" do
|
|
1276
|
-
|
|
1277
|
-
context "when the criterion are for different fields" do
|
|
1278
|
-
|
|
1279
|
-
let(:selection) do
|
|
1280
|
-
query.gte(first: 10, second: 15)
|
|
1281
|
-
end
|
|
1282
|
-
|
|
1283
|
-
it "adds the $gte selectors" do
|
|
1284
|
-
expect(selection.selector).to eq({
|
|
1285
|
-
"first" => { "$gte" => 10 },
|
|
1286
|
-
"second" => { "$gte" => 15 }
|
|
1287
|
-
})
|
|
1288
|
-
end
|
|
1289
|
-
|
|
1290
|
-
it "returns a cloned query" do
|
|
1291
|
-
expect(selection).to_not equal(query)
|
|
1292
|
-
end
|
|
1293
|
-
end
|
|
1294
|
-
end
|
|
1295
|
-
|
|
1296
|
-
context "when chaining the criterion" do
|
|
1297
|
-
|
|
1298
|
-
context "when the criterion are for different fields" do
|
|
1299
|
-
|
|
1300
|
-
let(:selection) do
|
|
1301
|
-
query.gte(first: 10).gte(second: 15)
|
|
1302
|
-
end
|
|
1303
|
-
|
|
1304
|
-
it "adds the $gte selectors" do
|
|
1305
|
-
expect(selection.selector).to eq({
|
|
1306
|
-
"first" => { "$gte" => 10 },
|
|
1307
|
-
"second" => { "$gte" => 15 }
|
|
1308
|
-
})
|
|
1309
|
-
end
|
|
1310
|
-
|
|
1311
|
-
it "returns a cloned query" do
|
|
1312
|
-
expect(selection).to_not equal(query)
|
|
1313
|
-
end
|
|
1314
|
-
end
|
|
1315
|
-
|
|
1316
|
-
context "when the criterion are on the same field" do
|
|
1317
|
-
|
|
1318
|
-
let(:selection) do
|
|
1319
|
-
query.gte(first: 10).gte(first: 15)
|
|
1320
|
-
end
|
|
1321
|
-
|
|
1322
|
-
it "overwrites the first $gte selector" do
|
|
1323
|
-
expect(selection.selector).to eq({
|
|
1324
|
-
"first" => { "$gte" => 15 }
|
|
1325
|
-
})
|
|
1326
|
-
end
|
|
1327
|
-
|
|
1328
|
-
it "returns a cloned query" do
|
|
1329
|
-
expect(selection).to_not equal(query)
|
|
1330
|
-
end
|
|
1331
|
-
end
|
|
1332
|
-
end
|
|
1333
|
-
end
|
|
1334
|
-
|
|
1335
|
-
describe "#in" do
|
|
1336
|
-
|
|
1337
|
-
context "when provided no criterion" do
|
|
1338
|
-
|
|
1339
|
-
let(:selection) do
|
|
1340
|
-
query.in
|
|
1341
|
-
end
|
|
1342
|
-
|
|
1343
|
-
it "does not add any criterion" do
|
|
1344
|
-
expect(selection.selector).to eq({})
|
|
1345
|
-
end
|
|
1346
|
-
|
|
1347
|
-
it "returns the query" do
|
|
1348
|
-
expect(selection).to eq(query)
|
|
1349
|
-
end
|
|
1350
|
-
|
|
1351
|
-
it "returns a cloned query" do
|
|
1352
|
-
expect(selection).to_not equal(query)
|
|
1353
|
-
end
|
|
1354
|
-
end
|
|
1355
|
-
|
|
1356
|
-
context "when provided nil" do
|
|
1357
|
-
|
|
1358
|
-
let(:selection) do
|
|
1359
|
-
query.in(nil)
|
|
1360
|
-
end
|
|
1361
|
-
|
|
1362
|
-
it "does not add any criterion" do
|
|
1363
|
-
expect(selection.selector).to eq({})
|
|
1364
|
-
end
|
|
1365
|
-
|
|
1366
|
-
it "returns the query" do
|
|
1367
|
-
expect(selection).to eq(query)
|
|
1368
|
-
end
|
|
1369
|
-
|
|
1370
|
-
it "returns a cloned query" do
|
|
1371
|
-
expect(selection).to_not equal(query)
|
|
1372
|
-
end
|
|
1373
|
-
end
|
|
1374
|
-
|
|
1375
|
-
context "when provided a single criterion" do
|
|
1376
|
-
|
|
1377
|
-
context "when providing an array" do
|
|
1378
|
-
|
|
1379
|
-
let(:selection) do
|
|
1380
|
-
query.in(field: [ 1, 2 ])
|
|
1381
|
-
end
|
|
1382
|
-
|
|
1383
|
-
it "adds the $in selector" do
|
|
1384
|
-
expect(selection.selector).to eq({
|
|
1385
|
-
"field" => { "$in" => [ 1, 2 ] }
|
|
1386
|
-
})
|
|
1387
|
-
end
|
|
1388
|
-
|
|
1389
|
-
it "returns a cloned query" do
|
|
1390
|
-
expect(selection).to_not equal(query)
|
|
1391
|
-
end
|
|
1392
|
-
end
|
|
1393
|
-
|
|
1394
|
-
context "when providing a range" do
|
|
1395
|
-
|
|
1396
|
-
let(:selection) do
|
|
1397
|
-
query.in(field: 1..3)
|
|
1398
|
-
end
|
|
1399
|
-
|
|
1400
|
-
it "adds the $in selector with converted range" do
|
|
1401
|
-
expect(selection.selector).to eq({
|
|
1402
|
-
"field" => { "$in" => [ 1, 2, 3 ] }
|
|
1403
|
-
})
|
|
1404
|
-
end
|
|
1405
|
-
|
|
1406
|
-
it "returns a cloned query" do
|
|
1407
|
-
expect(selection).to_not equal(query)
|
|
1408
|
-
end
|
|
1409
|
-
end
|
|
1410
|
-
|
|
1411
|
-
context "when providing a single value" do
|
|
1412
|
-
|
|
1413
|
-
let(:selection) do
|
|
1414
|
-
query.in(field: 1)
|
|
1415
|
-
end
|
|
1416
|
-
|
|
1417
|
-
it "adds the $in selector with wrapped value" do
|
|
1418
|
-
expect(selection.selector).to eq({
|
|
1419
|
-
"field" => { "$in" => [ 1 ] }
|
|
1420
|
-
})
|
|
1421
|
-
end
|
|
1422
|
-
|
|
1423
|
-
it "returns a cloned query" do
|
|
1424
|
-
expect(selection).to_not equal(query)
|
|
1425
|
-
end
|
|
1426
|
-
end
|
|
1427
|
-
end
|
|
1428
|
-
|
|
1429
|
-
context "when provided multiple criterion" do
|
|
1430
|
-
|
|
1431
|
-
context "when the criterion are for different fields" do
|
|
1432
|
-
|
|
1433
|
-
let(:selection) do
|
|
1434
|
-
query.in(first: [ 1, 2 ], second: 3..4)
|
|
1435
|
-
end
|
|
1436
|
-
|
|
1437
|
-
it "adds the $in selectors" do
|
|
1438
|
-
expect(selection.selector).to eq({
|
|
1439
|
-
"first" => { "$in" => [ 1, 2 ] },
|
|
1440
|
-
"second" => { "$in" => [ 3, 4 ] }
|
|
1441
|
-
})
|
|
1442
|
-
end
|
|
1443
|
-
|
|
1444
|
-
it "returns a cloned query" do
|
|
1445
|
-
expect(selection).to_not equal(query)
|
|
1446
|
-
end
|
|
1447
|
-
end
|
|
1448
|
-
end
|
|
1449
|
-
|
|
1450
|
-
context "when chaining the criterion" do
|
|
1451
|
-
|
|
1452
|
-
context "when the criterion are for different fields" do
|
|
1453
|
-
|
|
1454
|
-
let(:selection) do
|
|
1455
|
-
query.in(first: [ 1, 2 ]).in(second: [ 3, 4 ])
|
|
1456
|
-
end
|
|
1457
|
-
|
|
1458
|
-
it "adds the $in selectors" do
|
|
1459
|
-
expect(selection.selector).to eq({
|
|
1460
|
-
"first" => { "$in" => [ 1, 2 ] },
|
|
1461
|
-
"second" => { "$in" => [ 3, 4 ] }
|
|
1462
|
-
})
|
|
1463
|
-
end
|
|
1464
|
-
|
|
1465
|
-
it "returns a cloned query" do
|
|
1466
|
-
expect(selection).to_not equal(query)
|
|
1467
|
-
end
|
|
1468
|
-
end
|
|
1469
|
-
|
|
1470
|
-
context "when the criterion are on the same field" do
|
|
1471
|
-
|
|
1472
|
-
context "when the strategy is the default (intersection)" do
|
|
1473
|
-
|
|
1474
|
-
let(:selection) do
|
|
1475
|
-
query.in(first: [ 1, 2 ].freeze).in(first: [ 2, 3 ])
|
|
1476
|
-
end
|
|
1477
|
-
|
|
1478
|
-
it "intersects the $in selectors" do
|
|
1479
|
-
expect(selection.selector).to eq({
|
|
1480
|
-
"first" => { "$in" => [ 2 ] }
|
|
1481
|
-
})
|
|
1482
|
-
end
|
|
1483
|
-
|
|
1484
|
-
it "returns a cloned query" do
|
|
1485
|
-
expect(selection).to_not equal(query)
|
|
1486
|
-
end
|
|
1487
|
-
end
|
|
1488
|
-
|
|
1489
|
-
context 'when the field is aliased' do
|
|
1490
|
-
|
|
1491
|
-
before(:all) do
|
|
1492
|
-
class TestModel
|
|
1493
|
-
include Mongoid::Document
|
|
1494
|
-
end
|
|
1495
|
-
end
|
|
1496
|
-
|
|
1497
|
-
after(:all) do
|
|
1498
|
-
Object.send(:remove_const, :TestModel)
|
|
1499
|
-
end
|
|
1500
|
-
|
|
1501
|
-
let(:bson_object_id) do
|
|
1502
|
-
BSON::ObjectId.new
|
|
1503
|
-
end
|
|
1504
|
-
|
|
1505
|
-
let(:selection) do
|
|
1506
|
-
TestModel.in(id: [bson_object_id.to_s]).in(id: [bson_object_id.to_s])
|
|
1507
|
-
end
|
|
1508
|
-
|
|
1509
|
-
it "intersects the $in selectors" do
|
|
1510
|
-
expect(selection.selector).to eq("_id" => { "$in" => [ bson_object_id ] })
|
|
1511
|
-
end
|
|
1512
|
-
|
|
1513
|
-
it "returns a cloned query" do
|
|
1514
|
-
expect(selection).to_not equal(query)
|
|
1515
|
-
end
|
|
1516
|
-
end
|
|
1517
|
-
|
|
1518
|
-
context "when the stretegy is intersect" do
|
|
1519
|
-
|
|
1520
|
-
let(:selection) do
|
|
1521
|
-
query.in(first: [ 1, 2 ]).intersect.in(first: [ 2, 3 ])
|
|
1522
|
-
end
|
|
1523
|
-
|
|
1524
|
-
it "intersects the $in selectors" do
|
|
1525
|
-
expect(selection.selector).to eq({
|
|
1526
|
-
"first" => { "$in" => [ 2 ] }
|
|
1527
|
-
})
|
|
1528
|
-
end
|
|
1529
|
-
|
|
1530
|
-
it "returns a cloned query" do
|
|
1531
|
-
expect(selection).to_not equal(query)
|
|
1532
|
-
end
|
|
1533
|
-
end
|
|
1534
|
-
|
|
1535
|
-
context "when the strategy is override" do
|
|
1536
|
-
|
|
1537
|
-
let(:selection) do
|
|
1538
|
-
query.in(first: [ 1, 2 ]).override.in(first: [ 3, 4 ])
|
|
1539
|
-
end
|
|
1540
|
-
|
|
1541
|
-
it "overwrites the first $in selector" do
|
|
1542
|
-
expect(selection.selector).to eq({
|
|
1543
|
-
"first" => { "$in" => [ 3, 4 ] }
|
|
1544
|
-
})
|
|
1545
|
-
end
|
|
1546
|
-
|
|
1547
|
-
it "returns a cloned query" do
|
|
1548
|
-
expect(selection).to_not equal(query)
|
|
1549
|
-
end
|
|
1550
|
-
end
|
|
1551
|
-
|
|
1552
|
-
context "when the strategy is union" do
|
|
1553
|
-
|
|
1554
|
-
let(:selection) do
|
|
1555
|
-
query.in(first: [ 1, 2 ]).union.in(first: [ 3, 4 ])
|
|
1556
|
-
end
|
|
1557
|
-
|
|
1558
|
-
it "unions the $in selectors" do
|
|
1559
|
-
expect(selection.selector).to eq({
|
|
1560
|
-
"first" => { "$in" => [ 1, 2, 3, 4 ] }
|
|
1561
|
-
})
|
|
1562
|
-
end
|
|
1563
|
-
|
|
1564
|
-
it "returns a cloned query" do
|
|
1565
|
-
expect(selection).to_not equal(query)
|
|
1566
|
-
end
|
|
1567
|
-
end
|
|
1568
|
-
end
|
|
1569
|
-
end
|
|
1570
|
-
end
|
|
1571
|
-
|
|
1572
|
-
describe "#lt" do
|
|
1573
|
-
|
|
1574
|
-
context "when provided no criterion" do
|
|
1575
|
-
|
|
1576
|
-
let(:selection) do
|
|
1577
|
-
query.lt
|
|
1578
|
-
end
|
|
1579
|
-
|
|
1580
|
-
it "does not add any criterion" do
|
|
1581
|
-
expect(selection.selector).to eq({})
|
|
1582
|
-
end
|
|
1583
|
-
|
|
1584
|
-
it "returns the query" do
|
|
1585
|
-
expect(selection).to eq(query)
|
|
1586
|
-
end
|
|
1587
|
-
|
|
1588
|
-
it "returns a cloned query" do
|
|
1589
|
-
expect(selection).to_not equal(query)
|
|
1590
|
-
end
|
|
1591
|
-
end
|
|
1592
|
-
|
|
1593
|
-
context "when provided nil" do
|
|
1594
|
-
|
|
1595
|
-
let(:selection) do
|
|
1596
|
-
query.lt(nil)
|
|
1597
|
-
end
|
|
1598
|
-
|
|
1599
|
-
it "does not add any criterion" do
|
|
1600
|
-
expect(selection.selector).to eq({})
|
|
1601
|
-
end
|
|
1602
|
-
|
|
1603
|
-
it "returns the query" do
|
|
1604
|
-
expect(selection).to eq(query)
|
|
1605
|
-
end
|
|
1606
|
-
|
|
1607
|
-
it "returns a cloned query" do
|
|
1608
|
-
expect(selection).to_not equal(query)
|
|
1609
|
-
end
|
|
1610
|
-
end
|
|
1611
|
-
|
|
1612
|
-
context "when provided a single criterion" do
|
|
1613
|
-
|
|
1614
|
-
let(:selection) do
|
|
1615
|
-
query.lt(field: 10)
|
|
1616
|
-
end
|
|
1617
|
-
|
|
1618
|
-
it "adds the $lt selector" do
|
|
1619
|
-
expect(selection.selector).to eq({
|
|
1620
|
-
"field" => { "$lt" => 10 }
|
|
1621
|
-
})
|
|
1622
|
-
end
|
|
1623
|
-
|
|
1624
|
-
it "returns a cloned query" do
|
|
1625
|
-
expect(selection).to_not equal(query)
|
|
1626
|
-
end
|
|
1627
|
-
end
|
|
1628
|
-
|
|
1629
|
-
context "when provided multiple criterion" do
|
|
1630
|
-
|
|
1631
|
-
context "when the criterion are for different fields" do
|
|
1632
|
-
|
|
1633
|
-
let(:selection) do
|
|
1634
|
-
query.lt(first: 10, second: 15)
|
|
1635
|
-
end
|
|
1636
|
-
|
|
1637
|
-
it "adds the $lt selectors" do
|
|
1638
|
-
expect(selection.selector).to eq({
|
|
1639
|
-
"first" => { "$lt" => 10 },
|
|
1640
|
-
"second" => { "$lt" => 15 }
|
|
1641
|
-
})
|
|
1642
|
-
end
|
|
1643
|
-
|
|
1644
|
-
it "returns a cloned query" do
|
|
1645
|
-
expect(selection).to_not equal(query)
|
|
1646
|
-
end
|
|
1647
|
-
end
|
|
1648
|
-
end
|
|
1649
|
-
|
|
1650
|
-
context "when chaining the criterion" do
|
|
1651
|
-
|
|
1652
|
-
context "when the criterion are for different fields" do
|
|
1653
|
-
|
|
1654
|
-
let(:selection) do
|
|
1655
|
-
query.lt(first: 10).lt(second: 15)
|
|
1656
|
-
end
|
|
1657
|
-
|
|
1658
|
-
it "adds the $lt selectors" do
|
|
1659
|
-
expect(selection.selector).to eq({
|
|
1660
|
-
"first" => { "$lt" => 10 },
|
|
1661
|
-
"second" => { "$lt" => 15 }
|
|
1662
|
-
})
|
|
1663
|
-
end
|
|
1664
|
-
|
|
1665
|
-
it "returns a cloned query" do
|
|
1666
|
-
expect(selection).to_not equal(query)
|
|
1667
|
-
end
|
|
1668
|
-
end
|
|
1669
|
-
|
|
1670
|
-
context "when the criterion are on the same field" do
|
|
1671
|
-
|
|
1672
|
-
let(:selection) do
|
|
1673
|
-
query.lt(first: 10).lt(first: 15)
|
|
1674
|
-
end
|
|
1675
|
-
|
|
1676
|
-
it "overwrites the first $lt selector" do
|
|
1677
|
-
expect(selection.selector).to eq({
|
|
1678
|
-
"first" => { "$lt" => 15 }
|
|
1679
|
-
})
|
|
1680
|
-
end
|
|
1681
|
-
|
|
1682
|
-
it "returns a cloned query" do
|
|
1683
|
-
expect(selection).to_not equal(query)
|
|
1684
|
-
end
|
|
1685
|
-
end
|
|
1686
|
-
end
|
|
1687
|
-
end
|
|
1688
|
-
|
|
1689
|
-
describe "#lte" do
|
|
1690
|
-
|
|
1691
|
-
context "when provided no criterion" do
|
|
1692
|
-
|
|
1693
|
-
let(:selection) do
|
|
1694
|
-
query.lte
|
|
1695
|
-
end
|
|
1696
|
-
|
|
1697
|
-
it "does not add any criterion" do
|
|
1698
|
-
expect(selection.selector).to eq({})
|
|
1699
|
-
end
|
|
1700
|
-
|
|
1701
|
-
it "returns the query" do
|
|
1702
|
-
expect(selection).to eq(query)
|
|
1703
|
-
end
|
|
1704
|
-
|
|
1705
|
-
it "returns a cloned query" do
|
|
1706
|
-
expect(selection).to_not equal(query)
|
|
1707
|
-
end
|
|
1708
|
-
end
|
|
1709
|
-
|
|
1710
|
-
context "when provided nil" do
|
|
1711
|
-
|
|
1712
|
-
let(:selection) do
|
|
1713
|
-
query.lte(nil)
|
|
1714
|
-
end
|
|
1715
|
-
|
|
1716
|
-
it "does not add any criterion" do
|
|
1717
|
-
expect(selection.selector).to eq({})
|
|
1718
|
-
end
|
|
1719
|
-
|
|
1720
|
-
it "returns the query" do
|
|
1721
|
-
expect(selection).to eq(query)
|
|
1722
|
-
end
|
|
1723
|
-
|
|
1724
|
-
it "returns a cloned query" do
|
|
1725
|
-
expect(selection).to_not equal(query)
|
|
1726
|
-
end
|
|
1727
|
-
end
|
|
1728
|
-
|
|
1729
|
-
context "when provided a single criterion" do
|
|
1730
|
-
|
|
1731
|
-
let(:selection) do
|
|
1732
|
-
query.lte(field: 10)
|
|
1733
|
-
end
|
|
1734
|
-
|
|
1735
|
-
it "adds the $lte selector" do
|
|
1736
|
-
expect(selection.selector).to eq({
|
|
1737
|
-
"field" => { "$lte" => 10 }
|
|
1738
|
-
})
|
|
1739
|
-
end
|
|
1740
|
-
|
|
1741
|
-
it "returns a cloned query" do
|
|
1742
|
-
expect(selection).to_not equal(query)
|
|
1743
|
-
end
|
|
1744
|
-
end
|
|
1745
|
-
|
|
1746
|
-
context "when provided multiple criterion" do
|
|
1747
|
-
|
|
1748
|
-
context "when the criterion are for different fields" do
|
|
1749
|
-
|
|
1750
|
-
let(:selection) do
|
|
1751
|
-
query.lte(first: 10, second: 15)
|
|
1752
|
-
end
|
|
1753
|
-
|
|
1754
|
-
it "adds the $lte selectors" do
|
|
1755
|
-
expect(selection.selector).to eq({
|
|
1756
|
-
"first" => { "$lte" => 10 },
|
|
1757
|
-
"second" => { "$lte" => 15 }
|
|
1758
|
-
})
|
|
1759
|
-
end
|
|
1760
|
-
|
|
1761
|
-
it "returns a cloned query" do
|
|
1762
|
-
expect(selection).to_not equal(query)
|
|
1763
|
-
end
|
|
1764
|
-
end
|
|
1765
|
-
end
|
|
1766
|
-
|
|
1767
|
-
context "when chaining the criterion" do
|
|
1768
|
-
|
|
1769
|
-
context "when the criterion are for different fields" do
|
|
1770
|
-
|
|
1771
|
-
let(:selection) do
|
|
1772
|
-
query.lte(first: 10).lte(second: 15)
|
|
1773
|
-
end
|
|
1774
|
-
|
|
1775
|
-
it "adds the $lte selectors" do
|
|
1776
|
-
expect(selection.selector).to eq({
|
|
1777
|
-
"first" => { "$lte" => 10 },
|
|
1778
|
-
"second" => { "$lte" => 15 }
|
|
1779
|
-
})
|
|
1780
|
-
end
|
|
1781
|
-
|
|
1782
|
-
it "returns a cloned query" do
|
|
1783
|
-
expect(selection).to_not equal(query)
|
|
1784
|
-
end
|
|
1785
|
-
end
|
|
1786
|
-
|
|
1787
|
-
context "when the criterion are on the same field" do
|
|
1788
|
-
|
|
1789
|
-
let(:selection) do
|
|
1790
|
-
query.lte(first: 10).lte(first: 15)
|
|
1791
|
-
end
|
|
1792
|
-
|
|
1793
|
-
it "overwrites the first $lte selector" do
|
|
1794
|
-
expect(selection.selector).to eq({
|
|
1795
|
-
"first" => { "$lte" => 15 }
|
|
1796
|
-
})
|
|
1797
|
-
end
|
|
1798
|
-
|
|
1799
|
-
it "returns a cloned query" do
|
|
1800
|
-
expect(selection).to_not equal(query)
|
|
1801
|
-
end
|
|
1802
|
-
end
|
|
1803
|
-
end
|
|
1804
|
-
end
|
|
1805
|
-
|
|
1806
|
-
describe "#max_distance" do
|
|
1807
|
-
|
|
1808
|
-
context "when provided no criterion" do
|
|
1809
|
-
|
|
1810
|
-
let(:selection) do
|
|
1811
|
-
query.max_distance
|
|
1812
|
-
end
|
|
1813
|
-
|
|
1814
|
-
it "does not add any criterion" do
|
|
1815
|
-
expect(selection.selector).to eq({})
|
|
1816
|
-
end
|
|
1817
|
-
|
|
1818
|
-
it "returns the query" do
|
|
1819
|
-
expect(selection).to eq(query)
|
|
1820
|
-
end
|
|
1821
|
-
|
|
1822
|
-
it "returns a cloned query" do
|
|
1823
|
-
expect(selection).to_not equal(query)
|
|
1824
|
-
end
|
|
1825
|
-
end
|
|
1826
|
-
|
|
1827
|
-
context "when provided nil" do
|
|
1828
|
-
|
|
1829
|
-
let(:selection) do
|
|
1830
|
-
query.max_distance(nil)
|
|
1831
|
-
end
|
|
1832
|
-
|
|
1833
|
-
it "does not add any criterion" do
|
|
1834
|
-
expect(selection.selector).to eq({})
|
|
1835
|
-
end
|
|
1836
|
-
|
|
1837
|
-
it "returns the query" do
|
|
1838
|
-
expect(selection).to eq(query)
|
|
1839
|
-
end
|
|
1840
|
-
|
|
1841
|
-
it "returns a cloned query" do
|
|
1842
|
-
expect(selection).to_not equal(query)
|
|
1843
|
-
end
|
|
1844
|
-
end
|
|
1845
|
-
|
|
1846
|
-
context "when provided a criterion" do
|
|
1847
|
-
|
|
1848
|
-
context "when a $near criterion exists on the same field" do
|
|
1849
|
-
|
|
1850
|
-
let(:selection) do
|
|
1851
|
-
query.near(location: [ 1, 1 ]).max_distance(location: 50)
|
|
1852
|
-
end
|
|
1853
|
-
|
|
1854
|
-
it "adds the $maxDistance expression" do
|
|
1855
|
-
expect(selection.selector).to eq({
|
|
1856
|
-
"location" => { "$near" => [ 1, 1 ], "$maxDistance" => 50 }
|
|
1857
|
-
})
|
|
1858
|
-
end
|
|
1859
|
-
|
|
1860
|
-
it "returns a cloned query" do
|
|
1861
|
-
expect(selection).to_not equal(query)
|
|
1862
|
-
end
|
|
1863
|
-
end
|
|
1864
|
-
end
|
|
1865
|
-
end
|
|
1866
|
-
|
|
1867
|
-
describe "#mod" do
|
|
1868
|
-
|
|
1869
|
-
context "when provided no criterion" do
|
|
1870
|
-
|
|
1871
|
-
let(:selection) do
|
|
1872
|
-
query.mod
|
|
1873
|
-
end
|
|
1874
|
-
|
|
1875
|
-
it "does not add any criterion" do
|
|
1876
|
-
expect(selection.selector).to eq({})
|
|
1877
|
-
end
|
|
1878
|
-
|
|
1879
|
-
it "returns the query" do
|
|
1880
|
-
expect(selection).to eq(query)
|
|
1881
|
-
end
|
|
1882
|
-
|
|
1883
|
-
it "returns a cloned query" do
|
|
1884
|
-
expect(selection).to_not equal(query)
|
|
1885
|
-
end
|
|
1886
|
-
end
|
|
1887
|
-
|
|
1888
|
-
context "when provided nil" do
|
|
1889
|
-
|
|
1890
|
-
let(:selection) do
|
|
1891
|
-
query.mod(nil)
|
|
1892
|
-
end
|
|
1893
|
-
|
|
1894
|
-
it "does not add any criterion" do
|
|
1895
|
-
expect(selection.selector).to eq({})
|
|
1896
|
-
end
|
|
1897
|
-
|
|
1898
|
-
it "returns the query" do
|
|
1899
|
-
expect(selection).to eq(query)
|
|
1900
|
-
end
|
|
1901
|
-
|
|
1902
|
-
it "returns a cloned query" do
|
|
1903
|
-
expect(selection).to_not equal(query)
|
|
1904
|
-
end
|
|
1905
|
-
end
|
|
1906
|
-
|
|
1907
|
-
context "when provided a criterion" do
|
|
1908
|
-
|
|
1909
|
-
let(:selection) do
|
|
1910
|
-
query.mod(value: [ 10, 1 ])
|
|
1911
|
-
end
|
|
1912
|
-
|
|
1913
|
-
it "adds the $mod expression" do
|
|
1914
|
-
expect(selection.selector).to eq({
|
|
1915
|
-
"value" => { "$mod" => [ 10, 1 ] }
|
|
1916
|
-
})
|
|
1917
|
-
end
|
|
1918
|
-
|
|
1919
|
-
it "returns a cloned query" do
|
|
1920
|
-
expect(selection).to_not equal(query)
|
|
1921
|
-
end
|
|
1922
|
-
end
|
|
1923
|
-
|
|
1924
|
-
context "when providing multiple criteria" do
|
|
1925
|
-
|
|
1926
|
-
context "when the fields differ" do
|
|
1927
|
-
|
|
1928
|
-
let(:selection) do
|
|
1929
|
-
query.mod(
|
|
1930
|
-
value: [ 10, 1 ],
|
|
1931
|
-
comments: [ 10, 1 ]
|
|
1932
|
-
)
|
|
1933
|
-
end
|
|
1934
|
-
|
|
1935
|
-
it "adds the $mod expression" do
|
|
1936
|
-
expect(selection.selector).to eq({
|
|
1937
|
-
"value" => { "$mod" => [ 10, 1 ] },
|
|
1938
|
-
"comments" => { "$mod" => [ 10, 1 ] }
|
|
1939
|
-
})
|
|
1940
|
-
end
|
|
1941
|
-
|
|
1942
|
-
it "returns a cloned query" do
|
|
1943
|
-
expect(selection).to_not equal(query)
|
|
1944
|
-
end
|
|
1945
|
-
end
|
|
1946
|
-
end
|
|
1947
|
-
|
|
1948
|
-
context "when chaining multiple criteria" do
|
|
1949
|
-
|
|
1950
|
-
context "when the fields differ" do
|
|
1951
|
-
|
|
1952
|
-
let(:selection) do
|
|
1953
|
-
query.
|
|
1954
|
-
mod(value: [ 10, 1 ]).
|
|
1955
|
-
mod(result: [ 10, 1 ])
|
|
1956
|
-
end
|
|
1957
|
-
|
|
1958
|
-
it "adds the $mod expression" do
|
|
1959
|
-
expect(selection.selector).to eq({
|
|
1960
|
-
"value" => { "$mod" => [ 10, 1 ] },
|
|
1961
|
-
"result" => { "$mod" => [ 10, 1 ] }
|
|
1962
|
-
})
|
|
1963
|
-
end
|
|
1964
|
-
|
|
1965
|
-
it "returns a cloned query" do
|
|
1966
|
-
expect(selection).to_not equal(query)
|
|
1967
|
-
end
|
|
1968
|
-
end
|
|
1969
|
-
end
|
|
1970
|
-
end
|
|
1971
|
-
|
|
1972
|
-
describe "#ne" do
|
|
1973
|
-
|
|
1974
|
-
context "when provided no criterion" do
|
|
1975
|
-
|
|
1976
|
-
let(:selection) do
|
|
1977
|
-
query.ne
|
|
1978
|
-
end
|
|
1979
|
-
|
|
1980
|
-
it "does not add any criterion" do
|
|
1981
|
-
expect(selection.selector).to eq({})
|
|
1982
|
-
end
|
|
1983
|
-
|
|
1984
|
-
it "returns the query" do
|
|
1985
|
-
expect(selection).to eq(query)
|
|
1986
|
-
end
|
|
1987
|
-
|
|
1988
|
-
it "returns a cloned query" do
|
|
1989
|
-
expect(selection).to_not equal(query)
|
|
1990
|
-
end
|
|
1991
|
-
end
|
|
1992
|
-
|
|
1993
|
-
context "when provided nil" do
|
|
1994
|
-
|
|
1995
|
-
let(:selection) do
|
|
1996
|
-
query.ne(nil)
|
|
1997
|
-
end
|
|
1998
|
-
|
|
1999
|
-
it "does not add any criterion" do
|
|
2000
|
-
expect(selection.selector).to eq({})
|
|
2001
|
-
end
|
|
2002
|
-
|
|
2003
|
-
it "returns the query" do
|
|
2004
|
-
expect(selection).to eq(query)
|
|
2005
|
-
end
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
})
|
|
850
|
+
end
|
|
851
|
+
end
|
|
2006
852
|
|
|
2007
|
-
|
|
2008
|
-
expect(selection).to_not equal(query)
|
|
853
|
+
it_behaves_like "returns a cloned query"
|
|
2009
854
|
end
|
|
2010
855
|
end
|
|
856
|
+
end
|
|
2011
857
|
|
|
2012
|
-
|
|
858
|
+
describe "#gt" do
|
|
859
|
+
|
|
860
|
+
let(:query_method) { :gt }
|
|
861
|
+
|
|
862
|
+
it_behaves_like 'requires an argument'
|
|
863
|
+
it_behaves_like 'requires a non-nil argument'
|
|
864
|
+
|
|
865
|
+
context "when provided a single criterion" do
|
|
2013
866
|
|
|
2014
867
|
let(:selection) do
|
|
2015
|
-
query.
|
|
868
|
+
query.gt(field: 10)
|
|
2016
869
|
end
|
|
2017
870
|
|
|
2018
|
-
it "adds the $
|
|
871
|
+
it "adds the $gt selector" do
|
|
2019
872
|
expect(selection.selector).to eq({
|
|
2020
|
-
"
|
|
873
|
+
"field" => { "$gt" => 10 }
|
|
2021
874
|
})
|
|
2022
875
|
end
|
|
2023
876
|
|
|
@@ -2026,21 +879,18 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2026
879
|
end
|
|
2027
880
|
end
|
|
2028
881
|
|
|
2029
|
-
context "when
|
|
882
|
+
context "when provided multiple criterion" do
|
|
2030
883
|
|
|
2031
|
-
context "when the fields
|
|
884
|
+
context "when the criterion are for different fields" do
|
|
2032
885
|
|
|
2033
886
|
let(:selection) do
|
|
2034
|
-
query.
|
|
2035
|
-
value: 10,
|
|
2036
|
-
comments: 10
|
|
2037
|
-
)
|
|
887
|
+
query.gt(first: 10, second: 15)
|
|
2038
888
|
end
|
|
2039
889
|
|
|
2040
|
-
it "adds the $
|
|
890
|
+
it "adds the $gt selectors" do
|
|
2041
891
|
expect(selection.selector).to eq({
|
|
2042
|
-
"
|
|
2043
|
-
"
|
|
892
|
+
"first" => { "$gt" => 10 },
|
|
893
|
+
"second" => { "$gt" => 15 }
|
|
2044
894
|
})
|
|
2045
895
|
end
|
|
2046
896
|
|
|
@@ -2050,20 +900,18 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2050
900
|
end
|
|
2051
901
|
end
|
|
2052
902
|
|
|
2053
|
-
context "when chaining
|
|
903
|
+
context "when chaining the criterion" do
|
|
2054
904
|
|
|
2055
|
-
context "when the fields
|
|
905
|
+
context "when the criterion are for different fields" do
|
|
2056
906
|
|
|
2057
907
|
let(:selection) do
|
|
2058
|
-
query.
|
|
2059
|
-
ne(value: 10).
|
|
2060
|
-
ne(result: 10)
|
|
908
|
+
query.gt(first: 10).gt(second: 15)
|
|
2061
909
|
end
|
|
2062
910
|
|
|
2063
|
-
it "adds the $
|
|
911
|
+
it "adds the $gt selectors" do
|
|
2064
912
|
expect(selection.selector).to eq({
|
|
2065
|
-
"
|
|
2066
|
-
"
|
|
913
|
+
"first" => { "$gt" => 10 },
|
|
914
|
+
"second" => { "$gt" => 15 }
|
|
2067
915
|
})
|
|
2068
916
|
end
|
|
2069
917
|
|
|
@@ -2071,58 +919,42 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2071
919
|
expect(selection).to_not equal(query)
|
|
2072
920
|
end
|
|
2073
921
|
end
|
|
2074
|
-
end
|
|
2075
|
-
end
|
|
2076
|
-
|
|
2077
|
-
describe "#near" do
|
|
2078
|
-
|
|
2079
|
-
context "when provided no criterion" do
|
|
2080
922
|
|
|
2081
|
-
|
|
2082
|
-
query.near
|
|
2083
|
-
end
|
|
923
|
+
context "when the criterion are on the same field" do
|
|
2084
924
|
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
925
|
+
let(:selection) do
|
|
926
|
+
query.gt(first: 10).gt(first: 15)
|
|
927
|
+
end
|
|
2088
928
|
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
929
|
+
it "overwrites the first $gt selector" do
|
|
930
|
+
expect(selection.selector).to eq({
|
|
931
|
+
"first" => { "$gt" => 15 }
|
|
932
|
+
})
|
|
933
|
+
end
|
|
2092
934
|
|
|
2093
|
-
|
|
2094
|
-
|
|
935
|
+
it "returns a cloned query" do
|
|
936
|
+
expect(selection).to_not equal(query)
|
|
937
|
+
end
|
|
2095
938
|
end
|
|
2096
939
|
end
|
|
940
|
+
end
|
|
2097
941
|
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
let(:selection) do
|
|
2101
|
-
query.near(nil)
|
|
2102
|
-
end
|
|
2103
|
-
|
|
2104
|
-
it "does not add any criterion" do
|
|
2105
|
-
expect(selection.selector).to eq({})
|
|
2106
|
-
end
|
|
942
|
+
describe "#gte" do
|
|
2107
943
|
|
|
2108
|
-
|
|
2109
|
-
expect(selection).to eq(query)
|
|
2110
|
-
end
|
|
944
|
+
let(:query_method) { :gte }
|
|
2111
945
|
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
end
|
|
2115
|
-
end
|
|
946
|
+
it_behaves_like 'requires an argument'
|
|
947
|
+
it_behaves_like 'requires a non-nil argument'
|
|
2116
948
|
|
|
2117
|
-
context "when provided a criterion" do
|
|
949
|
+
context "when provided a single criterion" do
|
|
2118
950
|
|
|
2119
951
|
let(:selection) do
|
|
2120
|
-
query.
|
|
952
|
+
query.gte(field: 10)
|
|
2121
953
|
end
|
|
2122
954
|
|
|
2123
|
-
it "adds the $
|
|
955
|
+
it "adds the $gte selector" do
|
|
2124
956
|
expect(selection.selector).to eq({
|
|
2125
|
-
"
|
|
957
|
+
"field" => { "$gte" => 10 }
|
|
2126
958
|
})
|
|
2127
959
|
end
|
|
2128
960
|
|
|
@@ -2131,21 +963,18 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2131
963
|
end
|
|
2132
964
|
end
|
|
2133
965
|
|
|
2134
|
-
context "when
|
|
966
|
+
context "when provided multiple criterion" do
|
|
2135
967
|
|
|
2136
|
-
context "when the fields
|
|
968
|
+
context "when the criterion are for different fields" do
|
|
2137
969
|
|
|
2138
970
|
let(:selection) do
|
|
2139
|
-
query.
|
|
2140
|
-
location: [ 20, 21 ],
|
|
2141
|
-
comments: [ 20, 21 ]
|
|
2142
|
-
)
|
|
971
|
+
query.gte(first: 10, second: 15)
|
|
2143
972
|
end
|
|
2144
973
|
|
|
2145
|
-
it "adds the $
|
|
974
|
+
it "adds the $gte selectors" do
|
|
2146
975
|
expect(selection.selector).to eq({
|
|
2147
|
-
"
|
|
2148
|
-
"
|
|
976
|
+
"first" => { "$gte" => 10 },
|
|
977
|
+
"second" => { "$gte" => 15 }
|
|
2149
978
|
})
|
|
2150
979
|
end
|
|
2151
980
|
|
|
@@ -2155,20 +984,18 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2155
984
|
end
|
|
2156
985
|
end
|
|
2157
986
|
|
|
2158
|
-
context "when chaining
|
|
987
|
+
context "when chaining the criterion" do
|
|
2159
988
|
|
|
2160
|
-
context "when the fields
|
|
989
|
+
context "when the criterion are for different fields" do
|
|
2161
990
|
|
|
2162
991
|
let(:selection) do
|
|
2163
|
-
query.
|
|
2164
|
-
near(location: [ 20, 21 ]).
|
|
2165
|
-
near(comments: [ 20, 21 ])
|
|
992
|
+
query.gte(first: 10).gte(second: 15)
|
|
2166
993
|
end
|
|
2167
994
|
|
|
2168
|
-
it "adds the $
|
|
995
|
+
it "adds the $gte selectors" do
|
|
2169
996
|
expect(selection.selector).to eq({
|
|
2170
|
-
"
|
|
2171
|
-
"
|
|
997
|
+
"first" => { "$gte" => 10 },
|
|
998
|
+
"second" => { "$gte" => 15 }
|
|
2172
999
|
})
|
|
2173
1000
|
end
|
|
2174
1001
|
|
|
@@ -2176,81 +1003,62 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2176
1003
|
expect(selection).to_not equal(query)
|
|
2177
1004
|
end
|
|
2178
1005
|
end
|
|
2179
|
-
end
|
|
2180
|
-
end
|
|
2181
|
-
|
|
2182
|
-
describe "#near_sphere" do
|
|
2183
|
-
|
|
2184
|
-
context "when provided no criterion" do
|
|
2185
1006
|
|
|
2186
|
-
|
|
2187
|
-
query.near_sphere
|
|
2188
|
-
end
|
|
1007
|
+
context "when the criterion are on the same field" do
|
|
2189
1008
|
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
1009
|
+
let(:selection) do
|
|
1010
|
+
query.gte(first: 10).gte(first: 15)
|
|
1011
|
+
end
|
|
2193
1012
|
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
1013
|
+
it "overwrites the first $gte selector" do
|
|
1014
|
+
expect(selection.selector).to eq({
|
|
1015
|
+
"first" => { "$gte" => 15 }
|
|
1016
|
+
})
|
|
1017
|
+
end
|
|
2197
1018
|
|
|
2198
|
-
|
|
2199
|
-
|
|
1019
|
+
it "returns a cloned query" do
|
|
1020
|
+
expect(selection).to_not equal(query)
|
|
1021
|
+
end
|
|
2200
1022
|
end
|
|
2201
1023
|
end
|
|
1024
|
+
end
|
|
2202
1025
|
|
|
2203
|
-
|
|
2204
|
-
|
|
2205
|
-
let(:selection) do
|
|
2206
|
-
query.near_sphere(nil)
|
|
2207
|
-
end
|
|
1026
|
+
describe "#in" do
|
|
2208
1027
|
|
|
2209
|
-
|
|
2210
|
-
|
|
2211
|
-
end
|
|
1028
|
+
let(:query_method) { :in }
|
|
1029
|
+
let(:operator) { '$in' }
|
|
2212
1030
|
|
|
2213
|
-
|
|
2214
|
-
|
|
2215
|
-
end
|
|
1031
|
+
it_behaves_like 'requires an argument'
|
|
1032
|
+
it_behaves_like 'requires a non-nil argument'
|
|
2216
1033
|
|
|
2217
|
-
|
|
2218
|
-
expect(selection).to_not equal(query)
|
|
2219
|
-
end
|
|
2220
|
-
end
|
|
1034
|
+
context "when provided a single criterion" do
|
|
2221
1035
|
|
|
2222
|
-
|
|
1036
|
+
context "when providing an array" do
|
|
2223
1037
|
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
1038
|
+
let(:selection) do
|
|
1039
|
+
query.in(field: [ 1, 2 ])
|
|
1040
|
+
end
|
|
2227
1041
|
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
|
|
1042
|
+
it "adds the $in selector" do
|
|
1043
|
+
expect(selection.selector).to eq({
|
|
1044
|
+
"field" => { "$in" => [ 1, 2 ] }
|
|
1045
|
+
})
|
|
1046
|
+
end
|
|
2233
1047
|
|
|
2234
|
-
|
|
2235
|
-
|
|
1048
|
+
it "returns a cloned query" do
|
|
1049
|
+
expect(selection).to_not equal(query)
|
|
1050
|
+
end
|
|
2236
1051
|
end
|
|
2237
|
-
end
|
|
2238
1052
|
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
context "when the fields differ" do
|
|
1053
|
+
context "when providing a single value" do
|
|
2242
1054
|
|
|
2243
1055
|
let(:selection) do
|
|
2244
|
-
query.
|
|
2245
|
-
location: [ 20, 21 ],
|
|
2246
|
-
comments: [ 20, 21 ]
|
|
2247
|
-
)
|
|
1056
|
+
query.in(field: 1)
|
|
2248
1057
|
end
|
|
2249
1058
|
|
|
2250
|
-
it "adds the $
|
|
1059
|
+
it "adds the $in selector with wrapped value" do
|
|
2251
1060
|
expect(selection.selector).to eq({
|
|
2252
|
-
"
|
|
2253
|
-
"comments" => { "$nearSphere" => [ 20, 21 ] }
|
|
1061
|
+
"field" => { "$in" => [ 1 ] }
|
|
2254
1062
|
})
|
|
2255
1063
|
end
|
|
2256
1064
|
|
|
@@ -2260,20 +1068,18 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2260
1068
|
end
|
|
2261
1069
|
end
|
|
2262
1070
|
|
|
2263
|
-
context "when
|
|
1071
|
+
context "when provided multiple criterion" do
|
|
2264
1072
|
|
|
2265
|
-
context "when the fields
|
|
1073
|
+
context "when the criterion are for different fields" do
|
|
2266
1074
|
|
|
2267
1075
|
let(:selection) do
|
|
2268
|
-
query.
|
|
2269
|
-
near_sphere(location: [ 20, 21 ]).
|
|
2270
|
-
near_sphere(comments: [ 20, 21 ])
|
|
1076
|
+
query.in(first: [ 1, 2 ], second: 3..4)
|
|
2271
1077
|
end
|
|
2272
1078
|
|
|
2273
|
-
it "adds the $
|
|
1079
|
+
it "adds the $in selectors" do
|
|
2274
1080
|
expect(selection.selector).to eq({
|
|
2275
|
-
"
|
|
2276
|
-
"
|
|
1081
|
+
"first" => { "$in" => [ 1, 2 ] },
|
|
1082
|
+
"second" => { "$in" => [ 3, 4 ] }
|
|
2277
1083
|
})
|
|
2278
1084
|
end
|
|
2279
1085
|
|
|
@@ -2282,41 +1088,51 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2282
1088
|
end
|
|
2283
1089
|
end
|
|
2284
1090
|
end
|
|
2285
|
-
end
|
|
2286
1091
|
|
|
2287
|
-
|
|
1092
|
+
context "when chaining the criterion" do
|
|
2288
1093
|
|
|
2289
|
-
|
|
1094
|
+
context "when the criterion are for different fields" do
|
|
2290
1095
|
|
|
2291
|
-
|
|
2292
|
-
|
|
2293
|
-
|
|
1096
|
+
let(:selection) do
|
|
1097
|
+
query.in(first: [ 1, 2 ]).in(second: [ 3, 4 ])
|
|
1098
|
+
end
|
|
2294
1099
|
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
1100
|
+
it "adds the $in selectors" do
|
|
1101
|
+
expect(selection.selector).to eq({
|
|
1102
|
+
"first" => { "$in" => [ 1, 2 ] },
|
|
1103
|
+
"second" => { "$in" => [ 3, 4 ] }
|
|
1104
|
+
})
|
|
1105
|
+
end
|
|
2298
1106
|
|
|
2299
|
-
|
|
2300
|
-
|
|
1107
|
+
it "returns a cloned query" do
|
|
1108
|
+
expect(selection).to_not equal(query)
|
|
1109
|
+
end
|
|
2301
1110
|
end
|
|
2302
1111
|
|
|
2303
|
-
|
|
2304
|
-
|
|
1112
|
+
context "when the criterion are on the same field" do
|
|
1113
|
+
|
|
1114
|
+
it_behaves_like 'supports merge strategies'
|
|
2305
1115
|
end
|
|
2306
1116
|
end
|
|
1117
|
+
end
|
|
2307
1118
|
|
|
2308
|
-
|
|
1119
|
+
describe "#lt" do
|
|
2309
1120
|
|
|
2310
|
-
|
|
2311
|
-
query.nin(nil)
|
|
2312
|
-
end
|
|
1121
|
+
let(:query_method) { :lt }
|
|
2313
1122
|
|
|
2314
|
-
|
|
2315
|
-
|
|
1123
|
+
it_behaves_like 'requires an argument'
|
|
1124
|
+
it_behaves_like 'requires a non-nil argument'
|
|
1125
|
+
|
|
1126
|
+
context "when provided a single criterion" do
|
|
1127
|
+
|
|
1128
|
+
let(:selection) do
|
|
1129
|
+
query.lt(field: 10)
|
|
2316
1130
|
end
|
|
2317
1131
|
|
|
2318
|
-
it "
|
|
2319
|
-
expect(selection).to eq(
|
|
1132
|
+
it "adds the $lt selector" do
|
|
1133
|
+
expect(selection.selector).to eq({
|
|
1134
|
+
"field" => { "$lt" => 10 }
|
|
1135
|
+
})
|
|
2320
1136
|
end
|
|
2321
1137
|
|
|
2322
1138
|
it "returns a cloned query" do
|
|
@@ -2324,17 +1140,18 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2324
1140
|
end
|
|
2325
1141
|
end
|
|
2326
1142
|
|
|
2327
|
-
context "when provided
|
|
1143
|
+
context "when provided multiple criterion" do
|
|
2328
1144
|
|
|
2329
|
-
context "when
|
|
1145
|
+
context "when the criterion are for different fields" do
|
|
2330
1146
|
|
|
2331
1147
|
let(:selection) do
|
|
2332
|
-
query.
|
|
1148
|
+
query.lt(first: 10, second: 15)
|
|
2333
1149
|
end
|
|
2334
1150
|
|
|
2335
|
-
it "adds the $
|
|
1151
|
+
it "adds the $lt selectors" do
|
|
2336
1152
|
expect(selection.selector).to eq({
|
|
2337
|
-
"
|
|
1153
|
+
"first" => { "$lt" => 10 },
|
|
1154
|
+
"second" => { "$lt" => 15 }
|
|
2338
1155
|
})
|
|
2339
1156
|
end
|
|
2340
1157
|
|
|
@@ -2342,16 +1159,20 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2342
1159
|
expect(selection).to_not equal(query)
|
|
2343
1160
|
end
|
|
2344
1161
|
end
|
|
1162
|
+
end
|
|
1163
|
+
|
|
1164
|
+
context "when chaining the criterion" do
|
|
2345
1165
|
|
|
2346
|
-
context "when
|
|
1166
|
+
context "when the criterion are for different fields" do
|
|
2347
1167
|
|
|
2348
1168
|
let(:selection) do
|
|
2349
|
-
query.
|
|
1169
|
+
query.lt(first: 10).lt(second: 15)
|
|
2350
1170
|
end
|
|
2351
1171
|
|
|
2352
|
-
it "adds the $
|
|
1172
|
+
it "adds the $lt selectors" do
|
|
2353
1173
|
expect(selection.selector).to eq({
|
|
2354
|
-
"
|
|
1174
|
+
"first" => { "$lt" => 10 },
|
|
1175
|
+
"second" => { "$lt" => 15 }
|
|
2355
1176
|
})
|
|
2356
1177
|
end
|
|
2357
1178
|
|
|
@@ -2360,15 +1181,15 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2360
1181
|
end
|
|
2361
1182
|
end
|
|
2362
1183
|
|
|
2363
|
-
context "when
|
|
1184
|
+
context "when the criterion are on the same field" do
|
|
2364
1185
|
|
|
2365
1186
|
let(:selection) do
|
|
2366
|
-
query.
|
|
1187
|
+
query.lt(first: 10).lt(first: 15)
|
|
2367
1188
|
end
|
|
2368
1189
|
|
|
2369
|
-
it "
|
|
1190
|
+
it "overwrites the first $lt selector" do
|
|
2370
1191
|
expect(selection.selector).to eq({
|
|
2371
|
-
"
|
|
1192
|
+
"first" => { "$lt" => 15 }
|
|
2372
1193
|
})
|
|
2373
1194
|
end
|
|
2374
1195
|
|
|
@@ -2377,33 +1198,29 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2377
1198
|
end
|
|
2378
1199
|
end
|
|
2379
1200
|
end
|
|
1201
|
+
end
|
|
2380
1202
|
|
|
2381
|
-
|
|
1203
|
+
describe "#lte" do
|
|
2382
1204
|
|
|
2383
|
-
|
|
1205
|
+
let(:query_method) { :lte }
|
|
2384
1206
|
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
end
|
|
1207
|
+
it_behaves_like 'requires an argument'
|
|
1208
|
+
it_behaves_like 'requires a non-nil argument'
|
|
2388
1209
|
|
|
2389
|
-
|
|
2390
|
-
expect(selection.selector).to eq(
|
|
2391
|
-
{ "first" => { "$nin" => [ 1, 2, 3, 4 ]}}
|
|
2392
|
-
)
|
|
2393
|
-
end
|
|
2394
|
-
end
|
|
1210
|
+
context "when provided a single criterion" do
|
|
2395
1211
|
|
|
2396
|
-
|
|
1212
|
+
let(:selection) do
|
|
1213
|
+
query.lte(field: 10)
|
|
1214
|
+
end
|
|
2397
1215
|
|
|
2398
|
-
|
|
2399
|
-
|
|
2400
|
-
|
|
1216
|
+
it "adds the $lte selector" do
|
|
1217
|
+
expect(selection.selector).to eq({
|
|
1218
|
+
"field" => { "$lte" => 10 }
|
|
1219
|
+
})
|
|
1220
|
+
end
|
|
2401
1221
|
|
|
2402
|
-
|
|
2403
|
-
|
|
2404
|
-
{ "_id" => { "$nin" => [ 1, 2, 3, 4 ]}}
|
|
2405
|
-
)
|
|
2406
|
-
end
|
|
1222
|
+
it "returns a cloned query" do
|
|
1223
|
+
expect(selection).to_not equal(query)
|
|
2407
1224
|
end
|
|
2408
1225
|
end
|
|
2409
1226
|
|
|
@@ -2412,13 +1229,13 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2412
1229
|
context "when the criterion are for different fields" do
|
|
2413
1230
|
|
|
2414
1231
|
let(:selection) do
|
|
2415
|
-
query.
|
|
1232
|
+
query.lte(first: 10, second: 15)
|
|
2416
1233
|
end
|
|
2417
1234
|
|
|
2418
|
-
it "adds the $
|
|
1235
|
+
it "adds the $lte selectors" do
|
|
2419
1236
|
expect(selection.selector).to eq({
|
|
2420
|
-
"first" => { "$
|
|
2421
|
-
"second" => { "$
|
|
1237
|
+
"first" => { "$lte" => 10 },
|
|
1238
|
+
"second" => { "$lte" => 15 }
|
|
2422
1239
|
})
|
|
2423
1240
|
end
|
|
2424
1241
|
|
|
@@ -2433,13 +1250,13 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2433
1250
|
context "when the criterion are for different fields" do
|
|
2434
1251
|
|
|
2435
1252
|
let(:selection) do
|
|
2436
|
-
query.
|
|
1253
|
+
query.lte(first: 10).lte(second: 15)
|
|
2437
1254
|
end
|
|
2438
1255
|
|
|
2439
|
-
it "adds the $
|
|
1256
|
+
it "adds the $lte selectors" do
|
|
2440
1257
|
expect(selection.selector).to eq({
|
|
2441
|
-
"first" =>
|
|
2442
|
-
"second" =>
|
|
1258
|
+
"first" => { "$lte" => 10 },
|
|
1259
|
+
"second" => { "$lte" => 15 }
|
|
2443
1260
|
})
|
|
2444
1261
|
end
|
|
2445
1262
|
|
|
@@ -2450,91 +1267,68 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2450
1267
|
|
|
2451
1268
|
context "when the criterion are on the same field" do
|
|
2452
1269
|
|
|
2453
|
-
|
|
2454
|
-
|
|
2455
|
-
let(:selection) do
|
|
2456
|
-
query.nin(first: [ 1, 2 ]).nin(first: [ 2, 3 ])
|
|
2457
|
-
end
|
|
2458
|
-
|
|
2459
|
-
it "intersects the $nin selectors" do
|
|
2460
|
-
expect(selection.selector).to eq({
|
|
2461
|
-
"first" => { "$nin" => [ 2 ] }
|
|
2462
|
-
})
|
|
2463
|
-
end
|
|
2464
|
-
|
|
2465
|
-
it "returns a cloned query" do
|
|
2466
|
-
expect(selection).to_not equal(query)
|
|
2467
|
-
end
|
|
1270
|
+
let(:selection) do
|
|
1271
|
+
query.lte(first: 10).lte(first: 15)
|
|
2468
1272
|
end
|
|
2469
1273
|
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
it "intersects the $nin selectors" do
|
|
2477
|
-
expect(selection.selector).to eq({
|
|
2478
|
-
"first" => { "$nin" => [ 2 ] }
|
|
2479
|
-
})
|
|
2480
|
-
end
|
|
1274
|
+
it "overwrites the first $lte selector" do
|
|
1275
|
+
expect(selection.selector).to eq({
|
|
1276
|
+
"first" => { "$lte" => 15 }
|
|
1277
|
+
})
|
|
1278
|
+
end
|
|
2481
1279
|
|
|
2482
|
-
|
|
2483
|
-
|
|
2484
|
-
end
|
|
1280
|
+
it "returns a cloned query" do
|
|
1281
|
+
expect(selection).to_not equal(query)
|
|
2485
1282
|
end
|
|
1283
|
+
end
|
|
1284
|
+
end
|
|
1285
|
+
end
|
|
2486
1286
|
|
|
2487
|
-
|
|
1287
|
+
describe "#max_distance" do
|
|
2488
1288
|
|
|
2489
|
-
|
|
2490
|
-
query.nin(first: [ 1, 2 ]).override.nin(first: [ 3, 4 ])
|
|
2491
|
-
end
|
|
1289
|
+
let(:query_method) { :max_distance }
|
|
2492
1290
|
|
|
2493
|
-
|
|
2494
|
-
|
|
2495
|
-
"first" => { "$nin" => [ 3, 4 ] }
|
|
2496
|
-
})
|
|
2497
|
-
end
|
|
1291
|
+
it_behaves_like 'requires an argument'
|
|
1292
|
+
it_behaves_like 'requires a non-nil argument'
|
|
2498
1293
|
|
|
2499
|
-
|
|
2500
|
-
expect(selection).to_not equal(query)
|
|
2501
|
-
end
|
|
2502
|
-
end
|
|
1294
|
+
context "when provided a criterion" do
|
|
2503
1295
|
|
|
2504
|
-
|
|
1296
|
+
context "when a $near criterion exists on the same field" do
|
|
2505
1297
|
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
|
|
1298
|
+
let(:selection) do
|
|
1299
|
+
query.near(location: [ 1, 1 ]).max_distance(location: 50)
|
|
1300
|
+
end
|
|
2509
1301
|
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
1302
|
+
it "adds the $maxDistance expression" do
|
|
1303
|
+
expect(selection.selector).to eq({
|
|
1304
|
+
"location" => { "$near" => [ 1, 1 ], "$maxDistance" => 50 }
|
|
1305
|
+
})
|
|
1306
|
+
end
|
|
2515
1307
|
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
end
|
|
1308
|
+
it "returns a cloned query" do
|
|
1309
|
+
expect(selection).to_not equal(query)
|
|
2519
1310
|
end
|
|
2520
1311
|
end
|
|
2521
1312
|
end
|
|
2522
1313
|
end
|
|
2523
1314
|
|
|
2524
|
-
describe "#
|
|
1315
|
+
describe "#mod" do
|
|
2525
1316
|
|
|
2526
|
-
|
|
1317
|
+
let(:query_method) { :mod }
|
|
2527
1318
|
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
end
|
|
1319
|
+
it_behaves_like 'requires an argument'
|
|
1320
|
+
it_behaves_like 'requires a non-nil argument'
|
|
2531
1321
|
|
|
2532
|
-
|
|
2533
|
-
|
|
1322
|
+
context "when provided a criterion" do
|
|
1323
|
+
|
|
1324
|
+
let(:selection) do
|
|
1325
|
+
query.mod(value: [ 10, 1 ])
|
|
2534
1326
|
end
|
|
2535
1327
|
|
|
2536
|
-
it "
|
|
2537
|
-
expect(selection).to eq(
|
|
1328
|
+
it "adds the $mod expression" do
|
|
1329
|
+
expect(selection.selector).to eq({
|
|
1330
|
+
"value" => { "$mod" => [ 10, 1 ] }
|
|
1331
|
+
})
|
|
2538
1332
|
end
|
|
2539
1333
|
|
|
2540
1334
|
it "returns a cloned query" do
|
|
@@ -2542,34 +1336,70 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2542
1336
|
end
|
|
2543
1337
|
end
|
|
2544
1338
|
|
|
2545
|
-
context "when
|
|
1339
|
+
context "when providing multiple criteria" do
|
|
2546
1340
|
|
|
2547
|
-
|
|
2548
|
-
query.nor(nil)
|
|
2549
|
-
end
|
|
1341
|
+
context "when the fields differ" do
|
|
2550
1342
|
|
|
2551
|
-
|
|
2552
|
-
|
|
2553
|
-
|
|
1343
|
+
let(:selection) do
|
|
1344
|
+
query.mod(
|
|
1345
|
+
value: [ 10, 1 ],
|
|
1346
|
+
comments: [ 10, 1 ]
|
|
1347
|
+
)
|
|
1348
|
+
end
|
|
2554
1349
|
|
|
2555
|
-
|
|
2556
|
-
|
|
1350
|
+
it "adds the $mod expression" do
|
|
1351
|
+
expect(selection.selector).to eq({
|
|
1352
|
+
"value" => { "$mod" => [ 10, 1 ] },
|
|
1353
|
+
"comments" => { "$mod" => [ 10, 1 ] }
|
|
1354
|
+
})
|
|
1355
|
+
end
|
|
1356
|
+
|
|
1357
|
+
it "returns a cloned query" do
|
|
1358
|
+
expect(selection).to_not equal(query)
|
|
1359
|
+
end
|
|
2557
1360
|
end
|
|
1361
|
+
end
|
|
2558
1362
|
|
|
2559
|
-
|
|
2560
|
-
|
|
1363
|
+
context "when chaining multiple criteria" do
|
|
1364
|
+
|
|
1365
|
+
context "when the fields differ" do
|
|
1366
|
+
|
|
1367
|
+
let(:selection) do
|
|
1368
|
+
query.
|
|
1369
|
+
mod(value: [ 10, 1 ]).
|
|
1370
|
+
mod(result: [ 10, 1 ])
|
|
1371
|
+
end
|
|
1372
|
+
|
|
1373
|
+
it "adds the $mod expression" do
|
|
1374
|
+
expect(selection.selector).to eq({
|
|
1375
|
+
"value" => { "$mod" => [ 10, 1 ] },
|
|
1376
|
+
"result" => { "$mod" => [ 10, 1 ] }
|
|
1377
|
+
})
|
|
1378
|
+
end
|
|
1379
|
+
|
|
1380
|
+
it "returns a cloned query" do
|
|
1381
|
+
expect(selection).to_not equal(query)
|
|
1382
|
+
end
|
|
2561
1383
|
end
|
|
2562
1384
|
end
|
|
1385
|
+
end
|
|
2563
1386
|
|
|
2564
|
-
|
|
1387
|
+
describe "#ne" do
|
|
1388
|
+
|
|
1389
|
+
let(:query_method) { :ne }
|
|
1390
|
+
|
|
1391
|
+
it_behaves_like 'requires an argument'
|
|
1392
|
+
it_behaves_like 'requires a non-nil argument'
|
|
1393
|
+
|
|
1394
|
+
context "when provided a criterion" do
|
|
2565
1395
|
|
|
2566
1396
|
let(:selection) do
|
|
2567
|
-
query.
|
|
1397
|
+
query.ne(value: 10)
|
|
2568
1398
|
end
|
|
2569
1399
|
|
|
2570
|
-
it "adds the $
|
|
1400
|
+
it "adds the $ne expression" do
|
|
2571
1401
|
expect(selection.selector).to eq({
|
|
2572
|
-
"
|
|
1402
|
+
"value" => { "$ne" => 10 }
|
|
2573
1403
|
})
|
|
2574
1404
|
end
|
|
2575
1405
|
|
|
@@ -2578,20 +1408,44 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2578
1408
|
end
|
|
2579
1409
|
end
|
|
2580
1410
|
|
|
2581
|
-
context "when
|
|
1411
|
+
context "when providing multiple criteria" do
|
|
1412
|
+
|
|
1413
|
+
context "when the fields differ" do
|
|
1414
|
+
|
|
1415
|
+
let(:selection) do
|
|
1416
|
+
query.ne(
|
|
1417
|
+
value: 10,
|
|
1418
|
+
comments: 10
|
|
1419
|
+
)
|
|
1420
|
+
end
|
|
1421
|
+
|
|
1422
|
+
it "adds the $ne expression" do
|
|
1423
|
+
expect(selection.selector).to eq({
|
|
1424
|
+
"value" => { "$ne" => 10 },
|
|
1425
|
+
"comments" => { "$ne" => 10 }
|
|
1426
|
+
})
|
|
1427
|
+
end
|
|
1428
|
+
|
|
1429
|
+
it "returns a cloned query" do
|
|
1430
|
+
expect(selection).to_not equal(query)
|
|
1431
|
+
end
|
|
1432
|
+
end
|
|
1433
|
+
end
|
|
1434
|
+
|
|
1435
|
+
context "when chaining multiple criteria" do
|
|
2582
1436
|
|
|
2583
|
-
context "when the
|
|
1437
|
+
context "when the fields differ" do
|
|
2584
1438
|
|
|
2585
1439
|
let(:selection) do
|
|
2586
|
-
query.
|
|
1440
|
+
query.
|
|
1441
|
+
ne(value: 10).
|
|
1442
|
+
ne(result: 10)
|
|
2587
1443
|
end
|
|
2588
1444
|
|
|
2589
|
-
it "adds the $
|
|
1445
|
+
it "adds the $ne expression" do
|
|
2590
1446
|
expect(selection.selector).to eq({
|
|
2591
|
-
"$
|
|
2592
|
-
|
|
2593
|
-
{ "second" => [ 3, 4 ] }
|
|
2594
|
-
]
|
|
1447
|
+
"value" => { "$ne" => 10 },
|
|
1448
|
+
"result" => { "$ne" => 10 }
|
|
2595
1449
|
})
|
|
2596
1450
|
end
|
|
2597
1451
|
|
|
@@ -2599,42 +1453,48 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2599
1453
|
expect(selection).to_not equal(query)
|
|
2600
1454
|
end
|
|
2601
1455
|
end
|
|
1456
|
+
end
|
|
1457
|
+
end
|
|
2602
1458
|
|
|
2603
|
-
|
|
1459
|
+
describe "#near" do
|
|
2604
1460
|
|
|
2605
|
-
|
|
2606
|
-
query.nor({ first: [ 1, 2 ] }, { first: [ 3, 4 ] })
|
|
2607
|
-
end
|
|
1461
|
+
let(:query_method) { :near }
|
|
2608
1462
|
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
"$nor" => [
|
|
2612
|
-
{ "first" => [ 1, 2 ] },
|
|
2613
|
-
{ "first" => [ 3, 4 ] }
|
|
2614
|
-
]
|
|
2615
|
-
})
|
|
2616
|
-
end
|
|
1463
|
+
it_behaves_like 'requires an argument'
|
|
1464
|
+
it_behaves_like 'requires a non-nil argument'
|
|
2617
1465
|
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
|
|
1466
|
+
context "when provided a criterion" do
|
|
1467
|
+
|
|
1468
|
+
let(:selection) do
|
|
1469
|
+
query.near(location: [ 20, 21 ])
|
|
1470
|
+
end
|
|
1471
|
+
|
|
1472
|
+
it "adds the $near expression" do
|
|
1473
|
+
expect(selection.selector).to eq({
|
|
1474
|
+
"location" => { "$near" => [ 20, 21 ] }
|
|
1475
|
+
})
|
|
1476
|
+
end
|
|
1477
|
+
|
|
1478
|
+
it "returns a cloned query" do
|
|
1479
|
+
expect(selection).to_not equal(query)
|
|
2621
1480
|
end
|
|
2622
1481
|
end
|
|
2623
1482
|
|
|
2624
|
-
context "when
|
|
1483
|
+
context "when providing multiple criteria" do
|
|
2625
1484
|
|
|
2626
|
-
context "when the
|
|
1485
|
+
context "when the fields differ" do
|
|
2627
1486
|
|
|
2628
1487
|
let(:selection) do
|
|
2629
|
-
query.
|
|
1488
|
+
query.near(
|
|
1489
|
+
location: [ 20, 21 ],
|
|
1490
|
+
comments: [ 20, 21 ]
|
|
1491
|
+
)
|
|
2630
1492
|
end
|
|
2631
1493
|
|
|
2632
|
-
it "adds the $
|
|
1494
|
+
it "adds the $near expression" do
|
|
2633
1495
|
expect(selection.selector).to eq({
|
|
2634
|
-
"$
|
|
2635
|
-
|
|
2636
|
-
{ "second" => [ 3, 4 ] }
|
|
2637
|
-
]
|
|
1496
|
+
"location" => { "$near" => [ 20, 21 ] },
|
|
1497
|
+
"comments" => { "$near" => [ 20, 21 ] }
|
|
2638
1498
|
})
|
|
2639
1499
|
end
|
|
2640
1500
|
|
|
@@ -2642,19 +1502,22 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2642
1502
|
expect(selection).to_not equal(query)
|
|
2643
1503
|
end
|
|
2644
1504
|
end
|
|
1505
|
+
end
|
|
2645
1506
|
|
|
2646
|
-
|
|
1507
|
+
context "when chaining multiple criteria" do
|
|
1508
|
+
|
|
1509
|
+
context "when the fields differ" do
|
|
2647
1510
|
|
|
2648
1511
|
let(:selection) do
|
|
2649
|
-
query.
|
|
1512
|
+
query.
|
|
1513
|
+
near(location: [ 20, 21 ]).
|
|
1514
|
+
near(comments: [ 20, 21 ])
|
|
2650
1515
|
end
|
|
2651
1516
|
|
|
2652
|
-
it "
|
|
1517
|
+
it "adds the $near expression" do
|
|
2653
1518
|
expect(selection.selector).to eq({
|
|
2654
|
-
"$
|
|
2655
|
-
|
|
2656
|
-
{ "first" => [ 3, 4 ] }
|
|
2657
|
-
]
|
|
1519
|
+
"location" => { "$near" => [ 20, 21 ] },
|
|
1520
|
+
"comments" => { "$near" => [ 20, 21 ] }
|
|
2658
1521
|
})
|
|
2659
1522
|
end
|
|
2660
1523
|
|
|
@@ -2665,55 +1528,22 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2665
1528
|
end
|
|
2666
1529
|
end
|
|
2667
1530
|
|
|
2668
|
-
describe "#
|
|
2669
|
-
|
|
2670
|
-
context "when provided no criterion" do
|
|
2671
|
-
|
|
2672
|
-
let(:selection) do
|
|
2673
|
-
query.or
|
|
2674
|
-
end
|
|
2675
|
-
|
|
2676
|
-
it "does not add any criterion" do
|
|
2677
|
-
expect(selection.selector).to eq({})
|
|
2678
|
-
end
|
|
2679
|
-
|
|
2680
|
-
it "returns the query" do
|
|
2681
|
-
expect(selection).to eq(query)
|
|
2682
|
-
end
|
|
2683
|
-
|
|
2684
|
-
it "returns a cloned query" do
|
|
2685
|
-
expect(selection).to_not equal(query)
|
|
2686
|
-
end
|
|
2687
|
-
end
|
|
2688
|
-
|
|
2689
|
-
context "when provided nil" do
|
|
2690
|
-
|
|
2691
|
-
let(:selection) do
|
|
2692
|
-
query.or(nil)
|
|
2693
|
-
end
|
|
2694
|
-
|
|
2695
|
-
it "does not add any criterion" do
|
|
2696
|
-
expect(selection.selector).to eq({})
|
|
2697
|
-
end
|
|
1531
|
+
describe "#near_sphere" do
|
|
2698
1532
|
|
|
2699
|
-
|
|
2700
|
-
expect(selection).to eq(query)
|
|
2701
|
-
end
|
|
1533
|
+
let(:query_method) { :near_sphere }
|
|
2702
1534
|
|
|
2703
|
-
|
|
2704
|
-
|
|
2705
|
-
end
|
|
2706
|
-
end
|
|
1535
|
+
it_behaves_like 'requires an argument'
|
|
1536
|
+
it_behaves_like 'requires a non-nil argument'
|
|
2707
1537
|
|
|
2708
|
-
context "when provided a
|
|
1538
|
+
context "when provided a criterion" do
|
|
2709
1539
|
|
|
2710
1540
|
let(:selection) do
|
|
2711
|
-
query.
|
|
1541
|
+
query.near_sphere(location: [ 20, 21 ])
|
|
2712
1542
|
end
|
|
2713
1543
|
|
|
2714
|
-
it "adds the $
|
|
1544
|
+
it "adds the $nearSphere expression" do
|
|
2715
1545
|
expect(selection.selector).to eq({
|
|
2716
|
-
"
|
|
1546
|
+
"location" => { "$nearSphere" => [ 20, 21 ] }
|
|
2717
1547
|
})
|
|
2718
1548
|
end
|
|
2719
1549
|
|
|
@@ -2722,20 +1552,21 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2722
1552
|
end
|
|
2723
1553
|
end
|
|
2724
1554
|
|
|
2725
|
-
context "when
|
|
1555
|
+
context "when providing multiple criteria" do
|
|
2726
1556
|
|
|
2727
|
-
context "when the
|
|
1557
|
+
context "when the fields differ" do
|
|
2728
1558
|
|
|
2729
1559
|
let(:selection) do
|
|
2730
|
-
query.
|
|
1560
|
+
query.near_sphere(
|
|
1561
|
+
location: [ 20, 21 ],
|
|
1562
|
+
comments: [ 20, 21 ]
|
|
1563
|
+
)
|
|
2731
1564
|
end
|
|
2732
1565
|
|
|
2733
|
-
it "adds the $
|
|
1566
|
+
it "adds the $nearSphere expression" do
|
|
2734
1567
|
expect(selection.selector).to eq({
|
|
2735
|
-
"$
|
|
2736
|
-
|
|
2737
|
-
{ "second" => [ 3, 4 ] }
|
|
2738
|
-
]
|
|
1568
|
+
"location" => { "$nearSphere" => [ 20, 21 ] },
|
|
1569
|
+
"comments" => { "$nearSphere" => [ 20, 21 ] }
|
|
2739
1570
|
})
|
|
2740
1571
|
end
|
|
2741
1572
|
|
|
@@ -2743,19 +1574,22 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2743
1574
|
expect(selection).to_not equal(query)
|
|
2744
1575
|
end
|
|
2745
1576
|
end
|
|
1577
|
+
end
|
|
1578
|
+
|
|
1579
|
+
context "when chaining multiple criteria" do
|
|
2746
1580
|
|
|
2747
|
-
context "when
|
|
1581
|
+
context "when the fields differ" do
|
|
2748
1582
|
|
|
2749
1583
|
let(:selection) do
|
|
2750
|
-
query.
|
|
1584
|
+
query.
|
|
1585
|
+
near_sphere(location: [ 20, 21 ]).
|
|
1586
|
+
near_sphere(comments: [ 20, 21 ])
|
|
2751
1587
|
end
|
|
2752
1588
|
|
|
2753
|
-
it "adds the $
|
|
1589
|
+
it "adds the $nearSphere expression" do
|
|
2754
1590
|
expect(selection.selector).to eq({
|
|
2755
|
-
"$
|
|
2756
|
-
|
|
2757
|
-
{ "second" => { "$gt" => 3 }}
|
|
2758
|
-
]
|
|
1591
|
+
"location" => { "$nearSphere" => [ 20, 21 ] },
|
|
1592
|
+
"comments" => { "$nearSphere" => [ 20, 21 ] }
|
|
2759
1593
|
})
|
|
2760
1594
|
end
|
|
2761
1595
|
|
|
@@ -2763,36 +1597,28 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2763
1597
|
expect(selection).to_not equal(query)
|
|
2764
1598
|
end
|
|
2765
1599
|
end
|
|
1600
|
+
end
|
|
1601
|
+
end
|
|
2766
1602
|
|
|
2767
|
-
|
|
1603
|
+
describe "#nin" do
|
|
2768
1604
|
|
|
2769
|
-
|
|
2770
|
-
|
|
2771
|
-
end
|
|
1605
|
+
let(:query_method) { :nin }
|
|
1606
|
+
let(:operator) { '$nin' }
|
|
2772
1607
|
|
|
2773
|
-
|
|
2774
|
-
|
|
2775
|
-
"$or" => [ { "_id" => 1 } ]
|
|
2776
|
-
})
|
|
2777
|
-
end
|
|
1608
|
+
it_behaves_like 'requires an argument'
|
|
1609
|
+
it_behaves_like 'requires a non-nil argument'
|
|
2778
1610
|
|
|
2779
|
-
|
|
2780
|
-
expect(selection).to_not equal(query)
|
|
2781
|
-
end
|
|
2782
|
-
end
|
|
1611
|
+
context "when provided a single criterion" do
|
|
2783
1612
|
|
|
2784
|
-
context "when
|
|
1613
|
+
context "when providing an array" do
|
|
2785
1614
|
|
|
2786
1615
|
let(:selection) do
|
|
2787
|
-
query.
|
|
1616
|
+
query.nin(field: [ 1, 2 ])
|
|
2788
1617
|
end
|
|
2789
1618
|
|
|
2790
|
-
it "adds the $
|
|
1619
|
+
it "adds the $nin selector" do
|
|
2791
1620
|
expect(selection.selector).to eq({
|
|
2792
|
-
"$
|
|
2793
|
-
{ "first" => [ 1, 2 ] },
|
|
2794
|
-
{ "second" => { "$gt" => 3 }}
|
|
2795
|
-
]
|
|
1621
|
+
"field" => { "$nin" => [ 1, 2 ] }
|
|
2796
1622
|
})
|
|
2797
1623
|
end
|
|
2798
1624
|
|
|
@@ -2801,18 +1627,15 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2801
1627
|
end
|
|
2802
1628
|
end
|
|
2803
1629
|
|
|
2804
|
-
context "when
|
|
1630
|
+
context "when providing a single value" do
|
|
2805
1631
|
|
|
2806
1632
|
let(:selection) do
|
|
2807
|
-
query.
|
|
1633
|
+
query.nin(field: 1)
|
|
2808
1634
|
end
|
|
2809
1635
|
|
|
2810
|
-
it "
|
|
1636
|
+
it "adds the $nin selector with wrapped value" do
|
|
2811
1637
|
expect(selection.selector).to eq({
|
|
2812
|
-
"$
|
|
2813
|
-
{ "first" => [ 1, 2 ] },
|
|
2814
|
-
{ "first" => [ 3, 4 ] }
|
|
2815
|
-
]
|
|
1638
|
+
"field" => { "$nin" => [ 1 ] }
|
|
2816
1639
|
})
|
|
2817
1640
|
end
|
|
2818
1641
|
|
|
@@ -2822,20 +1645,18 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2822
1645
|
end
|
|
2823
1646
|
end
|
|
2824
1647
|
|
|
2825
|
-
context "when
|
|
1648
|
+
context "when provided multiple criterion" do
|
|
2826
1649
|
|
|
2827
1650
|
context "when the criterion are for different fields" do
|
|
2828
1651
|
|
|
2829
1652
|
let(:selection) do
|
|
2830
|
-
query.
|
|
1653
|
+
query.nin(first: [ 1, 2 ], second: [ 3, 4 ])
|
|
2831
1654
|
end
|
|
2832
1655
|
|
|
2833
|
-
it "adds the $
|
|
1656
|
+
it "adds the $nin selectors" do
|
|
2834
1657
|
expect(selection.selector).to eq({
|
|
2835
|
-
"$
|
|
2836
|
-
|
|
2837
|
-
{ "second" => [ 3, 4 ] }
|
|
2838
|
-
]
|
|
1658
|
+
"first" => { "$nin" => [ 1, 2 ] },
|
|
1659
|
+
"second" => { "$nin" => [ 3, 4 ] }
|
|
2839
1660
|
})
|
|
2840
1661
|
end
|
|
2841
1662
|
|
|
@@ -2843,19 +1664,20 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2843
1664
|
expect(selection).to_not equal(query)
|
|
2844
1665
|
end
|
|
2845
1666
|
end
|
|
1667
|
+
end
|
|
2846
1668
|
|
|
2847
|
-
|
|
1669
|
+
context "when chaining the criterion" do
|
|
1670
|
+
|
|
1671
|
+
context "when the criterion are for different fields" do
|
|
2848
1672
|
|
|
2849
1673
|
let(:selection) do
|
|
2850
|
-
query.
|
|
1674
|
+
query.nin(first: [ 1, 2 ]).nin(second: [ 3, 4 ])
|
|
2851
1675
|
end
|
|
2852
1676
|
|
|
2853
|
-
it "
|
|
1677
|
+
it "adds the $nin selectors" do
|
|
2854
1678
|
expect(selection.selector).to eq({
|
|
2855
|
-
"$
|
|
2856
|
-
|
|
2857
|
-
{ "first" => [ 3, 4 ] }
|
|
2858
|
-
]
|
|
1679
|
+
"first" => { "$nin" => [ 1, 2 ] },
|
|
1680
|
+
"second" => { "$nin" => [ 3, 4 ] }
|
|
2859
1681
|
})
|
|
2860
1682
|
end
|
|
2861
1683
|
|
|
@@ -2863,48 +1685,20 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
2863
1685
|
expect(selection).to_not equal(query)
|
|
2864
1686
|
end
|
|
2865
1687
|
end
|
|
2866
|
-
end
|
|
2867
|
-
end
|
|
2868
|
-
|
|
2869
|
-
describe "#with_size" do
|
|
2870
|
-
|
|
2871
|
-
context "when provided no criterion" do
|
|
2872
|
-
|
|
2873
|
-
let(:selection) do
|
|
2874
|
-
query.with_size
|
|
2875
|
-
end
|
|
2876
|
-
|
|
2877
|
-
it "does not add any criterion" do
|
|
2878
|
-
expect(selection.selector).to eq({})
|
|
2879
|
-
end
|
|
2880
1688
|
|
|
2881
|
-
|
|
2882
|
-
expect(selection).to eq(query)
|
|
2883
|
-
end
|
|
1689
|
+
context "when the criterion are on the same field" do
|
|
2884
1690
|
|
|
2885
|
-
|
|
2886
|
-
expect(selection).to_not equal(query)
|
|
1691
|
+
it_behaves_like 'supports merge strategies'
|
|
2887
1692
|
end
|
|
2888
1693
|
end
|
|
1694
|
+
end
|
|
2889
1695
|
|
|
2890
|
-
|
|
2891
|
-
|
|
2892
|
-
let(:selection) do
|
|
2893
|
-
query.with_size(nil)
|
|
2894
|
-
end
|
|
2895
|
-
|
|
2896
|
-
it "does not add any criterion" do
|
|
2897
|
-
expect(selection.selector).to eq({})
|
|
2898
|
-
end
|
|
1696
|
+
describe "#with_size" do
|
|
2899
1697
|
|
|
2900
|
-
|
|
2901
|
-
expect(selection).to eq(query)
|
|
2902
|
-
end
|
|
1698
|
+
let(:query_method) { :with_size }
|
|
2903
1699
|
|
|
2904
|
-
|
|
2905
|
-
|
|
2906
|
-
end
|
|
2907
|
-
end
|
|
1700
|
+
it_behaves_like 'requires an argument'
|
|
1701
|
+
it_behaves_like 'requires a non-nil argument'
|
|
2908
1702
|
|
|
2909
1703
|
context "when provided a single criterion" do
|
|
2910
1704
|
|
|
@@ -3024,45 +1818,12 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
3024
1818
|
end
|
|
3025
1819
|
end
|
|
3026
1820
|
|
|
3027
|
-
describe "#
|
|
3028
|
-
|
|
3029
|
-
context "when provided no criterion" do
|
|
3030
|
-
|
|
3031
|
-
let(:selection) do
|
|
3032
|
-
query.with_type
|
|
3033
|
-
end
|
|
3034
|
-
|
|
3035
|
-
it "does not add any criterion" do
|
|
3036
|
-
expect(selection.selector).to eq({})
|
|
3037
|
-
end
|
|
3038
|
-
|
|
3039
|
-
it "returns the query" do
|
|
3040
|
-
expect(selection).to eq(query)
|
|
3041
|
-
end
|
|
3042
|
-
|
|
3043
|
-
it "returns a cloned query" do
|
|
3044
|
-
expect(selection).to_not equal(query)
|
|
3045
|
-
end
|
|
3046
|
-
end
|
|
3047
|
-
|
|
3048
|
-
context "when provided nil" do
|
|
3049
|
-
|
|
3050
|
-
let(:selection) do
|
|
3051
|
-
query.with_type(nil)
|
|
3052
|
-
end
|
|
3053
|
-
|
|
3054
|
-
it "does not add any criterion" do
|
|
3055
|
-
expect(selection.selector).to eq({})
|
|
3056
|
-
end
|
|
1821
|
+
describe "#with_type" do
|
|
3057
1822
|
|
|
3058
|
-
|
|
3059
|
-
expect(selection).to eq(query)
|
|
3060
|
-
end
|
|
1823
|
+
let(:query_method) { :with_type }
|
|
3061
1824
|
|
|
3062
|
-
|
|
3063
|
-
|
|
3064
|
-
end
|
|
3065
|
-
end
|
|
1825
|
+
it_behaves_like 'requires an argument'
|
|
1826
|
+
it_behaves_like 'requires a non-nil argument'
|
|
3066
1827
|
|
|
3067
1828
|
context "when provided a single criterion" do
|
|
3068
1829
|
|
|
@@ -3191,7 +1952,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
3191
1952
|
expect(selection.selector['$text'][:$language]).to eq("fr")
|
|
3192
1953
|
end
|
|
3193
1954
|
|
|
3194
|
-
it_behaves_like "a
|
|
1955
|
+
it_behaves_like "returns a cloned query"
|
|
3195
1956
|
end
|
|
3196
1957
|
end
|
|
3197
1958
|
|
|
@@ -3217,6 +1978,8 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
3217
1978
|
|
|
3218
1979
|
describe "#where" do
|
|
3219
1980
|
|
|
1981
|
+
let(:query_method) { :where }
|
|
1982
|
+
|
|
3220
1983
|
context "when provided no criterion" do
|
|
3221
1984
|
|
|
3222
1985
|
let(:selection) do
|
|
@@ -3236,37 +1999,59 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
3236
1999
|
end
|
|
3237
2000
|
end
|
|
3238
2001
|
|
|
3239
|
-
|
|
2002
|
+
it_behaves_like 'requires a non-nil argument'
|
|
3240
2003
|
|
|
3241
|
-
|
|
3242
|
-
query.where(nil)
|
|
3243
|
-
end
|
|
2004
|
+
context "when provided a string" do
|
|
3244
2005
|
|
|
3245
|
-
|
|
3246
|
-
|
|
2006
|
+
let(:selection) do
|
|
2007
|
+
query.where("this.value = 10")
|
|
3247
2008
|
end
|
|
3248
2009
|
|
|
3249
|
-
it "
|
|
3250
|
-
expect(selection).to eq(
|
|
2010
|
+
it "adds the $where criterion" do
|
|
2011
|
+
expect(selection.selector).to eq({ "$where" => "this.value = 10" })
|
|
3251
2012
|
end
|
|
3252
2013
|
|
|
3253
2014
|
it "returns a cloned query" do
|
|
3254
2015
|
expect(selection).to_not equal(query)
|
|
3255
2016
|
end
|
|
3256
|
-
end
|
|
3257
2017
|
|
|
3258
|
-
|
|
2018
|
+
context 'when multiple calls with string argument are made' do
|
|
3259
2019
|
|
|
3260
|
-
|
|
3261
|
-
|
|
2020
|
+
let(:selection) do
|
|
2021
|
+
query.where("this.value = 10").where('foo.bar')
|
|
2022
|
+
end
|
|
2023
|
+
|
|
2024
|
+
it 'combines conditions' do
|
|
2025
|
+
expect(selection.selector).to eq(
|
|
2026
|
+
"$where" => "this.value = 10", '$and' => [{'$where' => 'foo.bar'}],
|
|
2027
|
+
)
|
|
2028
|
+
end
|
|
3262
2029
|
end
|
|
3263
2030
|
|
|
3264
|
-
|
|
3265
|
-
|
|
2031
|
+
context 'when called with string argument and with hash argument' do
|
|
2032
|
+
|
|
2033
|
+
let(:selection) do
|
|
2034
|
+
query.where("this.value = 10").where(foo: 'bar')
|
|
2035
|
+
end
|
|
2036
|
+
|
|
2037
|
+
it 'combines conditions' do
|
|
2038
|
+
expect(selection.selector).to eq(
|
|
2039
|
+
"$where" => "this.value = 10", 'foo' => 'bar',
|
|
2040
|
+
)
|
|
2041
|
+
end
|
|
3266
2042
|
end
|
|
3267
2043
|
|
|
3268
|
-
|
|
3269
|
-
|
|
2044
|
+
context 'when called with hash argument and with string argument' do
|
|
2045
|
+
|
|
2046
|
+
let(:selection) do
|
|
2047
|
+
query.where(foo: 'bar').where("this.value = 10")
|
|
2048
|
+
end
|
|
2049
|
+
|
|
2050
|
+
it 'combines conditions' do
|
|
2051
|
+
expect(selection.selector).to eq(
|
|
2052
|
+
'foo' => 'bar', "$where" => "this.value = 10",
|
|
2053
|
+
)
|
|
2054
|
+
end
|
|
3270
2055
|
end
|
|
3271
2056
|
end
|
|
3272
2057
|
|
|
@@ -3987,7 +2772,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
3987
2772
|
|
|
3988
2773
|
it "merges the strategies on the same field" do
|
|
3989
2774
|
expect(selection.selector).to eq(
|
|
3990
|
-
|
|
2775
|
+
"field" => { "$gt" => 5, "$lt" => 10, "$ne" => 7 }
|
|
3991
2776
|
)
|
|
3992
2777
|
end
|
|
3993
2778
|
end
|
|
@@ -3998,8 +2783,8 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
3998
2783
|
query.where(field: 5).where(field: 10)
|
|
3999
2784
|
end
|
|
4000
2785
|
|
|
4001
|
-
it "
|
|
4002
|
-
expect(selection.selector).to eq(
|
|
2786
|
+
it "combines conditions" do
|
|
2787
|
+
expect(selection.selector).to eq("field" => 5, '$and' => [{'field' => 10}] )
|
|
4003
2788
|
end
|
|
4004
2789
|
end
|
|
4005
2790
|
end
|
|
@@ -4014,7 +2799,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
4014
2799
|
|
|
4015
2800
|
it "merges the strategies on the same field" do
|
|
4016
2801
|
expect(selection.selector).to eq(
|
|
4017
|
-
|
|
2802
|
+
"field" => { "$gt" => 5, "$lt" => 10, "$ne" => 7 }
|
|
4018
2803
|
)
|
|
4019
2804
|
end
|
|
4020
2805
|
end
|