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
@@ -12,6 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ require 'mongo/bulk_write'
15
16
  require 'mongo/collection/view'
16
17
 
17
18
  module Mongo
@@ -22,6 +23,17 @@ module Mongo
22
23
  # @since 2.0.0
23
24
  class Collection
24
25
  extend Forwardable
26
+ include Retryable
27
+
28
+ # The capped option.
29
+ #
30
+ # @since 2.1.0
31
+ CAPPED = 'capped'.freeze
32
+
33
+ # The ns field constant.
34
+ #
35
+ # @since 2.1.0
36
+ NS = 'ns'.freeze
25
37
 
26
38
  # @return [ Mongo::Database ] The database the collection resides in.
27
39
  attr_reader :database
@@ -33,7 +45,7 @@ module Mongo
33
45
  attr_reader :options
34
46
 
35
47
  # Get client, cluster, read preference, and write concern from client.
36
- def_delegators :database, :client, :cluster, :read_preference, :write_concern
48
+ def_delegators :database, :client, :cluster
37
49
 
38
50
  # Delegate to the cluster for the next primary.
39
51
  def_delegators :cluster, :next_primary
@@ -41,6 +53,11 @@ module Mongo
41
53
  # Convenience delegators to find.
42
54
  def_delegators :find, :parallel_scan
43
55
 
56
+ # Options that can be updated on a new Collection instance via the #with method.
57
+ #
58
+ # @since 2.1.0
59
+ CHANGEABLE_OPTIONS = [ :read, :read_concern, :write ].freeze
60
+
44
61
  # Check if a collection is equal to another object. Will check the name and
45
62
  # the database for equality.
46
63
  #
@@ -74,6 +91,65 @@ module Mongo
74
91
  @options = options.freeze
75
92
  end
76
93
 
94
+ # Get the read concern for this collection instance.
95
+ #
96
+ # @example Get the read concern.
97
+ # collection.read_concern
98
+ #
99
+ # @return [ Hash ] The read concern.
100
+ #
101
+ # @since 2.2.0
102
+ def read_concern
103
+ @read_concern ||= options[:read_concern]
104
+ end
105
+
106
+ # Get the read preference on this collection.
107
+ #
108
+ # @example Get the read preference.
109
+ # collection.read_preference
110
+ #
111
+ # @return [ Mongo::ServerSelector ] The read preference.
112
+ #
113
+ # @since 2.0.0
114
+ def read_preference
115
+ @read_preference ||= options[:read] ? ServerSelector.get(client.options.merge(options[:read])) :
116
+ database.read_preference
117
+ end
118
+
119
+ # Get the write concern on this collection.
120
+ #
121
+ # @example Get the write concern.
122
+ # collection.write_concern
123
+ #
124
+ # @return [ Mongo::WriteConcern ] The write concern.
125
+ #
126
+ # @since 2.0.0
127
+ def write_concern
128
+ @write_concern ||= options[:write] ? WriteConcern.get(options[:write]) :
129
+ database.write_concern
130
+ end
131
+
132
+ # Provides a new collection with either a new read preference or new write concern
133
+ # merged over the existing read preference / write concern.
134
+ #
135
+ # @example Get a collection with changed read preference.
136
+ # collection.with(:read => { :mode => :primary_preferred })
137
+ #
138
+ # @example Get a collection with changed write concern.
139
+ # collection.with(:write => { w: 3 })
140
+
141
+ # @param [ Hash ] new_options The new options to use.
142
+ #
143
+ # @return [ Mongo::Collection ] A new collection instance.
144
+ #
145
+ # @since 2.1.0
146
+ def with(new_options)
147
+ new_options.keys.each do |k|
148
+ raise Error::UnchangeableCollectionOption.new(k) unless CHANGEABLE_OPTIONS.include?(k)
149
+ end
150
+ Collection.new(database, name, options.merge(new_options))
151
+ end
152
+
77
153
  # Is the collection capped?
78
154
  #
79
155
  # @example Is the collection capped?
@@ -83,7 +159,7 @@ module Mongo
83
159
  #
84
160
  # @since 2.0.0
85
161
  def capped?
86
- database.command(:collstats => name).documents[0]['capped']
162
+ database.command(:collstats => name).documents[0][CAPPED]
87
163
  end
88
164
 
89
165
  # Force the collection to be created in the database.
@@ -171,6 +247,8 @@ module Mongo
171
247
  # aggregation to run.
172
248
  # @option options [ true, false ] :use_cursor Indicates whether the command will request that the server
173
249
  # provide results using a cursor.
250
+ # @option options [ true, false ] :bypass_document_validation Whether or
251
+ # not to skip document level validation.
174
252
  #
175
253
  # @return [ Aggregation ] The aggregation object.
176
254
  #
@@ -256,13 +334,17 @@ module Mongo
256
334
  #
257
335
  # @since 2.0.0
258
336
  def insert_one(document, options = {})
259
- Operation::Write::Insert.new(
260
- :documents => [ document ],
261
- :db_name => database.name,
262
- :coll_name => name,
263
- :write_concern => write_concern,
264
- :options => options
265
- ).execute(next_primary.context)
337
+ write_with_retry do
338
+ Operation::Write::Insert.new(
339
+ :documents => [ document ],
340
+ :db_name => database.name,
341
+ :coll_name => name,
342
+ :write_concern => write_concern,
343
+ :bypass_document_validation => !!options[:bypass_document_validation],
344
+ :options => options,
345
+ :id_generator => client.options[:id_generator]
346
+ ).execute(next_primary.context)
347
+ end
266
348
  end
267
349
 
268
350
  # Insert the provided documents into the collection.
@@ -286,19 +368,21 @@ module Mongo
286
368
  # @example Execute a bulk write.
287
369
  # collection.bulk_write(operations, options)
288
370
  #
289
- # @param [ Array<Hash> ] operations The operations.
371
+ # @param [ Array<Hash> ] requests The bulk write requests.
290
372
  # @param [ Hash ] options The options.
291
373
  #
292
374
  # @option options [ true, false ] :ordered Whether the operations
293
375
  # should be executed in order.
294
376
  # @option options [ Hash ] :write_concern The write concern options.
295
377
  # Can be :w => Integer, :fsync => Boolean, :j => Boolean.
378
+ # @option options [ true, false ] :bypass_document_validation Whether or
379
+ # not to skip document level validation.
296
380
  #
297
381
  # @return [ BulkWrite::Result ] The result of the operation.
298
382
  #
299
383
  # @since 2.0.0
300
- def bulk_write(operations, options = {})
301
- BulkWrite.get(self, operations, options).execute
384
+ def bulk_write(requests, options = {})
385
+ BulkWrite.new(self, requests, options).execute
302
386
  end
303
387
 
304
388
  # Remove a document from the collection.
@@ -329,6 +413,24 @@ module Mongo
329
413
  find(filter).delete_many
330
414
  end
331
415
 
416
+ # Execute a parallel scan on the collection view.
417
+ #
418
+ # Returns a list of up to cursor_count cursors that can be iterated concurrently.
419
+ # As long as the collection is not modified during scanning, each document appears once
420
+ # in one of the cursors' result sets.
421
+ #
422
+ # @example Execute a parallel collection scan.
423
+ # collection.parallel_scan(2)
424
+ #
425
+ # @param [ Integer ] cursor_count The max number of cursors to return.
426
+ #
427
+ # @return [ Array<Cursor> ] An array of cursors.
428
+ #
429
+ # @since 2.1
430
+ def parallel_scan(cursor_count)
431
+ find.send(:parallel_scan, cursor_count)
432
+ end
433
+
332
434
  # Replaces a single document in the collection with the new document.
333
435
  #
334
436
  # @example Replace a single document.
@@ -340,6 +442,8 @@ module Mongo
340
442
  #
341
443
  # @option options [ true, false ] :upsert Whether to upsert if the
342
444
  # document doesn't exist.
445
+ # @option options [ true, false ] :bypass_document_validation Whether or
446
+ # not to skip document level validation.
343
447
  #
344
448
  # @return [ Result ] The response from the database.
345
449
  #
@@ -359,6 +463,8 @@ module Mongo
359
463
  #
360
464
  # @option options [ true, false ] :upsert Whether to upsert if the
361
465
  # document doesn't exist.
466
+ # @option options [ true, false ] :bypass_document_validation Whether or
467
+ # not to skip document level validation.
362
468
  #
363
469
  # @return [ Result ] The response from the database.
364
470
  #
@@ -378,6 +484,8 @@ module Mongo
378
484
  #
379
485
  # @option options [ true, false ] :upsert Whether to upsert if the
380
486
  # document doesn't exist.
487
+ # @option options [ true, false ] :bypass_document_validation Whether or
488
+ # not to skip document level validation.
381
489
  #
382
490
  # @return [ Result ] The response from the database.
383
491
  #
@@ -400,6 +508,8 @@ module Mongo
400
508
  # @option options [ Hash ] :projection The fields to include or exclude in the returned doc.
401
509
  # @option options [ Hash ] :sort The key and direction pairs by which the result set
402
510
  # will be sorted.
511
+ # @option options [ Hash ] :write_concern The write concern options.
512
+ # Defaults to the collection's write concern.
403
513
  #
404
514
  # @return [ BSON::Document, nil ] The document, if found.
405
515
  #
@@ -428,6 +538,10 @@ module Mongo
428
538
  # will be sorted.
429
539
  # @option options [ Symbol ] :return_document Either :before or :after.
430
540
  # @option options [ true, false ] :upsert Whether to upsert if the document doesn't exist.
541
+ # @option options [ true, false ] :bypass_document_validation Whether or
542
+ # not to skip document level validation.
543
+ # @option options [ Hash ] :write_concern The write concern options.
544
+ # Defaults to the collection's write concern.
431
545
  #
432
546
  # @return [ BSON::Document ] The document.
433
547
  #
@@ -456,6 +570,10 @@ module Mongo
456
570
  # will be sorted.
457
571
  # @option options [ Symbol ] :return_document Either :before or :after.
458
572
  # @option options [ true, false ] :upsert Whether to upsert if the document doesn't exist.
573
+ # @option options [ true, false ] :bypass_document_validation Whether or
574
+ # not to skip document level validation.
575
+ # @option options [ Hash ] :write_concern The write concern options.
576
+ # Defaults to the collection's write concern.
459
577
  #
460
578
  # @return [ BSON::Document ] The document.
461
579
  #
@@ -0,0 +1,71 @@
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 Cursor
17
+ module Builder
18
+
19
+ # Generates a specification for a get more command.
20
+ #
21
+ # @since 2.2.0
22
+ class GetMoreCommand
23
+ extend Forwardable
24
+
25
+ # @return [ Cursor ] cursor The cursor.
26
+ attr_reader :cursor
27
+
28
+ def_delegators :@cursor, :batch_size, :collection_name, :database, :view
29
+
30
+ # Create the new builder.
31
+ #
32
+ # @example Create the builder.
33
+ # GetMoreCommand.new(cursor)
34
+ #
35
+ # @param [ Cursor ] cursor The cursor.
36
+ #
37
+ # @since 2.2.0
38
+ def initialize(cursor)
39
+ @cursor = cursor
40
+ end
41
+
42
+ # Get the specification.
43
+ #
44
+ # @example Get the specification.
45
+ # get_more_command.specification
46
+ #
47
+ # @return [ Hash ] The spec.
48
+ #
49
+ # @since 2.2.0
50
+ def specification
51
+ { selector: get_more_command, db_name: database.name }
52
+ end
53
+
54
+ private
55
+
56
+ def get_more_command
57
+ command = { :getMore => cursor.id, :collection => collection_name }
58
+ command[:batchSize] = batch_size if batch_size
59
+ # If the max_await_time_ms option is set, then we set maxTimeMS on
60
+ # the get more command.
61
+ if view.respond_to?(:max_await_time_ms)
62
+ if view.max_await_time_ms && view.options[:await_data]
63
+ command[:maxTimeMS] = view.max_await_time_ms
64
+ end
65
+ end
66
+ command
67
+ end
68
+ end
69
+ end
70
+ end
71
+ 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 Cursor
17
+ module Builder
18
+
19
+ # Generates a specification for a kill cursors command.
20
+ #
21
+ # @since 2.2.0
22
+ class KillCursorsCommand
23
+ extend Forwardable
24
+
25
+ # @return [ Cursor ] cursor The cursor.
26
+ attr_reader :cursor
27
+
28
+ def_delegators :@cursor, :collection_name, :database
29
+
30
+ # Create the new builder.
31
+ #
32
+ # @example Create the builder.
33
+ # KillCursorsCommand.new(cursor)
34
+ #
35
+ # @param [ Cursor ] cursor The cursor.
36
+ #
37
+ # @since 2.2.0
38
+ def initialize(cursor)
39
+ @cursor = cursor
40
+ end
41
+
42
+ # Get the specification.
43
+ #
44
+ # @example Get the specification.
45
+ # kill_cursors_command.specification
46
+ #
47
+ # @return [ Hash ] The spec.
48
+ #
49
+ # @since 2.2.0
50
+ def specification
51
+ { selector: kill_cursors_command, db_name: database.name }
52
+ end
53
+
54
+ private
55
+
56
+ def kill_cursors_command
57
+ { :killCursors => collection_name, :cursors => [ cursor.id ] }
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,61 @@
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 Cursor
17
+ module Builder
18
+
19
+ # Encapsulates behaviour around generating an OP_GET_MORE specification.
20
+ #
21
+ # @since 2.2.0
22
+ class OpGetMore
23
+ extend Forwardable
24
+
25
+ # @return [ Cursor ] cursor The cursor.
26
+ attr_reader :cursor
27
+
28
+ def_delegators :@cursor, :collection_name, :database, :to_return
29
+
30
+ # Create the new builder.
31
+ #
32
+ # @example Create the builder.
33
+ # OpGetMore.new(cursor)
34
+ #
35
+ # @param [ Cursor ] cursor The cursor.
36
+ #
37
+ # @since 2.2.0
38
+ def initialize(cursor)
39
+ @cursor = cursor
40
+ end
41
+
42
+ # Get the specification.
43
+ #
44
+ # @example Get the specification.
45
+ # op_get_more.specification
46
+ #
47
+ # @return [ Hash ] The specification.
48
+ #
49
+ # @since 2.2.0
50
+ def specification
51
+ {
52
+ :to_return => to_return,
53
+ :cursor_id => cursor.id,
54
+ :db_name => database.name,
55
+ :coll_name => collection_name
56
+ }
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,56 @@
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 Cursor
17
+ module Builder
18
+
19
+ # Encapsulates behaviour around generating an OP_KILL_CURSORS specification.
20
+ #
21
+ # @since 2.2.0
22
+ class OpKillCursors
23
+ extend Forwardable
24
+
25
+ # @return [ Cursor ] cursor The cursor.
26
+ attr_reader :cursor
27
+
28
+ def_delegators :@cursor, :collection_name, :database
29
+
30
+ # Create the new builder.
31
+ #
32
+ # @example Create the builder.
33
+ # OpKillCursors.new(cursor)
34
+ #
35
+ # @param [ Cursor ] cursor The cursor.
36
+ #
37
+ # @since 2.2.0
38
+ def initialize(cursor)
39
+ @cursor = cursor
40
+ end
41
+
42
+ # Get the specification.
43
+ #
44
+ # @example Get the specification.
45
+ # op_kill_cursors.specification
46
+ #
47
+ # @return [ Hash ] The specification.
48
+ #
49
+ # @since 2.2.0
50
+ def specification
51
+ { :coll_name => collection_name, :db_name => database.name, :cursor_ids => [ cursor.id ] }
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,18 @@
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
+ require 'mongo/cursor/builder/op_get_more'
16
+ require 'mongo/cursor/builder/op_kill_cursors'
17
+ require 'mongo/cursor/builder/get_more_command'
18
+ require 'mongo/cursor/builder/kill_cursors_command'
data/lib/mongo/cursor.rb CHANGED
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ require 'mongo/cursor/builder'
16
+
15
17
  module Mongo
16
18
 
17
19
  # Client-side representation of an iterator over a query result set on
@@ -35,6 +37,9 @@ module Mongo
35
37
  def_delegators :@view, :collection, :limit
36
38
  def_delegators :collection, :client, :database
37
39
 
40
+ # @return [ Collection::View ] view The collection view.
41
+ attr_reader :view
42
+
38
43
  # Creates a +Cursor+ object.
39
44
  #
40
45
  # @example Instantiate the cursor.
@@ -82,12 +87,71 @@ module Mongo
82
87
  end
83
88
  end
84
89
 
85
- private
86
-
90
+ # Get the batch size.
91
+ #
92
+ # @example Get the batch size.
93
+ # cursor.batch_size
94
+ #
95
+ # @return [ Integer ] The batch size.
96
+ #
97
+ # @since 2.2.0
87
98
  def batch_size
88
99
  @view.batch_size && @view.batch_size > 0 ? @view.batch_size : limit
89
100
  end
90
101
 
102
+ # Is the cursor closed?
103
+ #
104
+ # @example Is the cursor closed?
105
+ # cursor.closed?
106
+ #
107
+ # @return [ true, false ] If the cursor is closed.
108
+ #
109
+ # @since 2.2.0
110
+ def closed?
111
+ !more?
112
+ end
113
+
114
+ # Get the parsed collection name.
115
+ #
116
+ # @example Get the parsed collection name.
117
+ # cursor.coll_name
118
+ #
119
+ # @return [ String ] The collection name.
120
+ #
121
+ # @since 2.2.0
122
+ def collection_name
123
+ @coll_name || collection.name
124
+ end
125
+
126
+ # Get the cursor id.
127
+ #
128
+ # @example Get the cursor id.
129
+ # cursor.id
130
+ #
131
+ # @note A cursor id of 0 means the cursor was closed on the server.
132
+ #
133
+ # @return [ Integer ] The cursor id.
134
+ #
135
+ # @since 2.2.0
136
+ def id
137
+ @cursor_id
138
+ end
139
+
140
+ # Get the number of documents to return. Used on 3.0 and lower server
141
+ # versions.
142
+ #
143
+ # @example Get the number to return.
144
+ # cursor.to_return
145
+ #
146
+ # @return [ Integer ] The number of documents to return.
147
+ #
148
+ # @since 2.2.0
149
+ def to_return
150
+ use_limit? ? @remaining : (batch_size || 0)
151
+ end
152
+
153
+ private
154
+
91
155
  def exhausted?
92
156
  limited? ? @remaining <= 0 : false
93
157
  end
@@ -97,16 +161,11 @@ module Mongo
97
161
  end
98
162
 
99
163
  def get_more_operation
100
- Operation::Read::GetMore.new(get_more_spec)
101
- end
102
-
103
- def get_more_spec
104
- {
105
- :to_return => to_return,
106
- :cursor_id => @cursor_id,
107
- :db_name => database.name,
108
- :coll_name => @coll_name || collection.name
109
- }
164
+ if @server.features.find_command_enabled?
165
+ Operation::Commands::GetMore.new(Builder::GetMoreCommand.new(self).specification)
166
+ else
167
+ Operation::Read::GetMore.new(Builder::OpGetMore.new(self).specification)
168
+ end
110
169
  end
111
170
 
112
171
  def kill_cursors
@@ -114,11 +173,11 @@ module Mongo
114
173
  end
115
174
 
116
175
  def kill_cursors_operation
117
- Operation::KillCursors.new(kill_cursors_spec)
118
- end
119
-
120
- def kill_cursors_spec
121
- { :cursor_ids => [ @cursor_id ]}
176
+ if @server.features.find_command_enabled?
177
+ Operation::Commands::Command.new(Builder::KillCursorsCommand.new(self).specification)
178
+ else
179
+ Operation::KillCursors.new(Builder::OpKillCursors.new(self).specification)
180
+ end
122
181
  end
123
182
 
124
183
  def limited?
@@ -136,10 +195,6 @@ module Mongo
136
195
  result.documents
137
196
  end
138
197
 
139
- def to_return
140
- use_limit? ? @remaining : (batch_size || 0)
141
- end
142
-
143
198
  def use_limit?
144
199
  limited? && batch_size >= @remaining
145
200
  end