mongoid 7.0.6 → 7.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/README.md +1 -1
- data/Rakefile +14 -5
- data/lib/mongoid.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_many.rb +2 -1
- data/lib/mongoid/association/embedded/embeds_one.rb +2 -1
- data/lib/mongoid/association/proxy.rb +1 -1
- data/lib/mongoid/atomic.rb +13 -3
- data/lib/mongoid/clients/sessions.rb +20 -4
- data/lib/mongoid/criteria.rb +7 -1
- data/lib/mongoid/criteria/modifiable.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
- data/lib/mongoid/criteria/queryable/extensions/time.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
- data/lib/mongoid/document.rb +3 -2
- data/lib/mongoid/extensions/hash.rb +4 -2
- data/lib/mongoid/extensions/regexp.rb +1 -1
- data/lib/mongoid/fields.rb +2 -1
- data/lib/mongoid/interceptable.rb +3 -1
- data/lib/mongoid/matchable/regexp.rb +2 -2
- data/lib/mongoid/persistable/pushable.rb +11 -2
- data/lib/mongoid/persistence_context.rb +6 -6
- data/lib/mongoid/query_cache.rb +61 -18
- data/lib/mongoid/validatable/uniqueness.rb +1 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
- data/spec/app/models/customer.rb +11 -0
- data/spec/app/models/customer_address.rb +12 -0
- data/spec/app/models/delegating_patient.rb +16 -0
- data/spec/integration/app_spec.rb +192 -0
- data/spec/integration/associations/embedded_spec.rb +62 -0
- data/spec/integration/callbacks_models.rb +49 -0
- data/spec/integration/callbacks_spec.rb +216 -0
- data/spec/integration/criteria/date_field_spec.rb +41 -0
- data/spec/integration/document_spec.rb +22 -0
- data/spec/lite_spec_helper.rb +12 -4
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +50 -0
- data/spec/mongoid/association/embedded/embeds_many_models.rb +53 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +10 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +0 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +140 -1
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +105 -0
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +2 -1
- data/spec/mongoid/atomic/paths_spec.rb +41 -0
- data/spec/mongoid/clients/options_spec.rb +4 -4
- data/spec/mongoid/clients/sessions_spec.rb +8 -4
- data/spec/mongoid/clients/transactions_spec.rb +20 -8
- data/spec/mongoid/clients_spec.rb +2 -2
- data/spec/mongoid/contextual/atomic_spec.rb +20 -10
- data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
- data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
- data/spec/mongoid/contextual/mongo_spec.rb +76 -53
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
- data/spec/mongoid/criteria_spec.rb +4 -2
- data/spec/mongoid/document_persistence_context_spec.rb +33 -0
- data/spec/mongoid/indexable_spec.rb +6 -4
- data/spec/mongoid/matchable/default_spec.rb +1 -1
- data/spec/mongoid/matchable/regexp_spec.rb +2 -2
- data/spec/mongoid/matchable_spec.rb +2 -2
- data/spec/mongoid/persistable/pushable_spec.rb +55 -1
- data/spec/mongoid/query_cache_spec.rb +77 -9
- data/spec/mongoid/relations/proxy_spec.rb +1 -1
- data/spec/mongoid/scopable_spec.rb +2 -1
- data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
- data/spec/mongoid/tasks/database_spec.rb +1 -1
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +211 -0
- data/spec/shared/lib/mrss/constraints.rb +330 -0
- data/spec/shared/lib/mrss/docker_runner.rb +262 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +69 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
- data/spec/shared/share/Dockerfile.erb +229 -0
- data/spec/shared/shlib/distro.sh +73 -0
- data/spec/shared/shlib/server.sh +270 -0
- data/spec/shared/shlib/set_env.sh +128 -0
- data/spec/spec_helper.rb +0 -31
- data/spec/support/child_process_helper.rb +76 -0
- data/spec/support/cluster_config.rb +3 -3
- data/spec/support/constraints.rb +201 -30
- data/spec/support/session_registry.rb +50 -0
- data/spec/support/spec_config.rb +12 -4
- metadata +510 -461
- metadata.gz.sig +2 -2
|
@@ -8,7 +8,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
|
|
|
8
8
|
context "when provided a regexp" do
|
|
9
9
|
|
|
10
10
|
let(:regexp) do
|
|
11
|
-
|
|
11
|
+
/\A[123]/
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
let(:evolved) do
|
|
@@ -23,7 +23,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
|
|
|
23
23
|
context "when provided a string" do
|
|
24
24
|
|
|
25
25
|
let(:regexp) do
|
|
26
|
-
"
|
|
26
|
+
"\\A[123]"
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
let(:evolved) do
|
|
@@ -31,7 +31,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
|
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
it "returns the converted regexp" do
|
|
34
|
-
expect(evolved).to eq(
|
|
34
|
+
expect(evolved).to eq(/\A[123]/)
|
|
35
35
|
end
|
|
36
36
|
end
|
|
37
37
|
|
|
@@ -40,7 +40,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
|
|
|
40
40
|
context "when the elements are regexps" do
|
|
41
41
|
|
|
42
42
|
let(:regexp) do
|
|
43
|
-
|
|
43
|
+
/\A[123]/
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
let(:array) do
|
|
@@ -63,7 +63,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
|
|
|
63
63
|
context "when the elements are strings" do
|
|
64
64
|
|
|
65
65
|
let(:regexp) do
|
|
66
|
-
"
|
|
66
|
+
"\\A[123]"
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
let(:evolved) do
|
|
@@ -71,7 +71,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
|
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
it "returns the regexps" do
|
|
74
|
-
expect(evolved).to eq([
|
|
74
|
+
expect(evolved).to eq([ /\A[123]/ ])
|
|
75
75
|
end
|
|
76
76
|
end
|
|
77
77
|
end
|
|
@@ -80,7 +80,7 @@ describe Mongoid::Criteria::Queryable::Extensions::Regexp do
|
|
|
80
80
|
describe "#regexp?" do
|
|
81
81
|
|
|
82
82
|
let(:regexp) do
|
|
83
|
-
|
|
83
|
+
/\A[123]/
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
it "returns true" do
|
|
@@ -346,23 +346,35 @@ describe Time do
|
|
|
346
346
|
|
|
347
347
|
describe "#__evolve_date__" do
|
|
348
348
|
|
|
349
|
-
let(:time) do
|
|
350
|
-
Time.new(2010, 1, 1, 12, 0, 0)
|
|
351
|
-
end
|
|
352
|
-
|
|
353
349
|
let(:evolved) do
|
|
354
350
|
time.__evolve_date__
|
|
355
351
|
end
|
|
356
352
|
|
|
357
|
-
|
|
358
|
-
|
|
353
|
+
context 'beginning of day' do
|
|
354
|
+
let(:time) do
|
|
355
|
+
Time.new(2010, 1, 1, 0, 0, 1).freeze
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
it "returns midnight utc" do
|
|
359
|
+
expect(evolved).to eq(Time.utc(2010, 1, 1, 0, 0, 0))
|
|
360
|
+
end
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
context 'end of day' do
|
|
364
|
+
let(:time) do
|
|
365
|
+
Time.new(2010, 1, 1, 23, 59, 59).freeze
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
it "returns midnight utc" do
|
|
369
|
+
expect(evolved).to eq(Time.utc(2010, 1, 1, 0, 0, 0))
|
|
370
|
+
end
|
|
359
371
|
end
|
|
360
372
|
end
|
|
361
373
|
|
|
362
374
|
describe "#__evolve_time__" do
|
|
363
375
|
|
|
364
376
|
let(:time) do
|
|
365
|
-
Time.new(2010, 1, 1, 12, 0, 0)
|
|
377
|
+
Time.new(2010, 1, 1, 12, 0, 0).freeze
|
|
366
378
|
end
|
|
367
379
|
|
|
368
380
|
let(:evolved) do
|
|
@@ -322,10 +322,37 @@ describe ActiveSupport::TimeWithZone do
|
|
|
322
322
|
end
|
|
323
323
|
end
|
|
324
324
|
|
|
325
|
+
describe "#__evolve_date__" do
|
|
326
|
+
|
|
327
|
+
let(:evolved) do
|
|
328
|
+
time.__evolve_date__
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
context 'beginning of day' do
|
|
332
|
+
let(:time) do
|
|
333
|
+
time_zone.local(2010, 1, 1, 0, 0, 1).freeze
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
it "returns midnight utc" do
|
|
337
|
+
expect(evolved).to eq(Time.utc(2010, 1, 1, 0, 0, 0))
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
context 'end of day' do
|
|
342
|
+
let(:time) do
|
|
343
|
+
time_zone.local(2010, 1, 1, 23, 59, 59).freeze
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
it "returns midnight utc" do
|
|
347
|
+
expect(evolved).to eq(Time.utc(2010, 1, 1, 0, 0, 0))
|
|
348
|
+
end
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
|
|
325
352
|
describe "#__evolve_time__" do
|
|
326
353
|
|
|
327
354
|
let(:date) do
|
|
328
|
-
time_zone.local(2010, 1, 1, 12, 0, 0)
|
|
355
|
+
time_zone.local(2010, 1, 1, 12, 0, 0).freeze
|
|
329
356
|
end
|
|
330
357
|
|
|
331
358
|
let(:evolved) do
|
|
@@ -2334,7 +2334,7 @@ describe Mongoid::Criteria do
|
|
|
2334
2334
|
end
|
|
2335
2335
|
|
|
2336
2336
|
it "returns the map/reduce results" do
|
|
2337
|
-
expect(map_reduce).to eq([
|
|
2337
|
+
expect(map_reduce.sort_by { |doc| doc['_id'] }).to eq([
|
|
2338
2338
|
{ "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
|
|
2339
2339
|
{ "_id" => "Tool", "value" => { "likes" => 100 }}
|
|
2340
2340
|
])
|
|
@@ -3499,7 +3499,8 @@ describe Mongoid::Criteria do
|
|
|
3499
3499
|
end
|
|
3500
3500
|
end
|
|
3501
3501
|
|
|
3502
|
-
context "when querying on a BSON::Decimal128"
|
|
3502
|
+
context "when querying on a BSON::Decimal128" do
|
|
3503
|
+
min_server_version '3.4'
|
|
3503
3504
|
|
|
3504
3505
|
let(:decimal) do
|
|
3505
3506
|
BSON::Decimal128.new("0.0005")
|
|
@@ -3553,6 +3554,7 @@ describe Mongoid::Criteria do
|
|
|
3553
3554
|
end
|
|
3554
3555
|
|
|
3555
3556
|
context "when the code has scope" do
|
|
3557
|
+
max_server_version '4.2'
|
|
3556
3558
|
|
|
3557
3559
|
let(:criteria) do
|
|
3558
3560
|
Band.for_js("this.name == param", param: "Depeche Mode")
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
require "spec_helper"
|
|
5
|
+
|
|
6
|
+
describe Mongoid::Document do
|
|
7
|
+
|
|
8
|
+
let(:klass) do
|
|
9
|
+
Person
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
let(:person) do
|
|
13
|
+
Person.new
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
describe '.client_name' do
|
|
17
|
+
it 'returns client name' do
|
|
18
|
+
Person.client_name.should == :default
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe '.database_name' do
|
|
23
|
+
it 'returns database name' do
|
|
24
|
+
Person.database_name.should == 'mongoid_test'
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe '.collection_name' do
|
|
29
|
+
it 'returns collection name' do
|
|
30
|
+
Person.collection_name.should == :people
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -45,7 +45,7 @@ describe Mongoid::Indexable do
|
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
-
context "when database specific options exist"
|
|
48
|
+
context "when database specific options exist" do
|
|
49
49
|
|
|
50
50
|
let(:klass) do
|
|
51
51
|
Class.new do
|
|
@@ -95,7 +95,7 @@ describe Mongoid::Indexable do
|
|
|
95
95
|
end
|
|
96
96
|
end
|
|
97
97
|
|
|
98
|
-
context "when database options are specified"
|
|
98
|
+
context "when database options are specified" do
|
|
99
99
|
|
|
100
100
|
let(:klass) do
|
|
101
101
|
Class.new do
|
|
@@ -133,7 +133,8 @@ describe Mongoid::Indexable do
|
|
|
133
133
|
end
|
|
134
134
|
end
|
|
135
135
|
|
|
136
|
-
context "when a collation option is specified"
|
|
136
|
+
context "when a collation option is specified" do
|
|
137
|
+
min_server_version '3.4'
|
|
137
138
|
|
|
138
139
|
let(:klass) do
|
|
139
140
|
Class.new do
|
|
@@ -308,7 +309,8 @@ describe Mongoid::Indexable do
|
|
|
308
309
|
end
|
|
309
310
|
end
|
|
310
311
|
|
|
311
|
-
context "when providing a collation option"
|
|
312
|
+
context "when providing a collation option" do
|
|
313
|
+
min_server_version '3.4'
|
|
312
314
|
|
|
313
315
|
before do
|
|
314
316
|
klass.index({ name: 1 }, collation: { locale: 'en_US', strength: 2 })
|
|
@@ -15,7 +15,7 @@ describe Mongoid::Matchable::Regexp do
|
|
|
15
15
|
context 'when a BSON::Regexp::Raw object is passed' do
|
|
16
16
|
|
|
17
17
|
let(:regexp) do
|
|
18
|
-
BSON::Regexp::Raw.new(
|
|
18
|
+
BSON::Regexp::Raw.new("\\AEm")
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
it 'compiles the regexp object to a native regexp for the matching' do
|
|
@@ -37,7 +37,7 @@ describe Mongoid::Matchable::Regexp do
|
|
|
37
37
|
context 'when a native Regexp object is passed' do
|
|
38
38
|
|
|
39
39
|
let(:regexp) do
|
|
40
|
-
|
|
40
|
+
/\AEm/
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
it 'calls super with the native regexp' do
|
|
@@ -293,7 +293,7 @@ describe Mongoid::Matchable do
|
|
|
293
293
|
context 'when a BSON::Regexp::Raw object is used' do
|
|
294
294
|
|
|
295
295
|
let(:selector) do
|
|
296
|
-
{ street: BSON::Regexp::Raw.new("
|
|
296
|
+
{ street: BSON::Regexp::Raw.new("\\AClarkenwell") }
|
|
297
297
|
end
|
|
298
298
|
|
|
299
299
|
it "returns true" do
|
|
@@ -304,7 +304,7 @@ describe Mongoid::Matchable do
|
|
|
304
304
|
context 'when a native Regexp object is used' do
|
|
305
305
|
|
|
306
306
|
let(:selector) do
|
|
307
|
-
{ street:
|
|
307
|
+
{ street: /\AClarkenwell/ }
|
|
308
308
|
end
|
|
309
309
|
|
|
310
310
|
it "returns true" do
|
|
@@ -4,7 +4,7 @@ describe Mongoid::Persistable::Pushable do
|
|
|
4
4
|
|
|
5
5
|
describe "#add_to_set" do
|
|
6
6
|
|
|
7
|
-
context "when the document is a
|
|
7
|
+
context "when the document is a top level document" do
|
|
8
8
|
|
|
9
9
|
shared_examples_for "a unique pushable root document" do
|
|
10
10
|
|
|
@@ -62,6 +62,60 @@ describe Mongoid::Persistable::Pushable do
|
|
|
62
62
|
|
|
63
63
|
it_behaves_like "a unique pushable root document"
|
|
64
64
|
end
|
|
65
|
+
|
|
66
|
+
context 'when the host model is not saved' do
|
|
67
|
+
context 'when attribute exists' do
|
|
68
|
+
let(:person) do
|
|
69
|
+
Person.new(aliases: [2])
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it 'records the change' do
|
|
73
|
+
person.add_to_set({aliases: 1})
|
|
74
|
+
|
|
75
|
+
expect(person.aliases).to eq([2, 1])
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
context 'when attribute does not exist' do
|
|
80
|
+
let(:person) do
|
|
81
|
+
Person.new
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it 'records the change' do
|
|
85
|
+
person.add_to_set({aliases: 1})
|
|
86
|
+
|
|
87
|
+
expect(person.aliases).to eq([1])
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
context 'when the host model is loaded from database' do
|
|
93
|
+
context 'when attribute exists' do
|
|
94
|
+
let(:person) do
|
|
95
|
+
Person.create!(aliases: [2])
|
|
96
|
+
person = Person.last
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it 'records the change' do
|
|
100
|
+
person.add_to_set({aliases: 1})
|
|
101
|
+
|
|
102
|
+
expect(person.aliases).to eq([2, 1])
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
context 'when attribute does not exist' do
|
|
107
|
+
let(:person) do
|
|
108
|
+
Person.create!
|
|
109
|
+
person = Person.last
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it 'records the change' do
|
|
113
|
+
person.add_to_set({aliases: 1})
|
|
114
|
+
|
|
115
|
+
expect(person.aliases).to eq([1])
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
65
119
|
end
|
|
66
120
|
|
|
67
121
|
context "when the document is embedded" do
|
|
@@ -7,6 +7,20 @@ describe Mongoid::QueryCache do
|
|
|
7
7
|
Mongoid::QueryCache.cache { spec.run }
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
+
before(:all) do
|
|
11
|
+
# It is likely that there are other session leaks in the driver
|
|
12
|
+
# and/or Mongoid that are unrelated to the query cache. Clear the
|
|
13
|
+
# SessionRegistry at the start of these tests in order to detect leaks that
|
|
14
|
+
# occur only within the scope of these tests.
|
|
15
|
+
#
|
|
16
|
+
# Other session leaks will be detected and addressed as part of RUBY-2391.
|
|
17
|
+
SessionRegistry.instance.clear_registry
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
after do
|
|
21
|
+
SessionRegistry.instance.verify_sessions_ended!
|
|
22
|
+
end
|
|
23
|
+
|
|
10
24
|
context 'when iterating over objects sharing the same base' do
|
|
11
25
|
|
|
12
26
|
let(:server) do
|
|
@@ -180,7 +194,8 @@ describe Mongoid::QueryCache do
|
|
|
180
194
|
end
|
|
181
195
|
end
|
|
182
196
|
|
|
183
|
-
context 'when the first query has a collation'
|
|
197
|
+
context 'when the first query has a collation' do
|
|
198
|
+
min_server_version '3.4'
|
|
184
199
|
|
|
185
200
|
before do
|
|
186
201
|
Band.where(name: 'DEPECHE MODE').collation(locale: 'en_US', strength: 2).to_a
|
|
@@ -221,6 +236,10 @@ describe Mongoid::QueryCache do
|
|
|
221
236
|
end
|
|
222
237
|
|
|
223
238
|
before do
|
|
239
|
+
10.times do |i|
|
|
240
|
+
game.ratings << Rating.create!(value: i+1)
|
|
241
|
+
end
|
|
242
|
+
|
|
224
243
|
game.ratings.where(:value.gt => 5).asc(:id).all.to_a
|
|
225
244
|
end
|
|
226
245
|
|
|
@@ -228,7 +247,9 @@ describe Mongoid::QueryCache do
|
|
|
228
247
|
|
|
229
248
|
it "uses the cache" do
|
|
230
249
|
expect_no_queries do
|
|
231
|
-
game.ratings.where(:value.gt => 5).limit(2).asc(:id).to_a
|
|
250
|
+
result = game.ratings.where(:value.gt => 5).limit(2).asc(:id).to_a
|
|
251
|
+
expect(result.length).to eq(2)
|
|
252
|
+
expect(result.map { |r| r['value'] }).to eq([6, 7])
|
|
232
253
|
end
|
|
233
254
|
end
|
|
234
255
|
end
|
|
@@ -241,14 +262,23 @@ describe Mongoid::QueryCache do
|
|
|
241
262
|
end
|
|
242
263
|
|
|
243
264
|
before do
|
|
265
|
+
10.times do |i|
|
|
266
|
+
game.ratings << Rating.create!(value: i+1)
|
|
267
|
+
end
|
|
268
|
+
|
|
244
269
|
game.ratings.where(:value.gt => 5).limit(3).asc(:id).all.to_a
|
|
245
270
|
end
|
|
246
271
|
|
|
247
272
|
context "when the next query has a limit" do
|
|
273
|
+
# Server versions older than 3.2 also perform a killCursors operation,
|
|
274
|
+
# which causes this test to fail.
|
|
275
|
+
min_server_version '3.2'
|
|
248
276
|
|
|
249
277
|
it "queries again" do
|
|
250
278
|
expect_query(1) do
|
|
251
|
-
game.ratings.where(:value.gt => 5).limit(2).asc(:id).to_a
|
|
279
|
+
result = game.ratings.where(:value.gt => 5).limit(2).asc(:id).to_a
|
|
280
|
+
expect(result.length).to eq(2)
|
|
281
|
+
expect(result.map { |r| r['value'] }).to eq([6, 7])
|
|
252
282
|
end
|
|
253
283
|
end
|
|
254
284
|
end
|
|
@@ -257,7 +287,9 @@ describe Mongoid::QueryCache do
|
|
|
257
287
|
|
|
258
288
|
it "queries again" do
|
|
259
289
|
expect_query(1) do
|
|
260
|
-
game.ratings.where(:value.gt => 5).asc(:id).to_a
|
|
290
|
+
result = game.ratings.where(:value.gt => 5).asc(:id).to_a
|
|
291
|
+
expect(result.length).to eq(5)
|
|
292
|
+
expect(result.map { |r| r['value'] }).to eq([6, 7, 8, 9, 10])
|
|
261
293
|
end
|
|
262
294
|
end
|
|
263
295
|
end
|
|
@@ -270,21 +302,34 @@ describe Mongoid::QueryCache do
|
|
|
270
302
|
end
|
|
271
303
|
|
|
272
304
|
before do
|
|
305
|
+
10.times do |i|
|
|
306
|
+
game.ratings << Rating.create!(value: i+1)
|
|
307
|
+
end
|
|
308
|
+
|
|
273
309
|
game.ratings.where(:value.gt => 5).asc(:id).all.to_a
|
|
274
310
|
end
|
|
275
311
|
|
|
276
312
|
it "does not query again" do
|
|
277
313
|
expect_no_queries do
|
|
278
|
-
game.ratings.where(:value.gt => 5).asc(:id).first
|
|
314
|
+
result = game.ratings.where(:value.gt => 5).asc(:id).first
|
|
315
|
+
expect(result['value']).to eq(6)
|
|
279
316
|
end
|
|
280
317
|
end
|
|
281
318
|
end
|
|
282
319
|
|
|
283
320
|
context "when limiting the result" do
|
|
321
|
+
before do
|
|
322
|
+
Band.destroy_all
|
|
323
|
+
|
|
324
|
+
5.times { |i| Band.create!(name: "Band #{i}") }
|
|
325
|
+
Band.all.to_a
|
|
326
|
+
end
|
|
284
327
|
|
|
285
328
|
it "does not query again" do
|
|
286
329
|
expect_query(0) do
|
|
287
|
-
Band.limit(2).all.to_a
|
|
330
|
+
result = Band.limit(2).all.to_a
|
|
331
|
+
expect(result.length).to eq(2)
|
|
332
|
+
expect(result.map { |r| r["name"] }).to eq(["Band 0", "Band 1"])
|
|
288
333
|
end
|
|
289
334
|
end
|
|
290
335
|
end
|
|
@@ -292,12 +337,16 @@ describe Mongoid::QueryCache do
|
|
|
292
337
|
context "when specifying a different skip value" do
|
|
293
338
|
|
|
294
339
|
before do
|
|
295
|
-
Band.
|
|
340
|
+
Band.destroy_all
|
|
341
|
+
|
|
342
|
+
5.times { |i| Band.create!(name: "Band #{i}") }
|
|
296
343
|
end
|
|
297
344
|
|
|
298
345
|
it "queries again" do
|
|
299
346
|
expect_query(1) do
|
|
300
|
-
Band.limit(2).skip(3).all.to_a
|
|
347
|
+
result = Band.limit(2).skip(3).all.to_a
|
|
348
|
+
expect(result.length).to eq(2)
|
|
349
|
+
expect(result.map { |r| r["name"] }).to eq(["Band 3", "Band 4"])
|
|
301
350
|
end
|
|
302
351
|
end
|
|
303
352
|
end
|
|
@@ -333,6 +382,25 @@ describe Mongoid::QueryCache do
|
|
|
333
382
|
end
|
|
334
383
|
end
|
|
335
384
|
|
|
385
|
+
context 'when querying colleciton larger than the batch size' do
|
|
386
|
+
before do
|
|
387
|
+
Band.destroy_all
|
|
388
|
+
101.times { |i| Band.create!(_id: i) }
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
it 'does not raise an exception when querying multiple times' do
|
|
392
|
+
expect do
|
|
393
|
+
results1 = Band.all.to_a
|
|
394
|
+
expect(results1.length).to eq(101)
|
|
395
|
+
expect(results1.map { |band| band["_id"] }).to eq([*0..100])
|
|
396
|
+
|
|
397
|
+
results2 = Band.all.to_a
|
|
398
|
+
expect(results2.length).to eq(101)
|
|
399
|
+
expect(results2.map { |band| band["_id"] }).to eq([*0..100])
|
|
400
|
+
end.not_to raise_error
|
|
401
|
+
end
|
|
402
|
+
end
|
|
403
|
+
|
|
336
404
|
context "when query caching is enabled and the batch_size is set" do
|
|
337
405
|
|
|
338
406
|
around(:each) do |example|
|
|
@@ -486,7 +554,7 @@ describe Mongoid::QueryCache do
|
|
|
486
554
|
Mongoid::QueryCache.enabled = true
|
|
487
555
|
10.times { Band.create! }
|
|
488
556
|
|
|
489
|
-
Band.batch_size(4).all.
|
|
557
|
+
Band.batch_size(4).all.to_a
|
|
490
558
|
end
|
|
491
559
|
|
|
492
560
|
it 'does not cache the result' do
|