mongo 2.0.0.beta → 2.0.0.rc
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 +0 -0
- data/Rakefile +14 -1
- data/lib/mongo.rb +2 -1
- data/lib/mongo/auth.rb +2 -2
- data/lib/mongo/bulk_write.rb +52 -0
- data/lib/mongo/bulk_write/bulk_writable.rb +191 -0
- data/lib/mongo/bulk_write/deletable.rb +60 -0
- data/lib/mongo/bulk_write/insertable.rb +52 -0
- data/lib/mongo/bulk_write/ordered_bulk_write.rb +48 -0
- data/lib/mongo/bulk_write/replacable.rb +57 -0
- data/lib/mongo/bulk_write/unordered_bulk_write.rb +46 -0
- data/lib/mongo/bulk_write/updatable.rb +68 -0
- data/lib/mongo/client.rb +15 -2
- data/lib/mongo/cluster/topology/replica_set.rb +1 -1
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/standalone.rb +1 -1
- data/lib/mongo/cluster/topology/unknown.rb +1 -1
- data/lib/mongo/collection.rb +1 -1
- data/lib/mongo/collection/view/aggregation.rb +1 -1
- data/lib/mongo/collection/view/readable.rb +1 -1
- data/lib/mongo/collection/view/writable.rb +5 -5
- data/lib/mongo/cursor.rb +0 -2
- data/lib/mongo/error.rb +4 -3
- data/lib/mongo/error/{bulk_write_failure.rb → bulk_write_error.rb} +2 -2
- data/lib/mongo/error/invalid_bulk_operation.rb +2 -2
- data/lib/mongo/error/invalid_bulk_operation_type.rb +36 -0
- data/lib/mongo/error/{empty_batch.rb → multi_index_drop.rb} +5 -10
- data/lib/mongo/grid/file/metadata.rb +1 -8
- data/lib/mongo/grid/fs.rb +5 -5
- data/lib/mongo/index/view.rb +90 -34
- data/lib/mongo/operation.rb +0 -1
- data/lib/mongo/operation/aggregate.rb +2 -2
- data/lib/mongo/operation/aggregate/result.rb +4 -0
- data/lib/mongo/operation/bulk_delete/result.rb +2 -127
- data/lib/mongo/operation/bulk_insert/result.rb +2 -132
- data/lib/mongo/operation/bulk_update/result.rb +2 -142
- data/lib/mongo/operation/command.rb +1 -1
- data/lib/mongo/operation/executable.rb +3 -3
- data/lib/mongo/operation/list_collections/result.rb +0 -2
- data/lib/mongo/operation/map_reduce.rb +1 -1
- data/lib/mongo/operation/read/collections_info.rb +1 -1
- data/lib/mongo/operation/read/get_more.rb +1 -1
- data/lib/mongo/operation/read/indexes.rb +1 -1
- data/lib/mongo/operation/read/list_collections.rb +1 -1
- data/lib/mongo/operation/read/list_indexes.rb +1 -1
- data/lib/mongo/operation/read/query.rb +1 -1
- data/lib/mongo/operation/specifiable.rb +18 -1
- data/lib/mongo/operation/write.rb +2 -0
- data/lib/mongo/operation/write/bulk_delete.rb +5 -19
- data/lib/mongo/operation/write/bulk_insert.rb +9 -40
- data/lib/mongo/operation/write/bulk_mergable.rb +67 -0
- data/lib/mongo/operation/write/bulk_update.rb +5 -19
- data/lib/mongo/operation/write/command.rb +1 -1
- data/lib/mongo/operation/write/command/{ensure_index.rb → create_index.rb} +4 -9
- data/lib/mongo/operation/write/command/delete.rb +4 -4
- data/lib/mongo/operation/write/command/drop_index.rb +1 -1
- data/lib/mongo/operation/write/command/insert.rb +4 -4
- data/lib/mongo/operation/write/command/update.rb +4 -4
- data/lib/mongo/operation/write/create_index.rb +12 -7
- data/lib/mongo/operation/write/create_user.rb +1 -1
- data/lib/mongo/operation/write/delete.rb +1 -1
- data/lib/mongo/operation/write/drop_index.rb +1 -1
- data/lib/mongo/operation/write/insert.rb +1 -1
- data/lib/mongo/operation/write/legacy_bulk_mergable.rb +83 -0
- data/lib/mongo/operation/write/remove_user.rb +1 -1
- data/lib/mongo/operation/write/update.rb +1 -1
- data/lib/mongo/{bulk.rb → options.rb} +2 -2
- data/lib/mongo/options/mapper.rb +78 -0
- data/lib/mongo/server.rb +2 -2
- data/lib/mongo/server/connection_pool/queue.rb +1 -1
- data/lib/mongo/server/description.rb +1 -1
- data/lib/mongo/server/description/inspector.rb +1 -1
- data/lib/mongo/server_selector.rb +1 -1
- data/lib/mongo/socket/unix.rb +2 -4
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo/write_concern/acknowledged.rb +15 -1
- data/lib/mongo/write_concern/normalizable.rb +0 -22
- data/lib/mongo/write_concern/unacknowledged.rb +12 -0
- data/spec/mongo/bulk/bulk_write_spec.rb +178 -91
- data/spec/mongo/collection/view/aggregation_spec.rb +14 -1
- data/spec/mongo/collection/view/explainable_spec.rb +1 -1
- data/spec/mongo/collection/view/map_reduce_spec.rb +2 -2
- data/spec/mongo/collection/view/readable_spec.rb +2 -2
- data/spec/mongo/collection/view/writable_spec.rb +7 -7
- data/spec/mongo/collection/view_spec.rb +14 -5
- data/spec/mongo/collection_spec.rb +5 -5
- data/spec/mongo/cursor_spec.rb +3 -3
- data/spec/mongo/database_spec.rb +4 -8
- data/spec/mongo/grid/fs_spec.rb +8 -8
- data/spec/mongo/index/view_spec.rb +139 -35
- data/spec/mongo/operation/aggregate_spec.rb +14 -22
- data/spec/mongo/operation/command_spec.rb +8 -16
- data/spec/mongo/operation/map_reduce_spec.rb +1 -1
- data/spec/mongo/operation/read/indexes_spec.rb +2 -2
- data/spec/mongo/operation/write/bulk_delete_spec.rb +1 -239
- data/spec/mongo/operation/write/bulk_insert_spec.rb +3 -234
- data/spec/mongo/operation/write/bulk_update_spec.rb +1 -289
- data/spec/mongo/operation/write/command/delete_spec.rb +0 -13
- data/spec/mongo/operation/write/command/insert_spec.rb +0 -14
- data/spec/mongo/operation/write/command/update_spec.rb +0 -14
- data/spec/mongo/operation/write/{ensure_index_spec.rb → create_index_spec.rb} +8 -26
- data/spec/mongo/operation/write/delete_spec.rb +1 -1
- data/spec/mongo/operation/write/drop_index_spec.rb +1 -1
- data/spec/mongo/operation/write/insert_spec.rb +3 -3
- data/spec/mongo/operation/write/update_spec.rb +1 -1
- data/spec/mongo/server_selection_spec.rb +2 -2
- data/spec/support/authorization.rb +4 -2
- data/spec/support/server_selection.rb +25 -8
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +4 -10
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +6 -12
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +4 -6
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +4 -10
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +6 -12
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +4 -10
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +4 -10
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +6 -12
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +6 -12
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +9 -17
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +9 -17
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +6 -10
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +11 -21
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +11 -18
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml +31 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +31 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +29 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +26 -0
- data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +4 -10
- data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +2 -6
- data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +0 -2
- data/spec/support/shared/bulk_write.rb +109 -72
- metadata +29 -10
- metadata.gz.sig +0 -0
- data/lib/mongo/bulk/bulk_write.rb +0 -307
- data/lib/mongo/operation/batchable.rb +0 -103
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.rc
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tyler Brock
|
@@ -32,7 +32,7 @@ cert_chain:
|
|
32
32
|
o2UXDbWtz5PqoFd8EgNJAn3+BG1pwC9S9pVFG3WPucfAx/bE8iq/vvchHei5Y/Vo
|
33
33
|
aAz5f/hY4zFeYWvGDBHYEXE1rTN2hhMSyJscPcFbmz0=
|
34
34
|
-----END CERTIFICATE-----
|
35
|
-
date: 2015-
|
35
|
+
date: 2015-03-17 00:00:00.000000000 Z
|
36
36
|
dependencies:
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: bson
|
@@ -77,8 +77,14 @@ files:
|
|
77
77
|
- lib/mongo/auth/user/view.rb
|
78
78
|
- lib/mongo/auth/x509.rb
|
79
79
|
- lib/mongo/auth/x509/conversation.rb
|
80
|
-
- lib/mongo/
|
81
|
-
- lib/mongo/
|
80
|
+
- lib/mongo/bulk_write.rb
|
81
|
+
- lib/mongo/bulk_write/bulk_writable.rb
|
82
|
+
- lib/mongo/bulk_write/deletable.rb
|
83
|
+
- lib/mongo/bulk_write/insertable.rb
|
84
|
+
- lib/mongo/bulk_write/ordered_bulk_write.rb
|
85
|
+
- lib/mongo/bulk_write/replacable.rb
|
86
|
+
- lib/mongo/bulk_write/unordered_bulk_write.rb
|
87
|
+
- lib/mongo/bulk_write/updatable.rb
|
82
88
|
- lib/mongo/client.rb
|
83
89
|
- lib/mongo/cluster.rb
|
84
90
|
- lib/mongo/cluster/topology.rb
|
@@ -99,9 +105,9 @@ files:
|
|
99
105
|
- lib/mongo/database.rb
|
100
106
|
- lib/mongo/database/view.rb
|
101
107
|
- lib/mongo/error.rb
|
102
|
-
- lib/mongo/error/
|
103
|
-
- lib/mongo/error/empty_batch.rb
|
108
|
+
- lib/mongo/error/bulk_write_error.rb
|
104
109
|
- lib/mongo/error/invalid_bulk_operation.rb
|
110
|
+
- lib/mongo/error/invalid_bulk_operation_type.rb
|
105
111
|
- lib/mongo/error/invalid_collection_name.rb
|
106
112
|
- lib/mongo/error/invalid_database_name.rb
|
107
113
|
- lib/mongo/error/invalid_document.rb
|
@@ -112,6 +118,7 @@ files:
|
|
112
118
|
- lib/mongo/error/invalid_update_document.rb
|
113
119
|
- lib/mongo/error/max_bson_size.rb
|
114
120
|
- lib/mongo/error/max_message_size.rb
|
121
|
+
- lib/mongo/error/multi_index_drop.rb
|
115
122
|
- lib/mongo/error/need_primary_server.rb
|
116
123
|
- lib/mongo/error/operation_failure.rb
|
117
124
|
- lib/mongo/error/parser.rb
|
@@ -137,7 +144,6 @@ files:
|
|
137
144
|
- lib/mongo/operation.rb
|
138
145
|
- lib/mongo/operation/aggregate.rb
|
139
146
|
- lib/mongo/operation/aggregate/result.rb
|
140
|
-
- lib/mongo/operation/batchable.rb
|
141
147
|
- lib/mongo/operation/bulk_delete/result.rb
|
142
148
|
- lib/mongo/operation/bulk_insert/result.rb
|
143
149
|
- lib/mongo/operation/bulk_update/result.rb
|
@@ -162,12 +168,13 @@ files:
|
|
162
168
|
- lib/mongo/operation/write.rb
|
163
169
|
- lib/mongo/operation/write/bulk_delete.rb
|
164
170
|
- lib/mongo/operation/write/bulk_insert.rb
|
171
|
+
- lib/mongo/operation/write/bulk_mergable.rb
|
165
172
|
- lib/mongo/operation/write/bulk_update.rb
|
166
173
|
- lib/mongo/operation/write/command.rb
|
174
|
+
- lib/mongo/operation/write/command/create_index.rb
|
167
175
|
- lib/mongo/operation/write/command/create_user.rb
|
168
176
|
- lib/mongo/operation/write/command/delete.rb
|
169
177
|
- lib/mongo/operation/write/command/drop_index.rb
|
170
|
-
- lib/mongo/operation/write/command/ensure_index.rb
|
171
178
|
- lib/mongo/operation/write/command/insert.rb
|
172
179
|
- lib/mongo/operation/write/command/remove_user.rb
|
173
180
|
- lib/mongo/operation/write/command/update.rb
|
@@ -177,8 +184,11 @@ files:
|
|
177
184
|
- lib/mongo/operation/write/delete.rb
|
178
185
|
- lib/mongo/operation/write/drop_index.rb
|
179
186
|
- lib/mongo/operation/write/insert.rb
|
187
|
+
- lib/mongo/operation/write/legacy_bulk_mergable.rb
|
180
188
|
- lib/mongo/operation/write/remove_user.rb
|
181
189
|
- lib/mongo/operation/write/update.rb
|
190
|
+
- lib/mongo/options.rb
|
191
|
+
- lib/mongo/options/mapper.rb
|
182
192
|
- lib/mongo/protocol.rb
|
183
193
|
- lib/mongo/protocol/bit_vector.rb
|
184
194
|
- lib/mongo/protocol/delete.rb
|
@@ -278,10 +288,10 @@ files:
|
|
278
288
|
- spec/mongo/operation/write/command/delete_spec.rb
|
279
289
|
- spec/mongo/operation/write/command/insert_spec.rb
|
280
290
|
- spec/mongo/operation/write/command/update_spec.rb
|
291
|
+
- spec/mongo/operation/write/create_index_spec.rb
|
281
292
|
- spec/mongo/operation/write/create_user_spec.rb
|
282
293
|
- spec/mongo/operation/write/delete_spec.rb
|
283
294
|
- spec/mongo/operation/write/drop_index_spec.rb
|
284
|
-
- spec/mongo/operation/write/ensure_index_spec.rb
|
285
295
|
- spec/mongo/operation/write/insert_spec.rb
|
286
296
|
- spec/mongo/operation/write/remove_user_spec.rb
|
287
297
|
- spec/mongo/operation/write/response_spec.rb
|
@@ -383,6 +393,10 @@ files:
|
|
383
393
|
- spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml
|
384
394
|
- spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml
|
385
395
|
- spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml
|
396
|
+
- spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml
|
397
|
+
- spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml
|
398
|
+
- spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml
|
399
|
+
- spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml
|
386
400
|
- spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml
|
387
401
|
- spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml
|
388
402
|
- spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml
|
@@ -475,10 +489,10 @@ test_files:
|
|
475
489
|
- spec/mongo/operation/write/command/delete_spec.rb
|
476
490
|
- spec/mongo/operation/write/command/insert_spec.rb
|
477
491
|
- spec/mongo/operation/write/command/update_spec.rb
|
492
|
+
- spec/mongo/operation/write/create_index_spec.rb
|
478
493
|
- spec/mongo/operation/write/create_user_spec.rb
|
479
494
|
- spec/mongo/operation/write/delete_spec.rb
|
480
495
|
- spec/mongo/operation/write/drop_index_spec.rb
|
481
|
-
- spec/mongo/operation/write/ensure_index_spec.rb
|
482
496
|
- spec/mongo/operation/write/insert_spec.rb
|
483
497
|
- spec/mongo/operation/write/remove_user_spec.rb
|
484
498
|
- spec/mongo/operation/write/response_spec.rb
|
@@ -579,6 +593,10 @@ test_files:
|
|
579
593
|
- spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml
|
580
594
|
- spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml
|
581
595
|
- spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml
|
596
|
+
- spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml
|
597
|
+
- spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml
|
598
|
+
- spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml
|
599
|
+
- spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml
|
582
600
|
- spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml
|
583
601
|
- spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml
|
584
602
|
- spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml
|
@@ -591,3 +609,4 @@ test_files:
|
|
591
609
|
- spec/support/shared/server_selector.rb
|
592
610
|
- spec/support/shared/socket.rb
|
593
611
|
- spec/support/travis.rb
|
612
|
+
has_rdoc: yard
|
metadata.gz.sig
CHANGED
Binary file
|
@@ -1,307 +0,0 @@
|
|
1
|
-
# Copyright (C) 2014-2015 MongoDB, Inc.
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at
|
6
|
-
#
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
|
15
|
-
module Mongo
|
16
|
-
|
17
|
-
# This semi-public class handles the logic for executing a batch of
|
18
|
-
# operations.
|
19
|
-
#
|
20
|
-
# @since 2.0.0
|
21
|
-
class BulkWrite
|
22
|
-
|
23
|
-
# @return [ Mongo::Collection ] The collection on which this bulk write
|
24
|
-
# operation will be executed.
|
25
|
-
attr_reader :collection
|
26
|
-
|
27
|
-
# @return [ Array<Hash> ] operations The list of operations.
|
28
|
-
attr_reader :operations
|
29
|
-
|
30
|
-
# @return [ Hash ] options The options.
|
31
|
-
attr_reader :options
|
32
|
-
|
33
|
-
# @return [ Acknowledged, Unacknowledged ] write_concern The write concern.
|
34
|
-
attr_reader :write_concern
|
35
|
-
|
36
|
-
# Initialize the BulkWrite object.
|
37
|
-
#
|
38
|
-
# @example Create an ordered bulk write object.
|
39
|
-
# BulkWrite.new([
|
40
|
-
# { insert_one: { x: 1 }},
|
41
|
-
# { update_one: [{ x: 1 }, { '$set' => { x: 2 }}]}
|
42
|
-
# ],
|
43
|
-
# { ordered: true },
|
44
|
-
# collection
|
45
|
-
# )
|
46
|
-
#
|
47
|
-
# @example Create an unordered bulk write object.
|
48
|
-
# BulkWrite.new([
|
49
|
-
# { insert_one: { x: 1 }},
|
50
|
-
# { update_one: [{ x: 1 }, { '$set' => { x: 2 }}]}
|
51
|
-
# ],
|
52
|
-
# { ordered: false },
|
53
|
-
# collection
|
54
|
-
# )
|
55
|
-
#
|
56
|
-
# @param [ Array<Hash> ] operations The operations to execute.
|
57
|
-
# @param [ Hash ] options The options for executing the operations.
|
58
|
-
# @param [ Collection ] collection The collection on which the
|
59
|
-
# operations will be executed.
|
60
|
-
#
|
61
|
-
# @option options [ String ] :ordered Whether the operations should
|
62
|
-
# be executed in order.
|
63
|
-
# @option options [ Hash ] :write_concern The write concern to use when
|
64
|
-
# executing the operations.
|
65
|
-
#
|
66
|
-
# @since 2.0.0
|
67
|
-
def initialize(operations, options, collection)
|
68
|
-
@operations = operations
|
69
|
-
@options = options
|
70
|
-
@collection = collection
|
71
|
-
if options[:write_concern]
|
72
|
-
@write_concern = WriteConcern.get(options[:write_concern])
|
73
|
-
else
|
74
|
-
@write_concern = collection.write_concern
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
# Is the bulk write operation ordered?
|
79
|
-
#
|
80
|
-
# @example Is the bulk write operation ordered?
|
81
|
-
# bulk_write.ordered?
|
82
|
-
#
|
83
|
-
# @return [ true, false ] If the bulk write is ordered.
|
84
|
-
#
|
85
|
-
# @since 2.0.0
|
86
|
-
def ordered?
|
87
|
-
@ordered ||= !!options[:ordered]
|
88
|
-
end
|
89
|
-
|
90
|
-
# Execute the bulk write.
|
91
|
-
#
|
92
|
-
# @example execute the bulk write operations.
|
93
|
-
# bulk.execute
|
94
|
-
#
|
95
|
-
# @return [ Hash ] The result of doing the bulk write.
|
96
|
-
def execute
|
97
|
-
raise Error::EmptyBatch.new if operations.empty?
|
98
|
-
|
99
|
-
@index = -1
|
100
|
-
@ops = []
|
101
|
-
|
102
|
-
operations.each do |operation|
|
103
|
-
operation.each do |name, document|
|
104
|
-
if respond_to?(name, true)
|
105
|
-
send(name, document)
|
106
|
-
else
|
107
|
-
raise Error::InvalidBulkOperation.new(name)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
ops = merge_ops
|
113
|
-
|
114
|
-
replies = []
|
115
|
-
until ops.empty?
|
116
|
-
op = ops.shift
|
117
|
-
|
118
|
-
until op.valid_batch_size?(collection.next_primary.context.max_write_batch_size)
|
119
|
-
ops = op.batch(2) + ops
|
120
|
-
op = ops.shift
|
121
|
-
end
|
122
|
-
|
123
|
-
begin
|
124
|
-
replies << op.execute(collection.next_primary.context)
|
125
|
-
# @todo: No test for max message size.
|
126
|
-
rescue Error::MaxBSONSize, Error::MaxMessageSize => ex
|
127
|
-
raise ex unless op.batchable?
|
128
|
-
ops = op.batch(2) + ops
|
129
|
-
end
|
130
|
-
return make_response!(replies) if stop_executing?(replies.last)
|
131
|
-
end
|
132
|
-
make_response!(replies) if op.write_concern.get_last_error
|
133
|
-
end
|
134
|
-
|
135
|
-
private
|
136
|
-
|
137
|
-
def increment_index
|
138
|
-
@index += 1
|
139
|
-
end
|
140
|
-
|
141
|
-
def valid_doc?(doc)
|
142
|
-
doc.respond_to?(:keys)
|
143
|
-
end
|
144
|
-
|
145
|
-
def update_doc?(doc)
|
146
|
-
!doc.empty? &&
|
147
|
-
doc.respond_to?(:keys) &&
|
148
|
-
doc.keys.first.to_s =~ /^\$/
|
149
|
-
end
|
150
|
-
|
151
|
-
def replacement_doc?(doc)
|
152
|
-
doc.respond_to?(:keys) && doc.keys.all?{|key| key !~ /^\$/}
|
153
|
-
end
|
154
|
-
|
155
|
-
def insert_one(doc)
|
156
|
-
raise Error::InvalidDocument.new unless valid_doc?(doc)
|
157
|
-
spec = { documents: [ doc ],
|
158
|
-
db_name: db_name,
|
159
|
-
coll_name: collection.name,
|
160
|
-
ordered: ordered?,
|
161
|
-
write_concern: write_concern }
|
162
|
-
|
163
|
-
push_op(Mongo::Operation::Write::BulkInsert, spec)
|
164
|
-
end
|
165
|
-
|
166
|
-
def delete_one(selector)
|
167
|
-
raise Error::InvalidDocument.new unless valid_doc?(selector)
|
168
|
-
spec = { deletes: [{ q: selector, limit: 1 }],
|
169
|
-
db_name: db_name,
|
170
|
-
coll_name: collection.name,
|
171
|
-
ordered: ordered?,
|
172
|
-
write_concern: write_concern }
|
173
|
-
|
174
|
-
push_op(Mongo::Operation::Write::BulkDelete, spec)
|
175
|
-
end
|
176
|
-
|
177
|
-
def delete_many(selector)
|
178
|
-
raise Error::InvalidDocument.new unless valid_doc?(selector)
|
179
|
-
spec = { deletes: [{ q: selector, limit: 0 }],
|
180
|
-
db_name: db_name,
|
181
|
-
coll_name: collection.name,
|
182
|
-
ordered: ordered?,
|
183
|
-
write_concern: write_concern }
|
184
|
-
|
185
|
-
push_op(Mongo::Operation::Write::BulkDelete, spec)
|
186
|
-
end
|
187
|
-
|
188
|
-
def replace_one(docs)
|
189
|
-
selector = docs[0]
|
190
|
-
replacement = docs[1]
|
191
|
-
upsert = (docs[2] || {})[:upsert]
|
192
|
-
raise ArgumentError unless selector && replacement
|
193
|
-
raise Error::InvalidReplacementDocument.new unless replacement_doc?(replacement)
|
194
|
-
upsert = !!upsert
|
195
|
-
spec = { updates: [{ q: selector,
|
196
|
-
u: replacement,
|
197
|
-
multi: false,
|
198
|
-
upsert: upsert }],
|
199
|
-
db_name: db_name,
|
200
|
-
coll_name: collection.name,
|
201
|
-
ordered: ordered?,
|
202
|
-
write_concern: write_concern }
|
203
|
-
|
204
|
-
push_op(Mongo::Operation::Write::BulkUpdate, spec)
|
205
|
-
end
|
206
|
-
|
207
|
-
def update_one(docs)
|
208
|
-
upsert = (docs[2] || {})[:upsert]
|
209
|
-
update_one_or_many(docs[0], docs[1], upsert, false)
|
210
|
-
end
|
211
|
-
|
212
|
-
def update_many(docs)
|
213
|
-
upsert = (docs[2] || {})[:upsert]
|
214
|
-
update_one_or_many(docs[0], docs[1], upsert, true)
|
215
|
-
end
|
216
|
-
|
217
|
-
def update_one_or_many(selector, update, upsert, multi)
|
218
|
-
raise ArgumentError unless selector && update
|
219
|
-
raise Error::InvalidUpdateDocument.new unless update_doc?(update)
|
220
|
-
upsert = !!upsert
|
221
|
-
spec = { updates: [{ q: selector,
|
222
|
-
u: update,
|
223
|
-
multi: multi,
|
224
|
-
upsert: upsert }],
|
225
|
-
db_name: db_name,
|
226
|
-
coll_name: collection.name,
|
227
|
-
ordered: ordered?,
|
228
|
-
write_concern: write_concern }
|
229
|
-
|
230
|
-
push_op(Mongo::Operation::Write::BulkUpdate, spec)
|
231
|
-
end
|
232
|
-
|
233
|
-
def push_op(op_class, spec)
|
234
|
-
spec.merge!(indexes: [ increment_index ])
|
235
|
-
@ops << op_class.send(:new, spec)
|
236
|
-
end
|
237
|
-
|
238
|
-
def merge_ops
|
239
|
-
if ordered?
|
240
|
-
merge_consecutive_ops(@ops)
|
241
|
-
else
|
242
|
-
merge_ops_by_type(@ops)
|
243
|
-
end
|
244
|
-
end
|
245
|
-
|
246
|
-
def merge_consecutive_ops(operations)
|
247
|
-
operations.inject([]) do |merged_ops, op|
|
248
|
-
previous_op = merged_ops.last
|
249
|
-
if previous_op.class == op.class
|
250
|
-
merged_ops.tap do |m|
|
251
|
-
m[m.size - 1] = previous_op.merge!(op)
|
252
|
-
end
|
253
|
-
else
|
254
|
-
merged_ops << op
|
255
|
-
end
|
256
|
-
end
|
257
|
-
end
|
258
|
-
|
259
|
-
def merge_ops_by_type(operations)
|
260
|
-
ops_by_type = operations.inject({}) do |merged_ops, op|
|
261
|
-
if merged_ops[op.class]
|
262
|
-
merged_ops.tap do |m|
|
263
|
-
m[op.class] << op
|
264
|
-
end
|
265
|
-
else
|
266
|
-
merged_ops.tap do |m|
|
267
|
-
m[op.class] = [ op ]
|
268
|
-
end
|
269
|
-
end
|
270
|
-
end
|
271
|
-
|
272
|
-
ops_by_type.keys.inject([]) do |merged_ops, type|
|
273
|
-
merged_ops << merge_consecutive_ops( ops_by_type[ type ] )
|
274
|
-
end.flatten
|
275
|
-
end
|
276
|
-
|
277
|
-
def stop_executing?(result)
|
278
|
-
result && ordered? && !result.successful?
|
279
|
-
end
|
280
|
-
|
281
|
-
def make_response!(results)
|
282
|
-
response = results.reduce({}) do |response, result|
|
283
|
-
write_errors = result.aggregate_write_errors
|
284
|
-
write_concern_errors = result.aggregate_write_concern_errors
|
285
|
-
response.tap do |r|
|
286
|
-
r['nInserted'] = ( r['nInserted'] || 0 ) + result.n_inserted if result.respond_to?(:n_inserted)
|
287
|
-
r['nMatched'] = ( r['nMatched'] || 0 ) + result.n_matched if result.respond_to?(:n_matched)
|
288
|
-
r['nModified'] = ( r['nModified'] || 0 ) + result.n_modified if result.respond_to?(:n_modified) && result.n_modified
|
289
|
-
r['nUpserted'] = ( r['nUpserted'] || 0 ) + result.n_upserted if result.respond_to?(:n_upserted)
|
290
|
-
r['nRemoved'] = ( r['nRemoved'] || 0 ) + result.n_removed if result.respond_to?(:n_removed)
|
291
|
-
r['writeErrors'] = ( r['writeErrors'] || [] ) + write_errors if write_errors
|
292
|
-
r['writeConcernErrors'] = ( r['writeConcernErrors'] || [] ) + write_concern_errors if write_concern_errors
|
293
|
-
end
|
294
|
-
end
|
295
|
-
|
296
|
-
if response['writeErrors'] || response['writeConcernErrors']
|
297
|
-
response.merge!('errmsg' => 'batch item errors occurred')
|
298
|
-
raise Error::BulkWriteFailure.new(response)
|
299
|
-
end
|
300
|
-
response
|
301
|
-
end
|
302
|
-
|
303
|
-
def db_name
|
304
|
-
collection.database.name
|
305
|
-
end
|
306
|
-
end
|
307
|
-
end
|
@@ -1,103 +0,0 @@
|
|
1
|
-
# Copyright (C) 2014-2015 MongoDB, Inc.
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at
|
6
|
-
#
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
|
15
|
-
module Mongo
|
16
|
-
|
17
|
-
module Operation
|
18
|
-
|
19
|
-
# This module contains common functionality for splitting an operation
|
20
|
-
# into the specified number of children operations.
|
21
|
-
# An operation including this module must provide a method called
|
22
|
-
# #batch_key. It specifies the key of the spec array element to split.
|
23
|
-
#
|
24
|
-
# @since 2.0.0
|
25
|
-
module Batchable
|
26
|
-
|
27
|
-
# Slices this operation into the specified number of children operations.
|
28
|
-
#
|
29
|
-
# @params [ Integer ] n_batches The number of children operations to split
|
30
|
-
# this one into.
|
31
|
-
#
|
32
|
-
# @return [ Array ] An array of children operations.
|
33
|
-
#
|
34
|
-
# @since 2.0.0
|
35
|
-
def batch(n_batches)
|
36
|
-
items = spec[batch_key]
|
37
|
-
raise Exception, "Cannot batch" unless items.size >= n_batches
|
38
|
-
|
39
|
-
items_per_batch = items.size / n_batches
|
40
|
-
batches = items.each_slice(items_per_batch).to_a
|
41
|
-
index_batches = indexes.each_slice(items_per_batch).to_a
|
42
|
-
|
43
|
-
# #each_slice makes groups containing exactly items_per_batch number of items.
|
44
|
-
# You could therefore end up with more groups than n_batches, so put the
|
45
|
-
# remaining items in the last group.
|
46
|
-
if batches.size > n_batches
|
47
|
-
batches[n_batches - 1] << batches.pop(batches.size - n_batches)
|
48
|
-
batches[-1].flatten!
|
49
|
-
end
|
50
|
-
|
51
|
-
if index_batches.size > n_batches
|
52
|
-
index_batches[n_batches - 1] << index_batches.pop(index_batches.size - n_batches)
|
53
|
-
index_batches[-1].flatten!
|
54
|
-
end
|
55
|
-
|
56
|
-
batches.each_with_index.inject([]) do |children, (batch, i)|
|
57
|
-
spec_copy = spec.dup
|
58
|
-
spec_copy[:indexes] = index_batches[i]
|
59
|
-
spec_copy[batch_key] = batch
|
60
|
-
children << self.class.new(spec_copy)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
# Merge another operation with this one.
|
65
|
-
# Requires that the collection and database of the two ops are the same.
|
66
|
-
#
|
67
|
-
# @params[ Mongo::Operation ] The other operation.
|
68
|
-
#
|
69
|
-
# @return [ self ] This operation merged with the other one.
|
70
|
-
#
|
71
|
-
# @since 2.0.0
|
72
|
-
def merge!(other)
|
73
|
-
# @todo: use specific exception
|
74
|
-
raise Exception, "Cannot merge" unless self.class == other.class &&
|
75
|
-
coll_name == other.coll_name &&
|
76
|
-
db_name == other.db_name
|
77
|
-
@spec[batch_key] += other.spec[batch_key]
|
78
|
-
@spec[:indexes] = indexes + other.indexes
|
79
|
-
self
|
80
|
-
end
|
81
|
-
|
82
|
-
# Determine if the batch size exceeds a given maximum.
|
83
|
-
#
|
84
|
-
# @params[ Integer ] The max batch size.
|
85
|
-
#
|
86
|
-
# @return [ true, false ] If this operation exceeds the given batch size.
|
87
|
-
#
|
88
|
-
# @since 2.0.0
|
89
|
-
def valid_batch_size?(max)
|
90
|
-
spec[batch_key].size < max
|
91
|
-
end
|
92
|
-
|
93
|
-
# Whether this operation can be split into batches.
|
94
|
-
#
|
95
|
-
# @return [ true, false ] If this operation can be split into batches.
|
96
|
-
#
|
97
|
-
# @since 2.0.0
|
98
|
-
def batchable?
|
99
|
-
spec[batch_key].size > 1
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|