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
@@ -0,0 +1,80 @@
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 Collection
17
+ class View
18
+ module Builder
19
+
20
+ # Provides behaviour for mapping modifiers.
21
+ #
22
+ # @since 2.2.0
23
+ module Modifiers
24
+ extend self
25
+
26
+ # Mappings from driver options to legacy server values.
27
+ #
28
+ # @since 2.2.0
29
+ DRIVER_MAPPINGS = BSON::Document.new(
30
+ sort: '$orderby',
31
+ hint: '$hint',
32
+ comment: '$comment',
33
+ snapshot: '$snapshot',
34
+ max_scan: '$maxScan',
35
+ max_value: '$max',
36
+ min_value: '$min',
37
+ max_time_ms: '$maxTimeMS',
38
+ return_key: '$returnKey',
39
+ show_disk_loc: '$showDiskLoc',
40
+ explain: '$explain'
41
+ ).freeze
42
+
43
+ # Mappings from server values to driver options.
44
+ #
45
+ # @since 2.2.0
46
+ SERVER_MAPPINGS = BSON::Document.new(DRIVER_MAPPINGS.invert).freeze
47
+
48
+ # Transform the provided server modifiers to driver options.
49
+ #
50
+ # @example Transform to driver options.
51
+ # Modifiers.map_driver_options(modifiers)
52
+ #
53
+ # @param [ Hash ] modifiers The modifiers.
54
+ #
55
+ # @return [ BSON::Document ] The driver options.
56
+ #
57
+ # @since 2.2.0
58
+ def self.map_driver_options(modifiers)
59
+ Options::Mapper.transform_documents(modifiers, SERVER_MAPPINGS)
60
+ end
61
+
62
+ # Transform the provided options into a document of only server
63
+ # modifiers.
64
+ #
65
+ # @example Map the server modifiers.
66
+ # Modifiers.map_server_modifiers(options)
67
+ #
68
+ # @param [ Hash, BSON::Document ] options The options.
69
+ #
70
+ # @return [ BSON::Document ] The modifiers.
71
+ #
72
+ # @since 2.2.0
73
+ def self.map_server_modifiers(options)
74
+ Options::Mapper.transform_documents(options, DRIVER_MAPPINGS)
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,83 @@
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 Collection
17
+ class View
18
+ module Builder
19
+
20
+ # Builds a legacy OP_QUERY specification from options.
21
+ #
22
+ # @since 2.2.0
23
+ class OpQuery
24
+ extend Forwardable
25
+
26
+ def_delegators :@view, :cluster, :collection, :database, :filter, :options, :read
27
+
28
+ # @return [ BSON::Document ] modifiers The server modifiers.
29
+ attr_reader :modifiers
30
+
31
+ # Create the new legacy query builder.
32
+ #
33
+ # @example Create the query builder.
34
+ # QueryBuilder.new(view)
35
+ #
36
+ # @param [ Collection::View ] view The collection view.
37
+ #
38
+ # @since 2.2.2
39
+ def initialize(view)
40
+ @view = view
41
+ @modifiers = Modifiers.map_server_modifiers(options)
42
+ end
43
+
44
+ def specification
45
+ {
46
+ :selector => requires_special_filter? ? special_filter : filter,
47
+ :read => read,
48
+ :options => query_options,
49
+ :db_name => database.name,
50
+ :coll_name => collection.name
51
+ }
52
+ end
53
+
54
+ private
55
+
56
+ def query_options
57
+ BSON::Document.new(
58
+ project: options[:projection],
59
+ skip: options[:skip],
60
+ limit: options[:limit],
61
+ flags: Flags.map_flags(options),
62
+ batch_size: options[:batch_size]
63
+ )
64
+ end
65
+
66
+ def requires_special_filter?
67
+ !modifiers.empty? || cluster.sharded?
68
+ end
69
+
70
+ def read_pref_formatted
71
+ @read_formatted ||= read.to_mongos
72
+ end
73
+
74
+ def special_filter
75
+ sel = BSON::Document.new(:$query => filter).merge!(modifiers)
76
+ sel[:$readPreference] = read_pref_formatted unless read_pref_formatted.nil?
77
+ sel
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,20 @@
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/collection/view/builder/aggregation'
16
+ require 'mongo/collection/view/builder/map_reduce'
17
+ require 'mongo/collection/view/builder/op_query'
18
+ require 'mongo/collection/view/builder/find_command'
19
+ require 'mongo/collection/view/builder/flags'
20
+ require 'mongo/collection/view/builder/modifiers'
@@ -21,6 +21,21 @@ module Mongo
21
21
  # @since 2.0.0
22
22
  module Explainable
23
23
 
24
+ # The query planner verbosity constant.
25
+ #
26
+ # @since 2.2.0
27
+ QUERY_PLANNER = 'queryPlanner'.freeze
28
+
29
+ # The execution stats verbosity constant.
30
+ #
31
+ # @since 2.2.0
32
+ EXECUTION_STATS = 'executionStats'.freeze
33
+
34
+ # The all plans execution verbosity constant.
35
+ #
36
+ # @since 2.2.0
37
+ ALL_PLANS_EXECUTION = 'allPlansExecution'.freeze
38
+
24
39
  # Get the explain plan for the query.
25
40
  #
26
41
  # @example Get the explain plan for the query.
@@ -15,6 +15,10 @@
15
15
  module Mongo
16
16
  class Collection
17
17
  class View
18
+
19
+ # Defines behaviour around views being configurable and immutable.
20
+ #
21
+ # @since 2.0.0
18
22
  module Immutable
19
23
 
20
24
  # @return [ Hash ] options The additional query options.
@@ -22,21 +26,10 @@ module Mongo
22
26
 
23
27
  private
24
28
 
25
- # @api private
26
- #
27
- # @note In the including class, the method #immutable needs to be
28
- # implemented in order to define how a new class of that type needs to
29
- # be instantiated.
30
29
  def configure(field, value)
31
30
  return options[field] if value.nil?
32
31
  new(options.merge(field => value))
33
32
  end
34
-
35
- def configure_flag(flag)
36
- new(options.dup).tap do |view|
37
- view.send(:flags).push(flag)
38
- end
39
- end
40
33
  end
41
34
  end
42
35
  end
@@ -35,13 +35,48 @@ module Mongo
35
35
  #
36
36
  # @yieldparam [ Hash ] Each matching document.
37
37
  def each
38
- server = read.select_server(cluster)
39
- initial_query = send_initial_query(server)
40
- cursor = Cursor.new(view, initial_query, server).to_enum
41
- cursor.each do |doc|
38
+ @cursor = nil
39
+ read_with_retry do
40
+ server = read.select_server(cluster, false)
41
+ result = send_initial_query(server)
42
+ @cursor = Cursor.new(view, result, server)
43
+ end
44
+ @cursor.each do |doc|
42
45
  yield doc
43
46
  end if block_given?
44
- cursor
47
+ @cursor.to_enum
48
+ end
49
+
50
+ # Stop the iteration by sending a KillCursors command to the server.
51
+ #
52
+ # @example Stop the iteration.
53
+ # view.close_query
54
+ #
55
+ # @since 2.1.0
56
+ def close_query
57
+ @cursor.send(:kill_cursors) if @cursor && !@cursor.closed?
58
+ end
59
+
60
+ private
61
+
62
+ def initial_query_op(server)
63
+ if server.features.find_command_enabled?
64
+ initial_command_op
65
+ else
66
+ Operation::Read::Query.new(Builder::OpQuery.new(self).specification)
67
+ end
68
+ end
69
+
70
+ def initial_command_op
71
+ if explained?
72
+ Operation::Commands::Command.new(Builder::FindCommand.new(self).explain_specification)
73
+ else
74
+ Operation::Commands::Find.new(Builder::FindCommand.new(self).specification)
75
+ end
76
+ end
77
+
78
+ def send_initial_query(server)
79
+ initial_query_op(server).execute(server.context)
45
80
  end
46
81
  end
47
82
  end
@@ -24,7 +24,18 @@ module Mongo
24
24
  extend Forwardable
25
25
  include Enumerable
26
26
  include Immutable
27
- include Iterable
27
+ include Loggable
28
+ include Retryable
29
+
30
+ # The inline option.
31
+ #
32
+ # @since 2.1.0
33
+ INLINE = 'inline'.freeze
34
+
35
+ # Reroute message.
36
+ #
37
+ # @since 2.1.0
38
+ REROUTE = 'Rerouting the MapReduce operation to the primary server.'.freeze
28
39
 
29
40
  # @return [ View ] view The collection view.
30
41
  attr_reader :view
@@ -41,6 +52,31 @@ module Mongo
41
52
  # Delegate necessary operations to the collection.
42
53
  def_delegators :collection, :database
43
54
 
55
+ # Iterate through documents returned by the map/reduce.
56
+ #
57
+ # @example Iterate through the result of the map/reduce.
58
+ # map_reduce.each do |document|
59
+ # p document
60
+ # end
61
+ #
62
+ # @return [ Enumerator ] The enumerator.
63
+ #
64
+ # @since 2.0.0
65
+ #
66
+ # @yieldparam [ Hash ] Each matching document.
67
+ def each
68
+ @cursor = nil
69
+ write_with_retry do
70
+ server = read.select_server(cluster, false)
71
+ result = send_initial_query(server)
72
+ @cursor = Cursor.new(view, result, server)
73
+ end
74
+ @cursor.each do |doc|
75
+ yield doc
76
+ end if block_given?
77
+ @cursor.to_enum
78
+ end
79
+
44
80
  # Set or get the finalize function for the operation.
45
81
  #
46
82
  # @example Set the finalize function.
@@ -71,7 +107,7 @@ module Mongo
71
107
  @view = view
72
108
  @map = map.freeze
73
109
  @reduce = reduce.freeze
74
- @options = options.dup
110
+ @options = options.freeze
75
111
  end
76
112
 
77
113
  # Set or get the jsMode flag for the operation.
@@ -86,7 +122,7 @@ module Mongo
86
122
  #
87
123
  # @since 2.0.0
88
124
  def js_mode(value = nil)
89
- configure(:jsMode, value)
125
+ configure(:js_mode, value)
90
126
  end
91
127
 
92
128
  # Set or get the output location for the operation.
@@ -147,21 +183,11 @@ module Mongo
147
183
  private
148
184
 
149
185
  def inline?
150
- out.nil? || out == { inline: 1 } || out == { 'inline' => 1 }
186
+ out.nil? || out == { inline: 1 } || out == { INLINE => 1 }
151
187
  end
152
188
 
153
189
  def map_reduce_spec
154
- {
155
- :db_name => database.name,
156
- :read => read,
157
- :selector => {
158
- :mapreduce => collection.name,
159
- :map => map,
160
- :reduce => reduce,
161
- :query => view.selector[:$query] || view.selector,
162
- :out => { inline: 1 }
163
- }.merge(options).merge(view.options)
164
- }
190
+ Builder::MapReduce.new(map, reduce, view, options).specification
165
191
  end
166
192
 
167
193
  def new(options)
@@ -169,40 +195,44 @@ module Mongo
169
195
  end
170
196
 
171
197
  def initial_query_op
172
- Operation::MapReduce.new(map_reduce_spec)
198
+ Operation::Commands::MapReduce.new(map_reduce_spec)
199
+ end
200
+
201
+ def valid_server?(server)
202
+ server.standalone? || server.mongos? || server.primary? || secondary_ok?
203
+ end
204
+
205
+ def secondary_ok?
206
+ out.respond_to?(:keys) && out.keys.first.to_s.downcase == INLINE
173
207
  end
174
208
 
175
209
  def send_initial_query(server)
176
- result =
177
- begin
178
- initial_query_op.execute(server.context)
179
- rescue Mongo::Error::NeedPrimaryServer
180
- log_warn([
181
- 'Rerouting the MapReduce operation to the primary server.'
182
- ])
183
- server = ServerSelector.get(mode: :primary).select_server(cluster)
184
- initial_query_op.execute(server.context)
185
- end
186
- if inline?
187
- result
188
- else
189
- send_fetch_query(server)
210
+ unless valid_server?(server)
211
+ log_warn(REROUTE)
212
+ server = cluster.next_primary(false)
190
213
  end
214
+ result = initial_query_op.execute(server.context)
215
+ inline? ? result : send_fetch_query(server)
191
216
  end
192
217
 
193
218
  def fetch_query_spec
194
- { :selector => {},
195
- :options => {},
196
- :db_name => database.name,
197
- :coll_name => out.values.first }
219
+ Builder::MapReduce.new(map, reduce, view, options).query_specification
220
+ end
221
+
222
+ def find_command_spec
223
+ Builder::MapReduce.new(map, reduce, view, options).command_specification
198
224
  end
199
225
 
200
- def fetch_query_op
201
- Operation::Read::Query.new(fetch_query_spec)
226
+ def fetch_query_op(server)
227
+ if server.features.find_command_enabled?
228
+ Operation::Commands::Find.new(find_command_spec)
229
+ else
230
+ Operation::Read::Query.new(fetch_query_spec)
231
+ end
202
232
  end
203
233
 
204
234
  def send_fetch_query(server)
205
- fetch_query_op.execute(server.context)
235
+ fetch_query_op(server).execute(server.context)
206
236
  end
207
237
  end
208
238
  end