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.
- 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
@@ -129,7 +129,7 @@ module Mongo
|
|
129
129
|
#
|
130
130
|
# @since 2.0.0
|
131
131
|
def initialize(document)
|
132
|
-
@document = default_document.merge(
|
132
|
+
@document = default_document.merge(Options::Mapper.transform(document, MAPPINGS))
|
133
133
|
@client_md5 = Digest::MD5.new
|
134
134
|
end
|
135
135
|
|
@@ -202,13 +202,6 @@ module Mongo
|
|
202
202
|
|
203
203
|
private
|
204
204
|
|
205
|
-
def normalize(document)
|
206
|
-
document.reduce(BSON::Document.new) do |doc, (key, value)|
|
207
|
-
doc[MAPPINGS[key] || key] = value
|
208
|
-
doc
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
205
|
def default_document
|
213
206
|
BSON::Document.new(
|
214
207
|
:_id => BSON::ObjectId.new,
|
data/lib/mongo/grid/fs.rb
CHANGED
@@ -100,7 +100,7 @@ module Mongo
|
|
100
100
|
@options = options
|
101
101
|
@chunks_collection = database[chunks_name]
|
102
102
|
@files_collection = database[files_name]
|
103
|
-
chunks_collection.indexes.
|
103
|
+
chunks_collection.indexes.create_one(INDEX_SPEC, :unique => true)
|
104
104
|
end
|
105
105
|
|
106
106
|
# Get the prefix for the GridFS
|
@@ -118,16 +118,16 @@ module Mongo
|
|
118
118
|
# Remove a single file from the GridFS.
|
119
119
|
#
|
120
120
|
# @example Remove a file from the GridFS.
|
121
|
-
# fs.
|
121
|
+
# fs.delete_one(file)
|
122
122
|
#
|
123
123
|
# @param [ Grid::File ] file The file to remove.
|
124
124
|
#
|
125
125
|
# @return [ Result ] The result of the remove.
|
126
126
|
#
|
127
127
|
# @since 2.0.0
|
128
|
-
def
|
129
|
-
files_collection.find(:_id => file.id).
|
130
|
-
chunks_collection.find(:files_id => file.id).
|
128
|
+
def delete_one(file)
|
129
|
+
files_collection.find(:_id => file.id).delete_one
|
130
|
+
chunks_collection.find(:files_id => file.id).delete_many
|
131
131
|
end
|
132
132
|
|
133
133
|
private
|
data/lib/mongo/index/view.rb
CHANGED
@@ -42,25 +42,42 @@ module Mongo
|
|
42
42
|
# @since 2.0.0
|
43
43
|
NAME = 'name'.freeze
|
44
44
|
|
45
|
-
#
|
45
|
+
# The mappings of Ruby index options to server options.
|
46
46
|
#
|
47
|
-
# @
|
48
|
-
|
47
|
+
# @since 2.0.0
|
48
|
+
OPTIONS = {
|
49
|
+
:background => :background,
|
50
|
+
:bits => :bits,
|
51
|
+
:bucket_size => :bucketSize,
|
52
|
+
:default_language => :default_language,
|
53
|
+
:expire_after => :expireAfterSeconds,
|
54
|
+
:key => :key,
|
55
|
+
:language_override => :language_override,
|
56
|
+
:max => :max,
|
57
|
+
:min => :min,
|
58
|
+
:name => :name,
|
59
|
+
:sparse => :sparse,
|
60
|
+
:sphere_version => :'2dsphereIndexVersion',
|
61
|
+
:storage_engine => :storageEngine,
|
62
|
+
:text_version => :textIndexVersion,
|
63
|
+
:unique => :unique,
|
64
|
+
:version => :v,
|
65
|
+
:weights => :weights
|
66
|
+
}.freeze
|
67
|
+
|
68
|
+
# Drop an index by its name.
|
49
69
|
#
|
50
70
|
# @example Drop an index by its name.
|
51
|
-
# view.
|
71
|
+
# view.drop_one('name_1')
|
52
72
|
#
|
53
|
-
# @param [
|
73
|
+
# @param [ String ] name The name of the index.
|
54
74
|
#
|
55
75
|
# @return [ Result ] The response.
|
56
76
|
#
|
57
77
|
# @since 2.0.0
|
58
|
-
def
|
59
|
-
|
60
|
-
|
61
|
-
coll_name: collection.name,
|
62
|
-
index_name: spec.is_a?(String) ? spec : index_name(spec)
|
63
|
-
).execute(next_primary.context)
|
78
|
+
def drop_one(name)
|
79
|
+
raise Error::MultiIndexDrop.new if name == '*'
|
80
|
+
drop_by_name(name)
|
64
81
|
end
|
65
82
|
|
66
83
|
# Drop all indexes on the collection.
|
@@ -72,12 +89,15 @@ module Mongo
|
|
72
89
|
#
|
73
90
|
# @since 2.0.0
|
74
91
|
def drop_all
|
75
|
-
|
92
|
+
drop_by_name('*')
|
76
93
|
end
|
77
94
|
|
78
|
-
#
|
95
|
+
# Creates an index on the collection.
|
96
|
+
#
|
97
|
+
# @example Create a unique index on the collection.
|
98
|
+
# view.create_one({ name: 1 }, { unique: true })
|
79
99
|
#
|
80
|
-
# @param [ Hash ]
|
100
|
+
# @param [ Hash ] keys A hash of field name/direction pairs.
|
81
101
|
# @param [ Hash ] options Options for this index.
|
82
102
|
#
|
83
103
|
# @option options [ true, false ] :unique (false) If true, this index will enforce
|
@@ -101,13 +121,32 @@ module Mongo
|
|
101
121
|
# @return [ Result ] The response.
|
102
122
|
#
|
103
123
|
# @since 2.0.0
|
104
|
-
def
|
105
|
-
|
106
|
-
|
124
|
+
def create_one(keys, options = {})
|
125
|
+
create_many({ key: keys }.merge(options))
|
126
|
+
end
|
127
|
+
|
128
|
+
# Creates multiple indexes on the collection.
|
129
|
+
#
|
130
|
+
# @example Create multiple indexes.
|
131
|
+
# view.create_many([
|
132
|
+
# { key: { name: 1 }, unique: true },
|
133
|
+
# { key: { age: -1 }, background: true }
|
134
|
+
# ])
|
135
|
+
#
|
136
|
+
# @note On MongoDB 3.0.0 and higher, the indexes will be created in
|
137
|
+
# parallel on the server.
|
138
|
+
#
|
139
|
+
# @param [ Array<Hash> ] models The index specifications. Each model MUST
|
140
|
+
# include a :key option.
|
141
|
+
#
|
142
|
+
# @return [ Result ] The result of the command.
|
143
|
+
#
|
144
|
+
# @since 2.0.0
|
145
|
+
def create_many(*models)
|
146
|
+
Operation::Write::CreateIndex.new(
|
147
|
+
indexes: normalize_models(models.flatten),
|
107
148
|
db_name: database.name,
|
108
149
|
coll_name: collection.name,
|
109
|
-
index_name: options[:name] || index_name(spec),
|
110
|
-
options: options
|
111
150
|
).execute(next_primary.context)
|
112
151
|
end
|
113
152
|
|
@@ -117,17 +156,17 @@ module Mongo
|
|
117
156
|
# @example Get index information by name.
|
118
157
|
# view.get('name_1')
|
119
158
|
#
|
120
|
-
# @example Get index information by
|
159
|
+
# @example Get index information by the keys.
|
121
160
|
# view.get(name: 1)
|
122
161
|
#
|
123
|
-
# @param [ Hash, String ]
|
162
|
+
# @param [ Hash, String ] keys_or_name The index name or spec.
|
124
163
|
#
|
125
164
|
# @return [ Hash ] The index information.
|
126
165
|
#
|
127
166
|
# @since 2.0.0
|
128
|
-
def get(
|
167
|
+
def get(keys_or_name)
|
129
168
|
find do |index|
|
130
|
-
(index[NAME] ==
|
169
|
+
(index[NAME] == keys_or_name) || (index[KEY] == normalize_keys(keys_or_name))
|
131
170
|
end
|
132
171
|
end
|
133
172
|
|
@@ -169,8 +208,16 @@ module Mongo
|
|
169
208
|
|
170
209
|
private
|
171
210
|
|
172
|
-
def
|
173
|
-
|
211
|
+
def drop_by_name(name)
|
212
|
+
Operation::Write::DropIndex.new(
|
213
|
+
db_name: database.name,
|
214
|
+
coll_name: collection.name,
|
215
|
+
index_name: name
|
216
|
+
).execute(next_primary.context)
|
217
|
+
end
|
218
|
+
|
219
|
+
def index_name(spec)
|
220
|
+
spec.to_a.join('_')
|
174
221
|
end
|
175
222
|
|
176
223
|
def indexes_spec
|
@@ -185,19 +232,28 @@ module Mongo
|
|
185
232
|
Operation::Read::Indexes.new(indexes_spec)
|
186
233
|
end
|
187
234
|
|
188
|
-
def
|
189
|
-
|
235
|
+
def limit; -1; end
|
236
|
+
|
237
|
+
def normalize_keys(spec)
|
238
|
+
return false if spec.is_a?(String)
|
239
|
+
Options::Mapper.transform_keys_to_strings(spec)
|
190
240
|
end
|
191
241
|
|
192
|
-
def
|
193
|
-
|
242
|
+
def normalize_models(models)
|
243
|
+
with_generated_names(models).map do |model|
|
244
|
+
Options::Mapper.transform(model, OPTIONS)
|
245
|
+
end
|
194
246
|
end
|
195
247
|
|
196
|
-
def
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
248
|
+
def send_initial_query(server)
|
249
|
+
initial_query_op.execute(server.context)
|
250
|
+
end
|
251
|
+
|
252
|
+
def with_generated_names(models)
|
253
|
+
models.dup.each do |model|
|
254
|
+
unless model[:name]
|
255
|
+
model[:name] = index_name(model[:key])
|
256
|
+
end
|
201
257
|
end
|
202
258
|
end
|
203
259
|
end
|
data/lib/mongo/operation.rb
CHANGED
@@ -17,7 +17,6 @@ require 'mongo/operation/executable'
|
|
17
17
|
require 'mongo/operation/specifiable'
|
18
18
|
require 'mongo/operation/limited'
|
19
19
|
require 'mongo/operation/read_preferrable'
|
20
|
-
require 'mongo/operation/batchable'
|
21
20
|
require 'mongo/operation/read'
|
22
21
|
require 'mongo/operation/write'
|
23
22
|
require 'mongo/operation/aggregate'
|
@@ -56,7 +56,7 @@ module Mongo
|
|
56
56
|
# server is not primary, the operation will be rerouted to the primary
|
57
57
|
# with a warning.
|
58
58
|
#
|
59
|
-
# @
|
59
|
+
# @param [ Server::Context ] context The context for this operation.
|
60
60
|
#
|
61
61
|
# @return [ Result ] The operation response, if there is one.
|
62
62
|
#
|
@@ -72,7 +72,7 @@ module Mongo
|
|
72
72
|
|
73
73
|
def execute_message(context)
|
74
74
|
context.with_connection do |connection|
|
75
|
-
Result.new(connection.dispatch([ message(context) ]))
|
75
|
+
Result.new(connection.dispatch([ message(context) ])).validate!
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
@@ -21,8 +21,7 @@ module Mongo
|
|
21
21
|
#
|
22
22
|
# @since 2.0.0
|
23
23
|
class Result < Operation::Result
|
24
|
-
|
25
|
-
attr_reader :indexes
|
24
|
+
include BulkMergable
|
26
25
|
|
27
26
|
# The aggregate number of deleted docs reported in the replies.
|
28
27
|
#
|
@@ -43,60 +42,6 @@ module Mongo
|
|
43
42
|
n += reply.documents.first[N]
|
44
43
|
end
|
45
44
|
end
|
46
|
-
|
47
|
-
# Set a list of indexes of the operations creating this result.
|
48
|
-
#
|
49
|
-
# @example Set the list of indexes.
|
50
|
-
# result.set_indexes([1,2,3])
|
51
|
-
#
|
52
|
-
# @return [ self ] The result.
|
53
|
-
#
|
54
|
-
# @since 2.0.0
|
55
|
-
def set_indexes(indexes)
|
56
|
-
@indexes = indexes
|
57
|
-
self
|
58
|
-
end
|
59
|
-
|
60
|
-
# Aggregate the write errors returned from this result.
|
61
|
-
#
|
62
|
-
# @example Aggregate the write errors.
|
63
|
-
# result.aggregate_write_errors
|
64
|
-
#
|
65
|
-
# @return [ Array ] The aggregate write errors.
|
66
|
-
#
|
67
|
-
# @since 2.0.0
|
68
|
-
def aggregate_write_errors
|
69
|
-
@replies.reduce(nil) do |errors, reply|
|
70
|
-
if write_errors = reply.documents.first['writeErrors']
|
71
|
-
errors ||= []
|
72
|
-
write_errors.each do |write_error|
|
73
|
-
errors << write_error.merge('index' => indexes[write_error['index']])
|
74
|
-
end
|
75
|
-
end
|
76
|
-
errors
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
# Aggregate the write concern errors returned from this result.
|
81
|
-
#
|
82
|
-
# @example Aggregate the write concern errors.
|
83
|
-
# result.aggregate_write_concern_errors
|
84
|
-
#
|
85
|
-
# @return [ Array ] The aggregate write concern errors.
|
86
|
-
#
|
87
|
-
# @since 2.0.0
|
88
|
-
def aggregate_write_concern_errors
|
89
|
-
@replies.reduce(nil) do |errors, reply|
|
90
|
-
if write_concern_errors = reply.documents.first['writeConcernErrors']
|
91
|
-
errors ||= []
|
92
|
-
write_concern_errors.each do |write_concern_error|
|
93
|
-
errors << write_concern_error.merge('index' =>
|
94
|
-
indexes[write_concern_error['index']])
|
95
|
-
end
|
96
|
-
end
|
97
|
-
errors
|
98
|
-
end
|
99
|
-
end
|
100
45
|
end
|
101
46
|
|
102
47
|
# Defines custom behaviour of results when deleting.
|
@@ -104,8 +49,7 @@ module Mongo
|
|
104
49
|
#
|
105
50
|
# @since 2.0.0
|
106
51
|
class LegacyResult < Operation::Result
|
107
|
-
|
108
|
-
attr_reader :indexes
|
52
|
+
include LegacyBulkMergable
|
109
53
|
|
110
54
|
# Gets the number of documents deleted.
|
111
55
|
#
|
@@ -121,75 +65,6 @@ module Mongo
|
|
121
65
|
n += reply.documents.first[N]
|
122
66
|
end
|
123
67
|
end
|
124
|
-
|
125
|
-
# Set a list of indexes of the operations creating this result.
|
126
|
-
#
|
127
|
-
# @example Set the list of indexes.
|
128
|
-
# result.set_indexes([1,2,3])
|
129
|
-
#
|
130
|
-
# @return [ self ] The result.
|
131
|
-
#
|
132
|
-
# @since 2.0.0
|
133
|
-
def set_indexes(indexes)
|
134
|
-
@indexes = indexes
|
135
|
-
self
|
136
|
-
end
|
137
|
-
|
138
|
-
# Aggregate the write errors returned from this result.
|
139
|
-
#
|
140
|
-
# @example Aggregate the write errors.
|
141
|
-
# result.aggregate_write_errors
|
142
|
-
#
|
143
|
-
# @return [ Array ] The aggregate write errors.
|
144
|
-
#
|
145
|
-
# @since 2.0.0
|
146
|
-
def aggregate_write_errors
|
147
|
-
@replies.each_with_index.reduce(nil) do |errors, (reply, i)|
|
148
|
-
if reply_write_errors?(reply)
|
149
|
-
errors ||= []
|
150
|
-
errors << { 'errmsg' => reply.documents.first[Error::ERROR],
|
151
|
-
'index' => indexes[i],
|
152
|
-
'code' => reply.documents.first[Error::CODE] }
|
153
|
-
end
|
154
|
-
errors
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
# Aggregate the write concern errors returned from this result.
|
159
|
-
#
|
160
|
-
# @example Aggregate the write concern errors.
|
161
|
-
# result.aggregate_write_concern_errors
|
162
|
-
#
|
163
|
-
# @return [ Array ] The aggregate write concern errors.
|
164
|
-
#
|
165
|
-
# @since 2.0.0
|
166
|
-
def aggregate_write_concern_errors
|
167
|
-
@replies.each_with_index.reduce(nil) do |errors, (reply, i)|
|
168
|
-
# @todo: only raise if error is timeout
|
169
|
-
if error = reply_write_errors?(reply)
|
170
|
-
errors ||= []
|
171
|
-
note = reply.documents.first['wnote'] || reply.documents.first['jnote']
|
172
|
-
if note
|
173
|
-
code = reply.documents.first['code'] || Error::BAD_VALUE
|
174
|
-
error_string = "#{code}: #{note}"
|
175
|
-
else
|
176
|
-
code = reply.documents.first['code'] || Error::UNKNOWN_ERROR
|
177
|
-
error_string = "#{code}: #{error}"
|
178
|
-
end
|
179
|
-
errors << { 'errmsg' => error_string,
|
180
|
-
'index' => indexes[i],
|
181
|
-
'code' => code }
|
182
|
-
end
|
183
|
-
errors
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
private
|
188
|
-
|
189
|
-
def reply_write_errors?(reply)
|
190
|
-
reply.documents.first[Error::ERROR] ||
|
191
|
-
reply.documents.first[Error::ERRMSG]
|
192
|
-
end
|
193
68
|
end
|
194
69
|
end
|
195
70
|
end
|
@@ -21,8 +21,7 @@ module Mongo
|
|
21
21
|
#
|
22
22
|
# @since 2.0.0
|
23
23
|
class Result < Operation::Result
|
24
|
-
|
25
|
-
attr_reader :indexes
|
24
|
+
include BulkMergable
|
26
25
|
|
27
26
|
# Gets the number of documents inserted.
|
28
27
|
#
|
@@ -35,65 +34,6 @@ module Mongo
|
|
35
34
|
def n_inserted
|
36
35
|
written_count
|
37
36
|
end
|
38
|
-
|
39
|
-
# Set a list of indexes of the operations creating this result.
|
40
|
-
#
|
41
|
-
# @example Set the list of indexes.
|
42
|
-
# result.set_indexes([1,2,3])
|
43
|
-
#
|
44
|
-
# @return [ self ] The result.
|
45
|
-
#
|
46
|
-
# @since 2.0.0
|
47
|
-
def set_indexes(indexes)
|
48
|
-
@indexes = indexes
|
49
|
-
self
|
50
|
-
end
|
51
|
-
|
52
|
-
# Aggregate the write errors returned from this result.
|
53
|
-
#
|
54
|
-
# @example Aggregate the write errors.
|
55
|
-
# result.aggregate_write_errors
|
56
|
-
#
|
57
|
-
# @return [ Array ] The aggregate write errors.
|
58
|
-
#
|
59
|
-
# @since 2.0.0
|
60
|
-
def aggregate_write_errors
|
61
|
-
@replies.reduce(nil) do |errors, reply|
|
62
|
-
if write_errors = reply.documents.first['writeErrors']
|
63
|
-
errors ||= []
|
64
|
-
write_errors.each do |write_error|
|
65
|
-
errors << write_error.merge('index' => indexes[write_error['index']])
|
66
|
-
end
|
67
|
-
end
|
68
|
-
errors
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
# Aggregate the write concern errors returned from this result.
|
73
|
-
#
|
74
|
-
# @example Aggregate the write concern errors.
|
75
|
-
# result.aggregate_write_concern_errors
|
76
|
-
#
|
77
|
-
# @return [ Array ] The aggregate write concern errors.
|
78
|
-
#
|
79
|
-
# @since 2.0.0
|
80
|
-
def aggregate_write_concern_errors
|
81
|
-
@replies.each_with_index.reduce(nil) do |errors, (reply, i)|
|
82
|
-
if write_concern_errors = reply.documents.first['writeConcernError']
|
83
|
-
errors ||= []
|
84
|
-
write_concern_errors.each do |write_concern_error|
|
85
|
-
errors << write_concern_error.merge('index' =>
|
86
|
-
indexes[write_concern_error['index']])
|
87
|
-
end
|
88
|
-
elsif reply.documents.first['errmsg']
|
89
|
-
errors ||= []
|
90
|
-
errors << { 'errmsg' => reply.documents.first['errmsg'],
|
91
|
-
'index' => indexes[i],
|
92
|
-
'code' => reply.documents.first['code'] }
|
93
|
-
end
|
94
|
-
errors
|
95
|
-
end
|
96
|
-
end
|
97
37
|
end
|
98
38
|
|
99
39
|
# Defines custom behaviour of results when inserting.
|
@@ -101,8 +41,7 @@ module Mongo
|
|
101
41
|
#
|
102
42
|
# @since 2.0.0
|
103
43
|
class LegacyResult < Operation::Result
|
104
|
-
|
105
|
-
attr_reader :indexes
|
44
|
+
include LegacyBulkMergable
|
106
45
|
|
107
46
|
# Gets the number of documents inserted.
|
108
47
|
#
|
@@ -119,75 +58,6 @@ module Mongo
|
|
119
58
|
n
|
120
59
|
end
|
121
60
|
end
|
122
|
-
|
123
|
-
# Set a list of indexes of the operations creating this result.
|
124
|
-
#
|
125
|
-
# @example Set the list of indexes.
|
126
|
-
# result.set_indexes([1,2,3])
|
127
|
-
#
|
128
|
-
# @return [ self ] The result.
|
129
|
-
#
|
130
|
-
# @since 2.0.0
|
131
|
-
def set_indexes(indexes)
|
132
|
-
@indexes = indexes
|
133
|
-
self
|
134
|
-
end
|
135
|
-
|
136
|
-
# Aggregate the write errors returned from this result.
|
137
|
-
#
|
138
|
-
# @example Aggregate the write errors.
|
139
|
-
# result.aggregate_write_errors
|
140
|
-
#
|
141
|
-
# @return [ Array ] The aggregate write errors.
|
142
|
-
#
|
143
|
-
# @since 2.0.0
|
144
|
-
def aggregate_write_errors
|
145
|
-
@replies.each_with_index.reduce(nil) do |errors, (reply, i)|
|
146
|
-
if reply_write_errors?(reply)
|
147
|
-
errors ||= []
|
148
|
-
errors << { 'errmsg' => reply.documents.first[Error::ERROR],
|
149
|
-
'index' => indexes[i],
|
150
|
-
'code' => reply.documents.first[Error::CODE] }
|
151
|
-
end
|
152
|
-
errors
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
# Aggregate the write concern errors returned from this result.
|
157
|
-
#
|
158
|
-
# @example Aggregate the write concern errors.
|
159
|
-
# result.aggregate_write_concern_errors
|
160
|
-
#
|
161
|
-
# @return [ Array ] The aggregate write concern errors.
|
162
|
-
#
|
163
|
-
# @since 2.0.0
|
164
|
-
def aggregate_write_concern_errors
|
165
|
-
@replies.each_with_index.reduce(nil) do |errors, (reply, i)|
|
166
|
-
# @todo: only raise if error is timeout
|
167
|
-
if error = reply_write_errors?(reply)
|
168
|
-
errors ||= []
|
169
|
-
note = reply.documents.first['wnote'] || reply.documents.first['jnote']
|
170
|
-
if note
|
171
|
-
code = reply.documents.first['code'] || "bad value constant"
|
172
|
-
error_string = "#{code}: #{note}"
|
173
|
-
else
|
174
|
-
code = reply.documents.first['code'] || "unknown error constant"
|
175
|
-
error_string = "#{code}: #{error}"
|
176
|
-
end
|
177
|
-
errors << { 'errmsg' => error_string,
|
178
|
-
'index' => indexes[i],
|
179
|
-
'code' => code }
|
180
|
-
end
|
181
|
-
errors
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
private
|
186
|
-
|
187
|
-
def reply_write_errors?(reply)
|
188
|
-
reply.documents.first[Error::ERROR] ||
|
189
|
-
reply.documents.first[Error::ERRMSG]
|
190
|
-
end
|
191
61
|
end
|
192
62
|
end
|
193
63
|
end
|