mongo 2.1.0.beta → 2.2.0

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 (342) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +10 -3
  4. data/Rakefile +1 -7
  5. data/lib/mongo/address/ipv4.rb +6 -1
  6. data/lib/mongo/address/unix.rb +2 -2
  7. data/lib/mongo/address.rb +32 -10
  8. data/lib/mongo/auth/cr/conversation.rb +1 -1
  9. data/lib/mongo/auth/ldap/conversation.rb +7 -3
  10. data/lib/mongo/auth/scram/conversation.rb +9 -3
  11. data/lib/mongo/auth/user/view.rb +23 -2
  12. data/lib/mongo/auth/x509/conversation.rb +1 -1
  13. data/lib/mongo/bulk_write/combineable.rb +51 -0
  14. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  15. data/lib/mongo/bulk_write/result.rb +61 -8
  16. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  17. data/lib/mongo/bulk_write/transformable.rb +132 -0
  18. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  19. data/lib/mongo/bulk_write/validatable.rb +62 -0
  20. data/lib/mongo/bulk_write.rb +164 -23
  21. data/lib/mongo/client.rb +75 -18
  22. data/lib/mongo/cluster/topology/replica_set.rb +8 -6
  23. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  24. data/lib/mongo/cluster.rb +85 -5
  25. data/lib/mongo/collection/view/aggregation.rb +19 -45
  26. data/lib/mongo/collection/view/builder/aggregation.rb +98 -0
  27. data/lib/mongo/collection/view/builder/find_command.rb +111 -0
  28. data/lib/mongo/collection/view/builder/flags.rb +62 -0
  29. data/lib/mongo/collection/view/builder/map_reduce.rb +134 -0
  30. data/lib/mongo/collection/view/builder/modifiers.rb +80 -0
  31. data/lib/mongo/collection/view/builder/op_query.rb +83 -0
  32. data/lib/mongo/collection/view/builder.rb +20 -0
  33. data/lib/mongo/collection/view/explainable.rb +15 -0
  34. data/lib/mongo/collection/view/immutable.rb +4 -11
  35. data/lib/mongo/collection/view/iterable.rb +40 -5
  36. data/lib/mongo/collection/view/map_reduce.rb +67 -37
  37. data/lib/mongo/collection/view/readable.rb +114 -100
  38. data/lib/mongo/collection/view/writable.rb +46 -22
  39. data/lib/mongo/collection/view.rb +25 -22
  40. data/lib/mongo/collection.rb +130 -12
  41. data/lib/mongo/cursor/builder/get_more_command.rb +71 -0
  42. data/lib/mongo/cursor/builder/kill_cursors_command.rb +62 -0
  43. data/lib/mongo/cursor/builder/op_get_more.rb +61 -0
  44. data/lib/mongo/cursor/builder/op_kill_cursors.rb +56 -0
  45. data/lib/mongo/cursor/builder.rb +18 -0
  46. data/lib/mongo/cursor.rb +76 -21
  47. data/lib/mongo/database/view.rb +11 -6
  48. data/lib/mongo/database.rb +16 -6
  49. data/lib/mongo/dbref.rb +9 -9
  50. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
  51. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
  52. data/lib/mongo/error/file_not_found.rb +37 -0
  53. data/lib/mongo/error/invalid_file.rb +2 -2
  54. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  55. data/lib/mongo/error/invalid_uri.rb +5 -4
  56. data/lib/mongo/error/invalid_write_concern.rb +35 -0
  57. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  58. data/lib/mongo/error/operation_failure.rb +33 -2
  59. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  60. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  61. data/lib/mongo/error.rb +8 -0
  62. data/lib/mongo/grid/file/chunk.rb +9 -9
  63. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  64. data/lib/mongo/grid/file.rb +12 -9
  65. data/lib/mongo/grid/fs_bucket.rb +448 -0
  66. data/lib/mongo/grid/stream/read.rb +208 -0
  67. data/lib/mongo/grid/stream/write.rb +187 -0
  68. data/lib/mongo/grid/stream.rb +64 -0
  69. data/lib/mongo/grid.rb +2 -1
  70. data/lib/mongo/index/view.rb +7 -4
  71. data/lib/mongo/index.rb +5 -0
  72. data/lib/mongo/loggable.rb +34 -57
  73. data/lib/mongo/logger.rb +16 -78
  74. data/lib/mongo/monitoring/command_log_subscriber.rb +38 -14
  75. data/lib/mongo/monitoring/event/command_started.rb +2 -1
  76. data/lib/mongo/monitoring/event/command_succeeded.rb +24 -2
  77. data/lib/mongo/monitoring/event/secure.rb +58 -0
  78. data/lib/mongo/monitoring/event.rb +1 -0
  79. data/lib/mongo/monitoring/publishable.rb +22 -12
  80. data/lib/mongo/monitoring.rb +1 -5
  81. data/lib/mongo/operation/commands/aggregate/result.rb +89 -0
  82. data/lib/mongo/operation/commands/aggregate.rb +64 -0
  83. data/lib/mongo/operation/commands/collections_info/result.rb +41 -0
  84. data/lib/mongo/operation/{read → commands}/collections_info.rb +5 -3
  85. data/lib/mongo/operation/commands/command.rb +47 -0
  86. data/lib/mongo/operation/commands/find/result.rb +62 -0
  87. data/lib/mongo/operation/commands/find.rb +27 -0
  88. data/lib/mongo/operation/commands/get_more/result.rb +62 -0
  89. data/lib/mongo/operation/commands/get_more.rb +27 -0
  90. data/lib/mongo/operation/{read → commands}/indexes.rb +9 -6
  91. data/lib/mongo/operation/{list_collections → commands/list_collections}/result.rb +1 -21
  92. data/lib/mongo/operation/{read → commands}/list_collections.rb +4 -32
  93. data/lib/mongo/operation/{list_indexes → commands/list_indexes}/result.rb +1 -21
  94. data/lib/mongo/operation/{read → commands}/list_indexes.rb +3 -33
  95. data/lib/mongo/operation/commands/map_reduce/result.rb +119 -0
  96. data/lib/mongo/operation/commands/map_reduce.rb +49 -0
  97. data/lib/mongo/operation/commands/parallel_scan/result.rb +64 -0
  98. data/lib/mongo/operation/commands/parallel_scan.rb +52 -0
  99. data/lib/mongo/operation/commands/user_query.rb +71 -0
  100. data/lib/mongo/operation/commands/users_info/result.rb +38 -0
  101. data/lib/mongo/operation/commands/users_info.rb +48 -0
  102. data/lib/mongo/operation/commands.rb +26 -0
  103. data/lib/mongo/operation/executable.rb +4 -68
  104. data/lib/mongo/operation/kill_cursors.rb +3 -3
  105. data/lib/mongo/operation/object_id_generator.rb +36 -0
  106. data/lib/mongo/operation/read/get_more.rb +2 -22
  107. data/lib/mongo/operation/read/query/result.rb +40 -0
  108. data/lib/mongo/operation/read/query.rb +4 -21
  109. data/lib/mongo/operation/read.rb +0 -4
  110. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  111. data/lib/mongo/operation/result.rb +43 -1
  112. data/lib/mongo/operation/specifiable.rb +59 -1
  113. data/lib/mongo/operation/write/bulk/bulkable.rb +83 -0
  114. data/lib/mongo/operation/write/bulk/delete/result.rb +67 -0
  115. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  116. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  117. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  118. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  119. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  120. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  121. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  122. data/lib/mongo/operation/write/bulk.rb +6 -3
  123. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  124. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  125. data/lib/mongo/operation/write/command/delete.rb +3 -3
  126. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  127. data/lib/mongo/operation/write/command/insert.rb +4 -3
  128. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  129. data/lib/mongo/operation/write/command/update.rb +6 -4
  130. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  131. data/lib/mongo/operation/write/command/writable.rb +13 -18
  132. data/lib/mongo/operation/write/create_index.rb +4 -27
  133. data/lib/mongo/operation/write/create_user.rb +4 -30
  134. data/lib/mongo/operation/write/delete.rb +6 -29
  135. data/lib/mongo/operation/write/drop_index.rb +3 -3
  136. data/lib/mongo/operation/write/gle.rb +49 -0
  137. data/lib/mongo/operation/write/idable.rb +24 -2
  138. data/lib/mongo/operation/write/insert.rb +2 -24
  139. data/lib/mongo/operation/write/remove_user.rb +4 -27
  140. data/lib/mongo/operation/write/update.rb +13 -36
  141. data/lib/mongo/operation/write/update_user.rb +4 -30
  142. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  143. data/lib/mongo/operation/write.rb +2 -0
  144. data/lib/mongo/operation.rb +33 -5
  145. data/lib/mongo/options/mapper.rb +26 -2
  146. data/lib/mongo/options/redacted.rb +156 -0
  147. data/lib/mongo/options.rb +1 -0
  148. data/lib/mongo/protocol/bit_vector.rb +11 -9
  149. data/lib/mongo/protocol/delete.rb +78 -3
  150. data/lib/mongo/protocol/get_more.rb +59 -2
  151. data/lib/mongo/protocol/insert.rb +73 -1
  152. data/lib/mongo/protocol/kill_cursors.rb +66 -4
  153. data/lib/mongo/protocol/message.rb +44 -20
  154. data/lib/mongo/protocol/query.rb +153 -65
  155. data/lib/mongo/protocol/reply.rb +92 -1
  156. data/lib/mongo/protocol/serializers.rb +49 -40
  157. data/lib/mongo/protocol/update.rb +93 -1
  158. data/lib/mongo/retryable.rb +101 -0
  159. data/lib/mongo/server/connectable.rb +28 -8
  160. data/lib/mongo/server/connection.rb +52 -10
  161. data/lib/mongo/server/connection_pool/queue.rb +15 -0
  162. data/lib/mongo/server/connection_pool.rb +12 -15
  163. data/lib/mongo/server/description/features.rb +4 -2
  164. data/lib/mongo/server/description.rb +39 -3
  165. data/lib/mongo/server/monitor/connection.rb +49 -28
  166. data/lib/mongo/server/monitor.rb +3 -14
  167. data/lib/mongo/server.rb +31 -4
  168. data/lib/mongo/server_selector/selectable.rb +58 -32
  169. data/lib/mongo/server_selector.rb +19 -10
  170. data/lib/mongo/socket/ssl.rb +4 -1
  171. data/lib/mongo/socket/tcp.rb +2 -2
  172. data/lib/mongo/socket/unix.rb +5 -8
  173. data/lib/mongo/socket.rb +11 -4
  174. data/lib/mongo/uri.rb +245 -139
  175. data/lib/mongo/version.rb +1 -1
  176. data/lib/mongo/write_concern.rb +21 -6
  177. data/lib/mongo.rb +4 -4
  178. data/mongo.gemspec +1 -2
  179. data/spec/mongo/address/unix_spec.rb +1 -1
  180. data/spec/mongo/address_spec.rb +25 -0
  181. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  182. data/spec/mongo/auth/user/view_spec.rb +26 -1
  183. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +284 -0
  184. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  185. data/spec/mongo/bulk_write_spec.rb +385 -161
  186. data/spec/mongo/client_spec.rb +193 -23
  187. data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
  188. data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
  189. data/spec/mongo/collection/view/builder/find_command_spec.rb +167 -0
  190. data/spec/mongo/collection/view/builder/flags_spec.rb +106 -0
  191. data/spec/mongo/collection/view/builder/modifiers_spec.rb +210 -0
  192. data/spec/mongo/collection/view/builder/op_query_spec.rb +154 -0
  193. data/spec/mongo/collection/view/explainable_spec.rb +1 -2
  194. data/spec/mongo/collection/view/immutable_spec.rb +54 -0
  195. data/spec/mongo/collection/view/map_reduce_spec.rb +104 -9
  196. data/spec/mongo/collection/view/readable_spec.rb +109 -112
  197. data/spec/mongo/collection/view_spec.rb +119 -487
  198. data/spec/mongo/collection_spec.rb +1002 -33
  199. data/spec/mongo/command_monitoring_spec.rb +64 -0
  200. data/spec/mongo/connection_string_spec.rb +115 -0
  201. data/spec/mongo/cursor/builder/get_more_command_spec.rb +160 -0
  202. data/spec/mongo/cursor/builder/op_get_more_spec.rb +52 -0
  203. data/spec/mongo/cursor_spec.rb +10 -60
  204. data/spec/mongo/database_spec.rb +81 -12
  205. data/spec/mongo/dbref_spec.rb +4 -4
  206. data/spec/mongo/grid/file/chunk_spec.rb +6 -6
  207. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  208. data/spec/mongo/grid/file_spec.rb +8 -8
  209. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  210. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  211. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  212. data/spec/mongo/grid/stream_spec.rb +48 -0
  213. data/spec/mongo/gridfs_spec.rb +50 -0
  214. data/spec/mongo/index/view_spec.rb +41 -0
  215. data/spec/mongo/logger_spec.rb +0 -40
  216. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  217. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
  218. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
  219. data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
  220. data/spec/mongo/operation/{aggregate → commands/aggregate}/result_spec.rb +1 -1
  221. data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
  222. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  223. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +1 -19
  224. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  225. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
  226. data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
  227. data/spec/mongo/operation/read/get_more_spec.rb +0 -16
  228. data/spec/mongo/operation/read/query_spec.rb +19 -16
  229. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  230. data/spec/mongo/operation/result_spec.rb +19 -0
  231. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +17 -28
  232. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
  233. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +7 -18
  234. data/spec/mongo/operation/write/command/delete_spec.rb +18 -9
  235. data/spec/mongo/operation/write/command/insert_spec.rb +18 -9
  236. data/spec/mongo/operation/write/command/update_spec.rb +18 -9
  237. data/spec/mongo/operation/write/delete_spec.rb +3 -3
  238. data/spec/mongo/operation/write/insert_spec.rb +0 -11
  239. data/spec/mongo/operation/write/update_spec.rb +6 -6
  240. data/spec/mongo/options/redacted_spec.rb +350 -0
  241. data/spec/mongo/protocol/delete_spec.rb +4 -4
  242. data/spec/mongo/protocol/get_more_spec.rb +4 -4
  243. data/spec/mongo/protocol/insert_spec.rb +3 -3
  244. data/spec/mongo/protocol/kill_cursors_spec.rb +8 -6
  245. data/spec/mongo/protocol/query_spec.rb +21 -7
  246. data/spec/mongo/protocol/update_spec.rb +5 -5
  247. data/spec/mongo/retryable_spec.rb +221 -0
  248. data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
  249. data/spec/mongo/server/connection_pool_spec.rb +42 -6
  250. data/spec/mongo/server/connection_spec.rb +86 -1
  251. data/spec/mongo/server/description/features_spec.rb +25 -0
  252. data/spec/mongo/server/description_spec.rb +42 -0
  253. data/spec/mongo/server/monitor_spec.rb +44 -0
  254. data/spec/mongo/server_discovery_and_monitoring_spec.rb +25 -59
  255. data/spec/mongo/server_selection_rtt_spec.rb +37 -57
  256. data/spec/mongo/server_selection_spec.rb +5 -3
  257. data/spec/mongo/server_selector/nearest_spec.rb +35 -27
  258. data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
  259. data/spec/mongo/server_selector/primary_spec.rb +21 -14
  260. data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
  261. data/spec/mongo/server_selector/secondary_spec.rb +24 -22
  262. data/spec/mongo/server_selector_spec.rb +87 -24
  263. data/spec/mongo/server_spec.rb +78 -15
  264. data/spec/mongo/socket/ssl_spec.rb +101 -57
  265. data/spec/mongo/socket/unix_spec.rb +52 -0
  266. data/spec/mongo/uri_spec.rb +271 -59
  267. data/spec/mongo/write_concern_spec.rb +126 -0
  268. data/spec/spec_helper.rb +29 -23
  269. data/spec/support/authorization.rb +4 -5
  270. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  271. data/spec/support/command_monitoring/command.yml +42 -0
  272. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  273. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  274. data/spec/support/command_monitoring/find.yml +268 -0
  275. data/spec/support/command_monitoring/insertMany.yml +81 -0
  276. data/spec/support/command_monitoring/insertOne.yml +51 -0
  277. data/spec/support/command_monitoring/updateMany.yml +67 -0
  278. data/spec/support/command_monitoring/updateOne.yml +95 -0
  279. data/spec/support/command_monitoring.rb +373 -0
  280. data/spec/support/connection_string.rb +228 -0
  281. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  282. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  283. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  284. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  285. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  286. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  287. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  288. data/spec/support/crud/read.rb +14 -10
  289. data/spec/support/crud/write.rb +36 -9
  290. data/spec/support/crud.rb +10 -2
  291. data/spec/support/gridfs.rb +637 -0
  292. data/spec/support/gridfs_tests/delete.yml +157 -0
  293. data/spec/support/gridfs_tests/download.yml +210 -0
  294. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  295. data/spec/support/gridfs_tests/upload.yml +158 -0
  296. data/spec/support/matchers.rb +2 -2
  297. data/spec/support/sdam/rs/equal_electionids.yml +1 -2
  298. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
  299. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  300. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  301. data/spec/support/sdam/rs/rsother_discovered.yml +24 -3
  302. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  303. data/spec/support/sdam/rs/stepdown_change_set_name.yml +59 -0
  304. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  305. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  306. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  307. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  308. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  309. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  310. data/spec/support/server_discovery_and_monitoring.rb +3 -1
  311. data/spec/support/server_selection.rb +3 -1
  312. data/spec/support/shared/bulk_write.rb +192 -0
  313. data/spec/support/shared/protocol.rb +5 -5
  314. data/spec/support/shared/server_selector.rb +78 -13
  315. data/spec/support/travis.rb +1 -1
  316. data.tar.gz.sig +0 -0
  317. metadata +211 -72
  318. metadata.gz.sig +0 -0
  319. data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
  320. data/lib/mongo/bulk_write/deletable.rb +0 -57
  321. data/lib/mongo/bulk_write/insertable.rb +0 -49
  322. data/lib/mongo/bulk_write/replacable.rb +0 -58
  323. data/lib/mongo/bulk_write/updatable.rb +0 -69
  324. data/lib/mongo/grid/fs.rb +0 -146
  325. data/lib/mongo/operation/aggregate/result.rb +0 -103
  326. data/lib/mongo/operation/aggregate.rb +0 -108
  327. data/lib/mongo/operation/command.rb +0 -61
  328. data/lib/mongo/operation/map_reduce/result.rb +0 -122
  329. data/lib/mongo/operation/map_reduce.rb +0 -95
  330. data/lib/mongo/operation/parallel_scan/result.rb +0 -72
  331. data/lib/mongo/operation/parallel_scan.rb +0 -76
  332. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  333. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  334. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  335. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  336. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  337. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -174
  338. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  339. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  340. data/spec/mongo/grid/fs_spec.rb +0 -160
  341. data/spec/mongo/loggable_spec.rb +0 -63
  342. data/spec/mongo/operation/aggregate_spec.rb +0 -127
@@ -1,174 +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/operation/write/bulk/bulk_mergable'
16
- require 'mongo/operation/write/bulk/legacy_bulk_mergable'
17
-
18
- module Mongo
19
- module Operation
20
- module Write
21
- class BulkUpdate
22
-
23
- # Defines custom behaviour of results when updating.
24
- #
25
- # @since 2.0.0
26
- class Result < Operation::Result
27
- include BulkMergable
28
-
29
- # The number of modified docs field in the result.
30
- #
31
- # @since 2.0.0
32
- MODIFIED = 'nModified'.freeze
33
-
34
- # The upserted docs field in the result.
35
- #
36
- # @since 2.0.0
37
- UPSERTED = 'upserted'.freeze
38
-
39
- # Gets the number of documents upserted.
40
- #
41
- # @example Get the upserted count.
42
- # result.n_upserted
43
- #
44
- # @return [ Integer ] The number of documents upserted.
45
- #
46
- # @since 2.0.0
47
- def n_upserted
48
- return 0 unless acknowledged?
49
- @replies.reduce(0) do |n, reply|
50
- if upsert?(reply)
51
- n += 1
52
- else
53
- n += 0
54
- end
55
- end
56
- end
57
-
58
- # Gets the number of documents matched.
59
- #
60
- # @example Get the matched count.
61
- # result.n_matched
62
- #
63
- # @return [ Integer ] The number of documents matched.
64
- #
65
- # @since 2.0.0
66
- def n_matched
67
- return 0 unless acknowledged?
68
- @replies.reduce(0) do |n, reply|
69
- if upsert?(reply)
70
- n += 0
71
- else
72
- n += reply.documents.first[N]
73
- end
74
- end
75
- end
76
-
77
- # Gets the number of documents modified.
78
- #
79
- # @example Get the modified count.
80
- # result.n_modified
81
- #
82
- # @return [ Integer ] The number of documents modified.
83
- #
84
- # @since 2.0.0
85
- def n_modified
86
- return 0 unless acknowledged?
87
- @replies.reduce(0) do |n, reply|
88
- n += reply.documents.first[MODIFIED] || 0
89
- end
90
- end
91
-
92
- # Get the upserted documents.
93
- #
94
- # @example Get upserted documents.
95
- # result.upserted
96
- #
97
- # @return [ Array<BSON::Document> ] The upserted document info
98
- #
99
- # @since 2.1.0
100
- def upserted
101
- reply.documents.first[UPSERTED] || []
102
- end
103
-
104
- private
105
-
106
- def upsert?(reply)
107
- upserted.any?
108
- end
109
- end
110
-
111
- # Defines custom behaviour of results when updating.
112
- # For server versions < 2.5.5 (that don't use write commands).
113
- #
114
- # @since 2.0.0
115
- class LegacyResult < Operation::Result
116
- include LegacyBulkMergable
117
-
118
- # The updated existing field in the result.
119
- #
120
- # @since 2.0.0
121
- UPDATED_EXISTING = 'updatedExisting'.freeze
122
-
123
- # Gets the number of documents upserted.
124
- #
125
- # @example Get the upserted count.
126
- # result.n_upserted
127
- #
128
- # @return [ Integer ] The number of documents upserted.
129
- #
130
- # @since 2.0.0
131
- def n_upserted
132
- return 0 unless acknowledged?
133
- @replies.reduce(0) do |n, reply|
134
- if upsert?(reply)
135
- n += reply.documents.first[N]
136
- else
137
- n
138
- end
139
- end
140
- end
141
-
142
- # Gets the number of documents matched.
143
- #
144
- # @example Get the matched count.
145
- # result.n_matched
146
- #
147
- # @return [ Integer ] The number of documents matched.
148
- #
149
- # @since 2.0.0
150
- def n_matched
151
- return 0 unless acknowledged?
152
- @replies.reduce(0) do |n, reply|
153
- if upsert?(reply)
154
- n
155
- else
156
- n += reply.documents.first[N]
157
- end
158
- end
159
- end
160
-
161
- private
162
-
163
- def upsert?(reply)
164
- !updated_existing?(reply) && reply.documents.first[N] == 1
165
- end
166
-
167
- def updated_existing?(reply)
168
- reply.documents.first[UPDATED_EXISTING]
169
- end
170
- end
171
- end
172
- end
173
- end
174
- end
@@ -1,154 +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/operation/write/bulk/bulk_update/result'
16
-
17
- module Mongo
18
- module Operation
19
- module Write
20
-
21
- # A MongoDB bulk update operation.
22
- #
23
- # @note If the server version is >= 2.5.5, a write command operation
24
- # will be created and sent instead.
25
- #
26
- # @example Create the update operation.
27
- # Write::BulkUpdate.new({
28
- # :updates => [
29
- # {
30
- # :q => { :foo => 1 },
31
- # :u => { :$set => { :bar => 1 }},
32
- # :multi => true,
33
- # :upsert => false
34
- # }
35
- # ],
36
- # :db_name => 'test',
37
- # :coll_name => 'test_coll',
38
- # :write_concern => write_concern,
39
- # :ordered => false
40
- # })
41
- #
42
- # Initialization:
43
- # param [ Hash ] spec The specifications for the update.
44
- #
45
- # option spec :updates [ Array ] The update documents.
46
- # option spec :db_name [ String ] The name of the database on which
47
- # the query should be run.
48
- # option spec :coll_name [ String ] The name of the collection on which
49
- # the query should be run.
50
- # option spec :write_concern [ Mongo::WriteConcern ] The write concern.
51
- # option spec :ordered [ true, false ] Whether the operations should be
52
- # executed in order.
53
- # option spec :options [ Hash ] Options for the command, if it ends up being a
54
- # write command.
55
- #
56
- # @since 2.0.0
57
- class BulkUpdate
58
- include Executable
59
- include Specifiable
60
-
61
- # Execute the update operation.
62
- #
63
- # @example Execute the operation.
64
- # operation.execute(context)
65
- #
66
- # @param [ Mongo::Server::Context ] context The context for this operation.
67
- #
68
- # @return [ Result ] The operation result.
69
- #
70
- # @since 2.0.0
71
- def execute(context)
72
- if context.features.write_command_enabled?
73
- execute_write_command(context)
74
- else
75
- execute_message(context)
76
- end
77
- end
78
-
79
- # Set the write concern on this operation.
80
- #
81
- # @example Set a write concern.
82
- # new_op = operation.write_concern(:w => 2)
83
- #
84
- # @param [ Hash ] wc The write concern.
85
- #
86
- # @since 2.0.0
87
- def write_concern(wc = nil)
88
- if wc
89
- self.class.new(spec.merge(write_concern: WriteConcern.get(wc)))
90
- else
91
- spec[WRITE_CONCERN]
92
- end
93
- end
94
-
95
- private
96
-
97
- def execute_write_command(context)
98
- Result.new(Command::Update.new(spec).execute(context))
99
- end
100
-
101
- def execute_message(context)
102
- replies = messages.map do |m|
103
- context.with_connection do |connection|
104
- result = LegacyResult.new(connection.dispatch([ m, gle ].compact, operation_id))
105
- if stop_sending?(result)
106
- return result
107
- else
108
- result.reply
109
- end
110
- end
111
- end
112
- LegacyResult.new(replies.compact.empty? ? nil : replies)
113
- end
114
-
115
- def stop_sending?(result)
116
- ordered? && !result.successful?
117
- end
118
-
119
- # @todo put this somewhere else
120
- def ordered?
121
- @spec.fetch(:ordered, true)
122
- end
123
-
124
- def gle
125
- gle_message = ( ordered? && write_concern.get_last_error.nil? ) ?
126
- Mongo::WriteConcern.get(:w => 1).get_last_error :
127
- write_concern.get_last_error
128
- if gle_message
129
- Protocol::Query.new(
130
- db_name,
131
- Database::COMMAND,
132
- gle_message,
133
- options.merge(limit: -1)
134
- )
135
- end
136
- end
137
-
138
- def initialize_copy(original)
139
- @spec = original.spec.dup
140
- @spec[UPDATES] = original.spec[UPDATES].dup
141
- end
142
-
143
- def messages
144
- updates.collect do |u|
145
- opts = { :flags => [] }
146
- opts[:flags] << :multi_update if !!u[:multi]
147
- opts[:flags] << :upsert if !!u[:upsert]
148
- Protocol::Update.new(db_name, coll_name, u[:q], u[:u], opts)
149
- end
150
- end
151
- end
152
- end
153
- end
154
- end
@@ -1,83 +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 Operation
17
- module Write
18
-
19
- module LegacyBulkMergable
20
-
21
- # Aggregate the write errors returned from this result.
22
- #
23
- # @example Aggregate the write errors.
24
- # result.aggregate_write_errors([0, 1, 2, 3])
25
- #
26
- # @param [ Array ] indexes The indexes of each operation as they
27
- # were listed in the Bulk API.
28
- #
29
- # @return [ Array ] The aggregate write errors.
30
- #
31
- # @since 2.0.0
32
- def aggregate_write_errors(indexes)
33
- @replies.each_with_index.reduce(nil) do |errors, (reply, i)|
34
- if reply_write_errors?(reply)
35
- errors ||= []
36
- errors << { 'errmsg' => reply.documents.first[Error::ERROR],
37
- 'index' => indexes[i],
38
- 'code' => reply.documents.first[Error::CODE] }
39
- end
40
- errors
41
- end
42
- end
43
-
44
- # Aggregate the write concern errors returned from this result.
45
- #
46
- # @example Aggregate the write concern errors.
47
- # result.aggregate_write_concern_errors([0, 1, 2, 3])
48
- #
49
- # @param [ Array ] indexes The indexes of each operation as they
50
- # were listed in the Bulk API.
51
- #
52
- # @return [ Array ] The aggregate write concern errors.
53
- #
54
- # @since 2.0.0
55
- def aggregate_write_concern_errors(indexes)
56
- @replies.each_with_index.reduce(nil) do |errors, (reply, i)|
57
- if error = reply_write_errors?(reply)
58
- errors ||= []
59
- if note = reply.documents.first['wnote'] || reply.documents.first['jnote']
60
- code = reply.documents.first['code'] || Error::BAD_VALUE
61
- error_string = "#{code}: #{note}"
62
- elsif error == 'timeout'
63
- code = reply.documents.first['code'] || Error::UNKNOWN_ERROR
64
- error_string = "#{code}: #{error}"
65
- end
66
- errors << { 'errmsg' => error_string,
67
- 'index' => indexes[i],
68
- 'code' => code } if error_string
69
- end
70
- errors
71
- end
72
- end
73
-
74
- private
75
-
76
- def reply_write_errors?(reply)
77
- reply.documents.first[Error::ERROR] ||
78
- reply.documents.first[Error::ERRMSG]
79
- end
80
- end
81
- end
82
- end
83
- end
@@ -1,160 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Mongo::Grid::FS do
4
-
5
- describe '#initialize' do
6
-
7
- let(:fs) do
8
- described_class.new(authorized_client.database)
9
- end
10
-
11
- let(:index) do
12
- fs.chunks_collection.indexes.get(:files_id => 1, :n => 1)
13
- end
14
-
15
- it 'sets the files collection' do
16
- expect(fs.files_collection.name).to eq('fs.files')
17
- end
18
-
19
- it 'sets the chunks collection' do
20
- expect(fs.chunks_collection.name).to eq('fs.chunks')
21
- end
22
-
23
- it 'creates the index on the chunks collection' do
24
- expect(index[:name]).to eq('files_id_1_n_1')
25
- end
26
- end
27
-
28
- describe '#find_one' do
29
-
30
- let(:fs) do
31
- described_class.new(authorized_client.database)
32
- end
33
-
34
- let(:file) do
35
- Mongo::Grid::File.new('hello world!', :filename => 'test.txt')
36
- end
37
-
38
- before do
39
- fs.insert_one(file)
40
- end
41
-
42
- after do
43
- fs.files_collection.find.delete_many
44
- fs.chunks_collection.find.delete_many
45
- end
46
-
47
- let(:from_db) do
48
- fs.find_one(:filename => 'test.txt')
49
- end
50
-
51
- it 'returns the assembled file from the db' do
52
- expect(from_db.filename).to eq(file.metadata.filename)
53
- end
54
- end
55
-
56
- describe '#insert_one' do
57
-
58
- let(:fs) do
59
- described_class.new(authorized_client.database)
60
- end
61
-
62
- let(:file) do
63
- Mongo::Grid::File.new('Hello!', :filename => 'test.txt')
64
- end
65
-
66
- context 'when inserting the file once' do
67
-
68
- let!(:result) do
69
- fs.insert_one(file)
70
- end
71
-
72
- after do
73
- fs.files_collection.find.delete_many
74
- fs.chunks_collection.find.delete_many
75
- end
76
-
77
- let(:from_db) do
78
- fs.find_one(:filename => 'test.txt')
79
- end
80
-
81
- it 'inserts the file into the database' do
82
- expect(from_db.filename).to eq(file.metadata.filename)
83
- end
84
-
85
- it 'includes the chunks and data with the file' do
86
- expect(from_db.data).to eq('Hello!')
87
- end
88
-
89
- it 'returns the file id' do
90
- expect(result).to eq(file.id)
91
- end
92
- end
93
-
94
- context 'when inserting the file more than once' do
95
-
96
- after do
97
- fs.files_collection.find.delete_many
98
- fs.chunks_collection.find.delete_many
99
- end
100
-
101
- it 'raises an error' do
102
- expect {
103
- fs.insert_one(file)
104
- fs.insert_one(file)
105
- }.to raise_error(Mongo::Error::OperationFailure)
106
- end
107
- end
108
-
109
- context 'when the file exceeds the max bson size' do
110
-
111
- let(:fs) do
112
- described_class.new(authorized_client.database)
113
- end
114
-
115
- let(:file) do
116
- str = 'y' * 16777216
117
- Mongo::Grid::File.new(str, :filename => 'large-file.txt')
118
- end
119
-
120
- before do
121
- fs.insert_one(file)
122
- end
123
-
124
- after do
125
- fs.files_collection.find.delete_many
126
- fs.chunks_collection.find.delete_many
127
- end
128
-
129
- it 'successfully inserts the file' do
130
- expect(
131
- fs.find_one(:filename => 'large-file.txt').chunks
132
- ).to eq(file.chunks)
133
- end
134
- end
135
- end
136
-
137
- describe '#delete_one' do
138
-
139
- let(:fs) do
140
- described_class.new(authorized_client.database)
141
- end
142
-
143
- let(:file) do
144
- Mongo::Grid::File.new('Hello!', :filename => 'test.txt')
145
- end
146
-
147
- before do
148
- fs.insert_one(file)
149
- fs.delete_one(file)
150
- end
151
-
152
- let(:from_db) do
153
- fs.find_one(:filename => 'test.txt')
154
- end
155
-
156
- it 'removes the file from the db' do
157
- expect(from_db).to be_nil
158
- end
159
- end
160
- end
@@ -1,63 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Mongo::Loggable do
4
-
5
- let(:operation) do
6
- Class.new do
7
- def log_message
8
- 'test'
9
- end
10
- end.new
11
- end
12
-
13
- describe '#log' do
14
-
15
- let(:loggable) do
16
- Class.new do
17
- include Mongo::Loggable
18
- end.new
19
- end
20
-
21
- let(:operation) do
22
- double('operation')
23
- end
24
-
25
- before do
26
- Mongo::Logger.level = Logger::DEBUG
27
- expect(operation).to receive(:log_message).and_return('test')
28
- expect(Mongo::Logger).to receive(:log).with(:debug, 'MONGO', 'test', anything())
29
- end
30
-
31
- context 'when a block is provided' do
32
-
33
- context 'when an exception occurs' do
34
-
35
- it 'logs the message' do
36
- expect {
37
- loggable.log(:debug, 'MONGO', [ operation ]) do
38
- raise RuntimeError
39
- end
40
- }.to raise_error(RuntimeError)
41
- end
42
- end
43
-
44
- context 'when no exception occurs' do
45
-
46
- it 'executes the block and logs the message' do
47
- expect(
48
- loggable.log(:debug, 'MONGO', [ operation ]) do
49
- 'testing'
50
- end
51
- ).to eq('testing')
52
- end
53
- end
54
- end
55
-
56
- context 'when no block is provided' do
57
-
58
- it 'logs the message' do
59
- expect(loggable.log(:debug, 'MONGO', [ operation ])).to be_nil
60
- end
61
- end
62
- end
63
- end