mongo 2.0.0.beta → 2.0.0.rc

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.
Files changed (136) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +14 -1
  5. data/lib/mongo.rb +2 -1
  6. data/lib/mongo/auth.rb +2 -2
  7. data/lib/mongo/bulk_write.rb +52 -0
  8. data/lib/mongo/bulk_write/bulk_writable.rb +191 -0
  9. data/lib/mongo/bulk_write/deletable.rb +60 -0
  10. data/lib/mongo/bulk_write/insertable.rb +52 -0
  11. data/lib/mongo/bulk_write/ordered_bulk_write.rb +48 -0
  12. data/lib/mongo/bulk_write/replacable.rb +57 -0
  13. data/lib/mongo/bulk_write/unordered_bulk_write.rb +46 -0
  14. data/lib/mongo/bulk_write/updatable.rb +68 -0
  15. data/lib/mongo/client.rb +15 -2
  16. data/lib/mongo/cluster/topology/replica_set.rb +1 -1
  17. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  18. data/lib/mongo/cluster/topology/standalone.rb +1 -1
  19. data/lib/mongo/cluster/topology/unknown.rb +1 -1
  20. data/lib/mongo/collection.rb +1 -1
  21. data/lib/mongo/collection/view/aggregation.rb +1 -1
  22. data/lib/mongo/collection/view/readable.rb +1 -1
  23. data/lib/mongo/collection/view/writable.rb +5 -5
  24. data/lib/mongo/cursor.rb +0 -2
  25. data/lib/mongo/error.rb +4 -3
  26. data/lib/mongo/error/{bulk_write_failure.rb → bulk_write_error.rb} +2 -2
  27. data/lib/mongo/error/invalid_bulk_operation.rb +2 -2
  28. data/lib/mongo/error/invalid_bulk_operation_type.rb +36 -0
  29. data/lib/mongo/error/{empty_batch.rb → multi_index_drop.rb} +5 -10
  30. data/lib/mongo/grid/file/metadata.rb +1 -8
  31. data/lib/mongo/grid/fs.rb +5 -5
  32. data/lib/mongo/index/view.rb +90 -34
  33. data/lib/mongo/operation.rb +0 -1
  34. data/lib/mongo/operation/aggregate.rb +2 -2
  35. data/lib/mongo/operation/aggregate/result.rb +4 -0
  36. data/lib/mongo/operation/bulk_delete/result.rb +2 -127
  37. data/lib/mongo/operation/bulk_insert/result.rb +2 -132
  38. data/lib/mongo/operation/bulk_update/result.rb +2 -142
  39. data/lib/mongo/operation/command.rb +1 -1
  40. data/lib/mongo/operation/executable.rb +3 -3
  41. data/lib/mongo/operation/list_collections/result.rb +0 -2
  42. data/lib/mongo/operation/map_reduce.rb +1 -1
  43. data/lib/mongo/operation/read/collections_info.rb +1 -1
  44. data/lib/mongo/operation/read/get_more.rb +1 -1
  45. data/lib/mongo/operation/read/indexes.rb +1 -1
  46. data/lib/mongo/operation/read/list_collections.rb +1 -1
  47. data/lib/mongo/operation/read/list_indexes.rb +1 -1
  48. data/lib/mongo/operation/read/query.rb +1 -1
  49. data/lib/mongo/operation/specifiable.rb +18 -1
  50. data/lib/mongo/operation/write.rb +2 -0
  51. data/lib/mongo/operation/write/bulk_delete.rb +5 -19
  52. data/lib/mongo/operation/write/bulk_insert.rb +9 -40
  53. data/lib/mongo/operation/write/bulk_mergable.rb +67 -0
  54. data/lib/mongo/operation/write/bulk_update.rb +5 -19
  55. data/lib/mongo/operation/write/command.rb +1 -1
  56. data/lib/mongo/operation/write/command/{ensure_index.rb → create_index.rb} +4 -9
  57. data/lib/mongo/operation/write/command/delete.rb +4 -4
  58. data/lib/mongo/operation/write/command/drop_index.rb +1 -1
  59. data/lib/mongo/operation/write/command/insert.rb +4 -4
  60. data/lib/mongo/operation/write/command/update.rb +4 -4
  61. data/lib/mongo/operation/write/create_index.rb +12 -7
  62. data/lib/mongo/operation/write/create_user.rb +1 -1
  63. data/lib/mongo/operation/write/delete.rb +1 -1
  64. data/lib/mongo/operation/write/drop_index.rb +1 -1
  65. data/lib/mongo/operation/write/insert.rb +1 -1
  66. data/lib/mongo/operation/write/legacy_bulk_mergable.rb +83 -0
  67. data/lib/mongo/operation/write/remove_user.rb +1 -1
  68. data/lib/mongo/operation/write/update.rb +1 -1
  69. data/lib/mongo/{bulk.rb → options.rb} +2 -2
  70. data/lib/mongo/options/mapper.rb +78 -0
  71. data/lib/mongo/server.rb +2 -2
  72. data/lib/mongo/server/connection_pool/queue.rb +1 -1
  73. data/lib/mongo/server/description.rb +1 -1
  74. data/lib/mongo/server/description/inspector.rb +1 -1
  75. data/lib/mongo/server_selector.rb +1 -1
  76. data/lib/mongo/socket/unix.rb +2 -4
  77. data/lib/mongo/version.rb +1 -1
  78. data/lib/mongo/write_concern/acknowledged.rb +15 -1
  79. data/lib/mongo/write_concern/normalizable.rb +0 -22
  80. data/lib/mongo/write_concern/unacknowledged.rb +12 -0
  81. data/spec/mongo/bulk/bulk_write_spec.rb +178 -91
  82. data/spec/mongo/collection/view/aggregation_spec.rb +14 -1
  83. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  84. data/spec/mongo/collection/view/map_reduce_spec.rb +2 -2
  85. data/spec/mongo/collection/view/readable_spec.rb +2 -2
  86. data/spec/mongo/collection/view/writable_spec.rb +7 -7
  87. data/spec/mongo/collection/view_spec.rb +14 -5
  88. data/spec/mongo/collection_spec.rb +5 -5
  89. data/spec/mongo/cursor_spec.rb +3 -3
  90. data/spec/mongo/database_spec.rb +4 -8
  91. data/spec/mongo/grid/fs_spec.rb +8 -8
  92. data/spec/mongo/index/view_spec.rb +139 -35
  93. data/spec/mongo/operation/aggregate_spec.rb +14 -22
  94. data/spec/mongo/operation/command_spec.rb +8 -16
  95. data/spec/mongo/operation/map_reduce_spec.rb +1 -1
  96. data/spec/mongo/operation/read/indexes_spec.rb +2 -2
  97. data/spec/mongo/operation/write/bulk_delete_spec.rb +1 -239
  98. data/spec/mongo/operation/write/bulk_insert_spec.rb +3 -234
  99. data/spec/mongo/operation/write/bulk_update_spec.rb +1 -289
  100. data/spec/mongo/operation/write/command/delete_spec.rb +0 -13
  101. data/spec/mongo/operation/write/command/insert_spec.rb +0 -14
  102. data/spec/mongo/operation/write/command/update_spec.rb +0 -14
  103. data/spec/mongo/operation/write/{ensure_index_spec.rb → create_index_spec.rb} +8 -26
  104. data/spec/mongo/operation/write/delete_spec.rb +1 -1
  105. data/spec/mongo/operation/write/drop_index_spec.rb +1 -1
  106. data/spec/mongo/operation/write/insert_spec.rb +3 -3
  107. data/spec/mongo/operation/write/update_spec.rb +1 -1
  108. data/spec/mongo/server_selection_spec.rb +2 -2
  109. data/spec/support/authorization.rb +4 -2
  110. data/spec/support/server_selection.rb +25 -8
  111. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +4 -10
  112. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +6 -12
  113. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +4 -6
  114. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +4 -10
  115. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +6 -12
  116. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +4 -10
  117. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +4 -10
  118. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +6 -12
  119. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +6 -12
  120. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +9 -17
  121. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +9 -17
  122. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +6 -10
  123. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +11 -21
  124. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +11 -18
  125. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml +31 -0
  126. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +31 -0
  127. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +29 -0
  128. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +26 -0
  129. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +4 -10
  130. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +2 -6
  131. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +0 -2
  132. data/spec/support/shared/bulk_write.rb +109 -72
  133. metadata +29 -10
  134. metadata.gz.sig +0 -0
  135. data/lib/mongo/bulk/bulk_write.rb +0 -307
  136. data/lib/mongo/operation/batchable.rb +0 -103
@@ -83,263 +83,6 @@ describe Mongo::Operation::Write::BulkUpdate do
83
83
  end
84
84
  end
85
85
 
86
- describe '#write_concern' do
87
-
88
- let(:other_write_concern) do
89
- { w: 2 }
90
- end
91
-
92
- context 'when the write concern is set' do
93
-
94
- it 'sets the write concern' do
95
- new_op = op.write_concern(other_write_concern)
96
- expect(new_op.write_concern.options).to eq(other_write_concern)
97
- end
98
- end
99
- end
100
-
101
- describe '#batch' do
102
-
103
- context 'when number of updates is evenly divisible by number of batches' do
104
- let(:documents) do
105
- [{ q: { a: 1 },
106
- u: { :$set => { a: 2 } },
107
- multi: true,
108
- upsert: false },
109
- { q: { b: 1 },
110
- u: { :$set => { b: 2 } },
111
- multi: true,
112
- upsert: false },
113
- { q: { c: 1 },
114
- u: { :$set => { c: 2 } },
115
- multi: true,
116
- upsert: false },
117
- { q: { d: 1 },
118
- u: { :$set => { d: 2 } },
119
- multi: true,
120
- upsert: false },
121
- { q: { e: 1 },
122
- u: { :$set => { e: 2 } },
123
- multi: true,
124
- upsert: false },
125
- { q: { f: 1 },
126
- u: { :$set => { f: 2 } },
127
- multi: true,
128
- upsert: false }
129
- ]
130
- end
131
-
132
- let(:n_batches) { 3 }
133
-
134
- it 'splits the op into the n_batches number of children ops' do
135
- expect(op.batch(n_batches).size).to eq(n_batches)
136
- end
137
-
138
- it 'divides the updates evenly between children ops' do
139
- ops = op.batch(n_batches)
140
- batch_size = documents.size / n_batches
141
-
142
- n_batches.times do |i|
143
- start_index = i * batch_size
144
- expect(ops[i].spec[:updates]).to eq(documents[start_index, batch_size])
145
- end
146
- end
147
- end
148
-
149
- context 'when number of updates is less than number of batches' do
150
- let(:documents) do
151
- [ { q: { a: 1 },
152
- u: { :$set => { a: 2 } } } ]
153
- end
154
- let(:n_batches) { 3 }
155
-
156
- it 'raises an exception' do
157
- expect {
158
- op.batch(n_batches)
159
- }.to raise_error(Exception)
160
- end
161
- end
162
-
163
- context 'when number of updates is not evenly divisible by number of batches' do
164
- let(:documents) do
165
- [{ q: { a: 1 },
166
- u: { :$set => { a: 2 } },
167
- multi: true,
168
- upsert: false },
169
- { q: { b: 1 },
170
- u: { :$set => { b: 2 } },
171
- multi: true,
172
- upsert: false },
173
- { q: { c: 1 },
174
- u: { :$set => { c: 2 } },
175
- multi: true,
176
- upsert: false },
177
- { q: { d: 1 },
178
- u: { :$set => { d: 2 } },
179
- multi: true,
180
- upsert: false },
181
- { q: { e: 1 },
182
- u: { :$set => { e: 2 } },
183
- multi: true,
184
- upsert: false },
185
- { q: { f: 1 },
186
- u: { :$set => { f: 2 } },
187
- multi: true,
188
- upsert: false }
189
- ]
190
- end
191
- let(:n_batches) { 4 }
192
-
193
- it 'splits the op into the n_batches number of children ops' do
194
- expect(op.batch(n_batches).size).to eq(n_batches)
195
- end
196
-
197
- it 'divides the updates evenly between children ops' do
198
- ops = op.batch(n_batches)
199
- batch_size = documents.size / n_batches
200
-
201
- n_batches.times do |i|
202
- start_index = i * batch_size
203
- if i == n_batches - 1
204
- expect(ops[i].spec[:updates]).to eq(documents[start_index..-1])
205
- else
206
- expect(ops[i].spec[:updates]).to eq(documents[start_index, batch_size])
207
- end
208
- end
209
- end
210
- end
211
- end
212
-
213
- describe '#merge!' do
214
-
215
- context 'same collection and database' do
216
-
217
- let(:other_docs) do
218
- [ { q: { foo: 1 },
219
- u: { :$set => { bar: 1 } },
220
- multi: true,
221
- upsert: true } ]
222
- end
223
-
224
- let(:other_spec) do
225
- { updates: other_docs,
226
- db_name: db_name,
227
- coll_name: coll_name
228
- }
229
- end
230
-
231
- let(:other) { described_class.new(other_spec) }
232
-
233
- it 'merges the two ops' do
234
- expect{ op.merge!(other) }.not_to raise_exception
235
- end
236
- end
237
-
238
- context 'different database' do
239
-
240
- let(:other_docs) do
241
- [ { q: { :foo => 1 },
242
- u: { :$set => { bar: 1 } },
243
- multi: true,
244
- upsert: true } ]
245
- end
246
-
247
- let(:other_spec) do
248
- { updates: other_docs,
249
- db_name: 'different',
250
- coll_name: coll_name
251
- }
252
- end
253
-
254
- let(:other) { described_class.new(other_spec) }
255
-
256
- it 'raises an exception' do
257
- expect{ op.merge!(other) }.to raise_exception
258
- end
259
- end
260
-
261
- context 'different collection' do
262
-
263
- let(:other_docs) do
264
- [ { q: { foo: 1 },
265
- u: { :$set => { bar: 1 } },
266
- multi: true,
267
- upsert: true } ]
268
- end
269
-
270
- let(:other_spec) do
271
- { updates: other_docs,
272
- db_name: db_name,
273
- coll_name: 'different'
274
- }
275
- end
276
-
277
- let(:other) { described_class.new(other_spec) }
278
-
279
- it 'raises an exception' do
280
- expect{ op.merge!(other) }.to raise_exception
281
- end
282
- end
283
-
284
- context 'different operation type' do
285
- let(:other) { Mongo::Write::Insert.new(spec) }
286
-
287
- it 'raises an exception' do
288
- expect{ op.merge!(other) }.to raise_exception
289
- end
290
- end
291
-
292
- context 'merged updates' do
293
-
294
- let(:other_docs) do
295
- [ { q: { foo: 1 },
296
- u: { :$set => { bar: 1 } },
297
- multi: true,
298
- upsert: true } ]
299
- end
300
-
301
- let(:other_spec) do
302
- { updates: other_docs,
303
- db_name: db_name,
304
- coll_name: coll_name
305
- }
306
- end
307
-
308
- let(:other) { described_class.new(other_spec) }
309
-
310
- let(:expected) do
311
- documents + other_docs
312
- end
313
-
314
- it 'merges the list of updates' do
315
- expect(op.merge!(other).spec[:updates]).to eq(expected)
316
- end
317
- end
318
-
319
- context 'mutability' do
320
-
321
- let(:other_docs) do
322
- [ { q: { foo: 1 },
323
- u: { :$set => { bar: 1 } },
324
- multi: true,
325
- upsert: true } ]
326
- end
327
-
328
- let(:other_spec) do
329
- { updates: other_docs,
330
- db_name: db_name,
331
- coll_name: coll_name
332
- }
333
- end
334
-
335
- let(:other) { described_class.new(other_spec) }
336
-
337
- it 'mutates the operation itself' do
338
- expect(op.merge!(other)).to be(op)
339
- end
340
- end
341
- end
342
-
343
86
  describe '#execute' do
344
87
 
345
88
  before do
@@ -350,7 +93,7 @@ describe Mongo::Operation::Write::BulkUpdate do
350
93
  end
351
94
 
352
95
  after do
353
- authorized_collection.find.remove_many
96
+ authorized_collection.find.delete_many
354
97
  end
355
98
 
356
99
  context 'when updating a single document' do
@@ -489,36 +232,5 @@ describe Mongo::Operation::Write::BulkUpdate do
489
232
  end
490
233
  end
491
234
  end
492
-
493
- context 'when a write concern override is specified' do
494
-
495
- let(:op) do
496
- described_class.new({
497
- updates: documents,
498
- db_name: db_name,
499
- coll_name: coll_name,
500
- write_concern: Mongo::WriteConcern.get(w: 1),
501
- ordered: false
502
- })
503
- end
504
-
505
- let(:documents) do
506
- [ { q: { name: 'test' }, u: { '$st' => { field: 'blah' }}, multi: true} ]
507
- end
508
-
509
- let(:unacknowledged) do
510
- { w: 0 }
511
- end
512
-
513
- it 'uses that write concern', if: write_command_enabled? do
514
- result = op.write_concern(unacknowledged).execute(authorized_primary.context)
515
- expect(result.replies.size).to eq(1)
516
- end
517
-
518
- it 'uses that write concern', unless: write_command_enabled? do
519
- result = op.write_concern(unacknowledged).execute(authorized_primary.context)
520
- expect(result.replies).to be(nil)
521
- end
522
- end
523
235
  end
524
236
  end
@@ -98,19 +98,6 @@ describe Mongo::Operation::Write::Command::Delete do
98
98
  op.execute(primary_context)
99
99
  end
100
100
  end
101
-
102
- context 'write concern' do
103
-
104
- context 'w == 0' do
105
-
106
- pending 'no response is returned'
107
- end
108
-
109
- context 'w > 0' do
110
-
111
- pending 'returns a response'
112
- end
113
- end
114
101
  end
115
102
  end
116
103
  end
@@ -98,20 +98,6 @@ describe Mongo::Operation::Write::Command::Insert do
98
98
  op.execute(primary_context)
99
99
  end
100
100
  end
101
-
102
- context 'write concern' do
103
-
104
- context 'w == 0' do
105
-
106
- pending 'no response is returned'
107
- end
108
-
109
- context 'w > 0' do
110
-
111
- pending 'returns a response'
112
- end
113
- end
114
101
  end
115
102
  end
116
103
  end
117
-
@@ -104,20 +104,6 @@ describe Mongo::Operation::Write::Command::Update do
104
104
  op.execute(primary_context)
105
105
  end
106
106
  end
107
-
108
- context 'write concern' do
109
-
110
- context 'w == 0' do
111
-
112
- pending 'no response is returned'
113
- end
114
-
115
- context 'w > 0' do
116
-
117
- pending 'returns a response'
118
- end
119
- end
120
107
  end
121
108
  end
122
109
  end
123
-
@@ -1,23 +1,17 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Mongo::Operation::Write::EnsureIndex do
3
+ describe Mongo::Operation::Write::CreateIndex do
4
4
 
5
5
  describe '#execute' do
6
6
 
7
7
  context 'when the index is created' do
8
8
 
9
9
  let(:spec) do
10
- { random: 1 }
10
+ { key: { random: 1 }, name: 'random_1', unique: true }
11
11
  end
12
12
 
13
13
  let(:operation) do
14
- described_class.new(
15
- index: spec,
16
- db_name: TEST_DB,
17
- coll_name: TEST_COLL,
18
- index_name: 'random_1',
19
- options: { unique: true }
20
- )
14
+ described_class.new(indexes: [ spec ], db_name: TEST_DB, coll_name: TEST_COLL)
21
15
  end
22
16
 
23
17
  let(:response) do
@@ -25,7 +19,7 @@ describe Mongo::Operation::Write::EnsureIndex do
25
19
  end
26
20
 
27
21
  after do
28
- authorized_collection.indexes.drop(spec)
22
+ authorized_collection.indexes.drop_one('random_1')
29
23
  end
30
24
 
31
25
  it 'returns ok' do
@@ -36,27 +30,15 @@ describe Mongo::Operation::Write::EnsureIndex do
36
30
  context 'when index creation fails' do
37
31
 
38
32
  let(:spec) do
39
- { random: 1 }
33
+ { key: { random: 1 }, name: 'random_1', unique: true }
40
34
  end
41
35
 
42
36
  let(:operation) do
43
- described_class.new(
44
- index: spec,
45
- db_name: TEST_DB,
46
- coll_name: TEST_COLL,
47
- index_name: 'random_1',
48
- options: { unique: true }
49
- )
37
+ described_class.new(indexes: [ spec ], db_name: TEST_DB, coll_name: TEST_COLL)
50
38
  end
51
39
 
52
40
  let(:second_operation) do
53
- described_class.new(
54
- index: spec,
55
- db_name: TEST_DB,
56
- coll_name: TEST_COLL,
57
- index_name: 'random_1',
58
- options: { unique: false }
59
- )
41
+ described_class.new(indexes: [ spec.merge(unique: false) ], db_name: TEST_DB, coll_name: TEST_COLL)
60
42
  end
61
43
 
62
44
  before do
@@ -64,7 +46,7 @@ describe Mongo::Operation::Write::EnsureIndex do
64
46
  end
65
47
 
66
48
  after do
67
- authorized_collection.indexes.drop(spec)
49
+ authorized_collection.indexes.drop_one('random_1')
68
50
  end
69
51
 
70
52
  it 'raises an exception', if: write_command_enabled? do
@@ -72,7 +72,7 @@ describe Mongo::Operation::Write::Delete do
72
72
  end
73
73
 
74
74
  after do
75
- authorized_collection.find.remove_many
75
+ authorized_collection.find.delete_many
76
76
  end
77
77
 
78
78
  context 'when deleting a single document' do