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.
Files changed (253) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +2 -2
  5. data/lib/mongo.rb +2 -3
  6. data/lib/mongo/address.rb +7 -5
  7. data/lib/mongo/address/unix.rb +2 -2
  8. data/lib/mongo/auth/ldap/conversation.rb +6 -2
  9. data/lib/mongo/auth/scram/conversation.rb +8 -2
  10. data/lib/mongo/auth/user/view.rb +21 -0
  11. data/lib/mongo/bulk_write.rb +155 -23
  12. data/lib/mongo/bulk_write/combineable.rb +51 -0
  13. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  14. data/lib/mongo/bulk_write/result.rb +61 -8
  15. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  16. data/lib/mongo/bulk_write/transformable.rb +117 -0
  17. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  18. data/lib/mongo/bulk_write/validatable.rb +62 -0
  19. data/lib/mongo/client.rb +7 -3
  20. data/lib/mongo/cluster.rb +3 -3
  21. data/lib/mongo/cluster/topology/replica_set.rb +8 -6
  22. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  23. data/lib/mongo/collection.rb +75 -4
  24. data/lib/mongo/collection/view.rb +1 -2
  25. data/lib/mongo/collection/view/aggregation.rb +13 -8
  26. data/lib/mongo/collection/view/immutable.rb +6 -6
  27. data/lib/mongo/collection/view/iterable.rb +13 -4
  28. data/lib/mongo/collection/view/map_reduce.rb +22 -17
  29. data/lib/mongo/collection/view/readable.rb +121 -70
  30. data/lib/mongo/cursor.rb +5 -1
  31. data/lib/mongo/database.rb +3 -3
  32. data/lib/mongo/database/view.rb +1 -1
  33. data/lib/mongo/error.rb +7 -0
  34. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
  35. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
  36. data/lib/mongo/error/file_not_found.rb +37 -0
  37. data/lib/mongo/error/invalid_file.rb +2 -2
  38. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  39. data/lib/mongo/error/invalid_uri.rb +5 -4
  40. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  41. data/lib/mongo/error/operation_failure.rb +1 -1
  42. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  43. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  44. data/lib/mongo/grid.rb +2 -1
  45. data/lib/mongo/grid/file.rb +12 -9
  46. data/lib/mongo/grid/file/chunk.rb +6 -6
  47. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  48. data/lib/mongo/grid/fs_bucket.rb +441 -0
  49. data/lib/mongo/grid/stream.rb +64 -0
  50. data/lib/mongo/grid/stream/read.rb +208 -0
  51. data/lib/mongo/grid/stream/write.rb +187 -0
  52. data/lib/mongo/index/view.rb +1 -1
  53. data/lib/mongo/loggable.rb +34 -57
  54. data/lib/mongo/logger.rb +16 -78
  55. data/lib/mongo/monitoring.rb +1 -5
  56. data/lib/mongo/monitoring/command_log_subscriber.rb +35 -17
  57. data/lib/mongo/monitoring/event/command_succeeded.rb +20 -1
  58. data/lib/mongo/monitoring/publishable.rb +22 -12
  59. data/lib/mongo/operation.rb +3 -6
  60. data/lib/mongo/operation/commands.rb +24 -0
  61. data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
  62. data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
  63. data/lib/mongo/operation/commands/collections_info.rb +66 -0
  64. data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
  65. data/lib/mongo/operation/commands/indexes.rb +70 -0
  66. data/lib/mongo/operation/commands/list_collections.rb +54 -0
  67. data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
  68. data/lib/mongo/operation/commands/list_indexes.rb +56 -0
  69. data/lib/mongo/operation/commands/list_indexes/result.rb +115 -0
  70. data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
  71. data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +0 -0
  72. data/lib/mongo/operation/{parallel_scan.rb → commands/parallel_scan.rb} +3 -23
  73. data/lib/mongo/operation/{parallel_scan → commands/parallel_scan}/result.rb +0 -0
  74. data/lib/mongo/operation/commands/user_query.rb +69 -0
  75. data/lib/mongo/operation/commands/users_info.rb +53 -0
  76. data/lib/mongo/operation/commands/users_info/result.rb +36 -0
  77. data/lib/mongo/operation/executable.rb +4 -68
  78. data/lib/mongo/operation/kill_cursors.rb +3 -3
  79. data/lib/mongo/operation/read.rb +0 -4
  80. data/lib/mongo/operation/read/get_more.rb +2 -22
  81. data/lib/mongo/operation/read/query.rb +2 -21
  82. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  83. data/lib/mongo/operation/specifiable.rb +24 -0
  84. data/lib/mongo/operation/write.rb +2 -0
  85. data/lib/mongo/operation/write/bulk.rb +6 -3
  86. data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
  87. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  88. data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
  89. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  90. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  91. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  92. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  93. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  94. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  95. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  96. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  97. data/lib/mongo/operation/write/command/delete.rb +0 -1
  98. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  99. data/lib/mongo/operation/write/command/insert.rb +0 -1
  100. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  101. data/lib/mongo/operation/write/command/update.rb +0 -1
  102. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  103. data/lib/mongo/operation/write/command/writable.rb +13 -18
  104. data/lib/mongo/operation/write/create_index.rb +4 -27
  105. data/lib/mongo/operation/write/create_user.rb +4 -30
  106. data/lib/mongo/operation/write/delete.rb +5 -28
  107. data/lib/mongo/operation/write/drop_index.rb +3 -3
  108. data/lib/mongo/operation/write/gle.rb +48 -0
  109. data/lib/mongo/operation/write/idable.rb +5 -0
  110. data/lib/mongo/operation/write/insert.rb +2 -24
  111. data/lib/mongo/operation/write/remove_user.rb +4 -27
  112. data/lib/mongo/operation/write/update.rb +4 -32
  113. data/lib/mongo/operation/write/update_user.rb +4 -30
  114. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  115. data/lib/mongo/options/mapper.rb +4 -2
  116. data/lib/mongo/protocol/delete.rb +68 -3
  117. data/lib/mongo/protocol/get_more.rb +54 -2
  118. data/lib/mongo/protocol/insert.rb +59 -1
  119. data/lib/mongo/protocol/kill_cursors.rb +53 -4
  120. data/lib/mongo/protocol/message.rb +12 -12
  121. data/lib/mongo/protocol/query.rb +139 -65
  122. data/lib/mongo/protocol/reply.rb +69 -1
  123. data/lib/mongo/protocol/update.rb +70 -1
  124. data/lib/mongo/server/connection.rb +11 -3
  125. data/lib/mongo/server/description.rb +29 -0
  126. data/lib/mongo/server/description/features.rb +2 -1
  127. data/lib/mongo/server/monitor.rb +2 -2
  128. data/lib/mongo/server_selector.rb +14 -10
  129. data/lib/mongo/server_selector/selectable.rb +24 -22
  130. data/lib/mongo/socket.rb +6 -3
  131. data/lib/mongo/socket/tcp.rb +2 -2
  132. data/lib/mongo/socket/unix.rb +5 -8
  133. data/lib/mongo/uri.rb +243 -139
  134. data/lib/mongo/version.rb +1 -1
  135. data/spec/mongo/address/unix_spec.rb +1 -1
  136. data/spec/mongo/address_spec.rb +25 -0
  137. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  138. data/spec/mongo/auth/user/view_spec.rb +26 -1
  139. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
  140. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  141. data/spec/mongo/bulk_write_spec.rb +332 -166
  142. data/spec/mongo/client_spec.rb +25 -0
  143. data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
  144. data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
  145. data/spec/mongo/collection/view/immutable_spec.rb +103 -0
  146. data/spec/mongo/collection/view/map_reduce_spec.rb +98 -3
  147. data/spec/mongo/collection/view/readable_spec.rb +17 -30
  148. data/spec/mongo/collection/view_spec.rb +233 -7
  149. data/spec/mongo/collection_spec.rb +360 -18
  150. data/spec/mongo/command_monitoring_spec.rb +51 -0
  151. data/spec/mongo/connection_string_spec.rb +137 -0
  152. data/spec/mongo/database_spec.rb +27 -11
  153. data/spec/mongo/grid/file/chunk_spec.rb +5 -5
  154. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  155. data/spec/mongo/grid/file_spec.rb +8 -8
  156. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  157. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  158. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  159. data/spec/mongo/grid/stream_spec.rb +48 -0
  160. data/spec/mongo/gridfs_spec.rb +50 -0
  161. data/spec/mongo/logger_spec.rb +0 -40
  162. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  163. data/spec/mongo/operation/{aggregate_spec.rb → commands/aggregate_spec.rb} +0 -42
  164. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  165. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -0
  166. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  167. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +0 -18
  168. data/spec/mongo/operation/kill_cursors_spec.rb +1 -1
  169. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  170. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +1 -12
  171. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
  172. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +1 -12
  173. data/spec/mongo/operation/write/insert_spec.rb +0 -11
  174. data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
  175. data/spec/mongo/server/description_spec.rb +42 -0
  176. data/spec/mongo/server/monitor_spec.rb +21 -0
  177. data/spec/mongo/server_discovery_and_monitoring_spec.rb +1 -0
  178. data/spec/mongo/server_selection_spec.rb +3 -3
  179. data/spec/mongo/server_selector/nearest_spec.rb +34 -27
  180. data/spec/mongo/server_selector/primary_preferred_spec.rb +31 -30
  181. data/spec/mongo/server_selector/primary_spec.rb +14 -13
  182. data/spec/mongo/server_selector/secondary_preferred_spec.rb +27 -26
  183. data/spec/mongo/server_selector/secondary_spec.rb +23 -22
  184. data/spec/mongo/server_selector_spec.rb +87 -24
  185. data/spec/mongo/socket/unix_spec.rb +52 -0
  186. data/spec/mongo/uri_spec.rb +251 -39
  187. data/spec/spec_helper.rb +11 -4
  188. data/spec/support/authorization.rb +4 -5
  189. data/spec/support/command_monitoring.rb +365 -0
  190. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  191. data/spec/support/command_monitoring/command.yml +42 -0
  192. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  193. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  194. data/spec/support/command_monitoring/find.yml +219 -0
  195. data/spec/support/command_monitoring/insertMany.yml +81 -0
  196. data/spec/support/command_monitoring/insertOne.yml +51 -0
  197. data/spec/support/command_monitoring/updateMany.yml +67 -0
  198. data/spec/support/command_monitoring/updateOne.yml +95 -0
  199. data/spec/support/connection_string.rb +228 -0
  200. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  201. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  202. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  203. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  204. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  205. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  206. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  207. data/spec/support/crud.rb +3 -1
  208. data/spec/support/crud/read.rb +14 -10
  209. data/spec/support/crud/write.rb +36 -9
  210. data/spec/support/gridfs.rb +637 -0
  211. data/spec/support/gridfs_tests/delete.yml +157 -0
  212. data/spec/support/gridfs_tests/download.yml +210 -0
  213. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  214. data/spec/support/gridfs_tests/upload.yml +158 -0
  215. data/spec/support/sdam/rs/equal_electionids.yml +1 -2
  216. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
  217. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  218. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  219. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  220. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  221. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  222. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  223. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  224. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  225. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  226. data/spec/support/server_discovery_and_monitoring.rb +3 -1
  227. data/spec/support/server_selection.rb +3 -1
  228. data/spec/support/shared/bulk_write.rb +192 -0
  229. data/spec/support/shared/server_selector.rb +21 -12
  230. metadata +147 -57
  231. metadata.gz.sig +0 -0
  232. data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
  233. data/lib/mongo/bulk_write/deletable.rb +0 -57
  234. data/lib/mongo/bulk_write/insertable.rb +0 -49
  235. data/lib/mongo/bulk_write/replacable.rb +0 -58
  236. data/lib/mongo/bulk_write/updatable.rb +0 -69
  237. data/lib/mongo/grid/fs.rb +0 -146
  238. data/lib/mongo/operation/list_collections/result.rb +0 -114
  239. data/lib/mongo/operation/list_indexes/result.rb +0 -118
  240. data/lib/mongo/operation/read/collections_info.rb +0 -68
  241. data/lib/mongo/operation/read/indexes.rb +0 -69
  242. data/lib/mongo/operation/read/list_collections.rb +0 -76
  243. data/lib/mongo/operation/read/list_indexes.rb +0 -78
  244. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  245. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  246. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  247. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  248. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  249. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  250. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -174
  251. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  252. data/spec/mongo/grid/fs_spec.rb +0 -160
  253. data/spec/mongo/loggable_spec.rb +0 -63
metadata.gz.sig CHANGED
Binary file
@@ -1,252 +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
- require 'mongo/bulk_write/insertable'
16
- require 'mongo/bulk_write/deletable'
17
- require 'mongo/bulk_write/updatable'
18
- require 'mongo/bulk_write/replacable'
19
-
20
- module Mongo
21
- module BulkWrite
22
-
23
- # Defines shared behaviour between ordered and unordered bulk operations.
24
- #
25
- # @since 2.0.0
26
- module BulkWritable
27
- include Insertable
28
- include Deletable
29
- include Updatable
30
- include Replacable
31
- extend Forwardable
32
-
33
- # Constant for number removed.
34
- #
35
- # @since 2.1.0
36
- REMOVED_COUNT = 'n_removed'.freeze
37
-
38
- # Constant for number inserted.
39
- #
40
- # @since 2.1.0
41
- INSERTED_COUNT = 'n_inserted'.freeze
42
-
43
- # Constant for inserted ids.
44
- #
45
- # @since 2.1.0
46
- INSERTED_IDS = 'inserted_ids'.freeze
47
-
48
- # Constant for number matched.
49
- #
50
- # @since 2.1.0
51
- MATCHED_COUNT = 'n_matched'.freeze
52
-
53
- # Constant for number modified.
54
- #
55
- # @since 2.1.0
56
- MODIFIED_COUNT = 'n_modified'.freeze
57
-
58
- # Constant for number upserted.
59
- #
60
- # @since 2.1.0
61
- UPSERTED_COUNT = 'n_upserted'.freeze
62
-
63
- # Constant for upserted ids.
64
- #
65
- # @since 2.1.0
66
- UPSERTED_IDS = 'upserted_ids'.freeze
67
-
68
- # Constant for indexes.
69
- #
70
- # @since 2.1.0
71
- INDEXES = 'indexes'.freeze
72
-
73
- # The fields contained in the result document returned from executing the
74
- # operations.
75
- #
76
- # @since 2.0.0.
77
- RESULT_FIELDS = [
78
- INSERTED_COUNT,
79
- REMOVED_COUNT,
80
- MODIFIED_COUNT,
81
- UPSERTED_COUNT,
82
- MATCHED_COUNT
83
- ].freeze
84
-
85
- # Delegate various methods to the collection.
86
- def_delegators :@collection, :database, :cluster, :next_primary
87
-
88
- # Initialize a bulk write object.
89
- #
90
- # @example Initialize a bulk write object.
91
- # Mongo::BulkWrite::OrderedBulkWrite.new(collection, operations, options)
92
- # Mongo::BulkWrite::UnorderedBulkWrite.new(collection, operations, options)
93
- #
94
- # @param [ Mongo::Collection ] collection The collection the operations will
95
- # be executed on.
96
- # @param [ Array<Hash> ] operations The operations to be executed.
97
- # @param [ Hash ] options The options.
98
- #
99
- # @option options [ Hash ] :write_concern The write concern to use for this
100
- # bulk write.
101
- #
102
- # @since 2.0.0
103
- def initialize(collection, operations, options)
104
- @collection = collection
105
- @operations = operations
106
- @options = options
107
- end
108
-
109
- # Execute the bulk operations.
110
- #
111
- # @example Execute the operations.
112
- # bulk.execute
113
- #
114
- # @return [ Hash ] The results from the bulk write.
115
- #
116
- # @since 2.0.0
117
- def execute
118
- server = next_primary
119
- validate_operations!
120
- operation_id = Monitoring.next_operation_id
121
- merged_ops.each do |op|
122
- validate_type!(op.keys.first)
123
- execute_op(op, server, operation_id)
124
- end
125
- finalize
126
- end
127
-
128
- private
129
-
130
- def valid_doc?(doc)
131
- doc.respond_to?(:keys) || doc.respond_to?(:document)
132
- end
133
-
134
- def write_concern
135
- @write_concern ||= @options[:write_concern] ?
136
- WriteConcern.get(@options[:write_concern]) :
137
- @collection.write_concern
138
- end
139
-
140
- def validate_operations!
141
- unless @operations && @operations.size > 0
142
- raise ArgumentError.new('Operations cannot be empty')
143
- end
144
- end
145
-
146
- def validate_type!(type)
147
- unless respond_to?(type, true)
148
- raise Error::InvalidBulkOperationType.new(type)
149
- end
150
- end
151
-
152
- def max_write_batches(op, server)
153
- type = op.keys.first
154
- ops = []
155
- while op[type].size > server.max_write_batch_size
156
- ops << {
157
- type => op[type].shift(server.max_write_batch_size),
158
- INDEXES => op[INDEXES].shift(server.max_write_batch_size)
159
- }
160
- end
161
- ops << op
162
- end
163
-
164
- def split(op, type)
165
- n = op[type].size/2
166
- [
167
- { type => op[type].shift(n), INDEXES => op[INDEXES].shift(n) },
168
- { type => op[type], INDEXES => op[INDEXES] }
169
- ]
170
- end
171
-
172
- def execute_op(operation, server, operation_id)
173
- ops = max_write_batches(operation, server)
174
-
175
- until ops.empty?
176
- op = ops.shift
177
- type = op.keys.first
178
- begin
179
- process(send(type, op, server, operation_id), op[INDEXES])
180
- rescue Error::MaxBSONSize, Error::MaxMessageSize => ex
181
- raise ex if op[type].size < 2
182
- ops = split(op, type) + ops
183
- end
184
- end
185
- end
186
-
187
- def merge_consecutive_ops(ops)
188
- ops.each_with_index.inject([]) do |merged, (op, i)|
189
- type = op.keys.first
190
- op[INDEXES] ||= [ i ]
191
- previous = merged.last
192
- if previous && previous.keys.first == type
193
- merged[-1].merge!(
194
- type => previous[type] << op[type],
195
- INDEXES => previous[INDEXES] + op[INDEXES]
196
- )
197
- merged
198
- else
199
- merged << { type => [ op[type] ].flatten, INDEXES => op[INDEXES] }
200
- end
201
- end
202
- end
203
-
204
- def merge_ops_by_type
205
- indexes = {}
206
- ops_hash = @operations.each_with_index.inject({}) do |merged, (op, i)|
207
- type = op.keys.first
208
- merged.merge!(op) { |type, v1, v2| ([v1] << v2).flatten }
209
- indexes[type] = (indexes[type] || []).push(i)
210
- merged
211
- end
212
- ops_hash.keys.reduce([]) do |ops_list, type|
213
- ops_list << { type => ops_hash[type], INDEXES => indexes[type] }
214
- end
215
- end
216
-
217
- def combine_results(result, indexes)
218
- @results ||= {}
219
- write_errors = result.aggregate_write_errors(indexes)
220
-
221
- # The Bulk API only returns the first write concern error encountered.
222
- @write_concern_errors ||= result.aggregate_write_concern_errors(indexes)
223
-
224
- @results.tap do |results|
225
- RESULT_FIELDS.each do |field|
226
- results.merge!(
227
- field => (results[field] || 0) + result.send(field)
228
- ) if result.respond_to?(field)
229
- end
230
-
231
- if result.respond_to?(INSERTED_IDS)
232
- results.merge!(INSERTED_IDS => result.inserted_ids)
233
- end
234
-
235
- if result.respond_to?(Operation::Write::BulkUpdate::Result::UPSERTED)
236
- results.merge!(UPSERTED_IDS => result.upserted.map{ |doc| doc['_id'] })
237
- end
238
-
239
- if write_errors
240
- results.merge!(
241
- Error::WRITE_ERRORS => ((results[Error::WRITE_ERRORS] || []) << write_errors).flatten
242
- )
243
- end
244
-
245
- if @write_concern_errors
246
- results.merge!(Error::WRITE_CONCERN_ERRORS => @write_concern_errors)
247
- end
248
- end
249
- end
250
- end
251
- end
252
- end
@@ -1,57 +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
- module BulkWrite
17
-
18
- # Defines behavior for validating and combining delete bulk write operations.
19
- #
20
- # @since 2.0.0.
21
- module Deletable
22
-
23
- private
24
-
25
- def validate_delete_op!(type, d)
26
- raise Error::InvalidBulkOperation.new(type, d) unless valid_doc?(d)
27
- end
28
-
29
- def deletes(ops, type)
30
- limit = (type == :delete_one) ? 1 : 0
31
- ops.collect do |d|
32
- validate_delete_op!(type, d)
33
- { q: d, limit: limit }
34
- end
35
- end
36
-
37
- def delete(ops, type, server, operation_id)
38
- Operation::Write::BulkDelete.new(
39
- :deletes => deletes(ops, type),
40
- :db_name => database.name,
41
- :coll_name => @collection.name,
42
- :write_concern => write_concern,
43
- :ordered => ordered?,
44
- :operation_id => operation_id
45
- ).execute(server.context)
46
- end
47
-
48
- def delete_one(op, server, operation_id)
49
- delete(op[:delete_one], __method__, server, operation_id)
50
- end
51
-
52
- def delete_many(op, server, operation_id)
53
- delete(op[:delete_many], __method__, server, operation_id)
54
- end
55
- end
56
- end
57
- end
@@ -1,49 +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
- module BulkWrite
17
-
18
- # Defines behavior for validating and combining insert bulk write operations.
19
- #
20
- # @since 2.0.0.
21
- module Insertable
22
-
23
- private
24
-
25
- def validate_insert_ops!(type, inserts)
26
- if inserts.empty?
27
- raise Error::InvalidBulkOperation.new(type, inserts)
28
- end
29
- inserts.each do |i|
30
- unless valid_doc?(i)
31
- raise Error::InvalidBulkOperation.new(type, i)
32
- end
33
- end
34
- end
35
-
36
- def insert_one(op, server, operation_id)
37
- validate_insert_ops!(__method__, op[:insert_one])
38
- Operation::Write::BulkInsert.new(
39
- :documents => op[:insert_one].flatten,
40
- :db_name => database.name,
41
- :coll_name => @collection.name,
42
- :write_concern => write_concern,
43
- :ordered => ordered?,
44
- :operation_id => operation_id
45
- ).execute(server.context)
46
- end
47
- end
48
- end
49
- end
@@ -1,58 +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
- module BulkWrite
17
-
18
- # Defines behavior for validating and combining replace bulk write operations.
19
- #
20
- # @since 2.0.0.
21
- module Replacable
22
-
23
- private
24
-
25
- def replacement_doc?(doc)
26
- doc.respond_to?(:keys) && doc.keys.all?{|key| key !~ /^\$/}
27
- end
28
-
29
- def validate_replace_op!(r, type)
30
- unless r[:find] && r[:replacement] && replacement_doc?(r[:replacement])
31
- raise Error::InvalidBulkOperation.new(type, r)
32
- end
33
- end
34
-
35
- def replace_ops(ops, type)
36
- ops.collect do |r|
37
- validate_replace_op!(r, type)
38
- { q: r[:find],
39
- u: r[:replacement],
40
- multi: false,
41
- upsert: r.fetch(:upsert, false)
42
- }
43
- end
44
- end
45
-
46
- def replace_one(op, server, operation_id)
47
- Operation::Write::BulkUpdate.new(
48
- :updates => replace_ops(op[:replace_one], __method__),
49
- :db_name => database.name,
50
- :coll_name => @collection.name,
51
- :write_concern => write_concern,
52
- :ordered => ordered?,
53
- :operation_id => operation_id
54
- ).execute(server.context)
55
- end
56
- end
57
- end
58
- end
@@ -1,69 +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
- module BulkWrite
17
-
18
- # Defines behavior for validating and combining update bulk write operations.
19
- #
20
- # @since 2.0.0.
21
- module Updatable
22
-
23
- private
24
-
25
- def update_doc?(doc)
26
- !doc.empty? &&
27
- doc.respond_to?(:keys) &&
28
- doc.keys.first.to_s =~ /^\$/
29
- end
30
-
31
- def validate_update_op!(type, u)
32
- unless u[:find] && u[:update] && update_doc?(u[:update])
33
- raise Error::InvalidBulkOperation.new(type, u)
34
- end
35
- end
36
-
37
- def updates(ops, type)
38
- multi = type == :update_many
39
- ops.collect do |u|
40
- validate_update_op!(type, u)
41
- { q: u[:find],
42
- u: u[:update],
43
- multi: multi,
44
- upsert: u.fetch(:upsert, false)
45
- }
46
- end
47
- end
48
-
49
- def update(ops, type, server, operation_id)
50
- Operation::Write::BulkUpdate.new(
51
- :updates => updates(ops, type),
52
- :db_name => database.name,
53
- :coll_name => @collection.name,
54
- :write_concern => write_concern,
55
- :ordered => ordered?,
56
- :operation_id => operation_id
57
- ).execute(server.context)
58
- end
59
-
60
- def update_one(op, server, operation_id)
61
- update(op[:update_one], __method__, server, operation_id)
62
- end
63
-
64
- def update_many(op, server, operation_id)
65
- update(op[:update_many], __method__, server, operation_id)
66
- end
67
- end
68
- end
69
- end