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,103 +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
- class Aggregate
18
-
19
- # Defines custom behaviour of results in an aggregation context.
20
- #
21
- # @since 2.0.0
22
- class Result < Operation::Result
23
-
24
- # The field name for the cursor document in an aggregation.
25
- #
26
- # @since 2.0.0
27
- CURSOR = 'cursor'.freeze
28
-
29
- # The cursor id field in the cursor document.
30
- #
31
- # @since 2.0.0
32
- CURSOR_ID = 'id'.freeze
33
-
34
- # The field name for the aggregation explain information.
35
- #
36
- # @since 2.0.5
37
- EXPLAIN = 'stages'.freeze
38
-
39
- # The legacy field name for the aggregation explain information.
40
- #
41
- # @since 2.0.5
42
- EXPLAIN_LEGACY = 'serverPipeline'.freeze
43
-
44
- # The field name for the first batch of a cursor.
45
- #
46
- # @since 2.0.0
47
- FIRST_BATCH = 'firstBatch'.freeze
48
-
49
- # The field name for a result without a cursor.
50
- #
51
- # @since 2.0.0
52
- RESULT = 'result'.freeze
53
-
54
- # Get the cursor id for the result.
55
- #
56
- # @example Get the cursor id.
57
- # result.cursor_id
58
- #
59
- # @note Even though the wire protocol has a cursor_id field for all
60
- # messages of type reply, it is always zero when using the
61
- # aggregation framework and must be retrieved from the cursor
62
- # document itself. Wahnsinn!
63
- #
64
- # @return [ Integer ] The cursor id.
65
- #
66
- # @since 2.0.0
67
- def cursor_id
68
- cursor_document ? cursor_document[CURSOR_ID] : super
69
- end
70
-
71
- # Get the documents for the aggregation result. This is either the
72
- # first document's 'result' field, or if a cursor option was selected
73
- # it is the 'firstBatch' field in the 'cursor' field of the first
74
- # document returned.
75
- #
76
- # @example Get the documents.
77
- # result.documents
78
- #
79
- # @return [ Array<BSON::Document> ] The documents.
80
- #
81
- # @since 2.0.0
82
- def documents
83
- reply.documents[0][RESULT] || explain_document ||
84
- cursor_document[FIRST_BATCH]
85
- end
86
-
87
- private
88
-
89
- def explain_document
90
- first_document[EXPLAIN] || first_document[EXPLAIN_LEGACY]
91
- end
92
-
93
- def cursor_document
94
- @cursor_document ||= reply.documents[0][CURSOR]
95
- end
96
-
97
- def first_document
98
- @first_document ||= reply.documents[0]
99
- end
100
- end
101
- end
102
- end
103
- end
@@ -1,108 +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/aggregate/result'
16
-
17
- module Mongo
18
- module Operation
19
-
20
- # A MongoDB aggregate operation.
21
- #
22
- # @note An aggregate operation can behave like a read and return a
23
- # result set, or can behave like a write operation and
24
- # output results to a user-specified collection.
25
- #
26
- # @example Create the aggregate operation.
27
- # Aggregate.new({
28
- # :selector => {
29
- # :aggregate => 'test_coll', :pipeline => [{ '$out' => 'test-out' }]
30
- # },
31
- # :db_name => 'test_db'
32
- # })
33
- #
34
- # Initialization:
35
- # param [ Hash ] spec The specifications for the operation.
36
- #
37
- # option spec :selector [ Hash ] The aggregate selector.
38
- # option spec :db_name [ String ] The name of the database on which
39
- # the operation should be executed.
40
- # option spec :options [ Hash ] Options for the aggregate command.
41
- #
42
- # @since 2.0.0
43
- class Aggregate
44
- include Executable
45
- include Specifiable
46
- include Limited
47
- include ReadPreferrable
48
-
49
- # The need primary error message.
50
- #
51
- # @since 2.0.0
52
- ERROR_MESSAGE = "The pipeline contains the '$out' operator so the primary must be used.".freeze
53
-
54
- # Execute the operation.
55
- # The context gets a connection on which the operation
56
- # is sent in the block.
57
- # If the aggregation will be written to an output collection and the
58
- # server is not primary, the operation will be rerouted to the primary
59
- # with a warning.
60
- #
61
- # @param [ Server::Context ] context The context for this operation.
62
- #
63
- # @return [ Result ] The operation response, if there is one.
64
- #
65
- # @since 2.0.0
66
- def execute(context)
67
- unless valid_context?(context)
68
- raise Error::NeedPrimaryServer.new(ERROR_MESSAGE)
69
- end
70
- execute_message(context)
71
- end
72
-
73
- private
74
-
75
- def execute_message(context)
76
- context.with_connection do |connection|
77
- Result.new(connection.dispatch([ message(context) ])).validate!
78
- end
79
- end
80
-
81
- def valid_context?(context)
82
- context.standalone? || context.mongos? || context.primary? || secondary_ok?
83
- end
84
-
85
- def secondary_ok?
86
- selector[:pipeline].none? { |op| op.key?('$out') || op.key?(:$out) }
87
- end
88
-
89
- def query_coll
90
- Database::COMMAND
91
- end
92
-
93
- def filter_selector(context)
94
- return selector if context.features.write_command_enabled?
95
- selector.reject{ |option, value| option.to_s == 'cursor' }
96
- end
97
-
98
- def update_selector(context)
99
- if context.mongos? && read_pref = read.to_mongos
100
- sel = selector[:$query] ? filter_selector(context) : { :$query => filter_selector(context) }
101
- sel.merge(:$readPreference => read_pref)
102
- else
103
- filter_selector(context)
104
- end
105
- end
106
- end
107
- end
108
- end
@@ -1,61 +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
-
18
- # A MongoDB command operation.
19
- #
20
- # @example Create the command operation.
21
- # Mongo::Operation::Command.new({ :selector => { :isMaster => 1 } })
22
- #
23
- # Initialization:
24
- # param [ Hash ] spec The specifications for the command.
25
- #
26
- # option spec :selector [ Hash ] The command selector.
27
- # option spec :db_name [ String ] The name of the database on which
28
- # the command should be executed.
29
- # option spec :options [ Hash ] Options for the command.
30
- #
31
- # @since 2.0.0
32
- class Command
33
- include Executable
34
- include Specifiable
35
- include Limited
36
- include ReadPreferrable
37
-
38
- # Execute the command operation.
39
- #
40
- # @example Execute the operation.
41
- # operation.execute(context)
42
- #
43
- # @param [ Server::Context ] context The context for this operation.
44
- #
45
- # @return [ Result ] The operation result.
46
- #
47
- # @since 2.0.0
48
- def execute(context)
49
- context.with_connection do |connection|
50
- Result.new(connection.dispatch([ message(context) ])).validate!
51
- end
52
- end
53
-
54
- private
55
-
56
- def query_coll
57
- Database::COMMAND
58
- end
59
- end
60
- end
61
- end
@@ -1,122 +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
- class MapReduce
18
-
19
- # Defines custom behaviour of results in an aggregation context.
20
- #
21
- # @since 2.0.0
22
- class Result < Operation::Result
23
-
24
- # The counts field for the map/reduce.
25
- #
26
- # @since 2.0.0
27
- COUNTS = 'counts'.freeze
28
-
29
- # The result field for when output is a collection.
30
- #
31
- # @since 2.0.0
32
- RESULT = 'result'.freeze
33
-
34
- # The field name for a result without a cursor.
35
- #
36
- # @since 2.0.0
37
- RESULTS = 'results'.freeze
38
-
39
- # The time the operation took constant.
40
- #
41
- # @since 2.0.0
42
- TIME = 'timeMillis'.freeze
43
-
44
- # Gets the map/reduce counts from the reply.
45
- #
46
- # @example Get the counts.
47
- # result.counts
48
- #
49
- # @return [ Hash ] A hash of the result counts.
50
- #
51
- # @since 2.0.0
52
- def counts
53
- reply.documents[0][COUNTS]
54
- end
55
-
56
- # Get the documents from the map/reduce.
57
- #
58
- # @example Get the documents.
59
- # result.documents
60
- #
61
- # @return [ Array<BSON::Document> ] The documents.
62
- #
63
- # @since 2.0.0
64
- def documents
65
- reply.documents[0][RESULTS] || reply.documents[0][RESULT]
66
- end
67
-
68
- # If the result was a command then determine if it was considered a
69
- # success.
70
- #
71
- # @note If the write was unacknowledged, then this will always return
72
- # true.
73
- #
74
- # @example Was the command successful?
75
- # result.successful?
76
- #
77
- # @return [ true, false ] If the command was successful.
78
- #
79
- # @since 2.0.0
80
- def successful?
81
- !documents.nil?
82
- end
83
-
84
- # Get the execution time of the map/reduce.
85
- #
86
- # @example Get the execution time.
87
- # result.time
88
- #
89
- # @return [ Integer ] The executiong time in milliseconds.
90
- #
91
- # @since 2.0.0
92
- def time
93
- reply.documents[0][TIME]
94
- end
95
-
96
- # Validate the result by checking for any errors.
97
- #
98
- # @note This only checks for errors with writes since authentication is
99
- # handled at the connection level and any authentication errors would
100
- # be raised there, before a Result is ever created.
101
- #
102
- # @example Validate the result.
103
- # result.validate!
104
- #
105
- # @raise [ Error::OperationFailure ] If an error is in the result.
106
- #
107
- # @return [ Result ] The result if verification passed.
108
- #
109
- # @since 2.0.0
110
- def validate!
111
- documents.nil? ? raise(Error::OperationFailure.new(parser.message)) : self
112
- end
113
-
114
- private
115
-
116
- def first_document
117
- @first_document ||= reply.documents[0]
118
- end
119
- end
120
- end
121
- end
122
- end
@@ -1,95 +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/map_reduce/result'
16
-
17
- module Mongo
18
- module Operation
19
-
20
- # A MongoDB map reduce operation.
21
- #
22
- # @note A map/reduce operation can behave like a read and
23
- # return a result set, or can behave like a write operation and
24
- # output results to a user-specified collection.
25
- #
26
- # @example Create the map/reduce operation.
27
- # MapReduce.new({
28
- # :selector => {
29
- # :mapreduce => 'test_coll',
30
- # :map => '',
31
- # :reduce => ''
32
- # },
33
- # :db_name => 'test_db'
34
- # })
35
- #
36
- # Initialization:
37
- # param [ Hash ] spec The specifications for the operation.
38
- #
39
- # option spec :selector [ Hash ] The map reduce selector.
40
- # option spec :db_name [ String ] The name of the database on which
41
- # the operation should be executed.
42
- # option spec :options [ Hash ] Options for the map reduce command.
43
- #
44
- # @since 2.0.0
45
- class MapReduce
46
- include Executable
47
- include Specifiable
48
- include Limited
49
- include ReadPreferrable
50
-
51
- # The error message for needing a primary.
52
- #
53
- # @since 2.0.
54
- ERROR_MESSAGE = "If 'out' is specified as a collection, the primary server must be used.".freeze
55
-
56
- # Execute the map/reduce operation.
57
- #
58
- # @example Execute the operation.
59
- # operation.execute(context)
60
- #
61
- # @param [ Server::Context ] context The context for this operation.
62
- #
63
- # @return [ Result ] The operation response, if there is one.
64
- #
65
- # @since 2.0.0
66
- def execute(context)
67
- unless valid_context?(context)
68
- raise Error::NeedPrimaryServer.new(ERROR_MESSAGE)
69
- end
70
- execute_message(context)
71
- end
72
-
73
- private
74
-
75
- def valid_context?(context)
76
- context.standalone? || context.mongos? || context.primary? || secondary_ok?
77
- end
78
-
79
- def execute_message(context)
80
- context.with_connection do |connection|
81
- Result.new(connection.dispatch([ message(context) ])).validate!
82
- end
83
- end
84
-
85
- def secondary_ok?
86
- selector[:out].respond_to?(:keys) &&
87
- selector[:out].keys.first.to_s.downcase == 'inline'
88
- end
89
-
90
- def query_coll
91
- Database::COMMAND
92
- end
93
- end
94
- end
95
- end
@@ -1,72 +0,0 @@
1
-
2
- # Copyright (C) 2009-2014 MongoDB, Inc.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
-
16
- module Mongo
17
- module Operation
18
- class ParallelScan
19
-
20
- # Defines custom behaviour of results in a parallel scan.
21
- #
22
- # @since 2.0.0
23
- class Result < Operation::Result
24
-
25
- # Get the name of the cursor field.
26
- #
27
- # @since 2.0.0
28
- CURSOR = 'cursor'.freeze
29
-
30
- # The name of the cursors field in the result.
31
- #
32
- # @since 2.0.0
33
- CURSORS = 'cursors'.freeze
34
-
35
- # Get the name of the id field.
36
- #
37
- # @since 2.0.0
38
- ID = 'id'.freeze
39
-
40
- # Get all the cursor ids from the result.
41
- #
42
- # @example Get the cursor ids.
43
- # result.cursor_ids
44
- #
45
- # @return [ Array<Integer> ] The cursor ids.
46
- #
47
- # @since 2.0.0
48
- def cursor_ids
49
- documents.map{ |doc| doc[CURSOR][ID] }
50
- end
51
-
52
- # Get the documents from parallel scan.
53
- #
54
- # @example Get the documents.
55
- # result.documents
56
- #
57
- # @return [ Array<BSON::Document> ] The documents.
58
- #
59
- # @since 2.0.0
60
- def documents
61
- reply.documents[0][CURSORS]
62
- end
63
-
64
- private
65
-
66
- def first
67
- @first ||= reply.documents[0] || {}
68
- end
69
- end
70
- end
71
- end
72
- end
@@ -1,76 +0,0 @@
1
- # Copyright (C) 2009-2014 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/parallel_scan/result'
16
-
17
- module Mongo
18
- module Operation
19
-
20
- # A MongoDB parallel scan operation.
21
- #
22
- # @example Create the parallel scan operation.
23
- # ParallelScan.new({
24
- # :db_name => 'test_db',
25
- # :coll_name = > 'test_collection',
26
- # :cursor_count => 5
27
- # })
28
- #
29
- # Initialization:
30
- # param [ Hash ] spec The specifications for the operation.
31
- #
32
- # option spec :db_name [ String ] The name of the database on which
33
- # the operation should be executed.
34
- # option spec :coll_name [ String ] The collection to scan.
35
- # option spec :cursor_count [ Integer ] The number of cursors to use.
36
- # option spec :options [ Hash ] Options for the command.
37
- #
38
- # @since 2.0.0
39
- class ParallelScan
40
- include Executable
41
- include Specifiable
42
- include Limited
43
- include ReadPreferrable
44
-
45
- # Execute the parallel scan operation.
46
- #
47
- # @example Execute the operation.
48
- # operation.execute(context)
49
- #
50
- # @param [ Mongo::Server::Context ] context The context for this operation.
51
- #
52
- # @return [ Result ] The operation response, if there is one.
53
- #
54
- # @since 2.0.0
55
- def execute(context)
56
- execute_message(context)
57
- end
58
-
59
- private
60
-
61
- def execute_message(context)
62
- context.with_connection do |connection|
63
- Result.new(connection.dispatch([ message(context) ])).validate!
64
- end
65
- end
66
-
67
- def selector
68
- { :parallelCollectionScan => coll_name, :numCursors => cursor_count }
69
- end
70
-
71
- def query_coll
72
- Database::COMMAND
73
- end
74
- end
75
- end
76
- end