mongo 2.1.0.beta → 2.1.0.rc0
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 +2 -2
- data/lib/mongo.rb +2 -3
- data/lib/mongo/address.rb +7 -5
- data/lib/mongo/address/unix.rb +2 -2
- data/lib/mongo/auth/ldap/conversation.rb +6 -2
- data/lib/mongo/auth/scram/conversation.rb +8 -2
- data/lib/mongo/auth/user/view.rb +21 -0
- data/lib/mongo/bulk_write.rb +155 -23
- data/lib/mongo/bulk_write/combineable.rb +51 -0
- data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
- data/lib/mongo/bulk_write/result.rb +61 -8
- data/lib/mongo/bulk_write/result_combiner.rb +117 -0
- data/lib/mongo/bulk_write/transformable.rb +117 -0
- data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
- data/lib/mongo/bulk_write/validatable.rb +62 -0
- data/lib/mongo/client.rb +7 -3
- data/lib/mongo/cluster.rb +3 -3
- data/lib/mongo/cluster/topology/replica_set.rb +8 -6
- data/lib/mongo/cluster/topology/unknown.rb +5 -2
- data/lib/mongo/collection.rb +75 -4
- data/lib/mongo/collection/view.rb +1 -2
- data/lib/mongo/collection/view/aggregation.rb +13 -8
- data/lib/mongo/collection/view/immutable.rb +6 -6
- data/lib/mongo/collection/view/iterable.rb +13 -4
- data/lib/mongo/collection/view/map_reduce.rb +22 -17
- data/lib/mongo/collection/view/readable.rb +121 -70
- data/lib/mongo/cursor.rb +5 -1
- data/lib/mongo/database.rb +3 -3
- data/lib/mongo/database/view.rb +1 -1
- data/lib/mongo/error.rb +7 -0
- data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
- data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
- data/lib/mongo/error/file_not_found.rb +37 -0
- data/lib/mongo/error/invalid_file.rb +2 -2
- data/lib/mongo/error/invalid_file_revision.rb +37 -0
- data/lib/mongo/error/invalid_uri.rb +5 -4
- data/lib/mongo/error/missing_file_chunk.rb +38 -0
- data/lib/mongo/error/operation_failure.rb +1 -1
- data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
- data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
- data/lib/mongo/grid.rb +2 -1
- data/lib/mongo/grid/file.rb +12 -9
- data/lib/mongo/grid/file/chunk.rb +6 -6
- data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
- data/lib/mongo/grid/fs_bucket.rb +441 -0
- data/lib/mongo/grid/stream.rb +64 -0
- data/lib/mongo/grid/stream/read.rb +208 -0
- data/lib/mongo/grid/stream/write.rb +187 -0
- data/lib/mongo/index/view.rb +1 -1
- data/lib/mongo/loggable.rb +34 -57
- data/lib/mongo/logger.rb +16 -78
- data/lib/mongo/monitoring.rb +1 -5
- data/lib/mongo/monitoring/command_log_subscriber.rb +35 -17
- data/lib/mongo/monitoring/event/command_succeeded.rb +20 -1
- data/lib/mongo/monitoring/publishable.rb +22 -12
- data/lib/mongo/operation.rb +3 -6
- data/lib/mongo/operation/commands.rb +24 -0
- data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
- data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
- data/lib/mongo/operation/commands/collections_info.rb +66 -0
- data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
- data/lib/mongo/operation/commands/indexes.rb +70 -0
- data/lib/mongo/operation/commands/list_collections.rb +54 -0
- data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
- data/lib/mongo/operation/commands/list_indexes.rb +56 -0
- data/lib/mongo/operation/commands/list_indexes/result.rb +115 -0
- data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
- data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +0 -0
- data/lib/mongo/operation/{parallel_scan.rb → commands/parallel_scan.rb} +3 -23
- data/lib/mongo/operation/{parallel_scan → commands/parallel_scan}/result.rb +0 -0
- data/lib/mongo/operation/commands/user_query.rb +69 -0
- data/lib/mongo/operation/commands/users_info.rb +53 -0
- data/lib/mongo/operation/commands/users_info/result.rb +36 -0
- data/lib/mongo/operation/executable.rb +4 -68
- data/lib/mongo/operation/kill_cursors.rb +3 -3
- data/lib/mongo/operation/read.rb +0 -4
- data/lib/mongo/operation/read/get_more.rb +2 -22
- data/lib/mongo/operation/read/query.rb +2 -21
- data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
- data/lib/mongo/operation/specifiable.rb +24 -0
- data/lib/mongo/operation/write.rb +2 -0
- data/lib/mongo/operation/write/bulk.rb +6 -3
- data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
- data/lib/mongo/operation/write/bulk/delete.rb +71 -0
- data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
- data/lib/mongo/operation/write/bulk/insert.rb +96 -0
- data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
- data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
- data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
- data/lib/mongo/operation/write/bulk/update.rb +81 -0
- data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
- data/lib/mongo/operation/write/command/create_index.rb +0 -1
- data/lib/mongo/operation/write/command/create_user.rb +0 -1
- data/lib/mongo/operation/write/command/delete.rb +0 -1
- data/lib/mongo/operation/write/command/drop_index.rb +0 -1
- data/lib/mongo/operation/write/command/insert.rb +0 -1
- data/lib/mongo/operation/write/command/remove_user.rb +0 -1
- data/lib/mongo/operation/write/command/update.rb +0 -1
- data/lib/mongo/operation/write/command/update_user.rb +0 -1
- data/lib/mongo/operation/write/command/writable.rb +13 -18
- data/lib/mongo/operation/write/create_index.rb +4 -27
- data/lib/mongo/operation/write/create_user.rb +4 -30
- data/lib/mongo/operation/write/delete.rb +5 -28
- data/lib/mongo/operation/write/drop_index.rb +3 -3
- data/lib/mongo/operation/write/gle.rb +48 -0
- data/lib/mongo/operation/write/idable.rb +5 -0
- data/lib/mongo/operation/write/insert.rb +2 -24
- data/lib/mongo/operation/write/remove_user.rb +4 -27
- data/lib/mongo/operation/write/update.rb +4 -32
- data/lib/mongo/operation/write/update_user.rb +4 -30
- data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
- data/lib/mongo/options/mapper.rb +4 -2
- data/lib/mongo/protocol/delete.rb +68 -3
- data/lib/mongo/protocol/get_more.rb +54 -2
- data/lib/mongo/protocol/insert.rb +59 -1
- data/lib/mongo/protocol/kill_cursors.rb +53 -4
- data/lib/mongo/protocol/message.rb +12 -12
- data/lib/mongo/protocol/query.rb +139 -65
- data/lib/mongo/protocol/reply.rb +69 -1
- data/lib/mongo/protocol/update.rb +70 -1
- data/lib/mongo/server/connection.rb +11 -3
- data/lib/mongo/server/description.rb +29 -0
- data/lib/mongo/server/description/features.rb +2 -1
- data/lib/mongo/server/monitor.rb +2 -2
- data/lib/mongo/server_selector.rb +14 -10
- data/lib/mongo/server_selector/selectable.rb +24 -22
- data/lib/mongo/socket.rb +6 -3
- data/lib/mongo/socket/tcp.rb +2 -2
- data/lib/mongo/socket/unix.rb +5 -8
- data/lib/mongo/uri.rb +243 -139
- data/lib/mongo/version.rb +1 -1
- data/spec/mongo/address/unix_spec.rb +1 -1
- data/spec/mongo/address_spec.rb +25 -0
- data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
- data/spec/mongo/auth/user/view_spec.rb +26 -1
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
- data/spec/mongo/bulk_write_spec.rb +332 -166
- data/spec/mongo/client_spec.rb +25 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
- data/spec/mongo/collection/view/immutable_spec.rb +103 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +98 -3
- data/spec/mongo/collection/view/readable_spec.rb +17 -30
- data/spec/mongo/collection/view_spec.rb +233 -7
- data/spec/mongo/collection_spec.rb +360 -18
- data/spec/mongo/command_monitoring_spec.rb +51 -0
- data/spec/mongo/connection_string_spec.rb +137 -0
- data/spec/mongo/database_spec.rb +27 -11
- data/spec/mongo/grid/file/chunk_spec.rb +5 -5
- data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
- data/spec/mongo/grid/file_spec.rb +8 -8
- data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
- data/spec/mongo/grid/stream/read_spec.rb +275 -0
- data/spec/mongo/grid/stream/write_spec.rb +440 -0
- data/spec/mongo/grid/stream_spec.rb +48 -0
- data/spec/mongo/gridfs_spec.rb +50 -0
- data/spec/mongo/logger_spec.rb +0 -40
- data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
- data/spec/mongo/operation/{aggregate_spec.rb → commands/aggregate_spec.rb} +0 -42
- data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
- data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -0
- data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
- data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +0 -18
- data/spec/mongo/operation/kill_cursors_spec.rb +1 -1
- data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
- data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +1 -12
- data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
- data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +1 -12
- data/spec/mongo/operation/write/insert_spec.rb +0 -11
- data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
- data/spec/mongo/server/description_spec.rb +42 -0
- data/spec/mongo/server/monitor_spec.rb +21 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +1 -0
- data/spec/mongo/server_selection_spec.rb +3 -3
- data/spec/mongo/server_selector/nearest_spec.rb +34 -27
- data/spec/mongo/server_selector/primary_preferred_spec.rb +31 -30
- data/spec/mongo/server_selector/primary_spec.rb +14 -13
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +27 -26
- data/spec/mongo/server_selector/secondary_spec.rb +23 -22
- data/spec/mongo/server_selector_spec.rb +87 -24
- data/spec/mongo/socket/unix_spec.rb +52 -0
- data/spec/mongo/uri_spec.rb +251 -39
- data/spec/spec_helper.rb +11 -4
- data/spec/support/authorization.rb +4 -5
- data/spec/support/command_monitoring.rb +365 -0
- data/spec/support/command_monitoring/bulkWrite.yml +73 -0
- data/spec/support/command_monitoring/command.yml +42 -0
- data/spec/support/command_monitoring/deleteMany.yml +55 -0
- data/spec/support/command_monitoring/deleteOne.yml +55 -0
- data/spec/support/command_monitoring/find.yml +219 -0
- data/spec/support/command_monitoring/insertMany.yml +81 -0
- data/spec/support/command_monitoring/insertOne.yml +51 -0
- data/spec/support/command_monitoring/updateMany.yml +67 -0
- data/spec/support/command_monitoring/updateOne.yml +95 -0
- data/spec/support/connection_string.rb +228 -0
- data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
- data/spec/support/connection_string_tests/valid-auth.yml +256 -0
- data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
- data/spec/support/connection_string_tests/valid-options.yml +30 -0
- data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
- data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
- data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
- data/spec/support/crud.rb +3 -1
- data/spec/support/crud/read.rb +14 -10
- data/spec/support/crud/write.rb +36 -9
- data/spec/support/gridfs.rb +637 -0
- data/spec/support/gridfs_tests/delete.yml +157 -0
- data/spec/support/gridfs_tests/download.yml +210 -0
- data/spec/support/gridfs_tests/download_by_name.yml +113 -0
- data/spec/support/gridfs_tests/upload.yml +158 -0
- data/spec/support/sdam/rs/equal_electionids.yml +1 -2
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
- data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
- data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
- data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
- data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
- data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
- data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
- data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
- data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
- data/spec/support/sdam/single/not_ok_response.yml +0 -1
- data/spec/support/server_discovery_and_monitoring.rb +3 -1
- data/spec/support/server_selection.rb +3 -1
- data/spec/support/shared/bulk_write.rb +192 -0
- data/spec/support/shared/server_selector.rb +21 -12
- metadata +147 -57
- metadata.gz.sig +0 -0
- data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
- data/lib/mongo/bulk_write/deletable.rb +0 -57
- data/lib/mongo/bulk_write/insertable.rb +0 -49
- data/lib/mongo/bulk_write/replacable.rb +0 -58
- data/lib/mongo/bulk_write/updatable.rb +0 -69
- data/lib/mongo/grid/fs.rb +0 -146
- data/lib/mongo/operation/list_collections/result.rb +0 -114
- data/lib/mongo/operation/list_indexes/result.rb +0 -118
- data/lib/mongo/operation/read/collections_info.rb +0 -68
- data/lib/mongo/operation/read/indexes.rb +0 -69
- data/lib/mongo/operation/read/list_collections.rb +0 -76
- data/lib/mongo/operation/read/list_indexes.rb +0 -78
- data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
- data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
- data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
- data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
- data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
- data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
- data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -174
- data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
- data/spec/mongo/grid/fs_spec.rb +0 -160
- data/spec/mongo/loggable_spec.rb +0 -63
@@ -13,13 +13,66 @@
|
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
15
|
module Mongo
|
16
|
-
|
16
|
+
class BulkWrite
|
17
17
|
|
18
18
|
# Wraps a series of bulk write operations in a result object.
|
19
19
|
#
|
20
20
|
# @since 2.0.6
|
21
21
|
class Result
|
22
22
|
|
23
|
+
# Constant for number removed.
|
24
|
+
#
|
25
|
+
# @since 2.1.0
|
26
|
+
REMOVED_COUNT = 'n_removed'.freeze
|
27
|
+
|
28
|
+
# Constant for number inserted.
|
29
|
+
#
|
30
|
+
# @since 2.1.0
|
31
|
+
INSERTED_COUNT = 'n_inserted'.freeze
|
32
|
+
|
33
|
+
# Constant for inserted ids.
|
34
|
+
#
|
35
|
+
# @since 2.1.0
|
36
|
+
INSERTED_IDS = 'inserted_ids'.freeze
|
37
|
+
|
38
|
+
# Constant for number matched.
|
39
|
+
#
|
40
|
+
# @since 2.1.0
|
41
|
+
MATCHED_COUNT = 'n_matched'.freeze
|
42
|
+
|
43
|
+
# Constant for number modified.
|
44
|
+
#
|
45
|
+
# @since 2.1.0
|
46
|
+
MODIFIED_COUNT = 'n_modified'.freeze
|
47
|
+
|
48
|
+
# Constant for upserted.
|
49
|
+
#
|
50
|
+
# @since 2.1.0
|
51
|
+
UPSERTED = 'upserted'.freeze
|
52
|
+
|
53
|
+
# Constant for number upserted.
|
54
|
+
#
|
55
|
+
# @since 2.1.0
|
56
|
+
UPSERTED_COUNT = 'n_upserted'.freeze
|
57
|
+
|
58
|
+
# Constant for upserted ids.
|
59
|
+
#
|
60
|
+
# @since 2.1.0
|
61
|
+
UPSERTED_IDS = 'upserted_ids'.freeze
|
62
|
+
|
63
|
+
# The fields contained in the result document returned from executing the
|
64
|
+
# operations.
|
65
|
+
#
|
66
|
+
# @since 2.1.0.
|
67
|
+
FIELDS = [
|
68
|
+
INSERTED_COUNT,
|
69
|
+
REMOVED_COUNT,
|
70
|
+
MODIFIED_COUNT,
|
71
|
+
UPSERTED_COUNT,
|
72
|
+
MATCHED_COUNT,
|
73
|
+
Operation::Result::N
|
74
|
+
].freeze
|
75
|
+
|
23
76
|
# Returns the number of documents deleted.
|
24
77
|
#
|
25
78
|
# @example Get the number of deleted documents.
|
@@ -29,7 +82,7 @@ module Mongo
|
|
29
82
|
#
|
30
83
|
# @since 2.1.0
|
31
84
|
def deleted_count
|
32
|
-
@results[
|
85
|
+
@results[REMOVED_COUNT]
|
33
86
|
end
|
34
87
|
|
35
88
|
# Create the new result object from the results document.
|
@@ -53,7 +106,7 @@ module Mongo
|
|
53
106
|
#
|
54
107
|
# @since 2.1.0
|
55
108
|
def inserted_count
|
56
|
-
@results[
|
109
|
+
@results[INSERTED_COUNT]
|
57
110
|
end
|
58
111
|
|
59
112
|
# Get the inserted document ids, if the operation has inserts.
|
@@ -65,7 +118,7 @@ module Mongo
|
|
65
118
|
#
|
66
119
|
# @since 2.1.0
|
67
120
|
def inserted_ids
|
68
|
-
@results[
|
121
|
+
@results[INSERTED_IDS]
|
69
122
|
end
|
70
123
|
|
71
124
|
# Returns the number of documents matched.
|
@@ -77,7 +130,7 @@ module Mongo
|
|
77
130
|
#
|
78
131
|
# @since 2.1.0
|
79
132
|
def matched_count
|
80
|
-
@results[
|
133
|
+
@results[MATCHED_COUNT]
|
81
134
|
end
|
82
135
|
|
83
136
|
# Returns the number of documents modified.
|
@@ -89,7 +142,7 @@ module Mongo
|
|
89
142
|
#
|
90
143
|
# @since 2.1.0
|
91
144
|
def modified_count
|
92
|
-
@results[
|
145
|
+
@results[MODIFIED_COUNT]
|
93
146
|
end
|
94
147
|
|
95
148
|
# Returns the number of documents upserted.
|
@@ -101,7 +154,7 @@ module Mongo
|
|
101
154
|
#
|
102
155
|
# @since 2.1.0
|
103
156
|
def upserted_count
|
104
|
-
@results[
|
157
|
+
@results[UPSERTED_COUNT]
|
105
158
|
end
|
106
159
|
|
107
160
|
# Get the upserted document ids, if the operation has inserts.
|
@@ -113,7 +166,7 @@ module Mongo
|
|
113
166
|
#
|
114
167
|
# @since 2.1.0
|
115
168
|
def upserted_ids
|
116
|
-
@results[
|
169
|
+
@results[UPSERTED_IDS]
|
117
170
|
end
|
118
171
|
|
119
172
|
# Validates the bulk write result.
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# Copyright (C) 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
|
+
class BulkWrite
|
17
|
+
|
18
|
+
# Combines bulk write results together.
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
#
|
22
|
+
# @since 2.1.0
|
23
|
+
class ResultCombiner
|
24
|
+
|
25
|
+
# @return [ Integer ] count The count of documents in the entire batch.
|
26
|
+
attr_reader :count
|
27
|
+
|
28
|
+
# @return [ Hash ] results The results hash.
|
29
|
+
attr_reader :results
|
30
|
+
|
31
|
+
# Create the new result combiner.
|
32
|
+
#
|
33
|
+
# @api private
|
34
|
+
#
|
35
|
+
# @example Create the result combiner.
|
36
|
+
# ResultCombiner.new
|
37
|
+
#
|
38
|
+
# @since 2.1.0
|
39
|
+
def initialize
|
40
|
+
@results = {}
|
41
|
+
@count = 0
|
42
|
+
end
|
43
|
+
|
44
|
+
# Combines a result into the overall results.
|
45
|
+
#
|
46
|
+
# @api private
|
47
|
+
#
|
48
|
+
# @example Combine the result.
|
49
|
+
# combiner.combine!(result, count)
|
50
|
+
#
|
51
|
+
# @param [ Operation::Result ] result The result to combine.
|
52
|
+
# @param [ Integer ] count The count of requests in the batch.
|
53
|
+
#
|
54
|
+
# @since 2.1.0
|
55
|
+
def combine!(result, count)
|
56
|
+
combine_counts!(result)
|
57
|
+
combine_ids!(result)
|
58
|
+
combine_errors!(result)
|
59
|
+
@count += count
|
60
|
+
end
|
61
|
+
|
62
|
+
# Get the final result.
|
63
|
+
#
|
64
|
+
# @api private
|
65
|
+
#
|
66
|
+
# @example Get the final result.
|
67
|
+
# combinator.result
|
68
|
+
#
|
69
|
+
# @return [ BulkWrite::Result ] The final result.
|
70
|
+
#
|
71
|
+
# @since 2.1.0
|
72
|
+
def result
|
73
|
+
BulkWrite::Result.new(results).validate!
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def combine_counts!(result)
|
79
|
+
Result::FIELDS.each do |field|
|
80
|
+
if result.respond_to?(field)
|
81
|
+
results.merge!(field => (results[field] || 0) + result.send(field))
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def combine_ids!(result)
|
87
|
+
if result.respond_to?(Result::INSERTED_IDS)
|
88
|
+
results.merge!(Result::INSERTED_IDS => result.inserted_ids)
|
89
|
+
end
|
90
|
+
if result.respond_to?(Result::UPSERTED)
|
91
|
+
results.merge!(Result::UPSERTED_IDS => result.upserted.map{ |doc| doc['_id'] })
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def combine_errors!(result)
|
96
|
+
combine_write_errors!(result)
|
97
|
+
combine_write_concern_errors!(result)
|
98
|
+
end
|
99
|
+
|
100
|
+
def combine_write_errors!(result)
|
101
|
+
if write_errors = result.aggregate_write_errors(count)
|
102
|
+
results.merge!(
|
103
|
+
Error::WRITE_ERRORS => ((results[Error::WRITE_ERRORS] || []) << write_errors).flatten
|
104
|
+
)
|
105
|
+
else
|
106
|
+
result.validate!
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def combine_write_concern_errors!(result)
|
111
|
+
if write_concern_errors = result.aggregate_write_concern_errors(count)
|
112
|
+
results.merge!(Error::WRITE_CONCERN_ERRORS => write_concern_errors)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# Copyright (C) 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
|
+
class BulkWrite
|
17
|
+
|
18
|
+
# Defines behaviour around transformations.
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
#
|
22
|
+
# @since 2.1.0
|
23
|
+
module Transformable
|
24
|
+
|
25
|
+
# The delete many model constant.
|
26
|
+
#
|
27
|
+
# @since 2.1.0
|
28
|
+
DELETE_MANY = :delete_many.freeze
|
29
|
+
|
30
|
+
# The delete one model constant.
|
31
|
+
#
|
32
|
+
# @since 2.1.0
|
33
|
+
DELETE_ONE = :delete_one.freeze
|
34
|
+
|
35
|
+
# The insert one model constant.
|
36
|
+
#
|
37
|
+
# @since 2.1.0
|
38
|
+
INSERT_ONE = :insert_one.freeze
|
39
|
+
|
40
|
+
# The replace one model constant.
|
41
|
+
#
|
42
|
+
# @since 2.1.0
|
43
|
+
REPLACE_ONE = :replace_one.freeze
|
44
|
+
|
45
|
+
# The update many model constant.
|
46
|
+
#
|
47
|
+
# @since 2.1.0
|
48
|
+
UPDATE_MANY = :update_many.freeze
|
49
|
+
|
50
|
+
# The update one model constant.
|
51
|
+
#
|
52
|
+
# @since 2.1.0
|
53
|
+
UPDATE_ONE = :update_one.freeze
|
54
|
+
|
55
|
+
# Proc to transform delete many ops.
|
56
|
+
#
|
57
|
+
# @since 2.1.0
|
58
|
+
DELETE_MANY_TRANSFORM = ->(doc){
|
59
|
+
{ q: doc[:filter], limit: 0 }
|
60
|
+
}
|
61
|
+
|
62
|
+
# Proc to transform delete one ops.
|
63
|
+
#
|
64
|
+
# @since 2.1.0
|
65
|
+
DELETE_ONE_TRANSFORM = ->(doc){
|
66
|
+
{ q: doc[:filter], limit: 1 }
|
67
|
+
}
|
68
|
+
|
69
|
+
# Proc to transform insert one ops.
|
70
|
+
#
|
71
|
+
# @since 2.1.0
|
72
|
+
INSERT_ONE_TRANSFORM = ->(doc){
|
73
|
+
doc
|
74
|
+
}
|
75
|
+
|
76
|
+
# Proc to transfor replace one ops.
|
77
|
+
#
|
78
|
+
# @since 2.1.0
|
79
|
+
REPLACE_ONE_TRANSFORM = ->(doc){
|
80
|
+
{ q: doc[:filter], u: doc[:replacement], multi: false, upsert: doc.fetch(:upsert, false) }
|
81
|
+
}
|
82
|
+
|
83
|
+
# Proc to transform update many ops.
|
84
|
+
#
|
85
|
+
# @since 2.1.0
|
86
|
+
UPDATE_MANY_TRANSFORM = ->(doc){
|
87
|
+
{ q: doc[:filter], u: doc[:update], multi: true, upsert: doc.fetch(:upsert, false) }
|
88
|
+
}
|
89
|
+
|
90
|
+
# Proc to transform update one ops.
|
91
|
+
#
|
92
|
+
# @since 2.1.0
|
93
|
+
UPDATE_ONE_TRANSFORM = ->(doc){
|
94
|
+
{ q: doc[:filter], u: doc[:update], multi: false, upsert: doc.fetch(:upsert, false) }
|
95
|
+
}
|
96
|
+
|
97
|
+
# Document mappers from the bulk api input into proper commands.
|
98
|
+
#
|
99
|
+
# @since 2.1.0
|
100
|
+
MAPPERS = {
|
101
|
+
DELETE_MANY => DELETE_MANY_TRANSFORM,
|
102
|
+
DELETE_ONE => DELETE_ONE_TRANSFORM,
|
103
|
+
INSERT_ONE => INSERT_ONE_TRANSFORM,
|
104
|
+
REPLACE_ONE => REPLACE_ONE_TRANSFORM,
|
105
|
+
UPDATE_MANY => UPDATE_MANY_TRANSFORM,
|
106
|
+
UPDATE_ONE => UPDATE_ONE_TRANSFORM
|
107
|
+
}.freeze
|
108
|
+
|
109
|
+
private
|
110
|
+
|
111
|
+
def transform(name, document)
|
112
|
+
validate(name, document)
|
113
|
+
MAPPERS[name].call(document)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# Copyright (C) 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
|
+
class BulkWrite
|
17
|
+
|
18
|
+
# Combines groups of bulk write operations in no order.
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
#
|
22
|
+
# @since 2.1.0
|
23
|
+
class UnorderedCombiner
|
24
|
+
include Transformable
|
25
|
+
include Validatable
|
26
|
+
include Combineable
|
27
|
+
|
28
|
+
# Combine the requests in order.
|
29
|
+
#
|
30
|
+
# @api private
|
31
|
+
#
|
32
|
+
# @example Combine the requests.
|
33
|
+
# combiner.combine
|
34
|
+
#
|
35
|
+
# @return [ Array<Hash> ] The combined requests.
|
36
|
+
#
|
37
|
+
# @since 2.1.0
|
38
|
+
def combine
|
39
|
+
combine_requests({}).map do |name, ops|
|
40
|
+
{ name => ops }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def add(operations, name, document)
|
47
|
+
(operations[name] ||= []).push(transform(name, document))
|
48
|
+
operations
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# Copyright (C) 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
|
+
class BulkWrite
|
17
|
+
|
18
|
+
# Defines behaviour around validations.
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
#
|
22
|
+
# @since 2.1.0
|
23
|
+
module Validatable
|
24
|
+
|
25
|
+
# Validate the document.
|
26
|
+
#
|
27
|
+
# @api private
|
28
|
+
#
|
29
|
+
# @example Validate the document.
|
30
|
+
# validatable.validate(:insert_one, { _id: 0 })
|
31
|
+
#
|
32
|
+
# @param [ Symbol ] name The operation name.
|
33
|
+
# @param [ Hash, BSON::Document ] document The document.
|
34
|
+
#
|
35
|
+
# @raise [ InvalidBulkOperation ] If not valid.
|
36
|
+
#
|
37
|
+
# @return [ Hash, BSON::Document ] The document.
|
38
|
+
#
|
39
|
+
# @since 2.1.0
|
40
|
+
def validate(name, document)
|
41
|
+
validate_operation(name)
|
42
|
+
validate_document(name, document)
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def validate_document(name, document)
|
48
|
+
if document.respond_to?(:keys) || document.respond_to?(:data)
|
49
|
+
document
|
50
|
+
else
|
51
|
+
raise Error::InvalidBulkOperation.new(name, document)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def validate_operation(name)
|
56
|
+
unless Transformable::MAPPERS.key?(name)
|
57
|
+
raise Error::InvalidBulkOperationType.new(name)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|