mongoid 5.4.1 → 6.0.0.beta
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 +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/config/locales/en.yml +23 -16
- data/lib/mongoid.rb +4 -9
- data/lib/mongoid/atomic.rb +1 -1
- data/lib/mongoid/atomic/modifiers.rb +8 -12
- data/lib/mongoid/attributes.rb +9 -11
- data/lib/mongoid/attributes/dynamic.rb +5 -6
- data/lib/mongoid/attributes/nested.rb +1 -1
- data/lib/mongoid/attributes/processing.rb +4 -0
- data/lib/mongoid/attributes/readonly.rb +22 -0
- data/lib/mongoid/cacheable.rb +36 -0
- data/lib/mongoid/changeable.rb +37 -1
- data/lib/mongoid/clients.rb +0 -63
- data/lib/mongoid/clients/factory.rb +0 -2
- data/lib/mongoid/clients/options.rb +54 -249
- data/lib/mongoid/clients/storage_options.rb +1 -69
- data/lib/mongoid/composable.rb +26 -2
- data/lib/mongoid/config.rb +1 -1
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -0
- data/lib/mongoid/contextual/atomic.rb +6 -9
- data/lib/mongoid/contextual/geo_near.rb +2 -3
- data/lib/mongoid/contextual/map_reduce.rb +97 -24
- data/lib/mongoid/contextual/memory.rb +7 -4
- data/lib/mongoid/contextual/mongo.rb +63 -54
- data/lib/mongoid/contextual/none.rb +2 -2
- data/lib/mongoid/copyable.rb +19 -19
- data/lib/mongoid/criteria.rb +5 -4
- data/lib/mongoid/criteria/findable.rb +2 -3
- data/lib/mongoid/criteria/includable.rb +63 -16
- data/lib/mongoid/criteria/marshalable.rb +2 -2
- data/lib/mongoid/criteria/modifiable.rb +17 -1
- data/lib/mongoid/criteria/options.rb +25 -0
- data/lib/mongoid/criteria/queryable.rb +86 -0
- data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
- data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
- data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
- data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +45 -0
- data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
- data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
- data/lib/mongoid/criteria/queryable/key.rb +103 -0
- data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
- data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
- data/lib/mongoid/criteria/queryable/optional.rb +411 -0
- data/lib/mongoid/criteria/queryable/options.rb +136 -0
- data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
- data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
- data/lib/mongoid/criteria/queryable/selector.rb +196 -0
- data/lib/mongoid/criteria/queryable/smash.rb +103 -0
- data/lib/mongoid/document.rb +9 -23
- data/lib/mongoid/errors.rb +2 -1
- data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
- data/lib/mongoid/errors/delete_restriction.rb +2 -2
- data/lib/mongoid/errors/invalid_field.rb +2 -2
- data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
- data/lib/mongoid/errors/invalid_relation.rb +66 -0
- data/lib/mongoid/errors/inverse_not_found.rb +1 -1
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/evolvable.rb +1 -1
- data/lib/mongoid/extensions.rb +0 -5
- data/lib/mongoid/extensions/big_decimal.rb +17 -8
- data/lib/mongoid/extensions/date.rb +4 -1
- data/lib/mongoid/extensions/hash.rb +2 -3
- data/lib/mongoid/extensions/object.rb +2 -2
- data/lib/mongoid/extensions/string.rb +4 -3
- data/lib/mongoid/extensions/time.rb +5 -2
- data/lib/mongoid/factory.rb +1 -0
- data/lib/mongoid/fields/foreign_key.rb +2 -2
- data/lib/mongoid/fields/localized.rb +3 -8
- data/lib/mongoid/fields/validators/macro.rb +18 -0
- data/lib/mongoid/findable.rb +3 -3
- data/lib/mongoid/indexable.rb +17 -16
- data/lib/mongoid/indexable/specification.rb +1 -1
- data/lib/mongoid/indexable/validators/options.rb +1 -2
- data/lib/mongoid/interceptable.rb +6 -17
- data/lib/mongoid/loggable.rb +1 -1
- data/lib/mongoid/matchable.rb +3 -10
- data/lib/mongoid/matchable/gt.rb +2 -0
- data/lib/mongoid/matchable/gte.rb +2 -0
- data/lib/mongoid/matchable/lt.rb +2 -0
- data/lib/mongoid/matchable/lte.rb +2 -0
- data/lib/mongoid/persistable.rb +6 -5
- data/lib/mongoid/persistable/creatable.rb +2 -0
- data/lib/mongoid/persistable/deletable.rb +7 -3
- data/lib/mongoid/persistable/settable.rb +3 -16
- data/lib/mongoid/persistable/updatable.rb +10 -12
- data/lib/mongoid/persistence_context.rb +216 -0
- data/lib/mongoid/query_cache.rb +5 -30
- data/lib/mongoid/relations/accessors.rb +6 -2
- data/lib/mongoid/relations/auto_save.rb +12 -4
- data/lib/mongoid/relations/bindings/embedded/in.rb +4 -0
- data/lib/mongoid/relations/bindings/embedded/many.rb +8 -1
- data/lib/mongoid/relations/bindings/embedded/one.rb +10 -0
- data/lib/mongoid/relations/bindings/referenced/many.rb +4 -0
- data/lib/mongoid/relations/builders.rb +2 -2
- data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
- data/lib/mongoid/relations/conversions.rb +1 -1
- data/lib/mongoid/relations/counter_cache.rb +28 -18
- data/lib/mongoid/relations/eager.rb +19 -7
- data/lib/mongoid/relations/eager/base.rb +5 -5
- data/lib/mongoid/relations/embedded/batchable.rb +9 -33
- data/lib/mongoid/relations/embedded/in.rb +16 -2
- data/lib/mongoid/relations/embedded/many.rb +23 -8
- data/lib/mongoid/relations/embedded/one.rb +17 -2
- data/lib/mongoid/relations/macros.rb +9 -2
- data/lib/mongoid/relations/metadata.rb +3 -3
- data/lib/mongoid/relations/nested_builder.rb +1 -1
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/proxy.rb +2 -33
- data/lib/mongoid/relations/referenced/in.rb +23 -11
- data/lib/mongoid/relations/referenced/many.rb +24 -16
- data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
- data/lib/mongoid/relations/referenced/one.rb +17 -1
- data/lib/mongoid/relations/reflections.rb +3 -5
- data/lib/mongoid/relations/touchable.rb +1 -1
- data/lib/mongoid/reloadable.rb +1 -1
- data/lib/mongoid/scopable.rb +3 -3
- data/lib/mongoid/serializable.rb +2 -3
- data/lib/mongoid/tasks/database.rb +1 -2
- data/lib/mongoid/threaded.rb +4 -4
- data/lib/mongoid/traversable.rb +1 -1
- data/lib/mongoid/validatable.rb +1 -1
- data/lib/mongoid/validatable/macros.rb +2 -4
- data/lib/mongoid/validatable/uniqueness.rb +1 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -7
- data/spec/app/models/album.rb +5 -1
- data/spec/app/models/artist.rb +21 -0
- data/spec/app/models/band.rb +0 -1
- data/spec/app/models/church.rb +0 -2
- data/spec/app/models/ordered_post.rb +5 -0
- data/spec/app/models/oscar.rb +1 -2
- data/spec/app/models/person.rb +3 -1
- data/spec/app/models/post.rb +0 -1
- data/spec/app/models/princess.rb +2 -0
- data/spec/app/models/record.rb +1 -0
- data/spec/app/models/thing.rb +1 -1
- data/spec/config/mongoid.yml +1 -5
- data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
- data/spec/mongoid/atomic_spec.rb +17 -17
- data/spec/mongoid/attributes/nested_spec.rb +14 -14
- data/spec/mongoid/attributes/readonly_spec.rb +87 -44
- data/spec/mongoid/attributes_spec.rb +63 -0
- data/spec/mongoid/cacheable_spec.rb +112 -0
- data/spec/mongoid/changeable_spec.rb +58 -0
- data/spec/mongoid/clients/factory_spec.rb +3 -11
- data/spec/mongoid/clients/options_spec.rb +378 -96
- data/spec/mongoid/clients_spec.rb +207 -170
- data/spec/mongoid/composable_spec.rb +7 -0
- data/spec/mongoid/config_spec.rb +41 -21
- data/spec/mongoid/contextual/atomic_spec.rb +77 -343
- data/spec/mongoid/contextual/map_reduce_spec.rb +119 -111
- data/spec/mongoid/contextual/memory_spec.rb +56 -316
- data/spec/mongoid/contextual/mongo_spec.rb +104 -378
- data/spec/mongoid/copyable_spec.rb +8 -15
- data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
- data/spec/mongoid/criteria/options_spec.rb +29 -0
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
- data/spec/mongoid/{extensions/origin/regexp_raw_spec.rb → criteria/queryable/extensions/regexp_spec.rb} +21 -20
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
- data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
- data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +1786 -0
- data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +4159 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +778 -0
- data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
- data/spec/mongoid/criteria_spec.rb +45 -63
- data/spec/mongoid/document_spec.rb +21 -88
- data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
- data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
- data/spec/mongoid/extensions/date_spec.rb +2 -6
- data/spec/mongoid/extensions/date_time_spec.rb +2 -6
- data/spec/mongoid/extensions/float_spec.rb +8 -1
- data/spec/mongoid/extensions/integer_spec.rb +8 -1
- data/spec/mongoid/extensions/object_spec.rb +11 -0
- data/spec/mongoid/extensions/string_spec.rb +21 -0
- data/spec/mongoid/extensions/time_spec.rb +4 -8
- data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
- data/spec/mongoid/fields/localized_spec.rb +0 -91
- data/spec/mongoid/findable_spec.rb +46 -1
- data/spec/mongoid/indexable_spec.rb +6 -46
- data/spec/mongoid/interceptable_spec.rb +49 -10
- data/spec/mongoid/matchable/gt_spec.rb +11 -0
- data/spec/mongoid/matchable/gte_spec.rb +10 -0
- data/spec/mongoid/matchable/lt_spec.rb +11 -0
- data/spec/mongoid/matchable/lte_spec.rb +11 -0
- data/spec/mongoid/matchable_spec.rb +1 -51
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +1 -1
- data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
- data/spec/mongoid/persistable/savable_spec.rb +30 -30
- data/spec/mongoid/persistable/settable_spec.rb +0 -185
- data/spec/mongoid/persistable/updatable_spec.rb +166 -5
- data/spec/mongoid/persistence_context_spec.rb +654 -0
- data/spec/mongoid/positional_spec.rb +10 -10
- data/spec/mongoid/query_cache_spec.rb +89 -65
- data/spec/mongoid/relations/accessors_spec.rb +1 -1
- data/spec/mongoid/relations/auto_save_spec.rb +39 -6
- data/spec/mongoid/relations/builders_spec.rb +37 -10
- data/spec/mongoid/relations/counter_cache_spec.rb +64 -15
- data/spec/mongoid/relations/cyclic_spec.rb +0 -22
- data/spec/mongoid/relations/embedded/many_spec.rb +9 -41
- data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
- data/spec/mongoid/relations/macros_spec.rb +395 -7
- data/spec/mongoid/relations/proxy_spec.rb +3 -1
- data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
- data/spec/mongoid/relations/referenced/many_spec.rb +6 -29
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +6 -29
- data/spec/mongoid/relations/reflections_spec.rb +9 -9
- data/spec/mongoid/reloadable_spec.rb +51 -0
- data/spec/mongoid/scopable_spec.rb +0 -12
- data/spec/mongoid/serializable_spec.rb +0 -50
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +16 -9
- data/spec/mongoid/validatable_spec.rb +16 -0
- data/spec/spec_helper.rb +10 -10
- metadata +536 -479
- metadata.gz.sig +0 -0
- data/lib/mongoid/clients/thread_options.rb +0 -19
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -20
- data/lib/mongoid/extensions/decimal128.rb +0 -39
- data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
- data/lib/mongoid/matchable/regexp.rb +0 -27
- data/spec/app/models/post_genre.rb +0 -6
- data/spec/mongoid/extensions/decimal128_spec.rb +0 -44
- data/spec/mongoid/matchable/regexp_spec.rb +0 -59
@@ -115,6 +115,21 @@ describe Mongoid::Contextual::Mongo do
|
|
115
115
|
end
|
116
116
|
end
|
117
117
|
|
118
|
+
context "when provided a document" do
|
119
|
+
|
120
|
+
let(:context) do
|
121
|
+
described_class.new(criteria)
|
122
|
+
end
|
123
|
+
|
124
|
+
let(:count) do
|
125
|
+
context.count(depeche)
|
126
|
+
end
|
127
|
+
|
128
|
+
it "returns the number of documents that match" do
|
129
|
+
expect(count).to eq(1)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
118
133
|
context "when provided a block" do
|
119
134
|
|
120
135
|
let(:context) do
|
@@ -167,28 +182,6 @@ describe Mongoid::Contextual::Mongo do
|
|
167
182
|
expect(count).to eq(2)
|
168
183
|
end
|
169
184
|
end
|
170
|
-
|
171
|
-
context 'when a collation is specified', if: collation_supported? do
|
172
|
-
|
173
|
-
let(:context) do
|
174
|
-
described_class.new(criteria)
|
175
|
-
end
|
176
|
-
|
177
|
-
context 'when the collation is specified on the criteria' do
|
178
|
-
|
179
|
-
let(:criteria) do
|
180
|
-
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
181
|
-
end
|
182
|
-
|
183
|
-
let(:count) do
|
184
|
-
context.count
|
185
|
-
end
|
186
|
-
|
187
|
-
it 'applies the collation' do
|
188
|
-
expect(count).to eq(1)
|
189
|
-
end
|
190
|
-
end
|
191
|
-
end
|
192
185
|
end
|
193
186
|
|
194
187
|
[ :delete, :delete_all ].each do |method|
|
@@ -230,34 +223,7 @@ describe Mongoid::Contextual::Mongo do
|
|
230
223
|
end
|
231
224
|
end
|
232
225
|
|
233
|
-
context
|
234
|
-
|
235
|
-
let(:criteria) do
|
236
|
-
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
237
|
-
end
|
238
|
-
|
239
|
-
let(:context) do
|
240
|
-
described_class.new(criteria)
|
241
|
-
end
|
242
|
-
|
243
|
-
let!(:deleted) do
|
244
|
-
context.send(method)
|
245
|
-
end
|
246
|
-
|
247
|
-
it "deletes the matching documents" do
|
248
|
-
expect(Band.find(new_order.id)).to eq(new_order)
|
249
|
-
end
|
250
|
-
|
251
|
-
it "deletes the correct number of documents" do
|
252
|
-
expect(Band.count).to eq(1)
|
253
|
-
end
|
254
|
-
|
255
|
-
it "returns the number of documents deleted" do
|
256
|
-
expect(deleted).to eq(1)
|
257
|
-
end
|
258
|
-
end
|
259
|
-
|
260
|
-
context "when the selector is not constraining" do
|
226
|
+
context "when the selector is not contraining" do
|
261
227
|
|
262
228
|
let(:criteria) do
|
263
229
|
Band.all
|
@@ -315,33 +281,6 @@ describe Mongoid::Contextual::Mongo do
|
|
315
281
|
it "returns the number of documents destroyed" do
|
316
282
|
expect(destroyed).to eq(1)
|
317
283
|
end
|
318
|
-
|
319
|
-
context 'when the criteria has a collation', if: collation_supported? do
|
320
|
-
|
321
|
-
let(:criteria) do
|
322
|
-
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
323
|
-
end
|
324
|
-
|
325
|
-
let(:context) do
|
326
|
-
described_class.new(criteria)
|
327
|
-
end
|
328
|
-
|
329
|
-
let!(:destroyed) do
|
330
|
-
context.send(method)
|
331
|
-
end
|
332
|
-
|
333
|
-
it "destroys the matching documents" do
|
334
|
-
expect(Band.find(new_order.id)).to eq(new_order)
|
335
|
-
end
|
336
|
-
|
337
|
-
it "destroys the correct number of documents" do
|
338
|
-
expect(Band.count).to eq(1)
|
339
|
-
end
|
340
|
-
|
341
|
-
it "returns the number of documents destroyed" do
|
342
|
-
expect(destroyed).to eq(1)
|
343
|
-
end
|
344
|
-
end
|
345
284
|
end
|
346
285
|
|
347
286
|
context "when the selector is not contraining" do
|
@@ -416,29 +355,6 @@ describe Mongoid::Contextual::Mongo do
|
|
416
355
|
expect(context.distinct(:years)).to eq([ 30, 25 ])
|
417
356
|
end
|
418
357
|
end
|
419
|
-
|
420
|
-
context 'when a collation is specified', if: collation_supported? do
|
421
|
-
|
422
|
-
before do
|
423
|
-
Band.create(name: 'DEPECHE MODE')
|
424
|
-
end
|
425
|
-
|
426
|
-
let(:context) do
|
427
|
-
described_class.new(criteria)
|
428
|
-
end
|
429
|
-
|
430
|
-
let(:expected_results) do
|
431
|
-
["Depeche Mode", "New Order"]
|
432
|
-
end
|
433
|
-
|
434
|
-
let(:criteria) do
|
435
|
-
Band.where({}).collation(locale: 'en_US', strength: 2)
|
436
|
-
end
|
437
|
-
|
438
|
-
it 'applies the collation' do
|
439
|
-
expect(context.distinct(:name)).to eq(expected_results)
|
440
|
-
end
|
441
|
-
end
|
442
358
|
end
|
443
359
|
|
444
360
|
describe "#each" do
|
@@ -455,29 +371,6 @@ describe Mongoid::Contextual::Mongo do
|
|
455
371
|
described_class.new(criteria)
|
456
372
|
end
|
457
373
|
|
458
|
-
context 'when the criteria has a collation', if: collation_supported? do
|
459
|
-
|
460
|
-
let(:criteria) do
|
461
|
-
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
462
|
-
end
|
463
|
-
|
464
|
-
it "yields mongoid documents to the block" do
|
465
|
-
context.each do |doc|
|
466
|
-
expect(doc).to be_a(Mongoid::Document)
|
467
|
-
end
|
468
|
-
end
|
469
|
-
|
470
|
-
it "iterates over the matching documents" do
|
471
|
-
context.each do |doc|
|
472
|
-
expect(doc.name).to eq("Depeche Mode")
|
473
|
-
end
|
474
|
-
end
|
475
|
-
|
476
|
-
it "returns self" do
|
477
|
-
expect(context.each{}).to be(context)
|
478
|
-
end
|
479
|
-
end
|
480
|
-
|
481
374
|
context "when providing a block" do
|
482
375
|
|
483
376
|
it "yields mongoid documents to the block" do
|
@@ -520,22 +413,9 @@ describe Mongoid::Contextual::Mongo do
|
|
520
413
|
|
521
414
|
context "when iterating with next" do
|
522
415
|
|
523
|
-
before do
|
524
|
-
10.times { |i| Band.create(name: "Test #{i}") }
|
525
|
-
end
|
526
|
-
|
527
|
-
let(:criteria) do
|
528
|
-
Band.batch_size(5)
|
529
|
-
end
|
530
|
-
|
531
416
|
it "yields mongoid documents" do
|
532
417
|
expect(enum.next).to be_a(Mongoid::Document)
|
533
418
|
end
|
534
|
-
|
535
|
-
it "does not load all documents" do
|
536
|
-
expect(Mongo::Logger.logger).to receive(:debug?).exactly(2).times.and_call_original
|
537
|
-
enum.next
|
538
|
-
end
|
539
419
|
end
|
540
420
|
end
|
541
421
|
end
|
@@ -677,7 +557,7 @@ describe Mongoid::Contextual::Mongo do
|
|
677
557
|
end
|
678
558
|
end
|
679
559
|
|
680
|
-
describe "#
|
560
|
+
describe "#find_one_and_update" do
|
681
561
|
|
682
562
|
let!(:depeche) do
|
683
563
|
Band.create(name: "Depeche Mode")
|
@@ -700,7 +580,7 @@ describe Mongoid::Contextual::Mongo do
|
|
700
580
|
end
|
701
581
|
|
702
582
|
let!(:result) do
|
703
|
-
context.
|
583
|
+
context.find_one_and_update("$inc" => { likes: 1 })
|
704
584
|
end
|
705
585
|
|
706
586
|
it "returns the first matching document" do
|
@@ -708,7 +588,7 @@ describe Mongoid::Contextual::Mongo do
|
|
708
588
|
end
|
709
589
|
|
710
590
|
it "updates the document in the database" do
|
711
|
-
expect(depeche.reload.
|
591
|
+
expect(depeche.reload.likes).to eq(1)
|
712
592
|
end
|
713
593
|
end
|
714
594
|
|
@@ -723,7 +603,7 @@ describe Mongoid::Contextual::Mongo do
|
|
723
603
|
end
|
724
604
|
|
725
605
|
let!(:result) do
|
726
|
-
context.
|
606
|
+
context.find_one_and_update("$inc" => { likes: 1 })
|
727
607
|
end
|
728
608
|
|
729
609
|
it "returns the first matching document" do
|
@@ -732,7 +612,6 @@ describe Mongoid::Contextual::Mongo do
|
|
732
612
|
|
733
613
|
it "updates the document in the database" do
|
734
614
|
expect(tool.reload.likes).to eq(1)
|
735
|
-
expect(tool.reload.name).to be_nil
|
736
615
|
end
|
737
616
|
end
|
738
617
|
|
@@ -747,7 +626,7 @@ describe Mongoid::Contextual::Mongo do
|
|
747
626
|
end
|
748
627
|
|
749
628
|
let!(:result) do
|
750
|
-
context.
|
629
|
+
context.find_one_and_update("$inc" => { likes: 1 })
|
751
630
|
end
|
752
631
|
|
753
632
|
it "returns the first matching document" do
|
@@ -774,7 +653,7 @@ describe Mongoid::Contextual::Mongo do
|
|
774
653
|
end
|
775
654
|
|
776
655
|
let!(:result) do
|
777
|
-
context.
|
656
|
+
context.find_one_and_update({ "$inc" => { likes: 1 }}, return_document: :after)
|
778
657
|
end
|
779
658
|
|
780
659
|
it "returns the first matching document" do
|
@@ -782,15 +661,14 @@ describe Mongoid::Contextual::Mongo do
|
|
782
661
|
end
|
783
662
|
|
784
663
|
it "returns the updated document" do
|
785
|
-
expect(result.name).to be_nil
|
786
664
|
expect(result.likes).to eq(1)
|
787
665
|
end
|
788
666
|
end
|
789
667
|
|
790
|
-
context
|
668
|
+
context "when removing" do
|
791
669
|
|
792
670
|
let(:criteria) do
|
793
|
-
Band.where(name: "
|
671
|
+
Band.where(name: "Depeche Mode")
|
794
672
|
end
|
795
673
|
|
796
674
|
let(:context) do
|
@@ -798,16 +676,17 @@ describe Mongoid::Contextual::Mongo do
|
|
798
676
|
end
|
799
677
|
|
800
678
|
let!(:result) do
|
801
|
-
context.
|
679
|
+
context.find_one_and_delete
|
802
680
|
end
|
803
681
|
|
804
682
|
it "returns the first matching document" do
|
805
683
|
expect(result).to eq(depeche)
|
806
684
|
end
|
807
685
|
|
808
|
-
it "
|
809
|
-
expect
|
810
|
-
|
686
|
+
it "deletes the document from the database" do
|
687
|
+
expect {
|
688
|
+
depeche.reload
|
689
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
811
690
|
end
|
812
691
|
end
|
813
692
|
end
|
@@ -815,7 +694,7 @@ describe Mongoid::Contextual::Mongo do
|
|
815
694
|
context "when the selector does not match" do
|
816
695
|
|
817
696
|
let(:criteria) do
|
818
|
-
Band.where(name: "
|
697
|
+
Band.where(name: "Placebo")
|
819
698
|
end
|
820
699
|
|
821
700
|
let(:context) do
|
@@ -823,7 +702,7 @@ describe Mongoid::Contextual::Mongo do
|
|
823
702
|
end
|
824
703
|
|
825
704
|
let(:result) do
|
826
|
-
context.
|
705
|
+
context.find_one_and_update("$inc" => { likes: 1 })
|
827
706
|
end
|
828
707
|
|
829
708
|
it "returns nil" do
|
@@ -832,19 +711,19 @@ describe Mongoid::Contextual::Mongo do
|
|
832
711
|
end
|
833
712
|
end
|
834
713
|
|
835
|
-
|
714
|
+
[ :first, :one ].each do |method|
|
836
715
|
|
837
|
-
|
838
|
-
Band.create(name: "Depeche Mode")
|
839
|
-
end
|
716
|
+
describe "##{method}" do
|
840
717
|
|
841
|
-
|
842
|
-
|
843
|
-
|
718
|
+
let!(:depeche_mode) do
|
719
|
+
Band.create(name: "Depeche Mode")
|
720
|
+
end
|
844
721
|
|
845
|
-
|
722
|
+
let!(:new_order) do
|
723
|
+
Band.create(name: "New Order")
|
724
|
+
end
|
846
725
|
|
847
|
-
context "when not
|
726
|
+
context "when the context is not cached" do
|
848
727
|
|
849
728
|
let(:criteria) do
|
850
729
|
Band.where(name: "Depeche Mode")
|
@@ -854,20 +733,12 @@ describe Mongoid::Contextual::Mongo do
|
|
854
733
|
described_class.new(criteria)
|
855
734
|
end
|
856
735
|
|
857
|
-
let!(:result) do
|
858
|
-
context.find_one_and_update("$inc" => { likes: 1 })
|
859
|
-
end
|
860
|
-
|
861
736
|
it "returns the first matching document" do
|
862
|
-
expect(
|
863
|
-
end
|
864
|
-
|
865
|
-
it "updates the document in the database" do
|
866
|
-
expect(depeche.reload.likes).to eq(1)
|
737
|
+
expect(context.send(method)).to eq(depeche_mode)
|
867
738
|
end
|
868
739
|
end
|
869
740
|
|
870
|
-
context "when
|
741
|
+
context "when using .desc" do
|
871
742
|
|
872
743
|
let(:criteria) do
|
873
744
|
Band.desc(:name)
|
@@ -877,249 +748,104 @@ describe Mongoid::Contextual::Mongo do
|
|
877
748
|
described_class.new(criteria)
|
878
749
|
end
|
879
750
|
|
880
|
-
|
881
|
-
context.find_one_and_update("$inc" => { likes: 1 })
|
882
|
-
end
|
883
|
-
|
884
|
-
it "returns the first matching document" do
|
885
|
-
expect(result).to eq(tool)
|
886
|
-
end
|
887
|
-
|
888
|
-
it "updates the document in the database" do
|
889
|
-
expect(tool.reload.likes).to eq(1)
|
890
|
-
end
|
891
|
-
end
|
892
|
-
|
893
|
-
context "when limiting fields" do
|
894
|
-
|
895
|
-
let(:criteria) do
|
896
|
-
Band.only(:_id)
|
897
|
-
end
|
898
|
-
|
899
|
-
let(:context) do
|
900
|
-
described_class.new(criteria)
|
901
|
-
end
|
902
|
-
|
903
|
-
let!(:result) do
|
904
|
-
context.find_one_and_update("$inc" => { likes: 1 })
|
905
|
-
end
|
751
|
+
context "when there is sort on the context" do
|
906
752
|
|
907
|
-
|
908
|
-
|
753
|
+
it "follows the main sort" do
|
754
|
+
expect(context.send(method)).to eq(new_order)
|
755
|
+
end
|
909
756
|
end
|
910
757
|
|
911
|
-
|
912
|
-
expect(result.name).to be_nil
|
913
|
-
end
|
758
|
+
context "when subsequently calling #last" do
|
914
759
|
|
915
|
-
|
916
|
-
|
760
|
+
it "returns the correct document" do
|
761
|
+
expect(context.send(method)).to eq(new_order)
|
762
|
+
expect(context.last).to eq(depeche_mode)
|
763
|
+
end
|
917
764
|
end
|
918
765
|
end
|
919
766
|
|
920
|
-
context
|
767
|
+
context 'when the criteria has no sort' do
|
921
768
|
|
922
769
|
let(:criteria) do
|
923
|
-
Band.
|
770
|
+
Band.all
|
924
771
|
end
|
925
772
|
|
926
773
|
let(:context) do
|
927
774
|
described_class.new(criteria)
|
928
775
|
end
|
929
776
|
|
930
|
-
let!(:result) do
|
931
|
-
context.find_one_and_update({ "$inc" => { likes: 1 }}, return_document: :after)
|
932
|
-
end
|
933
|
-
|
934
|
-
it "returns the first matching document" do
|
935
|
-
expect(result).to eq(depeche)
|
936
|
-
end
|
937
|
-
|
938
|
-
it "returns the updated document" do
|
939
|
-
expect(result.likes).to eq(1)
|
940
|
-
end
|
941
|
-
end
|
942
777
|
|
943
|
-
|
944
|
-
|
945
|
-
let(:criteria) do
|
946
|
-
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
947
|
-
end
|
948
|
-
|
949
|
-
let(:context) do
|
950
|
-
described_class.new(criteria)
|
951
|
-
end
|
952
|
-
|
953
|
-
let!(:result) do
|
954
|
-
context.find_one_and_update({ "$inc" => { likes: 1 }}, return_document: :after)
|
778
|
+
it 'applies a sort on _id' do
|
779
|
+
expect(context.send(method)).to eq(depeche_mode)
|
955
780
|
end
|
956
781
|
|
957
|
-
|
958
|
-
expect(result).to eq(depeche)
|
959
|
-
end
|
782
|
+
context 'when calling #last' do
|
960
783
|
|
961
|
-
|
962
|
-
|
784
|
+
it 'returns the last document, sorted by _id' do
|
785
|
+
expect(context.send(method)).to eq(depeche_mode)
|
786
|
+
expect(context.last).to eq(new_order)
|
787
|
+
end
|
963
788
|
end
|
964
|
-
end
|
965
|
-
end
|
966
|
-
|
967
|
-
context "when the selector does not match" do
|
968
|
-
|
969
|
-
let(:criteria) do
|
970
|
-
Band.where(name: "Placebo")
|
971
|
-
end
|
972
|
-
|
973
|
-
let(:context) do
|
974
|
-
described_class.new(criteria)
|
975
|
-
end
|
976
|
-
|
977
|
-
let(:result) do
|
978
|
-
context.find_one_and_update("$inc" => { likes: 1 })
|
979
|
-
end
|
980
|
-
|
981
|
-
it "returns nil" do
|
982
|
-
expect(result).to be_nil
|
983
|
-
end
|
984
|
-
end
|
985
|
-
end
|
986
|
-
|
987
|
-
describe "#find_one_and_delete" do
|
988
|
-
|
989
|
-
let!(:depeche) do
|
990
|
-
Band.create(name: "Depeche Mode")
|
991
|
-
end
|
992
|
-
|
993
|
-
let(:criteria) do
|
994
|
-
Band.where(name: "Depeche Mode")
|
995
|
-
end
|
996
|
-
|
997
|
-
let(:context) do
|
998
|
-
described_class.new(criteria)
|
999
|
-
end
|
1000
|
-
|
1001
|
-
let!(:result) do
|
1002
|
-
context.find_one_and_delete
|
1003
|
-
end
|
1004
|
-
|
1005
|
-
context 'when the selector matches a document' do
|
1006
|
-
|
1007
|
-
it "returns the first matching document" do
|
1008
|
-
expect(result).to eq(depeche)
|
1009
|
-
end
|
1010
|
-
|
1011
|
-
it "deletes the document from the database" do
|
1012
|
-
expect {
|
1013
|
-
depeche.reload
|
1014
|
-
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
1015
|
-
end
|
1016
|
-
|
1017
|
-
context 'when a collation is specified on the criteria', if: collation_supported? do
|
1018
789
|
|
1019
|
-
|
1020
|
-
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
1021
|
-
end
|
790
|
+
context 'with option { sort: :none }' do
|
1022
791
|
|
1023
|
-
|
1024
|
-
|
1025
|
-
|
792
|
+
let(:opts) do
|
793
|
+
{ id_sort: :none }
|
794
|
+
end
|
1026
795
|
|
1027
|
-
|
1028
|
-
|
1029
|
-
|
796
|
+
it 'does not apply the sort on _id' do
|
797
|
+
expect(context.send(method, opts)).to eq(depeche_mode)
|
798
|
+
end
|
1030
799
|
|
1031
|
-
|
1032
|
-
expect(result).to eq(depeche)
|
1033
|
-
end
|
800
|
+
context 'when calling #last' do
|
1034
801
|
|
1035
|
-
|
1036
|
-
|
1037
|
-
|
1038
|
-
|
802
|
+
it 'does not apply a sort on _id' do
|
803
|
+
expect(context.send(method, opts)).to eq(depeche_mode)
|
804
|
+
expect(context.last(opts)).to eq(depeche_mode)
|
805
|
+
end
|
806
|
+
end
|
1039
807
|
end
|
1040
808
|
end
|
1041
|
-
end
|
1042
|
-
|
1043
|
-
context 'when the selector does not match a document' do
|
1044
|
-
|
1045
|
-
let(:criteria) do
|
1046
|
-
Band.where(name: "Placebo")
|
1047
|
-
end
|
1048
|
-
|
1049
|
-
let(:context) do
|
1050
|
-
described_class.new(criteria)
|
1051
|
-
end
|
1052
|
-
|
1053
|
-
let(:result) do
|
1054
|
-
context.find_one_and_delete
|
1055
|
-
end
|
1056
|
-
|
1057
|
-
it "returns nil" do
|
1058
|
-
expect(result).to be_nil
|
1059
|
-
end
|
1060
|
-
end
|
1061
|
-
end
|
1062
|
-
|
1063
|
-
[ :first, :one ].each do |method|
|
1064
|
-
|
1065
|
-
describe "##{method}" do
|
1066
|
-
|
1067
|
-
let!(:depeche_mode) do
|
1068
|
-
Band.create(name: "Depeche Mode")
|
1069
|
-
end
|
1070
|
-
|
1071
|
-
let!(:new_order) do
|
1072
|
-
Band.create(name: "New Order")
|
1073
|
-
end
|
1074
809
|
|
1075
|
-
context
|
810
|
+
context 'when the criteria has a sort' do
|
1076
811
|
|
1077
812
|
let(:criteria) do
|
1078
|
-
Band.
|
813
|
+
Band.desc(:name)
|
1079
814
|
end
|
1080
815
|
|
1081
816
|
let(:context) do
|
1082
817
|
described_class.new(criteria)
|
1083
818
|
end
|
1084
819
|
|
1085
|
-
it "returns the first matching document" do
|
1086
|
-
expect(context.send(method)).to eq(depeche_mode)
|
1087
|
-
end
|
1088
|
-
|
1089
|
-
context 'when the criteria has a collation', if: collation_supported? do
|
1090
|
-
|
1091
|
-
let(:criteria) do
|
1092
|
-
Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
|
1093
|
-
end
|
1094
820
|
|
1095
|
-
|
1096
|
-
|
1097
|
-
end
|
821
|
+
it 'applies the criteria sort' do
|
822
|
+
expect(context.send(method)).to eq(new_order)
|
1098
823
|
end
|
1099
|
-
end
|
1100
824
|
|
1101
|
-
|
825
|
+
context 'when calling #last' do
|
1102
826
|
|
1103
|
-
|
1104
|
-
|
827
|
+
it 'applies the criteria sort' do
|
828
|
+
expect(context.send(method)).to eq(new_order)
|
829
|
+
expect(context.last).to eq(depeche_mode)
|
830
|
+
end
|
1105
831
|
end
|
1106
832
|
|
1107
|
-
|
1108
|
-
described_class.new(criteria)
|
1109
|
-
end
|
833
|
+
context 'with option { sort: :none }' do
|
1110
834
|
|
1111
|
-
|
835
|
+
let(:opts) do
|
836
|
+
{ id_sort: :none }
|
837
|
+
end
|
1112
838
|
|
1113
|
-
it
|
1114
|
-
expect(context.send(method)).to eq(new_order)
|
839
|
+
it 'applies the criteria sort' do
|
840
|
+
expect(context.send(method, opts)).to eq(new_order)
|
1115
841
|
end
|
1116
|
-
end
|
1117
842
|
|
1118
|
-
|
843
|
+
context 'when calling #last' do
|
1119
844
|
|
1120
|
-
|
1121
|
-
|
1122
|
-
|
845
|
+
it 'applies the criteria sort' do
|
846
|
+
expect(context.send(method, opts)).to eq(new_order)
|
847
|
+
expect(context.last(opts)).to eq(depeche_mode)
|
848
|
+
end
|
1123
849
|
end
|
1124
850
|
end
|
1125
851
|
end
|
@@ -1363,6 +1089,11 @@ describe Mongoid::Contextual::Mongo do
|
|
1363
1089
|
|
1364
1090
|
context "when passed the symbol field name" do
|
1365
1091
|
|
1092
|
+
it "limits query to that field" do
|
1093
|
+
expect(criteria).to receive(:only).with(:name).and_call_original
|
1094
|
+
context.map(:name)
|
1095
|
+
end
|
1096
|
+
|
1366
1097
|
it "performs mapping" do
|
1367
1098
|
expect(context.map(:name)).to eq ["Depeche Mode", "New Order"]
|
1368
1099
|
end
|
@@ -2090,31 +1821,26 @@ describe Mongoid::Contextual::Mongo do
|
|
2090
1821
|
|
2091
1822
|
describe '#pipeline' do
|
2092
1823
|
|
2093
|
-
context 'when the criteria has a selector'
|
2094
|
-
|
2095
|
-
before do
|
2096
|
-
Artist.index(name: "text")
|
2097
|
-
Artist.create_indexes
|
2098
|
-
end
|
1824
|
+
context 'when the criteria has a selector' do
|
2099
1825
|
|
2100
1826
|
let(:criteria) do
|
2101
|
-
|
1827
|
+
Band.where(name: "New Order")
|
2102
1828
|
end
|
2103
1829
|
|
2104
1830
|
let(:context) do
|
2105
1831
|
described_class.new(criteria)
|
2106
1832
|
end
|
2107
1833
|
|
2108
|
-
let(:
|
2109
|
-
context.send(:pipeline,
|
1834
|
+
let(:matches_operators) do
|
1835
|
+
context.send(:pipeline, 'name').select { |o| o['$match'] }
|
2110
1836
|
end
|
2111
1837
|
|
2112
1838
|
it 'creates a pipeline with the selector as one of the $match criteria' do
|
2113
|
-
expect(
|
1839
|
+
expect(matches_operators).to include('$match' => criteria.selector)
|
2114
1840
|
end
|
2115
1841
|
|
2116
1842
|
it 'creates a pipeline with the $exists operator as one of the $match criteria' do
|
2117
|
-
expect(
|
1843
|
+
expect(matches_operators).to include('$match' => { 'name' => { '$exists' => true } })
|
2118
1844
|
end
|
2119
1845
|
end
|
2120
1846
|
end
|