mongoid 6.0.0.rc0 → 6.0.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.tar.gz.sig +0 -0
- data/README.md +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +19 -1
- data/lib/mongoid/document.rb +21 -15
- data/lib/mongoid/extensions/hash.rb +1 -0
- data/lib/mongoid/relations/eager/base.rb +4 -4
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +1 -1
- data/lib/mongoid/relations/eager/has_many.rb +1 -1
- data/lib/mongoid/version.rb +1 -1
- data/spec/mongoid/contextual/mongo_spec.rb +59 -15
- data/spec/mongoid/document_spec.rb +16 -0
- data/spec/mongoid/extensions/hash_spec.rb +15 -0
- data/spec/mongoid/query_cache_spec.rb +2 -2
- data/spec/mongoid/relations/eager_spec.rb +40 -0
- data/spec/mongoid/relations/embedded/many_spec.rb +30 -0
- metadata +4 -4
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba5a14c6242427982c5072b4f2e56ab499ff7559
|
4
|
+
data.tar.gz: 39d47341e981c5facfd7360ae9a83c6b3bd2dc00
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e932dbd7064df798fae822b792a82b5b387a9c8daa93826158b15e5cbffe0ee59a0f92eb5b003d1e051097f4b017d6fc6f0c989bc00b363f4a8853a45689ccc
|
7
|
+
data.tar.gz: 4121c17953fa7b3786e30ed6d3f0c473d5ed7bd26dc59e700c9d41061cd83e318d0c6a62c0539a4d74d7561f8b9bf9eaa437cce41421358d98c139705ad9325b
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -268,11 +268,29 @@ module Mongoid
|
|
268
268
|
# @since 3.0.0
|
269
269
|
def documents
|
270
270
|
return results["results"] if results.has_key?("results")
|
271
|
-
view =
|
271
|
+
view = output_database[output_collection].find
|
272
272
|
view.no_cursor_timeout if criteria.options[:timeout] == false
|
273
273
|
view
|
274
274
|
end
|
275
275
|
|
276
|
+
# Get the database that the map/reduce results were stored in.
|
277
|
+
#
|
278
|
+
# @api private
|
279
|
+
#
|
280
|
+
# @example Get the output database.
|
281
|
+
# map_reduce.output_database
|
282
|
+
#
|
283
|
+
# @return [ Mongo::Database ] The output database.
|
284
|
+
#
|
285
|
+
# @since 6.0.0
|
286
|
+
def output_database
|
287
|
+
if db = command[:out].fetch(:db, command[:out]['db'])
|
288
|
+
client.with(database: db).database
|
289
|
+
else
|
290
|
+
client.database
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
276
294
|
# Get the collection that the map/reduce results were stored in.
|
277
295
|
#
|
278
296
|
# @api private
|
data/lib/mongoid/document.rb
CHANGED
@@ -49,7 +49,7 @@ module Mongoid
|
|
49
49
|
#
|
50
50
|
# @since 2.0.0
|
51
51
|
def freeze
|
52
|
-
|
52
|
+
as_attributes.freeze and self
|
53
53
|
end
|
54
54
|
|
55
55
|
# Checks if the document is frozen
|
@@ -172,20 +172,7 @@ module Mongoid
|
|
172
172
|
#
|
173
173
|
# @since 1.0.0
|
174
174
|
def as_document
|
175
|
-
|
176
|
-
embedded_relations.each_pair do |name, meta|
|
177
|
-
without_autobuild do
|
178
|
-
relation, stored = send(name), meta.store_as
|
179
|
-
if attributes.key?(stored) || !relation.blank?
|
180
|
-
if relation
|
181
|
-
attributes[stored] = relation.as_document
|
182
|
-
else
|
183
|
-
attributes.delete(stored)
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|
187
|
-
end
|
188
|
-
attributes
|
175
|
+
BSON::Document.new(as_attributes)
|
189
176
|
end
|
190
177
|
|
191
178
|
# Calls #as_json on the document with additional, Mongoid-specific options.
|
@@ -285,6 +272,25 @@ module Mongoid
|
|
285
272
|
nil
|
286
273
|
end
|
287
274
|
|
275
|
+
private
|
276
|
+
|
277
|
+
def as_attributes
|
278
|
+
return attributes if frozen?
|
279
|
+
embedded_relations.each_pair do |name, meta|
|
280
|
+
without_autobuild do
|
281
|
+
relation, stored = send(name), meta.store_as
|
282
|
+
if attributes.key?(stored) || !relation.blank?
|
283
|
+
if relation
|
284
|
+
attributes[stored] = relation.as_document
|
285
|
+
else
|
286
|
+
attributes.delete(stored)
|
287
|
+
end
|
288
|
+
end
|
289
|
+
end
|
290
|
+
end
|
291
|
+
attributes
|
292
|
+
end
|
293
|
+
|
288
294
|
module ClassMethods
|
289
295
|
|
290
296
|
# Performs class equality checking.
|
@@ -48,7 +48,7 @@ module Mongoid
|
|
48
48
|
@loaded = []
|
49
49
|
while shift_metadata
|
50
50
|
preload
|
51
|
-
@loaded << @docs.collect { |d| d.send(@metadata.name) }
|
51
|
+
@loaded << @docs.collect { |d| d.send(@metadata.name) if d.respond_to?(@metadata.name) }
|
52
52
|
end
|
53
53
|
@loaded.flatten
|
54
54
|
end
|
@@ -99,12 +99,12 @@ module Mongoid
|
|
99
99
|
# @example Return a hash with the current documents grouped by key.
|
100
100
|
# loader.grouped_docs
|
101
101
|
#
|
102
|
-
# @return [ Hash ] hash with
|
102
|
+
# @return [ Hash ] hash with grouped documents.
|
103
103
|
#
|
104
104
|
# @since 4.0.0
|
105
105
|
def grouped_docs
|
106
106
|
@grouped_docs[@metadata.name] ||= @docs.group_by do |doc|
|
107
|
-
doc.send(group_by_key)
|
107
|
+
doc.send(group_by_key) if doc.respond_to?(group_by_key)
|
108
108
|
end
|
109
109
|
end
|
110
110
|
|
@@ -145,7 +145,7 @@ module Mongoid
|
|
145
145
|
#
|
146
146
|
# @since 4.0.0
|
147
147
|
def set_relation(doc, element)
|
148
|
-
doc.set_relation(@metadata.name, element)
|
148
|
+
doc.set_relation(@metadata.name, element) unless doc.blank?
|
149
149
|
end
|
150
150
|
end
|
151
151
|
end
|
data/lib/mongoid/version.rb
CHANGED
@@ -115,21 +115,6 @@ 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
|
-
|
133
118
|
context "when provided a block" do
|
134
119
|
|
135
120
|
let(:context) do
|
@@ -1400,6 +1385,65 @@ describe Mongoid::Contextual::Mongo do
|
|
1400
1385
|
end
|
1401
1386
|
end
|
1402
1387
|
|
1388
|
+
context "when the output specifies a different db" do
|
1389
|
+
|
1390
|
+
let(:criteria) do
|
1391
|
+
Band.limit(1)
|
1392
|
+
end
|
1393
|
+
|
1394
|
+
let(:context) do
|
1395
|
+
described_class.new(criteria)
|
1396
|
+
end
|
1397
|
+
|
1398
|
+
after do
|
1399
|
+
Band.with(database: 'another-db') do |b|
|
1400
|
+
b.all.delete
|
1401
|
+
end
|
1402
|
+
end
|
1403
|
+
|
1404
|
+
context 'when db is a string' do
|
1405
|
+
|
1406
|
+
let(:results) do
|
1407
|
+
context.map_reduce(map, reduce).out(merge: :mr_output, db: 'another-db')
|
1408
|
+
end
|
1409
|
+
|
1410
|
+
it "returns the correct number of documents" do
|
1411
|
+
expect(results.count).to eq(1)
|
1412
|
+
end
|
1413
|
+
|
1414
|
+
it "contains the entire results" do
|
1415
|
+
expect(results).to eq([
|
1416
|
+
{ "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
|
1417
|
+
])
|
1418
|
+
end
|
1419
|
+
|
1420
|
+
it 'writes to the specified db' do
|
1421
|
+
expect(Band.mongo_client.with(database: 'another-db')[:mr_output].find.count).to eq(1)
|
1422
|
+
end
|
1423
|
+
end
|
1424
|
+
|
1425
|
+
context 'when db is a symbol' do
|
1426
|
+
|
1427
|
+
let(:results) do
|
1428
|
+
context.map_reduce(map, reduce).out(merge: :mr_output, 'db' => 'another-db')
|
1429
|
+
end
|
1430
|
+
|
1431
|
+
it "returns the correct number of documents" do
|
1432
|
+
expect(results.count).to eq(1)
|
1433
|
+
end
|
1434
|
+
|
1435
|
+
it "contains the entire results" do
|
1436
|
+
expect(results).to eq([
|
1437
|
+
{ "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
|
1438
|
+
])
|
1439
|
+
end
|
1440
|
+
|
1441
|
+
it 'writes to the specified db' do
|
1442
|
+
expect(Band.mongo_client.with(database: 'another-db')[:mr_output].find.count).to eq(1)
|
1443
|
+
end
|
1444
|
+
end
|
1445
|
+
end
|
1446
|
+
|
1403
1447
|
context "when providing no output" do
|
1404
1448
|
|
1405
1449
|
let(:criteria) do
|
@@ -450,14 +450,26 @@ describe Mongoid::Document do
|
|
450
450
|
expect(person.as_document).to have_key("name")
|
451
451
|
end
|
452
452
|
|
453
|
+
it "includes embeds one attributes as a symbol" do
|
454
|
+
expect(person.as_document).to have_key(:name)
|
455
|
+
end
|
456
|
+
|
453
457
|
it "includes embeds many attributes" do
|
454
458
|
expect(person.as_document).to have_key("addresses")
|
455
459
|
end
|
456
460
|
|
461
|
+
it "includes embeds many attributes as a symbol" do
|
462
|
+
expect(person.as_document).to have_key(:addresses)
|
463
|
+
end
|
464
|
+
|
457
465
|
it "includes second level embeds many attributes" do
|
458
466
|
expect(person.as_document["addresses"].first).to have_key("locations")
|
459
467
|
end
|
460
468
|
|
469
|
+
it "includes second level embeds many attributes as a symbol" do
|
470
|
+
expect(person.as_document["addresses"].first).to have_key(:locations)
|
471
|
+
end
|
472
|
+
|
461
473
|
context "with relation define store_as option in embeded_many" do
|
462
474
|
|
463
475
|
let!(:phone) do
|
@@ -468,6 +480,10 @@ describe Mongoid::Document do
|
|
468
480
|
expect(person.as_document).to have_key("mobile_phones")
|
469
481
|
end
|
470
482
|
|
483
|
+
it 'includes the store_as key association as a symbol' do
|
484
|
+
expect(person.as_document).to have_key(:mobile_phones)
|
485
|
+
end
|
486
|
+
|
471
487
|
it 'should not include the key of association' do
|
472
488
|
expect(person.as_document).to_not have_key("phones")
|
473
489
|
end
|
@@ -247,6 +247,21 @@ describe Mongoid::Extensions::Hash do
|
|
247
247
|
end
|
248
248
|
end
|
249
249
|
|
250
|
+
context "when the parent key is not present" do
|
251
|
+
|
252
|
+
let(:hash) do
|
253
|
+
{ "101" => { "name" => "hundred and one" } }
|
254
|
+
end
|
255
|
+
|
256
|
+
let(:nested) do
|
257
|
+
hash.__nested__("100.name")
|
258
|
+
end
|
259
|
+
|
260
|
+
it "should return nil" do
|
261
|
+
expect(nested).to eq(nil)
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
250
265
|
describe ".demongoize" do
|
251
266
|
|
252
267
|
let(:hash) do
|
@@ -38,7 +38,7 @@ describe Mongoid::QueryCache do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
it 'queries for each access to the base' do
|
41
|
-
expect(server).to receive(:
|
41
|
+
expect(server).to receive(:with_connection).exactly(relations.size).times.and_call_original
|
42
42
|
relations.each do |object|
|
43
43
|
object.person
|
44
44
|
end
|
@@ -52,7 +52,7 @@ describe Mongoid::QueryCache do
|
|
52
52
|
end
|
53
53
|
|
54
54
|
it 'queries only once for the base' do
|
55
|
-
expect(server).to receive(:
|
55
|
+
expect(server).to receive(:with_connection).exactly(1).times.and_call_original
|
56
56
|
relations.each do |object|
|
57
57
|
object.person
|
58
58
|
end
|
@@ -181,6 +181,46 @@ describe Mongoid::Relations::Eager do
|
|
181
181
|
expect(Mongoid::Relations::Eager::HasAndBelongsToMany).to receive(:new).with([houses_metadata], docs).once.and_call_original
|
182
182
|
context.eager_load(docs)
|
183
183
|
end
|
184
|
+
|
185
|
+
context 'when one of the eager loading definitions is nested' do
|
186
|
+
|
187
|
+
before do
|
188
|
+
class User
|
189
|
+
include Mongoid::Document
|
190
|
+
end
|
191
|
+
|
192
|
+
class Unit
|
193
|
+
include Mongoid::Document
|
194
|
+
end
|
195
|
+
|
196
|
+
class Booking
|
197
|
+
include Mongoid::Document
|
198
|
+
belongs_to :unit
|
199
|
+
has_many :vouchers
|
200
|
+
end
|
201
|
+
|
202
|
+
class Voucher
|
203
|
+
include Mongoid::Document
|
204
|
+
belongs_to :booking
|
205
|
+
belongs_to :created_by, class_name: 'User'
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
it 'successfully loads all relations' do
|
210
|
+
user = User.create
|
211
|
+
unit = Unit.create
|
212
|
+
booking = Booking.create(unit: unit)
|
213
|
+
Voucher.create(booking: booking, created_by: user)
|
214
|
+
|
215
|
+
vouchers = Voucher.includes(:created_by, booking: [:unit])
|
216
|
+
|
217
|
+
vouchers.each do |voucher|
|
218
|
+
expect(voucher.created_by).to eql(user)
|
219
|
+
expect(voucher.booking).to eql(booking)
|
220
|
+
expect(voucher.booking.unit).to eql(unit)
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
184
224
|
end
|
185
225
|
|
186
226
|
context "when including two of the same relation type" do
|
@@ -879,6 +879,36 @@ describe Mongoid::Relations::Embedded::Many do
|
|
879
879
|
Person.create
|
880
880
|
end
|
881
881
|
|
882
|
+
context 'when a string is used to access an attribute' do
|
883
|
+
|
884
|
+
let!(:address) do
|
885
|
+
person.addresses.create(street: "one")
|
886
|
+
end
|
887
|
+
|
888
|
+
let(:document) do
|
889
|
+
person.reload.addresses.as_document.first
|
890
|
+
end
|
891
|
+
|
892
|
+
it "returns the attribute value" do
|
893
|
+
expect(document['street']).to eq('one')
|
894
|
+
end
|
895
|
+
end
|
896
|
+
|
897
|
+
context 'when a symbol is used to access an attribute' do
|
898
|
+
|
899
|
+
let!(:address) do
|
900
|
+
person.addresses.create(street: "one")
|
901
|
+
end
|
902
|
+
|
903
|
+
let(:document) do
|
904
|
+
person.reload.addresses.as_document.first
|
905
|
+
end
|
906
|
+
|
907
|
+
it "returns the attribute value" do
|
908
|
+
expect(document[:street]).to eq('one')
|
909
|
+
end
|
910
|
+
end
|
911
|
+
|
882
912
|
context "when the relation has no default scope" do
|
883
913
|
|
884
914
|
let!(:address) do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.0.0
|
4
|
+
version: 6.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Durran Jordan
|
@@ -30,7 +30,7 @@ cert_chain:
|
|
30
30
|
ZIvvwAhgCjVW5QCi2I1noxXLmtZ3XDawWu8kaGtu8giHXcwL3941m8hvFZ/Wr9Yi
|
31
31
|
JvcXJt2a4/JvwnIs2hmKuyfhZmB9HEE5wQQaCMnnC14=
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date: 2016-
|
33
|
+
date: 2016-09-21 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: activemodel
|
@@ -52,14 +52,14 @@ dependencies:
|
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: '2.
|
55
|
+
version: '2.3'
|
56
56
|
type: :runtime
|
57
57
|
prerelease: false
|
58
58
|
version_requirements: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: '2.
|
62
|
+
version: '2.3'
|
63
63
|
description: Mongoid is an ODM (Object Document Mapper) Framework for MongoDB, written
|
64
64
|
in Ruby.
|
65
65
|
email:
|
metadata.gz.sig
CHANGED
Binary file
|