mongoid 6.0.3 → 6.1.0.rc0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +3 -2
- data/lib/config/locales/en.yml +15 -0
- data/lib/mongoid.rb +5 -0
- data/lib/mongoid/clients.rb +10 -2
- data/lib/mongoid/clients/factory.rb +2 -0
- data/lib/mongoid/config.rb +1 -0
- data/lib/mongoid/contextual/map_reduce.rb +20 -115
- data/lib/mongoid/contextual/memory.rb +1 -0
- data/lib/mongoid/contextual/mongo.rb +16 -13
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
- data/lib/mongoid/criteria/queryable/optional.rb +14 -0
- data/lib/mongoid/errors.rb +1 -0
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +20 -0
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/extensions/decimal128.rb +39 -0
- data/lib/mongoid/indexable/validators/options.rb +2 -1
- data/lib/mongoid/persistable/deletable.rb +3 -7
- data/lib/mongoid/query_cache.rb +2 -2
- data/lib/mongoid/relations/metadata.rb +3 -3
- data/lib/mongoid/relations/referenced/many.rb +2 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -0
- data/spec/app/models/band.rb +1 -0
- data/spec/config/mongoid.yml +19 -0
- data/spec/mongoid/clients/factory_spec.rb +8 -0
- data/spec/mongoid/clients_spec.rb +69 -0
- data/spec/mongoid/config_spec.rb +34 -2
- data/spec/mongoid/contextual/atomic_spec.rb +342 -76
- data/spec/mongoid/contextual/map_reduce_spec.rb +102 -135
- data/spec/mongoid/contextual/memory_spec.rb +316 -56
- data/spec/mongoid/contextual/mongo_spec.rb +366 -4
- data/spec/mongoid/criteria/queryable/optional_spec.rb +13 -0
- data/spec/mongoid/criteria_spec.rb +19 -0
- data/spec/mongoid/extensions/boolean_spec.rb +14 -0
- data/spec/mongoid/extensions/decimal128_spec.rb +44 -0
- data/spec/mongoid/indexable_spec.rb +43 -0
- data/spec/mongoid/query_cache_spec.rb +34 -0
- data/spec/mongoid/relations/metadata_spec.rb +0 -1
- data/spec/mongoid/relations/referenced/many_spec.rb +11 -0
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +11 -0
- data/spec/mongoid/scopable_spec.rb +12 -0
- data/spec/spec_helper.rb +9 -0
- metadata +17 -7
- metadata.gz.sig +0 -0
data/lib/mongoid/extensions.rb
CHANGED
@@ -27,6 +27,7 @@ require "mongoid/extensions/big_decimal"
|
|
27
27
|
require "mongoid/extensions/boolean"
|
28
28
|
require "mongoid/extensions/date"
|
29
29
|
require "mongoid/extensions/date_time"
|
30
|
+
require "mongoid/extensions/decimal128"
|
30
31
|
require "mongoid/extensions/false_class"
|
31
32
|
require "mongoid/extensions/float"
|
32
33
|
require "mongoid/extensions/hash"
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Extensions
|
4
|
+
module Decimal128
|
5
|
+
|
6
|
+
# Evolve the decimal128.
|
7
|
+
#
|
8
|
+
# @example Evolve the decimal128.
|
9
|
+
# decimal128.__evolve_decimal128__
|
10
|
+
#
|
11
|
+
# @return [ BSON::Decimal128 ] self.
|
12
|
+
#
|
13
|
+
# @since 6.1.0
|
14
|
+
def __evolve_decimal128__
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
module ClassMethods
|
19
|
+
|
20
|
+
# Evolve the object into a mongo-friendly value to query with.
|
21
|
+
#
|
22
|
+
# @example Evolve the object.
|
23
|
+
# Decimal128.evolve(dec)
|
24
|
+
#
|
25
|
+
# @param [ Object ] object The object to evolve.
|
26
|
+
#
|
27
|
+
# @return [ BSON::Decimal128 ] The decimal128.
|
28
|
+
#
|
29
|
+
# @since 6.1.0
|
30
|
+
def evolve(object)
|
31
|
+
object.__evolve_decimal128__
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
BSON::Decimal128.__send__(:include, Mongoid::Extensions::Decimal128)
|
39
|
+
BSON::Decimal128.extend(Mongoid::Extensions::Decimal128::ClassMethods)
|
@@ -135,13 +135,9 @@ module Mongoid
|
|
135
135
|
# @return [ Integer ] The number of documents deleted.
|
136
136
|
#
|
137
137
|
# @since 1.0.0
|
138
|
-
def delete_all(conditions =
|
139
|
-
selector = conditions
|
140
|
-
|
141
|
-
coll = collection
|
142
|
-
deleted = coll.find(selector).count
|
143
|
-
coll.find(selector).delete_many
|
144
|
-
deleted
|
138
|
+
def delete_all(conditions = {})
|
139
|
+
selector = hereditary? ? conditions.merge(_type: name) : conditions
|
140
|
+
collection.find(selector).delete_many.deleted_count
|
145
141
|
end
|
146
142
|
end
|
147
143
|
end
|
data/lib/mongoid/query_cache.rb
CHANGED
@@ -237,7 +237,7 @@ module Mongoid
|
|
237
237
|
|
238
238
|
def cached_cursor
|
239
239
|
if limit
|
240
|
-
key = [ collection.namespace, selector, nil, skip, sort, projection ]
|
240
|
+
key = [ collection.namespace, selector, nil, skip, sort, projection, collation ]
|
241
241
|
cursor = QueryCache.cache_table[key]
|
242
242
|
if cursor
|
243
243
|
limited_docs = cursor.to_a[0...limit.abs]
|
@@ -248,7 +248,7 @@ module Mongoid
|
|
248
248
|
end
|
249
249
|
|
250
250
|
def cache_key
|
251
|
-
[ collection.namespace, selector, limit, skip, sort, projection ]
|
251
|
+
[ collection.namespace, selector, limit, skip, sort, projection, collation ]
|
252
252
|
end
|
253
253
|
|
254
254
|
def system_collection?
|
@@ -778,10 +778,10 @@ module Mongoid
|
|
778
778
|
#
|
779
779
|
# @since 2.0.0.rc.1
|
780
780
|
def validate?
|
781
|
-
|
782
|
-
self[:validate]
|
783
|
-
else
|
781
|
+
if self[:validate].nil?
|
784
782
|
self[:validate] = relation.validation_default
|
783
|
+
else
|
784
|
+
self[:validate]
|
785
785
|
end
|
786
786
|
end
|
787
787
|
|
@@ -803,8 +803,8 @@ module Mongoid
|
|
803
803
|
# @since 3.0.0
|
804
804
|
def with_inverse_field_criterion(criteria, metadata)
|
805
805
|
inverse_metadata = metadata.inverse_metadata(metadata.klass)
|
806
|
-
if inverse_metadata.try(:
|
807
|
-
criteria.any_in(inverse_metadata.
|
806
|
+
if inverse_metadata.try(:inverse_of)
|
807
|
+
criteria.any_in(inverse_metadata.inverse_of => [ metadata.name, nil ])
|
808
808
|
else
|
809
809
|
criteria
|
810
810
|
end
|
data/lib/mongoid/version.rb
CHANGED
@@ -131,6 +131,10 @@ development:
|
|
131
131
|
# environment. The Mongoid logger will be set to the Rails logger
|
132
132
|
# otherwise.(default: :info)
|
133
133
|
# log_level: :info
|
134
|
+
|
135
|
+
# Application name that is printed to the mongodb logs upon establishing a
|
136
|
+
# connection in server versions >= 3.4. Note that the name cannot exceed 128 bytes.
|
137
|
+
# app_name: MyApplicationName
|
134
138
|
test:
|
135
139
|
clients:
|
136
140
|
default:
|
data/spec/app/models/band.rb
CHANGED
@@ -13,6 +13,7 @@ class Band
|
|
13
13
|
field :upserted, type: Mongoid::Boolean, default: false
|
14
14
|
field :created, type: DateTime
|
15
15
|
field :sales, type: BigDecimal
|
16
|
+
field :decimal, type: BSON::Decimal128
|
16
17
|
field :y, as: :years, type: Integer
|
17
18
|
field :founded, type: Date
|
18
19
|
field :deleted, type: Boolean
|
data/spec/config/mongoid.yml
CHANGED
@@ -13,6 +13,14 @@ test:
|
|
13
13
|
tag_sets:
|
14
14
|
- use: web
|
15
15
|
max_pool_size: 1
|
16
|
+
reports:
|
17
|
+
database: reports
|
18
|
+
hosts:
|
19
|
+
- <%=ENV["MONGOID_SPEC_HOST"]%>:<%=ENV["MONGOID_SPEC_PORT"]%>
|
20
|
+
options:
|
21
|
+
user: "mongoid-user"
|
22
|
+
password: "password"
|
23
|
+
auth_source: "admin"
|
16
24
|
options:
|
17
25
|
include_root_in_json: false
|
18
26
|
include_type_for_serialization: false
|
@@ -23,3 +31,14 @@ test:
|
|
23
31
|
use_utc: false
|
24
32
|
log_level: :warn
|
25
33
|
belongs_to_required_by_default: false
|
34
|
+
app_name: 'testing'
|
35
|
+
test_with_max_staleness:
|
36
|
+
clients:
|
37
|
+
default:
|
38
|
+
database: mongoid_test
|
39
|
+
hosts:
|
40
|
+
- <%=ENV["MONGOID_SPEC_HOST"]%>:<%=ENV["MONGOID_SPEC_PORT"]%>
|
41
|
+
options:
|
42
|
+
read:
|
43
|
+
mode: :primary_preferred
|
44
|
+
max_staleness: 100
|
@@ -40,6 +40,10 @@ describe Mongoid::Clients::Factory do
|
|
40
40
|
it "sets the cluster's seeds" do
|
41
41
|
expect(cluster.addresses.first.to_s).to eq("127.0.0.1:27017")
|
42
42
|
end
|
43
|
+
|
44
|
+
it "sets the platform to Mongoid's platform constant" do
|
45
|
+
expect(client.options[:platform]).to eq(Mongoid::PLATFORM_DETAILS)
|
46
|
+
end
|
43
47
|
end
|
44
48
|
|
45
49
|
context "when the configuration has no ports" do
|
@@ -308,5 +312,9 @@ describe Mongoid::Clients::Factory do
|
|
308
312
|
it "sets the write concern" do
|
309
313
|
expect(client.write_concern).to be_a(Mongo::WriteConcern::Acknowledged)
|
310
314
|
end
|
315
|
+
|
316
|
+
it "sets the platform to Mongoid's platform constant" do
|
317
|
+
expect(client.options[:platform]).to eq(Mongoid::PLATFORM_DETAILS)
|
318
|
+
end
|
311
319
|
end
|
312
320
|
end
|
@@ -524,6 +524,14 @@ describe Mongoid::Clients do
|
|
524
524
|
it "returns the default client" do
|
525
525
|
expect(mongo_client.options[:database].to_s).to eq(database_id)
|
526
526
|
end
|
527
|
+
|
528
|
+
it "sets the platform to Mongoid's platform constant" do
|
529
|
+
expect(mongo_client.options[:platform]).to eq(Mongoid::PLATFORM_DETAILS)
|
530
|
+
end
|
531
|
+
|
532
|
+
it "sets the app_name to the config value" do
|
533
|
+
expect(mongo_client.options[:app_name]).to eq('testing')
|
534
|
+
end
|
527
535
|
end
|
528
536
|
|
529
537
|
context "when no client exists with the key" do
|
@@ -542,6 +550,59 @@ describe Mongoid::Clients do
|
|
542
550
|
}.to raise_error(Mongoid::Errors::NoClientConfig)
|
543
551
|
end
|
544
552
|
end
|
553
|
+
|
554
|
+
context "when getting a client by name" do
|
555
|
+
|
556
|
+
let(:file) do
|
557
|
+
File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml")
|
558
|
+
end
|
559
|
+
|
560
|
+
before do
|
561
|
+
described_class.clear
|
562
|
+
Mongoid.load!(file, :test)
|
563
|
+
Band.store_in(client: :reports)
|
564
|
+
end
|
565
|
+
|
566
|
+
after do
|
567
|
+
mongo_client.close
|
568
|
+
Mongoid::Config.reset
|
569
|
+
Band.reset_storage_options!
|
570
|
+
end
|
571
|
+
|
572
|
+
let(:mongo_client) do
|
573
|
+
Band.new.mongo_client
|
574
|
+
end
|
575
|
+
|
576
|
+
it "uses the reports client" do
|
577
|
+
expect(mongo_client.options[:database].to_s).to eq('reports')
|
578
|
+
end
|
579
|
+
|
580
|
+
it "sets the platform to Mongoid's platform constant" do
|
581
|
+
expect(mongo_client.options[:platform]).to eq(Mongoid::PLATFORM_DETAILS)
|
582
|
+
end
|
583
|
+
|
584
|
+
it "sets the app_name to the config value" do
|
585
|
+
expect(mongo_client.options[:app_name]).to eq('testing')
|
586
|
+
end
|
587
|
+
end
|
588
|
+
|
589
|
+
context 'when the app_name is not set in the config' do
|
590
|
+
|
591
|
+
before do
|
592
|
+
Mongoid::Config.reset
|
593
|
+
Mongoid.configure do |config|
|
594
|
+
config.load_configuration(CONFIG)
|
595
|
+
end
|
596
|
+
end
|
597
|
+
|
598
|
+
let(:mongo_client) do
|
599
|
+
Band.new.mongo_client
|
600
|
+
end
|
601
|
+
|
602
|
+
it 'does not set the Mongoid.app_name option' do
|
603
|
+
expect(mongo_client.options.has_key?(:app_name)).to be(false)
|
604
|
+
end
|
605
|
+
end
|
545
606
|
end
|
546
607
|
|
547
608
|
describe ".mongo_client" do
|
@@ -580,6 +641,14 @@ describe Mongoid::Clients do
|
|
580
641
|
it "returns the default client" do
|
581
642
|
expect(mongo_client.options[:database].to_s).to eq(database_id)
|
582
643
|
end
|
644
|
+
|
645
|
+
it "sets the platform to Mongoid's platform constant" do
|
646
|
+
expect(mongo_client.options[:platform]).to eq(Mongoid::PLATFORM_DETAILS)
|
647
|
+
end
|
648
|
+
|
649
|
+
it "sets the app_name to the config value" do
|
650
|
+
expect(mongo_client.options[:app_name]).to eq('testing')
|
651
|
+
end
|
583
652
|
end
|
584
653
|
|
585
654
|
context "when no client exists with the key" do
|
data/spec/mongoid/config_spec.rb
CHANGED
@@ -128,6 +128,7 @@ describe Mongoid::Config do
|
|
128
128
|
end
|
129
129
|
|
130
130
|
before do
|
131
|
+
Mongoid::Config.reset
|
131
132
|
Mongoid.configure do |config|
|
132
133
|
config.load_configuration(conf)
|
133
134
|
end
|
@@ -139,6 +140,37 @@ describe Mongoid::Config do
|
|
139
140
|
end
|
140
141
|
end
|
141
142
|
|
143
|
+
context 'when the app_name is set in the config' do
|
144
|
+
|
145
|
+
let(:conf) do
|
146
|
+
CONFIG.merge(options: { app_name: 'admin-reporting' })
|
147
|
+
end
|
148
|
+
|
149
|
+
before do
|
150
|
+
Mongoid.configure do |config|
|
151
|
+
config.load_configuration(conf)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'sets the Mongoid.app_name to the provided value' do
|
156
|
+
expect(Mongoid.app_name).to eq('admin-reporting')
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
context 'when the app_name is not set in the config' do
|
161
|
+
|
162
|
+
before do
|
163
|
+
Mongoid::Config.reset
|
164
|
+
Mongoid.configure do |config|
|
165
|
+
config.load_configuration(CONFIG)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'does not set the Mongoid.app_name option' do
|
170
|
+
expect(Mongoid.app_name).to be_nil
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
142
174
|
describe "#load!" do
|
143
175
|
|
144
176
|
before(:all) do
|
@@ -306,7 +338,7 @@ describe Mongoid::Config do
|
|
306
338
|
context "when a default is provided" do
|
307
339
|
|
308
340
|
before do
|
309
|
-
described_class.load!(file)
|
341
|
+
described_class.load!(file, :test_with_max_staleness)
|
310
342
|
end
|
311
343
|
|
312
344
|
let(:default) do
|
@@ -325,7 +357,7 @@ describe Mongoid::Config do
|
|
325
357
|
|
326
358
|
it "sets the read option" do
|
327
359
|
expect(options["read"]).to eq({ "mode" => :primary_preferred,
|
328
|
-
"
|
360
|
+
"max_staleness" => 100 })
|
329
361
|
end
|
330
362
|
end
|
331
363
|
end
|
@@ -73,6 +73,29 @@ describe Mongoid::Contextual::Atomic do
|
|
73
73
|
expect(smiths.reload.members).to eq([ "Dave" ])
|
74
74
|
end
|
75
75
|
end
|
76
|
+
|
77
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
78
|
+
|
79
|
+
let(:criteria) do
|
80
|
+
Band.where(members: [ "DAVE" ]).collation(locale: 'en_US', strength: 2)
|
81
|
+
end
|
82
|
+
|
83
|
+
let(:context) do
|
84
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
85
|
+
end
|
86
|
+
|
87
|
+
before do
|
88
|
+
context.add_to_set(members: "Dave", genres: "Electro")
|
89
|
+
end
|
90
|
+
|
91
|
+
it "does not add duplicates" do
|
92
|
+
expect(depeche_mode.reload.members).to eq([ "Dave" ])
|
93
|
+
end
|
94
|
+
|
95
|
+
it "adds multiple operations" do
|
96
|
+
expect(depeche_mode.reload.genres).to eq([ "Electro" ])
|
97
|
+
end
|
98
|
+
end
|
76
99
|
end
|
77
100
|
|
78
101
|
describe "#bit" do
|
@@ -121,6 +144,29 @@ describe Mongoid::Contextual::Atomic do
|
|
121
144
|
expect(depeche_mode.reload.likes).to eq(14)
|
122
145
|
end
|
123
146
|
end
|
147
|
+
|
148
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
149
|
+
|
150
|
+
let!(:depeche_mode) do
|
151
|
+
Band.create(members: [ "Dave" ], likes: 60)
|
152
|
+
end
|
153
|
+
|
154
|
+
let(:criteria) do
|
155
|
+
Band.where(members: [ "DAVE" ]).collation(locale: 'en_US', strength: 2)
|
156
|
+
end
|
157
|
+
|
158
|
+
let(:context) do
|
159
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
160
|
+
end
|
161
|
+
|
162
|
+
before do
|
163
|
+
context.bit(likes: { and: 13, or: 10 })
|
164
|
+
end
|
165
|
+
|
166
|
+
it "performs the bitwise operation on initialized fields" do
|
167
|
+
expect(depeche_mode.reload.likes).to eq(14)
|
168
|
+
end
|
169
|
+
end
|
124
170
|
end
|
125
171
|
|
126
172
|
describe "#inc" do
|
@@ -177,6 +223,29 @@ describe Mongoid::Contextual::Atomic do
|
|
177
223
|
expect(beatles.reload.y).to eq(3)
|
178
224
|
end
|
179
225
|
end
|
226
|
+
|
227
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
228
|
+
|
229
|
+
let!(:depeche_mode) do
|
230
|
+
Band.create(members: [ "Dave" ])
|
231
|
+
end
|
232
|
+
|
233
|
+
let(:criteria) do
|
234
|
+
Band.where(members: [ "DAVE" ]).collation(locale: 'en_US', strength: 2)
|
235
|
+
end
|
236
|
+
|
237
|
+
let(:context) do
|
238
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
239
|
+
end
|
240
|
+
|
241
|
+
before do
|
242
|
+
context.inc(years: 1)
|
243
|
+
end
|
244
|
+
|
245
|
+
it "incs the value and read from alias" do
|
246
|
+
expect(depeche_mode.reload.years).to eq(1)
|
247
|
+
end
|
248
|
+
end
|
180
249
|
end
|
181
250
|
|
182
251
|
describe "#pop" do
|
@@ -226,6 +295,29 @@ describe Mongoid::Contextual::Atomic do
|
|
226
295
|
expect(smiths.reload.members).to be_nil
|
227
296
|
end
|
228
297
|
end
|
298
|
+
|
299
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
300
|
+
|
301
|
+
let!(:depeche_mode) do
|
302
|
+
Band.create(members: [ "Dave" ])
|
303
|
+
end
|
304
|
+
|
305
|
+
let(:criteria) do
|
306
|
+
Band.where(members: [ "DAVE" ]).collation(locale: 'en_US', strength: 2)
|
307
|
+
end
|
308
|
+
|
309
|
+
let(:context) do
|
310
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
311
|
+
end
|
312
|
+
|
313
|
+
before do
|
314
|
+
context.pop(members: 1)
|
315
|
+
end
|
316
|
+
|
317
|
+
it "pops the last element off the array" do
|
318
|
+
expect(depeche_mode.reload.members).to be_empty
|
319
|
+
end
|
320
|
+
end
|
229
321
|
end
|
230
322
|
|
231
323
|
describe "#pull" do
|
@@ -257,129 +349,276 @@ describe Mongoid::Contextual::Atomic do
|
|
257
349
|
it "does not error on non existent fields" do
|
258
350
|
expect(smiths.reload.members).to be_nil
|
259
351
|
end
|
352
|
+
|
353
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
354
|
+
|
355
|
+
let!(:depeche_mode) do
|
356
|
+
Band.create(members: [ "Dave" ])
|
357
|
+
end
|
358
|
+
|
359
|
+
let(:criteria) do
|
360
|
+
Band.where(members: [ "DAVE" ]).collation(locale: 'en_US', strength: 2)
|
361
|
+
end
|
362
|
+
|
363
|
+
let(:context) do
|
364
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
365
|
+
end
|
366
|
+
|
367
|
+
before do
|
368
|
+
context.pull(members: "DAVE")
|
369
|
+
end
|
370
|
+
|
371
|
+
it "pulls when the value is found" do
|
372
|
+
expect(depeche_mode.reload.members).to be_empty
|
373
|
+
end
|
374
|
+
end
|
260
375
|
end
|
261
376
|
|
262
377
|
describe "#pull_all" do
|
263
378
|
|
264
|
-
|
265
|
-
Band.create(members: [ "Dave", "Alan", "Fletch" ])
|
266
|
-
end
|
379
|
+
context 'when the criteria does not have a collation' do
|
267
380
|
|
268
|
-
|
269
|
-
|
270
|
-
|
381
|
+
let!(:depeche_mode) do
|
382
|
+
Band.create(members: [ "Dave", "Alan", "Fletch" ])
|
383
|
+
end
|
271
384
|
|
272
|
-
|
273
|
-
|
274
|
-
|
385
|
+
let!(:smiths) do
|
386
|
+
Band.create
|
387
|
+
end
|
275
388
|
|
276
|
-
|
277
|
-
|
278
|
-
|
389
|
+
let(:criteria) do
|
390
|
+
Band.all
|
391
|
+
end
|
279
392
|
|
280
|
-
|
281
|
-
|
282
|
-
|
393
|
+
let(:context) do
|
394
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
395
|
+
end
|
396
|
+
|
397
|
+
before do
|
398
|
+
context.pull_all(members: [ "Alan", "Dave" ])
|
399
|
+
end
|
283
400
|
|
284
|
-
|
285
|
-
|
401
|
+
it "pulls when the values are found" do
|
402
|
+
expect(depeche_mode.reload.members).to eq([ "Fletch" ])
|
403
|
+
end
|
404
|
+
|
405
|
+
it "does not error on non existent fields" do
|
406
|
+
expect(smiths.reload.members).to be_nil
|
407
|
+
end
|
286
408
|
end
|
287
409
|
|
288
|
-
|
289
|
-
|
410
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
411
|
+
|
412
|
+
let!(:depeche_mode) do
|
413
|
+
Band.create(members: [ "Dave", "Alan", "Fletch" ])
|
414
|
+
end
|
415
|
+
|
416
|
+
let(:criteria) do
|
417
|
+
Band.all.collation(locale: 'en_US', strength: 2)
|
418
|
+
end
|
419
|
+
|
420
|
+
let(:context) do
|
421
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
422
|
+
end
|
423
|
+
|
424
|
+
before do
|
425
|
+
context.pull_all(members: [ "ALAN", "DAVE" ])
|
426
|
+
end
|
427
|
+
|
428
|
+
it "pulls when the value is found" do
|
429
|
+
expect(depeche_mode.reload.members).to eq([ "Fletch" ])
|
430
|
+
end
|
290
431
|
end
|
291
432
|
end
|
292
433
|
|
293
434
|
describe "#push" do
|
294
435
|
|
295
|
-
|
296
|
-
Band.create(members: [ "Dave" ])
|
297
|
-
end
|
436
|
+
context 'when the criteria does not have a collation' do
|
298
437
|
|
299
|
-
|
300
|
-
|
301
|
-
|
438
|
+
let!(:depeche_mode) do
|
439
|
+
Band.create(members: [ "Dave" ])
|
440
|
+
end
|
302
441
|
|
303
|
-
|
304
|
-
|
305
|
-
|
442
|
+
let!(:smiths) do
|
443
|
+
Band.create
|
444
|
+
end
|
306
445
|
|
307
|
-
|
308
|
-
|
309
|
-
|
446
|
+
let(:criteria) do
|
447
|
+
Band.all
|
448
|
+
end
|
310
449
|
|
311
|
-
|
312
|
-
|
313
|
-
|
450
|
+
let(:context) do
|
451
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
452
|
+
end
|
453
|
+
|
454
|
+
before do
|
455
|
+
context.push(members: "Alan")
|
456
|
+
end
|
457
|
+
|
458
|
+
it "pushes the value to existing arrays" do
|
459
|
+
expect(depeche_mode.reload.members).to eq([ "Dave", "Alan" ])
|
460
|
+
end
|
314
461
|
|
315
|
-
|
316
|
-
|
462
|
+
it "pushes to non existent fields" do
|
463
|
+
expect(smiths.reload.members).to eq([ "Alan" ])
|
464
|
+
end
|
317
465
|
end
|
318
466
|
|
319
|
-
|
320
|
-
|
467
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
468
|
+
|
469
|
+
let!(:depeche_mode) do
|
470
|
+
Band.create(members: [ "Dave" ])
|
471
|
+
end
|
472
|
+
|
473
|
+
let!(:smiths) do
|
474
|
+
Band.create
|
475
|
+
end
|
476
|
+
|
477
|
+
let(:criteria) do
|
478
|
+
Band.where(members: ['DAVE']).collation(locale: 'en_US', strength: 2)
|
479
|
+
end
|
480
|
+
|
481
|
+
let(:context) do
|
482
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
483
|
+
end
|
484
|
+
|
485
|
+
before do
|
486
|
+
context.push(members: "Alan")
|
487
|
+
end
|
488
|
+
|
489
|
+
it "pushes the value to existing arrays" do
|
490
|
+
expect(depeche_mode.reload.members).to eq([ "Dave", "Alan" ])
|
491
|
+
end
|
492
|
+
|
493
|
+
it "pushes to non existent fields" do
|
494
|
+
expect(smiths.reload.members).to be_nil
|
495
|
+
end
|
321
496
|
end
|
322
497
|
end
|
323
498
|
|
324
499
|
describe "#push_all" do
|
325
500
|
|
326
|
-
|
327
|
-
Band.create(members: [ "Dave" ])
|
328
|
-
end
|
501
|
+
context 'when the criteria does not have a collation' do
|
329
502
|
|
330
|
-
|
331
|
-
|
332
|
-
|
503
|
+
let!(:depeche_mode) do
|
504
|
+
Band.create(members: [ "Dave" ])
|
505
|
+
end
|
333
506
|
|
334
|
-
|
335
|
-
|
336
|
-
|
507
|
+
let!(:smiths) do
|
508
|
+
Band.create
|
509
|
+
end
|
337
510
|
|
338
|
-
|
339
|
-
|
340
|
-
|
511
|
+
let(:criteria) do
|
512
|
+
Band.all
|
513
|
+
end
|
341
514
|
|
342
|
-
|
343
|
-
|
344
|
-
|
515
|
+
let(:context) do
|
516
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
517
|
+
end
|
518
|
+
|
519
|
+
before do
|
520
|
+
context.push_all(members: [ "Alan", "Fletch" ])
|
521
|
+
end
|
345
522
|
|
346
|
-
|
347
|
-
|
523
|
+
it "pushes the values to existing arrays" do
|
524
|
+
expect(depeche_mode.reload.members).to eq([ "Dave", "Alan", "Fletch" ])
|
525
|
+
end
|
526
|
+
|
527
|
+
it "pushes to non existent fields" do
|
528
|
+
expect(smiths.reload.members).to eq([ "Alan", "Fletch" ])
|
529
|
+
end
|
348
530
|
end
|
349
531
|
|
350
|
-
|
351
|
-
|
532
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
533
|
+
|
534
|
+
let!(:depeche_mode) do
|
535
|
+
Band.create(members: [ "Dave" ])
|
536
|
+
end
|
537
|
+
|
538
|
+
let!(:smiths) do
|
539
|
+
Band.create
|
540
|
+
end
|
541
|
+
|
542
|
+
let(:criteria) do
|
543
|
+
Band.where(members: ['DAVE']).collation(locale: 'en_US', strength: 2)
|
544
|
+
end
|
545
|
+
|
546
|
+
let(:context) do
|
547
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
548
|
+
end
|
549
|
+
|
550
|
+
before do
|
551
|
+
context.push_all(members: [ "Alan", "Fletch" ])
|
552
|
+
end
|
553
|
+
|
554
|
+
it "pushes the values to existing arrays" do
|
555
|
+
expect(depeche_mode.reload.members).to eq([ "Dave", "Alan", "Fletch" ])
|
556
|
+
end
|
352
557
|
end
|
353
558
|
end
|
354
559
|
|
355
560
|
describe "#rename" do
|
356
561
|
|
357
|
-
|
358
|
-
Band.create(members: [ "Dave" ])
|
359
|
-
end
|
562
|
+
context 'when the criteria does not have a collation' do
|
360
563
|
|
361
|
-
|
362
|
-
|
363
|
-
|
564
|
+
let!(:depeche_mode) do
|
565
|
+
Band.create(members: [ "Dave" ])
|
566
|
+
end
|
364
567
|
|
365
|
-
|
366
|
-
|
367
|
-
|
568
|
+
let!(:smiths) do
|
569
|
+
Band.create
|
570
|
+
end
|
368
571
|
|
369
|
-
|
370
|
-
|
371
|
-
|
572
|
+
let(:criteria) do
|
573
|
+
Band.all
|
574
|
+
end
|
372
575
|
|
373
|
-
|
374
|
-
|
375
|
-
|
576
|
+
let(:context) do
|
577
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
578
|
+
end
|
376
579
|
|
377
|
-
|
378
|
-
|
580
|
+
before do
|
581
|
+
context.rename(members: :artists)
|
582
|
+
end
|
583
|
+
|
584
|
+
it "renames existing fields" do
|
585
|
+
expect(depeche_mode.reload.artists).to eq([ "Dave" ])
|
586
|
+
end
|
587
|
+
|
588
|
+
it "does not rename non existent fields" do
|
589
|
+
expect(smiths.reload).to_not respond_to(:artists)
|
590
|
+
end
|
379
591
|
end
|
380
592
|
|
381
|
-
|
382
|
-
|
593
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
594
|
+
|
595
|
+
let!(:depeche_mode) do
|
596
|
+
Band.create(members: [ "Dave" ])
|
597
|
+
end
|
598
|
+
|
599
|
+
let!(:smiths) do
|
600
|
+
Band.create
|
601
|
+
end
|
602
|
+
|
603
|
+
let(:criteria) do
|
604
|
+
Band.where(members: ['DAVE']).collation(locale: 'en_US', strength: 2)
|
605
|
+
end
|
606
|
+
|
607
|
+
let(:context) do
|
608
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
609
|
+
end
|
610
|
+
|
611
|
+
before do
|
612
|
+
context.rename(members: :artists)
|
613
|
+
end
|
614
|
+
|
615
|
+
it "renames existing fields" do
|
616
|
+
expect(depeche_mode.reload.artists).to eq([ "Dave" ])
|
617
|
+
end
|
618
|
+
|
619
|
+
it "does not rename non existent fields" do
|
620
|
+
expect(smiths.reload).to_not respond_to(:artists)
|
621
|
+
end
|
383
622
|
end
|
384
623
|
end
|
385
624
|
|
@@ -509,5 +748,32 @@ describe Mongoid::Contextual::Atomic do
|
|
509
748
|
end
|
510
749
|
end
|
511
750
|
end
|
751
|
+
|
752
|
+
context 'when the criteria has a collation', if: collation_supported? do
|
753
|
+
|
754
|
+
let!(:depeche_mode) do
|
755
|
+
Band.create(name: "Depeche Mode", years: 10)
|
756
|
+
end
|
757
|
+
|
758
|
+
let!(:new_order) do
|
759
|
+
Band.create(name: "New Order", years: 10)
|
760
|
+
end
|
761
|
+
|
762
|
+
let(:criteria) do
|
763
|
+
Band.where(name: 'DEPECHE MODE').collation(locale: 'en_US', strength: 2)
|
764
|
+
end
|
765
|
+
|
766
|
+
let(:context) do
|
767
|
+
Mongoid::Contextual::Mongo.new(criteria)
|
768
|
+
end
|
769
|
+
|
770
|
+
before do
|
771
|
+
context.unset(:name)
|
772
|
+
end
|
773
|
+
|
774
|
+
it "unsets the unaliased field" do
|
775
|
+
expect(depeche_mode.reload.name).to be_nil
|
776
|
+
end
|
777
|
+
end
|
512
778
|
end
|
513
779
|
end
|