mongoid 7.2.6 → 7.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +1 -1
- data/Rakefile +16 -0
- data/lib/config/locales/en.yml +2 -15
- data/lib/mongoid/association/accessors.rb +1 -1
- data/lib/mongoid/association/constrainable.rb +1 -1
- data/lib/mongoid/association/depending.rb +4 -4
- data/lib/mongoid/association/embedded/batchable.rb +1 -1
- data/lib/mongoid/association/embedded/embedded_in.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +11 -4
- data/lib/mongoid/association/nested/many.rb +1 -1
- data/lib/mongoid/association/nested/one.rb +4 -2
- data/lib/mongoid/association/proxy.rb +7 -2
- data/lib/mongoid/association/referenced/auto_save.rb +2 -2
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +493 -495
- data/lib/mongoid/association/referenced/has_many/proxy.rb +3 -3
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +2 -2
- data/lib/mongoid/association/relatable.rb +0 -2
- data/lib/mongoid/attributes/projector.rb +120 -0
- data/lib/mongoid/attributes.rb +24 -13
- data/lib/mongoid/cacheable.rb +2 -2
- data/lib/mongoid/clients/factory.rb +22 -8
- data/lib/mongoid/clients.rb +1 -1
- data/lib/mongoid/config/environment.rb +1 -9
- data/lib/mongoid/config.rb +19 -2
- data/lib/mongoid/contextual/aggregable/mongo.rb +10 -8
- data/lib/mongoid/contextual/atomic.rb +2 -7
- data/lib/mongoid/contextual/none.rb +0 -3
- data/lib/mongoid/copyable.rb +1 -1
- data/lib/mongoid/criteria/findable.rb +1 -1
- data/lib/mongoid/criteria/queryable/expandable.rb +0 -24
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions.rb +0 -4
- data/lib/mongoid/criteria/queryable/mergeable.rb +46 -20
- data/lib/mongoid/criteria/queryable/selectable.rb +10 -10
- data/lib/mongoid/criteria/queryable/storable.rb +4 -4
- data/lib/mongoid/criteria.rb +5 -6
- data/lib/mongoid/document.rb +3 -18
- data/lib/mongoid/errors/delete_restriction.rb +8 -9
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/errors.rb +0 -2
- data/lib/mongoid/evolvable.rb +1 -1
- data/lib/mongoid/extensions/boolean.rb +1 -2
- data/lib/mongoid/extensions/false_class.rb +1 -1
- data/lib/mongoid/extensions/hash.rb +2 -2
- data/lib/mongoid/extensions/true_class.rb +1 -1
- data/lib/mongoid/fields.rb +43 -5
- data/lib/mongoid/inspectable.rb +1 -1
- data/lib/mongoid/interceptable.rb +1 -1
- data/lib/mongoid/matcher/bits.rb +41 -0
- data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
- data/lib/mongoid/matcher/bits_all_set.rb +20 -0
- data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
- data/lib/mongoid/matcher/bits_any_set.rb +20 -0
- data/lib/mongoid/matcher/expression.rb +4 -0
- data/lib/mongoid/matcher/field_operator.rb +6 -0
- data/lib/mongoid/matcher/mod.rb +17 -0
- data/lib/mongoid/matcher/type.rb +99 -0
- data/lib/mongoid/matcher.rb +7 -0
- data/lib/mongoid/persistable/deletable.rb +1 -2
- data/lib/mongoid/persistable/destroyable.rb +8 -2
- data/lib/mongoid/persistable/updatable.rb +27 -2
- data/lib/mongoid/persistence_context.rb +1 -3
- data/lib/mongoid/query_cache.rb +36 -40
- data/lib/mongoid/selectable.rb +5 -7
- data/lib/mongoid/shardable.rb +21 -5
- data/lib/mongoid/tasks/database.rb +1 -1
- data/lib/mongoid/touchable.rb +23 -4
- data/lib/mongoid/validatable/associated.rb +1 -1
- data/lib/mongoid/validatable/presence.rb +3 -3
- data/lib/mongoid/validatable/uniqueness.rb +1 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid.rb +0 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +1 -1
- data/spec/integration/app_spec.rb +0 -3
- data/spec/integration/associations/embeds_many_spec.rb +44 -0
- data/spec/integration/associations/has_one_spec.rb +48 -0
- data/spec/integration/criteria/date_field_spec.rb +1 -1
- data/spec/integration/document_spec.rb +9 -0
- data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
- data/spec/integration/matcher_operator_data/comment.yml +22 -0
- data/spec/integration/matcher_operator_data/in.yml +16 -0
- data/spec/integration/matcher_operator_data/mod.yml +55 -0
- data/spec/integration/matcher_operator_data/type.yml +70 -0
- data/spec/integration/matcher_operator_data/type_array.yml +16 -0
- data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
- data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
- data/spec/integration/matcher_operator_data/type_code.yml +26 -0
- data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
- data/spec/integration/matcher_operator_data/type_date.yml +39 -0
- data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
- data/spec/integration/matcher_operator_data/type_decimal.yml +40 -0
- data/spec/integration/matcher_operator_data/type_double.yml +15 -0
- data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
- data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
- data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_null.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
- data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
- data/spec/integration/matcher_operator_data/type_string.yml +15 -0
- data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
- data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
- data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
- data/spec/integration/stringified_symbol_field_spec.rb +2 -2
- data/spec/lite_spec_helper.rb +2 -0
- data/spec/mongoid/association/depending_spec.rb +391 -352
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +4 -17
- data/spec/mongoid/association/nested/one_spec.rb +18 -14
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +25 -25
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +0 -20
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_many_models.rb +0 -17
- data/spec/mongoid/association/referenced/has_one_models.rb +8 -0
- data/spec/mongoid/atomic/paths_spec.rb +64 -12
- data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
- data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
- data/spec/mongoid/attributes/projector_spec.rb +41 -0
- data/spec/mongoid/attributes_spec.rb +98 -6
- data/spec/mongoid/clients/factory_spec.rb +51 -9
- data/spec/mongoid/clients/options_spec.rb +3 -11
- data/spec/mongoid/config/environment_spec.rb +8 -86
- data/spec/mongoid/config_spec.rb +32 -0
- data/spec/mongoid/contextual/atomic_spec.rb +25 -64
- data/spec/mongoid/contextual/geo_near_spec.rb +1 -1
- data/spec/mongoid/contextual/mongo_spec.rb +2 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +0 -73
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +105 -7
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +229 -24
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +1 -565
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
- data/spec/mongoid/criteria_projection_spec.rb +411 -0
- data/spec/mongoid/criteria_spec.rb +0 -279
- data/spec/mongoid/document_query_spec.rb +0 -51
- data/spec/mongoid/document_spec.rb +14 -34
- data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
- data/spec/mongoid/errors/mongoid_error_spec.rb +8 -20
- data/spec/mongoid/extensions/false_class_spec.rb +1 -1
- data/spec/mongoid/extensions/string_spec.rb +5 -5
- data/spec/mongoid/extensions/true_class_spec.rb +1 -1
- data/spec/mongoid/fields/localized_spec.rb +4 -4
- data/spec/mongoid/fields_spec.rb +4 -4
- data/spec/mongoid/inspectable_spec.rb +12 -4
- data/spec/mongoid/persistable/deletable_spec.rb +175 -1
- data/spec/mongoid/persistable/destroyable_spec.rb +191 -3
- data/spec/mongoid/persistable/savable_spec.rb +3 -5
- data/spec/mongoid/persistable/updatable_spec.rb +0 -2
- data/spec/mongoid/persistable/upsertable_spec.rb +1 -1
- data/spec/mongoid/persistable_spec.rb +2 -2
- data/spec/mongoid/query_cache_middleware_spec.rb +8 -0
- data/spec/mongoid/query_cache_spec.rb +0 -24
- data/spec/mongoid/reloadable_spec.rb +18 -1
- data/spec/mongoid/shardable_spec.rb +44 -0
- data/spec/mongoid/touchable_spec.rb +104 -16
- data/spec/mongoid/touchable_spec_models.rb +52 -0
- data/spec/mongoid/validatable_spec.rb +1 -1
- data/spec/shared/lib/mrss/cluster_config.rb +3 -8
- data/spec/shared/lib/mrss/constraints.rb +10 -41
- data/spec/shared/lib/mrss/docker_runner.rb +1 -7
- data/spec/shared/lib/mrss/server_version_registry.rb +12 -17
- data/spec/shared/lib/mrss/spec_organizer.rb +1 -18
- data/spec/shared/share/Dockerfile.erb +33 -125
- data/spec/shared/shlib/server.sh +23 -100
- data/spec/shared/shlib/set_env.sh +1 -4
- data/spec/spec_helper.rb +7 -3
- data/spec/support/client_registry.rb +9 -0
- data/spec/support/models/address.rb +0 -4
- data/spec/support/models/bolt.rb +8 -0
- data/spec/support/models/hole.rb +13 -0
- data/spec/support/models/mop.rb +0 -1
- data/spec/support/models/nut.rb +8 -0
- data/spec/support/models/person.rb +6 -9
- data/spec/support/models/sealer.rb +8 -0
- data/spec/support/models/shirt.rb +12 -0
- data/spec/support/models/spacer.rb +8 -0
- data/spec/support/models/threadlocker.rb +8 -0
- data/spec/support/models/washer.rb +8 -0
- data.tar.gz.sig +0 -0
- metadata +609 -545
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/empty_config_file.rb +0 -26
- data/lib/mongoid/errors/invalid_config_file.rb +0 -26
- data/spec/integration/contextual/empty_spec.rb +0 -142
- data/spec/mongoid/errors/invalid_config_file_spec.rb +0 -32
- data/spec/shared/bin/s3-copy +0 -45
- data/spec/shared/bin/s3-upload +0 -69
- data/spec/shared/lib/mrss/event_subscriber.rb +0 -200
- data/spec/shared/share/haproxy-1.conf +0 -16
- data/spec/shared/share/haproxy-2.conf +0 -17
- data/spec/support/cluster_config.rb +0 -158
|
@@ -44,7 +44,7 @@ describe Mongoid::Criteria::Queryable::Mergeable do
|
|
|
44
44
|
|
|
45
45
|
describe '#_mongoid_expand_keys' do
|
|
46
46
|
it 'expands simple keys' do
|
|
47
|
-
query.send(:_mongoid_expand_keys, {a: 1}).should == {a
|
|
47
|
+
query.send(:_mongoid_expand_keys, {a: 1}).should == {'a' => 1}
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
let(:gt) do
|
|
@@ -68,18 +68,116 @@ describe Mongoid::Criteria::Queryable::Mergeable do
|
|
|
68
68
|
'age' => {'$gt' => 42, '$lt' => 50}}
|
|
69
69
|
end
|
|
70
70
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
context 'given implicit equality and Key instance on the same field' do
|
|
72
|
+
[42, 'infinite', [nil]].each do |value|
|
|
73
|
+
context "for non-regular expression value #{value}" do
|
|
74
|
+
context 'implicit equality then Key instance' do
|
|
75
|
+
it 'expands implicit equality with $eq and combines with Key operator' do
|
|
76
|
+
query.send(:_mongoid_expand_keys, {'age' => value, lt => 50}).should == {
|
|
77
|
+
'age' => {'$eq' => value, '$lt' => 50}}
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
context 'symbol operator then implicit equality' do
|
|
82
|
+
it 'expands implicit equality with $eq and combines with Key operator' do
|
|
83
|
+
query.send(:_mongoid_expand_keys, {gt => 42, 'age' => value}).should == {
|
|
84
|
+
'age' => {'$gt' => 42, '$eq' => value}}
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
74
89
|
end
|
|
75
90
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
91
|
+
context 'given implicit equality with Regexp argument and Key instance on the same field' do
|
|
92
|
+
[/42/, BSON::Regexp::Raw.new('42')].each do |value|
|
|
93
|
+
context "for regular expression value #{value}" do
|
|
94
|
+
context 'implicit equality then Key instance' do
|
|
95
|
+
it 'expands implicit equality with $eq and combines with Key operator' do
|
|
96
|
+
query.send(:_mongoid_expand_keys, {'age' => value, lt => 50}).should == {
|
|
97
|
+
'age' => {'$regex' => value, '$lt' => 50}}
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
context 'Key instance then implicit equality' do
|
|
102
|
+
it 'expands implicit equality with $eq and combines with Key operator' do
|
|
103
|
+
query.send(:_mongoid_expand_keys, {gt => 50, 'age' => value}).should == {
|
|
104
|
+
'age' => {'$gt' => 50, '$regex' => value}}
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
79
109
|
end
|
|
80
110
|
|
|
81
111
|
it 'Ruby does not allow same symbol operator with different values' do
|
|
82
112
|
{gt => 42, gtp => 50}.should == {gtp => 50}
|
|
83
113
|
end
|
|
114
|
+
|
|
115
|
+
let(:expanded) do
|
|
116
|
+
query.send(:_mongoid_expand_keys, condition)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
context 'field name => value' do
|
|
120
|
+
shared_examples_for 'expands' do
|
|
121
|
+
|
|
122
|
+
it 'expands' do
|
|
123
|
+
expanded.should == {'foo' => 'bar'}
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
context 'string key' do
|
|
128
|
+
let(:condition) do
|
|
129
|
+
{'foo' => 'bar'}
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it_behaves_like 'expands'
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
context 'symbol key' do
|
|
136
|
+
let(:condition) do
|
|
137
|
+
{foo: 'bar'}
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it_behaves_like 'expands'
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
context 'Key instance => value' do
|
|
145
|
+
let(:key) do
|
|
146
|
+
Mongoid::Criteria::Queryable::Key.new(:foo, :__override__, '$gt')
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
let(:condition) do
|
|
150
|
+
{key => 'bar'}
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
it 'expands' do
|
|
154
|
+
expanded.should == {'foo' => {'$gt' => 'bar'}}
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
context 'operator => operator value expression' do
|
|
159
|
+
shared_examples_for 'expands' do
|
|
160
|
+
|
|
161
|
+
it 'expands' do
|
|
162
|
+
expanded.should == {'foo' => {'$in' => ['bar']}}
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
context 'string key' do
|
|
167
|
+
let(:condition) do
|
|
168
|
+
{foo: {'$in' => %w(bar)}}
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it_behaves_like 'expands'
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
context 'symbol key' do
|
|
175
|
+
let(:condition) do
|
|
176
|
+
{foo: {:$in => %w(bar)}}
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it_behaves_like 'expands'
|
|
180
|
+
end
|
|
181
|
+
end
|
|
84
182
|
end
|
|
85
183
|
end
|
|
@@ -417,6 +417,40 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
417
417
|
it_behaves_like 'returns a cloned query'
|
|
418
418
|
end
|
|
419
419
|
|
|
420
|
+
context 'when criteria use operators' do
|
|
421
|
+
shared_examples 'behave correctly' do
|
|
422
|
+
let(:selection) do
|
|
423
|
+
query.and(
|
|
424
|
+
{ field: {first_operator => [ 1, 2 ] }},
|
|
425
|
+
{ field: {second_operator => [ 3, 4 ] }},
|
|
426
|
+
)
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
it "combines via $and operator and stringifies all keys" do
|
|
430
|
+
expect(selection.selector).to eq({
|
|
431
|
+
"field" => {'$in' => [ 1, 2 ]},
|
|
432
|
+
"$and" => [
|
|
433
|
+
{ "field" => {'$in' => [ 3, 4 ] }}
|
|
434
|
+
]
|
|
435
|
+
})
|
|
436
|
+
end
|
|
437
|
+
end
|
|
438
|
+
|
|
439
|
+
[
|
|
440
|
+
['$in', '$in'],
|
|
441
|
+
[:$in, '$in'],
|
|
442
|
+
['$in', :$in],
|
|
443
|
+
[:$in, :$in],
|
|
444
|
+
].each do |first_operator, second_operator|
|
|
445
|
+
context "when first operator is #{first_operator.inspect} and second operator is #{second_operator.inspect}" do
|
|
446
|
+
let(:first_operator) { first_operator }
|
|
447
|
+
let(:second_operator) { second_operator }
|
|
448
|
+
|
|
449
|
+
include_examples 'behave correctly'
|
|
450
|
+
end
|
|
451
|
+
end
|
|
452
|
+
end
|
|
453
|
+
|
|
420
454
|
context 'when criteria are handled via Key' do
|
|
421
455
|
shared_examples_for 'adds the conditions to top level' do
|
|
422
456
|
|
|
@@ -467,12 +501,44 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
467
501
|
it_behaves_like 'returns a cloned query'
|
|
468
502
|
end
|
|
469
503
|
|
|
504
|
+
shared_examples_for 'combines conditions with $eq' do
|
|
505
|
+
|
|
506
|
+
it "combines conditions with $eq" do
|
|
507
|
+
expect(selection.selector).to eq({
|
|
508
|
+
"field" => {'$eq' => 3, '$lt' => 5},
|
|
509
|
+
})
|
|
510
|
+
end
|
|
511
|
+
|
|
512
|
+
it_behaves_like 'returns a cloned query'
|
|
513
|
+
end
|
|
514
|
+
|
|
515
|
+
shared_examples_for 'combines conditions with $regex' do
|
|
516
|
+
|
|
517
|
+
it "combines conditions with $regex" do
|
|
518
|
+
expect(selection.selector).to eq({
|
|
519
|
+
"field" => {'$regex' => /t/, '$lt' => 5},
|
|
520
|
+
})
|
|
521
|
+
end
|
|
522
|
+
|
|
523
|
+
it_behaves_like 'returns a cloned query'
|
|
524
|
+
end
|
|
525
|
+
|
|
470
526
|
context 'criteria are provided in the same hash' do
|
|
471
|
-
|
|
472
|
-
|
|
527
|
+
context 'non-regexp argument' do
|
|
528
|
+
let(:selection) do
|
|
529
|
+
query.send(tested_method, :field => 3, :field.lt => 5)
|
|
530
|
+
end
|
|
531
|
+
|
|
532
|
+
it_behaves_like 'combines conditions with $eq'
|
|
473
533
|
end
|
|
474
534
|
|
|
475
|
-
|
|
535
|
+
context 'regexp argument' do
|
|
536
|
+
let(:selection) do
|
|
537
|
+
query.send(tested_method, :field => /t/, :field.lt => 5)
|
|
538
|
+
end
|
|
539
|
+
|
|
540
|
+
it_behaves_like 'combines conditions with $regex'
|
|
541
|
+
end
|
|
476
542
|
end
|
|
477
543
|
|
|
478
544
|
context 'criteria are provided in separate hashes' do
|
|
@@ -505,12 +571,44 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
505
571
|
it_behaves_like 'returns a cloned query'
|
|
506
572
|
end
|
|
507
573
|
|
|
574
|
+
shared_examples_for 'combines conditions with $eq' do
|
|
575
|
+
|
|
576
|
+
it "combines conditions with $eq" do
|
|
577
|
+
expect(selection.selector).to eq({
|
|
578
|
+
"field" => {'$gt' => 3, '$eq' => 5},
|
|
579
|
+
})
|
|
580
|
+
end
|
|
581
|
+
|
|
582
|
+
it_behaves_like 'returns a cloned query'
|
|
583
|
+
end
|
|
584
|
+
|
|
585
|
+
shared_examples_for 'combines conditions with $regex' do
|
|
586
|
+
|
|
587
|
+
it "combines conditions with $regex" do
|
|
588
|
+
expect(selection.selector).to eq({
|
|
589
|
+
"field" => {'$gt' => 3, '$regex' => /t/},
|
|
590
|
+
})
|
|
591
|
+
end
|
|
592
|
+
|
|
593
|
+
it_behaves_like 'returns a cloned query'
|
|
594
|
+
end
|
|
595
|
+
|
|
508
596
|
context 'criteria are provided in the same hash' do
|
|
509
|
-
|
|
510
|
-
|
|
597
|
+
context 'non-regexp argument' do
|
|
598
|
+
let(:selection) do
|
|
599
|
+
query.send(tested_method, :field.gt => 3, :field => 5)
|
|
600
|
+
end
|
|
601
|
+
|
|
602
|
+
it_behaves_like 'combines conditions with $eq'
|
|
511
603
|
end
|
|
512
604
|
|
|
513
|
-
|
|
605
|
+
context 'regexp argument' do
|
|
606
|
+
let(:selection) do
|
|
607
|
+
query.send(tested_method, :field.gt => 3, :field => /t/)
|
|
608
|
+
end
|
|
609
|
+
|
|
610
|
+
it_behaves_like 'combines conditions with $regex'
|
|
611
|
+
end
|
|
514
612
|
end
|
|
515
613
|
|
|
516
614
|
context 'criteria are provided in separate hashes' do
|
|
@@ -1031,6 +1129,38 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
1031
1129
|
end
|
|
1032
1130
|
end
|
|
1033
1131
|
end
|
|
1132
|
+
|
|
1133
|
+
context 'when giving multiple conditions in one call on the same key with symbol operator' do
|
|
1134
|
+
|
|
1135
|
+
context 'non-regexp argument' do
|
|
1136
|
+
let(:selection) do
|
|
1137
|
+
query.send(tested_method, field: 1, :field.gt => 0)
|
|
1138
|
+
end
|
|
1139
|
+
|
|
1140
|
+
it 'combines conditions with $eq' do
|
|
1141
|
+
selection.selector.should == {
|
|
1142
|
+
expected_operator => [
|
|
1143
|
+
'field' => {'$eq' => 1, '$gt' => 0},
|
|
1144
|
+
]
|
|
1145
|
+
}
|
|
1146
|
+
end
|
|
1147
|
+
end
|
|
1148
|
+
|
|
1149
|
+
context 'regexp argument' do
|
|
1150
|
+
let(:selection) do
|
|
1151
|
+
query.send(tested_method, field: /t/, :field.gt => 0)
|
|
1152
|
+
end
|
|
1153
|
+
|
|
1154
|
+
it 'combines conditions with $regex' do
|
|
1155
|
+
selection.selector.should == {
|
|
1156
|
+
expected_operator => [
|
|
1157
|
+
'field' => {'$regex' => /t/, '$gt' => 0},
|
|
1158
|
+
]
|
|
1159
|
+
}
|
|
1160
|
+
end
|
|
1161
|
+
end
|
|
1162
|
+
|
|
1163
|
+
end
|
|
1034
1164
|
end
|
|
1035
1165
|
|
|
1036
1166
|
describe "#or" do
|
|
@@ -1270,14 +1400,28 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
1270
1400
|
it_behaves_like 'returns a cloned query'
|
|
1271
1401
|
end
|
|
1272
1402
|
|
|
1273
|
-
shared_examples_for '
|
|
1403
|
+
shared_examples_for 'combines conditions with $eq' do
|
|
1274
1404
|
|
|
1275
|
-
it "
|
|
1405
|
+
it "combines conditions with $eq" do
|
|
1276
1406
|
expect(selection.selector).to eq({
|
|
1277
|
-
'field' =>
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1407
|
+
'field' => {
|
|
1408
|
+
'$eq' => 3,
|
|
1409
|
+
'$lt' => 5,
|
|
1410
|
+
},
|
|
1411
|
+
})
|
|
1412
|
+
end
|
|
1413
|
+
|
|
1414
|
+
it_behaves_like 'returns a cloned query'
|
|
1415
|
+
end
|
|
1416
|
+
|
|
1417
|
+
shared_examples_for 'combines conditions with $regex' do
|
|
1418
|
+
|
|
1419
|
+
it "combines conditions with $regex" do
|
|
1420
|
+
expect(selection.selector).to eq({
|
|
1421
|
+
'field' => {
|
|
1422
|
+
'$regex' => /t/,
|
|
1423
|
+
'$lt' => 5,
|
|
1424
|
+
},
|
|
1281
1425
|
})
|
|
1282
1426
|
end
|
|
1283
1427
|
|
|
@@ -1285,11 +1429,21 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
1285
1429
|
end
|
|
1286
1430
|
|
|
1287
1431
|
context 'criteria are provided in the same hash' do
|
|
1288
|
-
|
|
1289
|
-
|
|
1432
|
+
context 'non-regexp argument' do
|
|
1433
|
+
let(:selection) do
|
|
1434
|
+
query.send(tested_method, :field => 3, :field.lt => 5)
|
|
1435
|
+
end
|
|
1436
|
+
|
|
1437
|
+
it_behaves_like 'combines conditions with $eq'
|
|
1290
1438
|
end
|
|
1291
1439
|
|
|
1292
|
-
|
|
1440
|
+
context 'regexp argument' do
|
|
1441
|
+
let(:selection) do
|
|
1442
|
+
query.send(tested_method, :field => /t/, :field.lt => 5)
|
|
1443
|
+
end
|
|
1444
|
+
|
|
1445
|
+
it_behaves_like 'combines conditions with $regex'
|
|
1446
|
+
end
|
|
1293
1447
|
end
|
|
1294
1448
|
|
|
1295
1449
|
context 'criteria are provided in separate hashes' do
|
|
@@ -1324,24 +1478,44 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
1324
1478
|
it_behaves_like 'returns a cloned query'
|
|
1325
1479
|
end
|
|
1326
1480
|
|
|
1327
|
-
shared_examples_for '
|
|
1481
|
+
shared_examples_for 'combines conditions with $eq' do
|
|
1328
1482
|
|
|
1329
|
-
it "
|
|
1330
|
-
expect(selection.selector).to eq(
|
|
1331
|
-
'field' => {'$gt' => 3},
|
|
1332
|
-
|
|
1333
|
-
|
|
1483
|
+
it "combines conditions with $eq" do
|
|
1484
|
+
expect(selection.selector).to eq(
|
|
1485
|
+
'field' => {'$gt' => 3, '$eq' => 5},
|
|
1486
|
+
)
|
|
1487
|
+
end
|
|
1488
|
+
|
|
1489
|
+
it_behaves_like 'returns a cloned query'
|
|
1490
|
+
end
|
|
1491
|
+
|
|
1492
|
+
shared_examples_for 'combines conditions with $regex' do
|
|
1493
|
+
|
|
1494
|
+
it "combines conditions with $regex" do
|
|
1495
|
+
expect(selection.selector).to eq(
|
|
1496
|
+
'field' => {'$gt' => 3, '$regex' => /t/},
|
|
1497
|
+
)
|
|
1334
1498
|
end
|
|
1335
1499
|
|
|
1336
1500
|
it_behaves_like 'returns a cloned query'
|
|
1337
1501
|
end
|
|
1338
1502
|
|
|
1339
1503
|
context 'criteria are provided in the same hash' do
|
|
1340
|
-
|
|
1341
|
-
|
|
1504
|
+
context 'non-regexp argument' do
|
|
1505
|
+
let(:selection) do
|
|
1506
|
+
query.send(tested_method, :field.gt => 3, :field => 5)
|
|
1507
|
+
end
|
|
1508
|
+
|
|
1509
|
+
it_behaves_like 'combines conditions with $eq'
|
|
1342
1510
|
end
|
|
1343
1511
|
|
|
1344
|
-
|
|
1512
|
+
context 'regexp argument' do
|
|
1513
|
+
let(:selection) do
|
|
1514
|
+
query.send(tested_method, :field.gt => 3, :field => /t/)
|
|
1515
|
+
end
|
|
1516
|
+
|
|
1517
|
+
it_behaves_like 'combines conditions with $regex'
|
|
1518
|
+
end
|
|
1345
1519
|
end
|
|
1346
1520
|
|
|
1347
1521
|
context 'criteria are provided in separate hashes' do
|
|
@@ -1861,5 +2035,36 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
|
1861
2035
|
)
|
|
1862
2036
|
end
|
|
1863
2037
|
end
|
|
2038
|
+
|
|
2039
|
+
context 'when giving multiple conditions in one call on the same key with symbol operator' do
|
|
2040
|
+
|
|
2041
|
+
context 'non-regexp argument' do
|
|
2042
|
+
let(:selection) do
|
|
2043
|
+
query.not(field: 1, :field.gt => 0)
|
|
2044
|
+
end
|
|
2045
|
+
|
|
2046
|
+
it 'combines conditions with $eq' do
|
|
2047
|
+
selection.selector.should == {
|
|
2048
|
+
'$and' => ['$nor' => [
|
|
2049
|
+
'field' => {'$eq' => 1, '$gt' => 0},
|
|
2050
|
+
]]
|
|
2051
|
+
}
|
|
2052
|
+
end
|
|
2053
|
+
end
|
|
2054
|
+
|
|
2055
|
+
context 'regexp argument' do
|
|
2056
|
+
let(:selection) do
|
|
2057
|
+
query.not(field: /t/, :field.gt => 0)
|
|
2058
|
+
end
|
|
2059
|
+
|
|
2060
|
+
it 'combines conditions with $regex' do
|
|
2061
|
+
selection.selector.should == {
|
|
2062
|
+
'$and' => ['$nor' => [
|
|
2063
|
+
'field' => {'$regex' => /t/, '$gt' => 0},
|
|
2064
|
+
]]
|
|
2065
|
+
}
|
|
2066
|
+
end
|
|
2067
|
+
end
|
|
2068
|
+
end
|
|
1864
2069
|
end
|
|
1865
2070
|
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
shared_examples_for "returns a cloned query" do
|
|
5
|
+
|
|
6
|
+
it "returns a cloned query" do
|
|
7
|
+
expect(selection).to_not equal(query)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
shared_examples_for 'requires an argument' do
|
|
12
|
+
context "when provided no argument" do
|
|
13
|
+
|
|
14
|
+
let(:selection) do
|
|
15
|
+
query.send(query_method)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "raises ArgumentError" do
|
|
19
|
+
expect do
|
|
20
|
+
selection.selector
|
|
21
|
+
end.to raise_error(ArgumentError)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
shared_examples_for 'requires a non-nil argument' do
|
|
27
|
+
context "when provided nil" do
|
|
28
|
+
|
|
29
|
+
let(:selection) do
|
|
30
|
+
query.send(query_method, nil)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "raises CriteriaArgumentRequired" do
|
|
34
|
+
expect do
|
|
35
|
+
selection.selector
|
|
36
|
+
end.to raise_error(Mongoid::Errors::CriteriaArgumentRequired, /#{query_method}/)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|