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,210 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Collection::View::Builder::Modifiers do
4
+
5
+ describe '.map_driver_options' do
6
+
7
+ shared_examples_for 'transformable driver options' do
8
+
9
+ it 'maps hint' do
10
+ expect(transformed[:hint]).to eq("_id" => 1)
11
+ end
12
+
13
+ it 'maps comment' do
14
+ expect(transformed[:comment]).to eq('testing')
15
+ end
16
+
17
+ it 'maps max scan' do
18
+ expect(transformed[:max_scan]).to eq(200)
19
+ end
20
+
21
+ it 'maps max time ms' do
22
+ expect(transformed[:max_time_ms]).to eq(500)
23
+ end
24
+
25
+ it 'maps max' do
26
+ expect(transformed[:max_value]).to eq("name" => 'joe')
27
+ end
28
+
29
+ it 'maps min' do
30
+ expect(transformed[:min_value]).to eq("name" => 'albert')
31
+ end
32
+
33
+ it 'maps return key' do
34
+ expect(transformed[:return_key]).to be true
35
+ end
36
+
37
+ it 'maps show record id' do
38
+ expect(transformed[:show_disk_loc]).to be true
39
+ end
40
+
41
+ it 'maps snapshot' do
42
+ expect(transformed[:snapshot]).to be true
43
+ end
44
+
45
+ it 'maps explain' do
46
+ expect(transformed[:explain]).to be true
47
+ end
48
+
49
+ it 'returns a BSON document' do
50
+ expect(transformed).to be_a(BSON::Document)
51
+ end
52
+ end
53
+
54
+ context 'when the keys are strings' do
55
+
56
+ let(:modifiers) do
57
+ {
58
+ '$orderby' => { name: 1 },
59
+ '$hint' => { _id: 1 },
60
+ '$comment' => 'testing',
61
+ '$snapshot' => true,
62
+ '$maxScan' => 200,
63
+ '$max' => { name: 'joe' },
64
+ '$min' => { name: 'albert' },
65
+ '$maxTimeMS' => 500,
66
+ '$returnKey' => true,
67
+ '$showDiskLoc' => true,
68
+ '$explain' => true
69
+ }
70
+ end
71
+
72
+ let(:transformed) do
73
+ described_class.map_driver_options(modifiers)
74
+ end
75
+
76
+ it_behaves_like 'transformable driver options'
77
+ end
78
+
79
+ context 'when the keys are symbols' do
80
+
81
+ let(:modifiers) do
82
+ {
83
+ :$orderby => { name: 1 },
84
+ :$hint => { _id: 1 },
85
+ :$comment => 'testing',
86
+ :$snapshot => true,
87
+ :$maxScan => 200,
88
+ :$max => { name: 'joe' },
89
+ :$min => { name: 'albert' },
90
+ :$maxTimeMS => 500,
91
+ :$returnKey => true,
92
+ :$showDiskLoc => true,
93
+ :$explain => true
94
+ }
95
+ end
96
+
97
+ let(:transformed) do
98
+ described_class.map_driver_options(modifiers)
99
+ end
100
+
101
+ it_behaves_like 'transformable driver options'
102
+ end
103
+ end
104
+
105
+ describe '.map_server_modifiers' do
106
+
107
+ shared_examples_for 'transformable server modifiers' do
108
+
109
+ it 'maps hint' do
110
+ expect(transformed[:$hint]).to eq("_id" => 1)
111
+ end
112
+
113
+ it 'maps comment' do
114
+ expect(transformed[:$comment]).to eq('testing')
115
+ end
116
+
117
+ it 'maps max scan' do
118
+ expect(transformed[:$maxScan]).to eq(200)
119
+ end
120
+
121
+ it 'maps max time ms' do
122
+ expect(transformed[:$maxTimeMS]).to eq(500)
123
+ end
124
+
125
+ it 'maps max' do
126
+ expect(transformed[:$max]).to eq("name" => 'joe')
127
+ end
128
+
129
+ it 'maps min' do
130
+ expect(transformed[:$min]).to eq("name" => 'albert')
131
+ end
132
+
133
+ it 'maps return key' do
134
+ expect(transformed[:$returnKey]).to be true
135
+ end
136
+
137
+ it 'maps show record id' do
138
+ expect(transformed[:$showDiskLoc]).to be true
139
+ end
140
+
141
+ it 'maps snapshot' do
142
+ expect(transformed[:$snapshot]).to be true
143
+ end
144
+
145
+ it 'maps explain' do
146
+ expect(transformed[:$explain]).to be true
147
+ end
148
+
149
+ it 'returns a BSON document' do
150
+ expect(transformed).to be_a(BSON::Document)
151
+ end
152
+
153
+ it 'does not include non modifiers' do
154
+ expect(transformed[:limit]).to be_nil
155
+ end
156
+ end
157
+
158
+ context 'when the keys are strings' do
159
+
160
+ let(:options) do
161
+ {
162
+ 'sort' => { name: 1 },
163
+ 'hint' => { _id: 1 },
164
+ 'comment' => 'testing',
165
+ 'snapshot' => true,
166
+ 'max_scan' => 200,
167
+ 'max_value' => { name: 'joe' },
168
+ 'min_value' => { name: 'albert' },
169
+ 'max_time_ms' => 500,
170
+ 'return_key' => true,
171
+ 'show_disk_loc' => true,
172
+ 'explain' => true,
173
+ 'limit' => 10
174
+ }
175
+ end
176
+
177
+ let(:transformed) do
178
+ described_class.map_server_modifiers(options)
179
+ end
180
+
181
+ it_behaves_like 'transformable server modifiers'
182
+ end
183
+
184
+ context 'when the keys are symbols' do
185
+
186
+ let(:options) do
187
+ {
188
+ :sort => { name: 1 },
189
+ :hint => { _id: 1 },
190
+ :comment => 'testing',
191
+ :snapshot => true,
192
+ :max_scan => 200,
193
+ :max_value => { name: 'joe' },
194
+ :min_value => { name: 'albert' },
195
+ :max_time_ms => 500,
196
+ :return_key => true,
197
+ :show_disk_loc => true,
198
+ :explain => true,
199
+ :limit => 10
200
+ }
201
+ end
202
+
203
+ let(:transformed) do
204
+ described_class.map_server_modifiers(options)
205
+ end
206
+
207
+ it_behaves_like 'transformable server modifiers'
208
+ end
209
+ end
210
+ end
@@ -0,0 +1,154 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Collection::View::Builder::OpQuery do
4
+
5
+ describe '#specification' do
6
+
7
+ let(:filter) do
8
+ { 'name' => 'test' }
9
+ end
10
+
11
+ let(:builder) do
12
+ described_class.new(view)
13
+ end
14
+
15
+ let(:specification) do
16
+ builder.specification
17
+ end
18
+
19
+ let(:view) do
20
+ Mongo::Collection::View.new(authorized_collection, filter, options)
21
+ end
22
+
23
+ context 'when there are modifiers in the options' do
24
+
25
+ let(:options) do
26
+ {
27
+ sort: { _id: 1 },
28
+ projection: { name: 1 },
29
+ hint: { name: 1 },
30
+ skip: 10,
31
+ limit: 20,
32
+ batch_size: 5,
33
+ single_batch: false,
34
+ comment: "testing",
35
+ max_scan: 200,
36
+ max_time_ms: 40,
37
+ max_value: { name: 'joe' },
38
+ min_value: { name: 'albert' },
39
+ return_key: true,
40
+ show_disk_loc: true,
41
+ snapshot: true,
42
+ tailable: true,
43
+ oplog_replay: true,
44
+ no_cursor_timeout: true,
45
+ tailable_await: true,
46
+ allow_partial_results: true,
47
+ read_concern: { level: 'local' }
48
+ }
49
+ end
50
+
51
+ let(:selector) do
52
+ specification[:selector]
53
+ end
54
+
55
+ let(:opts) do
56
+ specification[:options]
57
+ end
58
+
59
+ let(:flags) do
60
+ opts[:flags]
61
+ end
62
+
63
+ it 'maps the collection name' do
64
+ expect(specification[:coll_name]).to eq(authorized_collection.name)
65
+ end
66
+
67
+ it 'maps the filter' do
68
+ expect(selector['$query']).to eq(filter)
69
+ end
70
+
71
+ it 'maps sort' do
72
+ expect(selector['$orderby']).to eq('_id' => 1)
73
+ end
74
+
75
+ it 'maps projection' do
76
+ expect(opts['project']).to eq('name' => 1)
77
+ end
78
+
79
+ it 'maps hint' do
80
+ expect(selector['$hint']).to eq('name' => 1)
81
+ end
82
+
83
+ it 'maps skip' do
84
+ expect(opts['skip']).to eq(10)
85
+ end
86
+
87
+ it 'maps limit' do
88
+ expect(opts['limit']).to eq(20)
89
+ end
90
+
91
+ it 'maps batch size' do
92
+ expect(opts['batch_size']).to eq(5)
93
+ end
94
+
95
+ it 'maps comment' do
96
+ expect(selector['$comment']).to eq('testing')
97
+ end
98
+
99
+ it 'maps max scan' do
100
+ expect(selector['$maxScan']).to eq(200)
101
+ end
102
+
103
+ it 'maps max time ms' do
104
+ expect(selector['$maxTimeMS']).to eq(40)
105
+ end
106
+
107
+ it 'maps max' do
108
+ expect(selector['$max']).to eq('name' => 'joe')
109
+ end
110
+
111
+ it 'maps min' do
112
+ expect(selector['$min']).to eq('name' => 'albert')
113
+ end
114
+
115
+ it 'does not map read concern' do
116
+ expect(selector['$readConcern']).to be_nil
117
+ expect(selector['readConcern']).to be_nil
118
+ expect(opts['readConcern']).to be_nil
119
+ end
120
+
121
+ it 'maps return key' do
122
+ expect(selector['$returnKey']).to be true
123
+ end
124
+
125
+ it 'maps show record id' do
126
+ expect(selector['$showDiskLoc']).to be true
127
+ end
128
+
129
+ it 'maps snapshot' do
130
+ expect(selector['$snapshot']).to be true
131
+ end
132
+
133
+ it 'maps tailable' do
134
+ expect(flags).to include(:tailable_cursor)
135
+ end
136
+
137
+ it 'maps oplog replay' do
138
+ expect(flags).to include(:oplog_replay)
139
+ end
140
+
141
+ it 'maps no cursor timeout' do
142
+ expect(flags).to include(:no_cursor_timeout)
143
+ end
144
+
145
+ it 'maps await data' do
146
+ expect(flags).to include(:await_data)
147
+ end
148
+
149
+ it 'maps allow partial results' do
150
+ expect(flags).to include(:partial)
151
+ end
152
+ end
153
+ end
154
+ end
@@ -25,8 +25,7 @@ describe Mongo::Collection::View::Explainable do
25
25
  end
26
26
 
27
27
  it 'executes an explain' do
28
- expect(explain[:cursor] == 'BasicCursor' ||
29
- explain[:queryPlanner]).to be_truthy
28
+ expect(explain[:cursor] == 'BasicCursor' || explain[:queryPlanner]).to be_truthy
30
29
  end
31
30
  end
32
31
  end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Collection::View::Immutable do
4
+
5
+ let(:selector) do
6
+ {}
7
+ end
8
+
9
+ let(:options) do
10
+ {}
11
+ end
12
+
13
+ let(:view) do
14
+ Mongo::Collection::View.new(authorized_collection, selector, options)
15
+ end
16
+
17
+ after do
18
+ authorized_collection.delete_many
19
+ end
20
+
21
+ describe '#configure' do
22
+
23
+ context 'when the options have modifiers' do
24
+
25
+ let(:options) do
26
+ { :max_time_ms => 500 }
27
+ end
28
+
29
+ let(:new_view) do
30
+ view.projection(_id: 1)
31
+ end
32
+
33
+ it 'returns a new view' do
34
+ expect(view).not_to be(new_view)
35
+ end
36
+
37
+ it 'creates a new options hash' do
38
+ expect(view.options).not_to be(new_view.options)
39
+ end
40
+
41
+ it 'keeps the modifier fields already in the options hash' do
42
+ expect(new_view.modifiers[:$maxTimeMS]).to eq(500)
43
+ end
44
+
45
+ it 'sets the option' do
46
+ expect(new_view.projection).to eq('_id' => 1)
47
+ end
48
+
49
+ it 'creates a new modifiers document' do
50
+ expect(view.modifiers).not_to be(new_view.modifiers)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -66,6 +66,39 @@ describe Mongo::Collection::View::MapReduce do
66
66
  end
67
67
  end
68
68
 
69
+ context 'when out is in the options' do
70
+
71
+ after do
72
+ authorized_client['output_collection'].delete_many
73
+ end
74
+
75
+ context 'when out is a string' do
76
+
77
+ let(:options) do
78
+ { :out => 'output_collection' }
79
+ end
80
+
81
+ it 'iterates over the documents in the result' do
82
+ map_reduce.each do |document|
83
+ expect(document[:value]).to_not be_nil
84
+ end
85
+ end
86
+ end
87
+
88
+ context 'when out is a document' do
89
+
90
+ let(:options) do
91
+ { :out => { replace: 'output_collection' } }
92
+ end
93
+
94
+ it 'iterates over the documents in the result' do
95
+ map_reduce.each do |document|
96
+ expect(document[:value]).to_not be_nil
97
+ end
98
+ end
99
+ end
100
+ end
101
+
69
102
  context 'when out is inline' do
70
103
 
71
104
  let(:new_map_reduce) do
@@ -82,7 +115,7 @@ describe Mongo::Collection::View::MapReduce do
82
115
  context 'when out is a collection' do
83
116
 
84
117
  after do
85
- authorized_client['output_collection'].find.delete_many
118
+ authorized_client['output_collection'].delete_many
86
119
  end
87
120
 
88
121
  context 'when the option is to replace' do
@@ -135,6 +168,17 @@ describe Mongo::Collection::View::MapReduce do
135
168
  expect(new_map_reduce.count).to eq(2)
136
169
  end
137
170
  end
171
+
172
+ context 'when the option is a collection name' do
173
+
174
+ let(:new_map_reduce) do
175
+ map_reduce.out('output_collection')
176
+ end
177
+
178
+ it 'fetches the results from the collection' do
179
+ expect(new_map_reduce.count).to eq(2)
180
+ end
181
+ end
138
182
  end
139
183
 
140
184
  context 'when the view has a selector' do
@@ -142,7 +186,7 @@ describe Mongo::Collection::View::MapReduce do
142
186
  context 'when the selector is basic' do
143
187
 
144
188
  let(:selector) do
145
- { name: 'Berlin' }
189
+ { 'name' => 'Berlin' }
146
190
  end
147
191
 
148
192
  it 'applies the selector to the map/reduce' do
@@ -159,7 +203,7 @@ describe Mongo::Collection::View::MapReduce do
159
203
  context 'when the selector is advanced' do
160
204
 
161
205
  let(:selector) do
162
- { :$query => { name: 'Berlin' }}
206
+ { :$query => { 'name' => 'Berlin' }}
163
207
  end
164
208
 
165
209
  it 'applies the selector to the map/reduce' do
@@ -229,7 +273,7 @@ describe Mongo::Collection::View::MapReduce do
229
273
  describe '#out' do
230
274
 
231
275
  let(:location) do
232
- { replace: 'testing' }
276
+ { 'replace' => 'testing' }
233
277
  end
234
278
 
235
279
  let(:new_map_reduce) do
@@ -241,13 +285,64 @@ describe Mongo::Collection::View::MapReduce do
241
285
  end
242
286
 
243
287
  it 'includes the out value in the operation spec' do
244
- expect(new_map_reduce.send(:map_reduce_spec)[:selector][:out]).to be(location)
288
+ expect(new_map_reduce.send(:map_reduce_spec)[:selector][:out]).to eq(location)
245
289
  end
246
290
 
247
291
  context 'when out is not defined' do
248
292
 
249
293
  it 'defaults to inline' do
250
- expect(map_reduce.send(:map_reduce_spec)[:selector][:out]).to eq(inline: 1)
294
+ expect(map_reduce.send(:map_reduce_spec)[:selector][:out]).to eq('inline' => 1)
295
+ end
296
+ end
297
+
298
+ context 'when out is specified in the options' do
299
+
300
+ let(:location) do
301
+ { 'replace' => 'testing' }
302
+ end
303
+
304
+ let(:options) do
305
+ { :out => location }
306
+ end
307
+
308
+ it 'sets the out value' do
309
+ expect(map_reduce.out).to eq(location)
310
+ end
311
+
312
+ it 'includes the out value in the operation spec' do
313
+ expect(map_reduce.send(:map_reduce_spec)[:selector][:out]).to eq(location)
314
+ end
315
+ end
316
+
317
+ context 'when out is not inline' do
318
+
319
+ let(:location) do
320
+ { 'replace' => 'testing' }
321
+ end
322
+
323
+ let(:options) do
324
+ { :out => location }
325
+ end
326
+
327
+ it 'does not allow the operation on a secondary' do
328
+ expect(map_reduce.send(:secondary_ok?)).to be false
329
+ end
330
+
331
+ context 'when the context is not a valid server for writing' do
332
+
333
+ it 'reroutes the operation to a primary' do
334
+ allow(map_reduce).to receive(:valid_server?).and_return(false)
335
+ expect(Mongo::Logger.logger).to receive(:warn?).and_call_original
336
+ map_reduce.to_a
337
+ end
338
+ end
339
+
340
+ context 'when the context is a valid server for writing' do
341
+
342
+ it 'does not reroute the operation to a primary' do
343
+ expect(Mongo::Logger.logger).not_to receive(:warn?)
344
+ map_reduce.to_a
345
+ end
251
346
  end
252
347
  end
253
348
  end
@@ -255,7 +350,7 @@ describe Mongo::Collection::View::MapReduce do
255
350
  describe '#scope' do
256
351
 
257
352
  let(:object) do
258
- { value: 'testing' }
353
+ { 'value' => 'testing' }
259
354
  end
260
355
 
261
356
  let(:new_map_reduce) do
@@ -267,7 +362,7 @@ describe Mongo::Collection::View::MapReduce do
267
362
  end
268
363
 
269
364
  it 'includes the scope object in the operation spec' do
270
- expect(new_map_reduce.send(:map_reduce_spec)[:selector][:scope]).to be(object)
365
+ expect(new_map_reduce.send(:map_reduce_spec)[:selector][:scope]).to eq(object)
271
366
  end
272
367
  end
273
368
 
@@ -316,7 +411,7 @@ describe Mongo::Collection::View::MapReduce do
316
411
  end
317
412
 
318
413
  it 'includes the sort object in the operation spec' do
319
- expect(map_reduce.send(:map_reduce_spec)[:selector][:sort]).to be(sort)
414
+ expect(map_reduce.send(:map_reduce_spec)[:selector][:sort][:name]).to eq(sort[:name])
320
415
  end
321
416
  end
322
417