mongoid 7.6.2 → 8.0.1
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 +2 -0
- data/README.md +3 -3
- data/Rakefile +21 -85
- data/lib/config/locales/en.yml +46 -56
- data/lib/mongoid/association/accessors.rb +32 -3
- data/lib/mongoid/association/bindable.rb +48 -0
- data/lib/mongoid/association/builders.rb +4 -2
- data/lib/mongoid/association/depending.rb +4 -8
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +28 -5
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
- data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
- data/lib/mongoid/association/macros.rb +2 -1
- data/lib/mongoid/association/many.rb +5 -0
- data/lib/mongoid/association/nested/many.rb +5 -39
- data/lib/mongoid/association/nested/nested_buildable.rb +0 -14
- data/lib/mongoid/association/proxy.rb +12 -0
- data/lib/mongoid/association/referenced/auto_save.rb +3 -2
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
- data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -18
- data/lib/mongoid/association/referenced/has_many/proxy.rb +11 -107
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
- data/lib/mongoid/association/referenced/syncable.rb +2 -2
- data/lib/mongoid/association/relatable.rb +38 -4
- data/lib/mongoid/attributes/processing.rb +9 -2
- data/lib/mongoid/attributes.rb +30 -27
- data/lib/mongoid/cacheable.rb +2 -2
- data/lib/mongoid/changeable.rb +37 -2
- data/lib/mongoid/clients/factory.rb +0 -4
- data/lib/mongoid/clients/options.rb +4 -0
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/config.rb +15 -73
- data/lib/mongoid/contextual/aggregable/memory.rb +22 -20
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +63 -47
- data/lib/mongoid/contextual/mongo.rb +173 -287
- data/lib/mongoid/contextual/none.rb +33 -15
- data/lib/mongoid/copyable.rb +32 -8
- data/lib/mongoid/criteria/includable.rb +24 -20
- data/lib/mongoid/criteria/marshalable.rb +10 -2
- data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
- data/lib/mongoid/criteria/queryable/mergeable.rb +0 -12
- data/lib/mongoid/criteria/queryable/optional.rb +3 -9
- data/lib/mongoid/criteria/queryable/options.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +2 -133
- data/lib/mongoid/criteria/queryable/selector.rb +90 -5
- data/lib/mongoid/criteria/queryable/smash.rb +39 -6
- data/lib/mongoid/criteria/queryable/storable.rb +1 -1
- data/lib/mongoid/criteria/queryable.rb +11 -6
- data/lib/mongoid/criteria.rb +1 -28
- data/lib/mongoid/deprecable.rb +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +88 -33
- data/lib/mongoid/equality.rb +4 -4
- data/lib/mongoid/errors/document_not_found.rb +6 -2
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +5 -1
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors.rb +2 -3
- data/lib/mongoid/extensions/array.rb +8 -6
- data/lib/mongoid/extensions/big_decimal.rb +29 -10
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +8 -2
- data/lib/mongoid/extensions/date.rb +26 -20
- data/lib/mongoid/extensions/date_time.rb +1 -1
- data/lib/mongoid/extensions/float.rb +4 -5
- data/lib/mongoid/extensions/hash.rb +13 -32
- data/lib/mongoid/extensions/integer.rb +4 -5
- data/lib/mongoid/extensions/object.rb +2 -0
- data/lib/mongoid/extensions/range.rb +41 -10
- data/lib/mongoid/extensions/regexp.rb +11 -4
- data/lib/mongoid/extensions/set.rb +11 -4
- data/lib/mongoid/extensions/string.rb +2 -13
- data/lib/mongoid/extensions/symbol.rb +3 -14
- data/lib/mongoid/extensions/time.rb +27 -16
- data/lib/mongoid/extensions/time_with_zone.rb +1 -2
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +42 -7
- data/lib/mongoid/fields/foreign_key.rb +7 -0
- data/lib/mongoid/fields/validators/macro.rb +3 -9
- data/lib/mongoid/fields.rb +49 -7
- data/lib/mongoid/findable.rb +21 -16
- data/lib/mongoid/indexable/specification.rb +1 -1
- data/lib/mongoid/indexable/validators/options.rb +4 -1
- data/lib/mongoid/interceptable.rb +69 -9
- data/lib/mongoid/matchable.rb +1 -6
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +5 -3
- data/lib/mongoid/matcher/regex.rb +9 -8
- data/lib/mongoid/matcher.rb +0 -1
- data/lib/mongoid/persistable/creatable.rb +14 -5
- data/lib/mongoid/persistable/updatable.rb +12 -5
- data/lib/mongoid/persistence_context.rb +8 -42
- data/lib/mongoid/query_cache.rb +6 -258
- data/lib/mongoid/railties/controller_runtime.rb +1 -1
- data/lib/mongoid/reloadable.rb +7 -3
- data/lib/mongoid/scopable.rb +9 -11
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/shardable.rb +11 -35
- data/lib/mongoid/stateful.rb +27 -1
- data/lib/mongoid/threaded.rb +0 -3
- data/lib/mongoid/timestamps/created.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +1 -1
- data/lib/mongoid/touchable.rb +2 -3
- data/lib/mongoid/traversable.rb +1 -0
- data/lib/mongoid/validatable/uniqueness.rb +2 -1
- data/lib/mongoid/version.rb +1 -5
- data/lib/mongoid/warnings.rb +3 -5
- data/lib/mongoid.rb +1 -0
- data/spec/config/mongoid.yml +16 -0
- data/spec/integration/app_spec.rb +8 -20
- data/spec/integration/associations/belongs_to_spec.rb +18 -0
- data/spec/integration/associations/embedded_spec.rb +15 -0
- data/spec/integration/associations/embeds_many_spec.rb +15 -2
- data/spec/integration/associations/embeds_one_spec.rb +18 -0
- data/spec/integration/associations/foreign_key_spec.rb +9 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
- data/spec/integration/associations/has_one_spec.rb +97 -1
- data/spec/integration/associations/scope_option_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +95 -1
- data/spec/integration/callbacks_spec.rb +226 -4
- data/spec/integration/criteria/range_spec.rb +95 -1
- data/spec/integration/discriminator_key_spec.rb +115 -76
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +1 -15
- data/spec/integration/matcher_examples_spec.rb +20 -13
- data/spec/integration/matcher_operator_data/regex.yml +0 -21
- data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
- data/spec/integration/matcher_operator_spec.rb +3 -5
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/mongoid/association/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +9 -9
- data/spec/mongoid/association/eager_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +198 -8
- data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +36 -51
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +60 -156
- data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
- data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
- data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
- data/spec/mongoid/association/syncable_spec.rb +14 -0
- data/spec/mongoid/atomic/paths_spec.rb +0 -14
- data/spec/mongoid/attributes/nested_spec.rb +73 -198
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_spec.rb +1 -5
- data/spec/mongoid/attributes_spec.rb +480 -27
- data/spec/mongoid/cacheable_spec.rb +3 -3
- data/spec/mongoid/changeable_spec.rb +130 -13
- data/spec/mongoid/clients/factory_spec.rb +22 -60
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +2 -2
- data/spec/mongoid/config_spec.rb +52 -15
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +371 -231
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
- data/spec/mongoid/contextual/memory_spec.rb +467 -156
- data/spec/mongoid/contextual/mongo_spec.rb +566 -426
- data/spec/mongoid/contextual/none_spec.rb +11 -19
- data/spec/mongoid/copyable_spec.rb +451 -2
- data/spec/mongoid/criteria/findable_spec.rb +86 -210
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +1 -2
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +1 -2
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -2
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +0 -200
- data/spec/mongoid/criteria/queryable/selector_spec.rb +16 -77
- data/spec/mongoid/criteria/queryable/storable_spec.rb +0 -72
- data/spec/mongoid/criteria_spec.rb +469 -1203
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/equality_spec.rb +12 -12
- data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
- data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +16 -2
- data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
- data/spec/mongoid/extensions/binary_spec.rb +44 -9
- data/spec/mongoid/extensions/boolean_spec.rb +68 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
- data/spec/mongoid/extensions/date_spec.rb +71 -1
- data/spec/mongoid/extensions/date_time_spec.rb +15 -9
- data/spec/mongoid/extensions/float_spec.rb +48 -76
- data/spec/mongoid/extensions/hash_spec.rb +30 -236
- data/spec/mongoid/extensions/integer_spec.rb +45 -66
- data/spec/mongoid/extensions/range_spec.rb +255 -54
- data/spec/mongoid/extensions/regexp_spec.rb +58 -33
- data/spec/mongoid/extensions/set_spec.rb +106 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -25
- data/spec/mongoid/extensions/symbol_spec.rb +18 -25
- data/spec/mongoid/extensions/time_spec.rb +634 -66
- data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
- data/spec/mongoid/factory_spec.rb +61 -1
- data/spec/mongoid/fields_spec.rb +321 -50
- data/spec/mongoid/findable_spec.rb +64 -29
- data/spec/mongoid/indexable/specification_spec.rb +2 -2
- data/spec/mongoid/indexable_spec.rb +16 -19
- data/spec/mongoid/interceptable_spec.rb +584 -5
- data/spec/mongoid/interceptable_spec_models.rb +235 -4
- data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +2 -2
- data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
- data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
- data/spec/mongoid/persistence_context_spec.rb +24 -0
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +1 -156
- data/spec/mongoid/reloadable_spec.rb +35 -2
- data/spec/mongoid/scopable_spec.rb +36 -34
- data/spec/mongoid/serializable_spec.rb +14 -7
- data/spec/mongoid/shardable_models.rb +0 -14
- data/spec/mongoid/shardable_spec.rb +61 -153
- data/spec/mongoid/stateful_spec.rb +28 -0
- data/spec/mongoid/timestamps_spec.rb +390 -0
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +116 -0
- data/spec/mongoid/touchable_spec_models.rb +12 -8
- data/spec/mongoid/traversable_spec.rb +4 -11
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/mongoid_spec.rb +1 -7
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/shared/lib/mrss/cluster_config.rb +40 -5
- data/spec/shared/lib/mrss/constraints.rb +46 -7
- data/spec/shared/lib/mrss/docker_runner.rb +21 -17
- data/spec/shared/lib/mrss/eg_config_utils.rb +31 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
- data/spec/shared/lib/mrss/lite_constraints.rb +2 -10
- data/spec/shared/lib/mrss/server_version_registry.rb +29 -18
- data/spec/shared/lib/mrss/spec_organizer.rb +3 -32
- data/spec/shared/lib/mrss/utils.rb +6 -28
- data/spec/shared/share/Dockerfile.erb +114 -38
- data/spec/shared/shlib/distro.sh +0 -10
- data/spec/shared/shlib/server.sh +83 -64
- data/spec/shared/shlib/set_env.sh +81 -16
- data/spec/support/constraints.rb +24 -0
- data/spec/support/expectations.rb +17 -20
- data/spec/support/macros.rb +30 -0
- data/spec/support/models/augmentation.rb +12 -0
- data/spec/support/models/band.rb +3 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/support/models/circus.rb +3 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/support/models/implant.rb +9 -0
- data/spec/support/models/label.rb +2 -0
- data/spec/support/models/passport.rb +9 -0
- data/spec/support/models/person.rb +1 -0
- data/spec/support/models/player.rb +2 -0
- data/spec/support/models/powerup.rb +12 -0
- data/spec/support/models/registry.rb +1 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/support/models/weapon.rb +12 -0
- data.tar.gz.sig +0 -0
- metadata +695 -650
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/in_memory_regexp_timeout.rb +0 -26
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/lib/mongoid/field_readable.rb +0 -70
- data/lib/mongoid/matcher/regexp_budget.rb +0 -389
- data/spec/integration/matcher_regexp_timeout_spec.rb +0 -215
- data/spec/integration/query_operator_guard_spec.rb +0 -89
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
- data/spec/mongoid/matcher/regexp_budget_spec.rb +0 -570
- data/spec/shared/CANDIDATE.md +0 -28
- data/spec/shared/lib/mrss/release/candidate.rb +0 -287
- data/spec/shared/lib/mrss/release/product_data.rb +0 -144
- data/spec/shared/lib/tasks/candidate.rake +0 -64
|
@@ -754,127 +754,119 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
754
754
|
end
|
|
755
755
|
end
|
|
756
756
|
|
|
757
|
-
|
|
758
|
-
describe "#geo_spacial" do
|
|
757
|
+
describe "#geo_spatial" do
|
|
759
758
|
|
|
760
|
-
|
|
759
|
+
let(:query_method) { :geo_spatial }
|
|
761
760
|
|
|
762
|
-
|
|
763
|
-
|
|
761
|
+
it_behaves_like 'requires an argument'
|
|
762
|
+
it_behaves_like 'requires a non-nil argument'
|
|
764
763
|
|
|
765
|
-
|
|
764
|
+
context "when provided a criterion" do
|
|
766
765
|
|
|
767
|
-
|
|
766
|
+
context "when the geometry is a point intersection" do
|
|
768
767
|
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
768
|
+
let(:selection) do
|
|
769
|
+
query.geo_spatial(:location.intersects_point => [ 1, 10 ])
|
|
770
|
+
end
|
|
772
771
|
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
}
|
|
772
|
+
it "adds the $geoIntersects expression" do
|
|
773
|
+
expect(selection.selector).to eq({
|
|
774
|
+
"location" => {
|
|
775
|
+
"$geoIntersects" => {
|
|
776
|
+
"$geometry" => {
|
|
777
|
+
"type" => "Point",
|
|
778
|
+
"coordinates" => [ 1, 10 ]
|
|
781
779
|
}
|
|
782
780
|
}
|
|
783
|
-
}
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
it_behaves_like "returns a cloned query"
|
|
781
|
+
}
|
|
782
|
+
})
|
|
787
783
|
end
|
|
788
784
|
|
|
789
|
-
|
|
785
|
+
it_behaves_like "returns a cloned query"
|
|
786
|
+
end
|
|
787
|
+
|
|
788
|
+
context "when the geometry is a line intersection" do
|
|
790
789
|
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
790
|
+
let(:selection) do
|
|
791
|
+
query.geo_spatial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
|
|
792
|
+
end
|
|
794
793
|
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
}
|
|
794
|
+
it "adds the $geoIntersects expression" do
|
|
795
|
+
expect(selection.selector).to eq({
|
|
796
|
+
"location" => {
|
|
797
|
+
"$geoIntersects" => {
|
|
798
|
+
"$geometry" => {
|
|
799
|
+
"type" => "LineString",
|
|
800
|
+
"coordinates" => [[ 1, 10 ], [ 2, 10 ]]
|
|
803
801
|
}
|
|
804
802
|
}
|
|
805
|
-
}
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
it_behaves_like "returns a cloned query"
|
|
803
|
+
}
|
|
804
|
+
})
|
|
809
805
|
end
|
|
810
806
|
|
|
811
|
-
|
|
807
|
+
it_behaves_like "returns a cloned query"
|
|
808
|
+
end
|
|
812
809
|
|
|
813
|
-
|
|
814
|
-
query.public_send(query_method,
|
|
815
|
-
:location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
|
816
|
-
)
|
|
817
|
-
end
|
|
810
|
+
context "when the geometry is a polygon intersection" do
|
|
818
811
|
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
812
|
+
let(:selection) do
|
|
813
|
+
query.geo_spatial(:location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]])
|
|
814
|
+
end
|
|
815
|
+
|
|
816
|
+
it "adds the $geoIntersects expression" do
|
|
817
|
+
expect(selection.selector).to eq({
|
|
818
|
+
"location" => {
|
|
819
|
+
"$geoIntersects" => {
|
|
820
|
+
"$geometry" => {
|
|
821
|
+
"type" => "Polygon",
|
|
822
|
+
"coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
|
827
823
|
}
|
|
828
824
|
}
|
|
829
|
-
}
|
|
830
|
-
|
|
825
|
+
}
|
|
826
|
+
})
|
|
827
|
+
end
|
|
828
|
+
|
|
829
|
+
it_behaves_like "returns a cloned query"
|
|
830
|
+
end
|
|
831
831
|
|
|
832
|
-
|
|
832
|
+
context "when the geometry is within a polygon" do
|
|
833
|
+
|
|
834
|
+
let(:selection) do
|
|
835
|
+
query.geo_spatial(:location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]])
|
|
833
836
|
end
|
|
834
837
|
|
|
835
|
-
|
|
838
|
+
it "adds the $geoIntersects expression" do
|
|
839
|
+
expect(selection.selector).to eq({
|
|
840
|
+
"location" => {
|
|
841
|
+
"$geoWithin" => {
|
|
842
|
+
"$geometry" => {
|
|
843
|
+
"type" => "Polygon",
|
|
844
|
+
"coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
})
|
|
849
|
+
end
|
|
836
850
|
|
|
851
|
+
context "when used with the $box operator ($geoWithin query) " do
|
|
837
852
|
let(:selection) do
|
|
838
|
-
query.
|
|
839
|
-
:location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
|
840
|
-
)
|
|
853
|
+
query.geo_spatial(:location.within_box => [[ 1, 10 ], [ 2, 10 ]])
|
|
841
854
|
end
|
|
842
855
|
|
|
843
856
|
it "adds the $geoIntersects expression" do
|
|
844
857
|
expect(selection.selector).to eq({
|
|
845
858
|
"location" => {
|
|
846
859
|
"$geoWithin" => {
|
|
847
|
-
"$
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
}
|
|
860
|
+
"$box" => [
|
|
861
|
+
[ 1, 10 ], [ 2, 10 ]
|
|
862
|
+
]
|
|
851
863
|
}
|
|
852
864
|
}
|
|
853
865
|
})
|
|
854
866
|
end
|
|
855
|
-
|
|
856
|
-
context "when used with the $box operator ($geoWithin query) " do
|
|
857
|
-
let(:selection) do
|
|
858
|
-
query.public_send(query_method,
|
|
859
|
-
:location.within_box => [[ 1, 10 ], [ 2, 10 ]]
|
|
860
|
-
)
|
|
861
|
-
end
|
|
862
|
-
|
|
863
|
-
it "adds the $geoIntersects expression" do
|
|
864
|
-
expect(selection.selector).to eq({
|
|
865
|
-
"location" => {
|
|
866
|
-
"$geoWithin" => {
|
|
867
|
-
"$box" => [
|
|
868
|
-
[ 1, 10 ], [ 2, 10 ]
|
|
869
|
-
]
|
|
870
|
-
}
|
|
871
|
-
}
|
|
872
|
-
})
|
|
873
|
-
end
|
|
874
|
-
end
|
|
875
|
-
|
|
876
|
-
it_behaves_like "returns a cloned query"
|
|
877
867
|
end
|
|
868
|
+
|
|
869
|
+
it_behaves_like "returns a cloned query"
|
|
878
870
|
end
|
|
879
871
|
end
|
|
880
872
|
end
|
|
@@ -35,8 +35,6 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
35
35
|
it_behaves_like 'requires a non-nil argument'
|
|
36
36
|
|
|
37
37
|
context "when provided a string" do
|
|
38
|
-
# String criteria compile to $where, which requires the opt-in.
|
|
39
|
-
config_override :allow_unsafe_query_operators, true
|
|
40
38
|
|
|
41
39
|
let(:selection) do
|
|
42
40
|
query.where("this.value = 10")
|
|
@@ -588,202 +586,4 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
588
586
|
end
|
|
589
587
|
end
|
|
590
588
|
end
|
|
591
|
-
|
|
592
|
-
describe 'top-level operator injection guard' do
|
|
593
|
-
context 'when allow_unsafe_query_operators is true' do
|
|
594
|
-
config_override :allow_unsafe_query_operators, true
|
|
595
|
-
|
|
596
|
-
context 'when passing $where' do
|
|
597
|
-
it 'does not raise' do
|
|
598
|
-
expect do
|
|
599
|
-
query.where('$where' => 'this.name == "admin"')
|
|
600
|
-
end.not_to raise_error
|
|
601
|
-
end
|
|
602
|
-
end
|
|
603
|
-
|
|
604
|
-
context 'when passing a string criterion' do
|
|
605
|
-
it 'does not raise' do
|
|
606
|
-
expect do
|
|
607
|
-
query.where('this.name == "admin"')
|
|
608
|
-
end.not_to raise_error
|
|
609
|
-
end
|
|
610
|
-
end
|
|
611
|
-
|
|
612
|
-
context 'when passing a string criterion to a negated query' do
|
|
613
|
-
it 'does not raise' do
|
|
614
|
-
expect do
|
|
615
|
-
query.not.where('this.name == "admin"')
|
|
616
|
-
end.not_to raise_error
|
|
617
|
-
end
|
|
618
|
-
end
|
|
619
|
-
|
|
620
|
-
context 'when passing $function' do
|
|
621
|
-
it 'does not raise' do
|
|
622
|
-
expect do
|
|
623
|
-
query.where('$function' => { body: 'function() { return true; }', args: [], lang: 'js' })
|
|
624
|
-
end.not_to raise_error
|
|
625
|
-
end
|
|
626
|
-
end
|
|
627
|
-
end
|
|
628
|
-
|
|
629
|
-
context 'when allow_unsafe_query_operators is false' do
|
|
630
|
-
config_override :allow_unsafe_query_operators, false
|
|
631
|
-
|
|
632
|
-
context 'when passing $where' do
|
|
633
|
-
it 'raises InvalidQuery' do
|
|
634
|
-
expect do
|
|
635
|
-
query.where('$where' => 'this.name == "admin"')
|
|
636
|
-
end.to raise_error(Mongoid::Errors::InvalidQuery, /\$where/)
|
|
637
|
-
end
|
|
638
|
-
end
|
|
639
|
-
|
|
640
|
-
context 'when passing $function' do
|
|
641
|
-
it 'raises InvalidQuery' do
|
|
642
|
-
expect do
|
|
643
|
-
query.where('$function' => { body: 'function() { return true; }', args: [], lang: 'js' })
|
|
644
|
-
end.to raise_error(Mongoid::Errors::InvalidQuery, /\$function/)
|
|
645
|
-
end
|
|
646
|
-
end
|
|
647
|
-
|
|
648
|
-
context 'when the error mentions allow_unsafe_query_operators' do
|
|
649
|
-
it 'includes the config opt-in in the message' do
|
|
650
|
-
expect do
|
|
651
|
-
query.where('$where' => 'true')
|
|
652
|
-
end.to raise_error(Mongoid::Errors::InvalidQuery, /allow_unsafe_query_operators/)
|
|
653
|
-
end
|
|
654
|
-
end
|
|
655
|
-
|
|
656
|
-
context 'when passing a string criterion' do
|
|
657
|
-
it 'raises InvalidQuery' do
|
|
658
|
-
expect do
|
|
659
|
-
query.where('this.name == "admin"')
|
|
660
|
-
end.to raise_error(Mongoid::Errors::InvalidQuery, /\$where/)
|
|
661
|
-
end
|
|
662
|
-
|
|
663
|
-
it 'includes the config opt-in in the message' do
|
|
664
|
-
expect do
|
|
665
|
-
query.where('this.name == "admin"')
|
|
666
|
-
end.to raise_error(Mongoid::Errors::InvalidQuery, /allow_unsafe_query_operators/)
|
|
667
|
-
end
|
|
668
|
-
end
|
|
669
|
-
|
|
670
|
-
context 'when passing a string criterion to a negated query' do
|
|
671
|
-
it 'raises InvalidQuery' do
|
|
672
|
-
expect do
|
|
673
|
-
query.not.where('this.name == "admin"')
|
|
674
|
-
end.to raise_error(Mongoid::Errors::InvalidQuery, /\$where/)
|
|
675
|
-
end
|
|
676
|
-
end
|
|
677
|
-
|
|
678
|
-
%w[$and $or $nor $not $text $comment $expr $jsonSchema $alwaysFalse $alwaysTrue].each do |op|
|
|
679
|
-
context "when passing #{op} (allowlisted)" do
|
|
680
|
-
it 'does not raise' do
|
|
681
|
-
value = case op
|
|
682
|
-
when '$and', '$or', '$nor', '$not' then [ { 'x' => 1 } ]
|
|
683
|
-
when '$text' then { '$search' => 'hi' }
|
|
684
|
-
when '$expr' then { '$gt' => [ '$a', 1 ] }
|
|
685
|
-
when '$jsonSchema' then { 'required' => [ 'x' ] }
|
|
686
|
-
else true
|
|
687
|
-
end
|
|
688
|
-
expect { query.where(op => value) }.not_to raise_error
|
|
689
|
-
end
|
|
690
|
-
end
|
|
691
|
-
end
|
|
692
|
-
end
|
|
693
|
-
end
|
|
694
|
-
|
|
695
|
-
describe 'nested operator injection guard' do
|
|
696
|
-
js = 'this.name == "admin"'
|
|
697
|
-
|
|
698
|
-
function_expr = {
|
|
699
|
-
'$function' => { 'body' => 'function() { return true; }', 'args' => [], 'lang' => 'js' }
|
|
700
|
-
}.freeze
|
|
701
|
-
|
|
702
|
-
accumulator_expr = {
|
|
703
|
-
'$accumulator' => {
|
|
704
|
-
'init' => 'function() { return 0; }',
|
|
705
|
-
'accumulate' => 'function() { return 0; }',
|
|
706
|
-
'accumulateArgs' => [],
|
|
707
|
-
'merge' => 'function() { return 0; }',
|
|
708
|
-
'lang' => 'js'
|
|
709
|
-
}
|
|
710
|
-
}.freeze
|
|
711
|
-
|
|
712
|
-
# Every path into the selector that does not route through #expr_query,
|
|
713
|
-
# plus the nested forms that a top-level key check cannot see.
|
|
714
|
-
unsafe_queries = {
|
|
715
|
-
'and with a $where key' => ->(query) { query.and('$where' => js) },
|
|
716
|
-
'or with a $where key' => ->(query) { query.or('$where' => js) },
|
|
717
|
-
'nor with a $where key' => ->(query) { query.nor('$where' => js) },
|
|
718
|
-
'not with a $where key' => ->(query) { query.not('$where' => js) },
|
|
719
|
-
'any_of with a $where key' => ->(query) { query.any_of('$where' => js) },
|
|
720
|
-
# none_of is not available on this branch; it landed in 8.1 via MONGOID-5453.
|
|
721
|
-
'elem_match with a nested $where' => ->(query) { query.elem_match(a: { '$where' => js }) },
|
|
722
|
-
'where with $where inside $or' => ->(query) { query.where('$or' => [ { '$where' => js } ]) },
|
|
723
|
-
'where with $function inside $expr' => ->(query) { query.where('$expr' => function_expr) },
|
|
724
|
-
'where with $accumulator inside $expr' => ->(query) { query.where('$expr' => accumulator_expr) },
|
|
725
|
-
'where with $where three levels deep' => lambda { |query|
|
|
726
|
-
query.where('$and' => [ { '$or' => [ { '$where' => js } ] } ])
|
|
727
|
-
},
|
|
728
|
-
'where with a symbol $where key inside $or' => ->(query) { query.where('$or' => [ { :$where => js } ]) }
|
|
729
|
-
}.freeze
|
|
730
|
-
|
|
731
|
-
context 'when allow_unsafe_query_operators is false' do
|
|
732
|
-
config_override :allow_unsafe_query_operators, false
|
|
733
|
-
|
|
734
|
-
unsafe_queries.each do |description, builder|
|
|
735
|
-
context "when querying with #{description}" do
|
|
736
|
-
it 'raises InvalidQuery' do
|
|
737
|
-
expect do
|
|
738
|
-
builder.call(query)
|
|
739
|
-
end.to raise_error(Mongoid::Errors::InvalidQuery, /\$where|\$function|\$accumulator/)
|
|
740
|
-
end
|
|
741
|
-
end
|
|
742
|
-
end
|
|
743
|
-
|
|
744
|
-
it 'includes the config opt-in in the message' do
|
|
745
|
-
expect do
|
|
746
|
-
query.or('$where' => js)
|
|
747
|
-
end.to raise_error(Mongoid::Errors::InvalidQuery, /allow_unsafe_query_operators/)
|
|
748
|
-
end
|
|
749
|
-
|
|
750
|
-
context 'when the nested expression is safe' do
|
|
751
|
-
it 'permits $or with field expressions' do
|
|
752
|
-
expect do
|
|
753
|
-
query.where('$or' => [ { 'a' => 1 }, { 'b' => { '$gt' => 2 } } ])
|
|
754
|
-
end.not_to raise_error
|
|
755
|
-
end
|
|
756
|
-
|
|
757
|
-
it 'permits $expr with aggregation operators' do
|
|
758
|
-
expect do
|
|
759
|
-
query.where('$expr' => { '$gt' => [ '$a', '$b' ] })
|
|
760
|
-
end.not_to raise_error
|
|
761
|
-
end
|
|
762
|
-
|
|
763
|
-
it 'permits a field whose name resembles a javascript operator' do
|
|
764
|
-
expect do
|
|
765
|
-
query.where('where' => js)
|
|
766
|
-
end.not_to raise_error
|
|
767
|
-
end
|
|
768
|
-
|
|
769
|
-
it 'permits a value that resembles a javascript operator' do
|
|
770
|
-
expect do
|
|
771
|
-
query.where('name' => '$where')
|
|
772
|
-
end.not_to raise_error
|
|
773
|
-
end
|
|
774
|
-
end
|
|
775
|
-
end
|
|
776
|
-
|
|
777
|
-
context 'when allow_unsafe_query_operators is true' do
|
|
778
|
-
config_override :allow_unsafe_query_operators, true
|
|
779
|
-
|
|
780
|
-
unsafe_queries.each do |description, builder|
|
|
781
|
-
context "when querying with #{description}" do
|
|
782
|
-
it 'does not raise' do
|
|
783
|
-
expect { builder.call(query) }.not_to raise_error
|
|
784
|
-
end
|
|
785
|
-
end
|
|
786
|
-
end
|
|
787
|
-
end
|
|
788
|
-
end
|
|
789
589
|
end
|
|
@@ -44,7 +44,7 @@ describe Mongoid::Criteria::Queryable::Selector do
|
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
context "when selector contains a $nin
|
|
47
|
+
context "when selector contains a $nin" do
|
|
48
48
|
|
|
49
49
|
let(:initial) do
|
|
50
50
|
{ "$nin" => ["foo"] }
|
|
@@ -72,35 +72,7 @@ describe Mongoid::Criteria::Queryable::Selector do
|
|
|
72
72
|
end
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
-
context "when selector contains a $
|
|
76
|
-
|
|
77
|
-
let(:initial) do
|
|
78
|
-
{ :$nin => ["foo"] }
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
before do
|
|
82
|
-
selector["field"] = initial
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
context "when merging in a new $nin" do
|
|
86
|
-
|
|
87
|
-
let(:other) do
|
|
88
|
-
{ "field" => { :$nin => ["bar"] } }
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
before do
|
|
92
|
-
selector.merge!(other)
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
it "combines the two $nin queries into one" do
|
|
96
|
-
expect(selector).to eq({
|
|
97
|
-
"field" => { :$nin => ["foo", "bar"] }
|
|
98
|
-
})
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
context "when selector contains a $in string" do
|
|
75
|
+
context "when selector contains a $in" do
|
|
104
76
|
|
|
105
77
|
let(:initial) do
|
|
106
78
|
{ "$in" => [1, 2] }
|
|
@@ -145,51 +117,6 @@ describe Mongoid::Criteria::Queryable::Selector do
|
|
|
145
117
|
end
|
|
146
118
|
end
|
|
147
119
|
|
|
148
|
-
context "when selector contains a $in symbol" do
|
|
149
|
-
|
|
150
|
-
let(:initial) do
|
|
151
|
-
{ :$in => [1, 2] }
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
before do
|
|
155
|
-
selector["field"] = initial
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
context "when merging in a new $in with an intersecting value" do
|
|
159
|
-
|
|
160
|
-
let(:other) do
|
|
161
|
-
{ "field" => { :$in => [1] } }
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
before do
|
|
165
|
-
selector.merge!(other)
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
it "intersects the $in values" do
|
|
169
|
-
expect(selector).to eq({
|
|
170
|
-
"field" => { :$in => [1] }
|
|
171
|
-
})
|
|
172
|
-
end
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
context "when merging in a new $in with no intersecting values" do
|
|
176
|
-
|
|
177
|
-
let(:other) do
|
|
178
|
-
{ "field" => { :$in => [3] } }
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
before do
|
|
182
|
-
selector.merge!(other)
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
it "intersects the $in values" do
|
|
186
|
-
expect(selector).to eq({
|
|
187
|
-
"field" => { :$in => [] }
|
|
188
|
-
})
|
|
189
|
-
end
|
|
190
|
-
end
|
|
191
|
-
end
|
|
192
|
-
|
|
193
120
|
context "when selector is not nested" do
|
|
194
121
|
|
|
195
122
|
before do
|
|
@@ -460,8 +387,20 @@ describe Mongoid::Criteria::Queryable::Selector do
|
|
|
460
387
|
selector.send(method, "key", array)
|
|
461
388
|
end
|
|
462
389
|
|
|
463
|
-
|
|
464
|
-
|
|
390
|
+
context 'when serializing bigdecimal to string' do
|
|
391
|
+
config_override :map_big_decimal_to_decimal128, false
|
|
392
|
+
|
|
393
|
+
it "serializes each element in the array" do
|
|
394
|
+
expect(selector["key"]).to eq([ big_one.to_s, big_two.to_s ])
|
|
395
|
+
end
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
context 'when serializing bigdecimal to decimal128' do
|
|
399
|
+
config_override :map_big_decimal_to_decimal128, true
|
|
400
|
+
|
|
401
|
+
it "serializes each element in the array" do
|
|
402
|
+
expect(selector["key"]).to eq([ BSON::Decimal128.new(big_one), BSON::Decimal128.new(big_two)])
|
|
403
|
+
end
|
|
465
404
|
end
|
|
466
405
|
end
|
|
467
406
|
end
|
|
@@ -210,79 +210,7 @@ describe Mongoid::Criteria::Queryable::Storable do
|
|
|
210
210
|
}
|
|
211
211
|
end
|
|
212
212
|
end
|
|
213
|
-
|
|
214
|
-
context 'when value is a hash combine values with different operator keys' do
|
|
215
|
-
let(:base) do
|
|
216
|
-
query.add_field_expression('foo', {'$in' => ['bar']})
|
|
217
|
-
end
|
|
218
|
-
|
|
219
|
-
let(:modified) do
|
|
220
|
-
base.add_field_expression('foo', {'$nin' => ['zoom']})
|
|
221
|
-
end
|
|
222
|
-
|
|
223
|
-
it 'combines the conditions using $and' do
|
|
224
|
-
modified.selector.should == {
|
|
225
|
-
'foo' => {
|
|
226
|
-
'$in' => ['bar'],
|
|
227
|
-
'$nin' => ['zoom']
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
end
|
|
231
|
-
end
|
|
232
|
-
|
|
233
|
-
context 'when value is a hash with symbol operator key combine values with different operator keys' do
|
|
234
|
-
let(:base) do
|
|
235
|
-
query.add_field_expression('foo', {:$in => ['bar']})
|
|
236
|
-
end
|
|
237
|
-
|
|
238
|
-
let(:modified) do
|
|
239
|
-
base.add_field_expression('foo', {:$nin => ['zoom']})
|
|
240
|
-
end
|
|
241
|
-
|
|
242
|
-
it 'combines the conditions using $and' do
|
|
243
|
-
modified.selector.should == {
|
|
244
|
-
'foo' => {
|
|
245
|
-
:$in => ['bar'],
|
|
246
|
-
:$nin => ['zoom']
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
end
|
|
250
|
-
end
|
|
251
|
-
|
|
252
|
-
context 'when value is a hash add values with same operator keys using $and' do
|
|
253
|
-
let(:base) do
|
|
254
|
-
query.add_field_expression('foo', {'$in' => ['bar']})
|
|
255
|
-
end
|
|
256
|
-
|
|
257
|
-
let(:modified) do
|
|
258
|
-
base.add_field_expression('foo', {'$in' => ['zoom']})
|
|
259
|
-
end
|
|
260
|
-
|
|
261
|
-
it 'adds the new condition using $and' do
|
|
262
|
-
modified.selector.should == {
|
|
263
|
-
'foo' => {'$in' => ['bar']},
|
|
264
|
-
'$and' => ['foo' => {'$in' => ['zoom']}]
|
|
265
|
-
}
|
|
266
|
-
end
|
|
267
|
-
end
|
|
268
|
-
|
|
269
|
-
context 'when value is a hash with symbol operator key add values with same operator keys using $and' do
|
|
270
|
-
let(:base) do
|
|
271
|
-
query.add_field_expression('foo', {:$in => ['bar']})
|
|
272
|
-
end
|
|
273
|
-
|
|
274
|
-
let(:modified) do
|
|
275
|
-
base.add_field_expression('foo', {:$in => ['zoom']})
|
|
276
|
-
end
|
|
277
|
-
|
|
278
|
-
it 'adds the new condition using $and' do
|
|
279
|
-
modified.selector.should == {
|
|
280
|
-
'foo' => {:$in => ['bar']},
|
|
281
|
-
'$and' => ['foo' => {:$in => ['zoom']}]
|
|
282
|
-
}
|
|
283
|
-
end
|
|
284
213
|
end
|
|
285
|
-
end
|
|
286
214
|
|
|
287
215
|
describe '#add_operator_expression' do
|
|
288
216
|
let(:query_method) { :add_operator_expression }
|