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
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Collection::View do
4
4
 
5
- let(:selector) do
5
+ let(:filter) do
6
6
  {}
7
7
  end
8
8
 
@@ -11,7 +11,7 @@ describe Mongo::Collection::View do
11
11
  end
12
12
 
13
13
  let(:view) do
14
- described_class.new(authorized_collection, selector, options)
14
+ described_class.new(authorized_collection, filter, options)
15
15
  end
16
16
 
17
17
  after do
@@ -29,10 +29,10 @@ describe Mongo::Collection::View do
29
29
  end
30
30
  end
31
31
 
32
- context 'when the views have the same collection, selector, and options' do
32
+ context 'when the views have the same collection, filter, and options' do
33
33
 
34
34
  let(:other) do
35
- described_class.new(authorized_collection, selector, options)
35
+ described_class.new(authorized_collection, filter, options)
36
36
  end
37
37
 
38
38
  it 'returns true' do
@@ -47,7 +47,7 @@ describe Mongo::Collection::View do
47
47
  end
48
48
 
49
49
  let(:other) do
50
- described_class.new(other_collection, selector, options)
50
+ described_class.new(other_collection, filter, options)
51
51
  end
52
52
 
53
53
  it 'returns false' do
@@ -55,14 +55,14 @@ describe Mongo::Collection::View do
55
55
  end
56
56
  end
57
57
 
58
- context 'when two views have a different selector' do
58
+ context 'when two views have a different filter' do
59
59
 
60
- let(:other_selector) do
60
+ let(:other_filter) do
61
61
  { 'name' => 'Emily' }
62
62
  end
63
63
 
64
64
  let(:other) do
65
- described_class.new(authorized_collection, other_selector, options)
65
+ described_class.new(authorized_collection, other_filter, options)
66
66
  end
67
67
 
68
68
  it 'returns false' do
@@ -77,7 +77,7 @@ describe Mongo::Collection::View do
77
77
  end
78
78
 
79
79
  let(:other) do
80
- described_class.new(authorized_collection, selector, other_options)
80
+ described_class.new(authorized_collection, filter, other_options)
81
81
  end
82
82
 
83
83
  it 'returns false' do
@@ -96,8 +96,8 @@ describe Mongo::Collection::View do
96
96
  expect(view.options).not_to be(view_clone.options)
97
97
  end
98
98
 
99
- it 'dups the selector' do
100
- expect(view.selector).not_to be(view_clone.selector)
99
+ it 'dups the filter' do
100
+ expect(view.filter).not_to be(view_clone.filter)
101
101
  end
102
102
 
103
103
  it 'references the same collection' do
@@ -119,463 +119,37 @@ describe Mongo::Collection::View do
119
119
  authorized_collection.delete_many
120
120
  end
121
121
 
122
- context 'when sending the initial query' do
123
-
124
- let(:returned) do
125
- view.to_a
126
- end
127
-
128
- let(:query_spec) do
129
- view.send(:query_spec)
130
- end
131
-
132
- context 'when limit is specified' do
133
-
134
- let(:options) do
135
- { :limit => 5 }
136
- end
137
-
138
- let(:returned) do
139
- view.to_a
140
- end
141
-
142
- it 'sets the limit on the initial query' do
143
- expect(query_spec[:options][:limit]).to eq(options[:limit])
144
- end
145
-
146
- it 'returns limited documents' do
147
- expect(returned.count).to eq(5)
148
- end
149
-
150
- it 'iterates over all of the documents' do
151
- returned.each do |doc|
152
- expect(doc).to have_key('field')
153
- end
154
- end
155
- end
156
-
157
- context 'when batch size is specified' do
158
-
159
- let(:options) do
160
- { :batch_size => 5 }
161
- end
162
-
163
- let(:returned) do
164
- view.to_a
165
- end
166
-
167
- it 'sets the batch size on the initial query' do
168
- expect(query_spec[:options][:limit]).to eq(options[:batch_size])
169
- end
170
-
171
- it 'returns all the documents' do
172
- expect(returned.count).to eq(10)
173
- end
174
-
175
- it 'iterates over all of the documents' do
176
- returned.each do |doc|
177
- expect(doc).to have_key('field')
178
- end
179
- end
180
- end
181
-
182
- context 'when no limit is specified' do
183
-
184
- it 'does not set a limit on the initial query' do
185
- expect(query_spec[:options][:limit]).to be_nil
186
- end
187
-
188
- it 'returns all the documents' do
189
- expect(returned.count).to eq(10)
190
- end
191
-
192
- it 'iterates over all of the documents' do
193
- returned.each do |doc|
194
- expect(doc).to have_key('field')
195
- end
196
- end
197
- end
198
-
199
- context 'when batch size is greater than limit' do
200
-
201
- let(:options) do
202
- { :batch_size => 5, :limit => 3 }
203
- end
204
-
205
- let(:returned) do
206
- view.to_a
207
- end
208
-
209
- it 'sets the limit on the initial query' do
210
- expect(query_spec[:options][:limit]).to eq(options[:limit])
211
- end
212
-
213
- it 'returns the limit of documents' do
214
- expect(returned.count).to eq(3)
215
- end
216
-
217
- it 'iterates over all of the documents' do
218
- returned.each do |doc|
219
- expect(doc).to have_key('field')
220
- end
221
- end
222
- end
223
-
224
- context 'when limit is greater than batch size' do
225
-
226
- let(:options) do
227
- { :limit => 5, :batch_size => 3 }
228
- end
229
-
230
- let(:returned) do
231
- view.to_a
232
- end
233
-
234
- it 'sets the batch size on the initial query' do
235
- expect(query_spec[:options][:limit]).to eq(options[:batch_size])
236
- end
237
-
238
- it 'returns the limit of documents' do
239
- expect(returned.count).to eq(5)
240
- end
241
-
242
- it 'iterates over all of the documents' do
243
- returned.each do |doc|
244
- expect(doc).to have_key('field')
245
- end
246
- end
247
- end
248
-
249
- context 'when the selector has special fields' do
250
-
251
- context 'when a snapshot option is specified' do
252
-
253
- let(:options) do
254
- { :snapshot => true }
255
- end
256
-
257
- before do
258
- expect(view).to receive(:special_selector).and_call_original
259
- end
260
-
261
- it 'creates a special query selector' do
262
- expect(query_spec[:selector][:$snapshot]).to eq(options[:snapshot])
263
- end
264
-
265
- it 'iterates over all of the documents' do
266
- returned.each do |doc|
267
- expect(doc).to have_key('field')
268
- end
269
- end
270
- end
271
-
272
- context 'when a max_scan option is provided' do
273
-
274
- let(:options) do
275
- { :max_scan => 100 }
276
- end
277
-
278
- before do
279
- expect(view).to receive(:special_selector).and_call_original
280
- end
281
-
282
- it 'creates a special query selector' do
283
- expect(query_spec[:selector][:$maxScan]).to eq(options[:max_scan])
284
- end
285
-
286
- it 'iterates over all of the documents' do
287
- returned.each do |doc|
288
- expect(doc).to have_key('field')
289
- end
290
- end
291
- end
292
-
293
- context 'when a max_time_ms option is provided' do
294
-
295
- let(:options) do
296
- { :max_time_ms => 100 }
297
- end
298
-
299
- before do
300
- expect(view).to receive(:special_selector).and_call_original
301
- end
302
-
303
- it 'creates a special query selector' do
304
- expect(query_spec[:selector][:$maxTimeMS]).to eq(options[:max_time_ms])
305
- end
306
-
307
- it 'iterates over all of the documents' do
308
- returned.each do |doc|
309
- expect(doc).to have_key('field')
310
- end
311
- end
312
- end
313
-
314
- context 'when a show_disk_loc option is provided' do
315
-
316
- let(:options) do
317
- { :show_disk_loc => true }
318
- end
319
-
320
- before do
321
- expect(view).to receive(:special_selector).and_call_original
322
- end
323
-
324
- it 'creates a special query selector' do
325
- expect(query_spec[:selector][:$showDiskLoc]).to eq(options[:show_disk_loc])
326
- end
327
-
328
- it 'iterates over all of the documents' do
329
- returned.each do |doc|
330
- expect(doc).to have_key('field')
331
- end
332
- end
333
- end
334
- end
335
-
336
- context 'when sorting' do
337
-
338
- let(:options) do
339
- { :sort => {'x' => Mongo::Index::ASCENDING }}
340
- end
341
-
342
- before do
343
- expect(view).to receive(:special_selector).and_call_original
344
- end
345
-
346
- it 'creates a special query selector' do
347
- expect(query_spec[:selector][:$orderby]).to eq(options[:sort])
348
- end
349
-
350
- it 'iterates over all of the documents' do
351
- returned.each do |doc|
352
- expect(doc).to have_key('field')
353
- end
354
- end
355
- end
356
-
357
- context 'when providing a hint' do
358
-
359
- context 'when the hint is bad' do
360
-
361
- let(:options) do
362
- { :hint => { 'x' => Mongo::Index::ASCENDING }}
363
- end
364
-
365
- before do
366
- expect(view).to receive(:special_selector).and_call_original
367
- end
368
-
369
- it 'creates a special query selector' do
370
- expect(query_spec[:selector][:$hint]).to eq(options[:hint])
371
- end
372
- end
373
- end
374
-
375
- context 'when providing a comment' do
376
-
377
- let(:options) do
378
- { :comment => 'query1' }
379
- end
380
-
381
- before do
382
- expect(view).to receive(:special_selector).and_call_original
383
- end
384
-
385
- it 'creates a special query selector' do
386
- expect(query_spec[:selector][:$comment]).to eq(options[:comment])
387
- end
388
-
389
- it 'iterates over all of the documents' do
390
- returned.each do |doc|
391
- expect(doc).to have_key('field')
392
- end
393
- end
394
- end
395
-
396
- context 'when the cluster is sharded', if: sharded? do
397
-
398
- before do
399
- allow(authorized_collection.cluster).to receive(:sharded?).and_return(true)
400
- expect(view).to receive(:special_selector).and_call_original
401
- end
122
+ context 'when a block is not provided' do
402
123
 
403
- it 'iterates over all of the documents' do
404
- view.each do |doc|
405
- expect(doc).to have_key('field')
406
- end
407
- end
124
+ let(:enumerator) do
125
+ view.each
408
126
  end
409
127
 
410
- context 'when a modifier document is provided' do
411
-
412
- let(:options) do
413
- { :modifiers => {
414
- :$orderby => {'x' => Mongo::Index::ASCENDING }
415
- }
416
- }
417
- end
418
-
419
- before do
420
- expect(view).to receive(:special_selector).and_call_original
421
- end
422
-
423
- it 'creates a special query selector' do
424
- expect(query_spec[:selector][:$orderby]).to eq(options[:modifiers][:$orderby])
425
- end
426
-
427
- it 'iterates over all of the documents' do
428
- view.each do |doc|
429
- expect(doc).to have_key('field')
430
- end
431
- end
432
-
433
- context 'when $explain is specified' do
434
- let(:options) do
435
- { :modifiers => {
436
- :$explain => 1
437
- }
438
- }
439
- end
440
-
441
- let(:explain) do
442
- view.to_a.first
443
- end
444
-
445
- it 'executes an explain' do
446
- expect(explain['cursor'] == 'BasicCursor' ||
447
- explain['queryPlanner']).to be_truthy
448
- end
449
-
450
- end
451
-
452
- context 'when an option is also provided' do
453
-
454
- context 'when $orderby and sort are specified' do
455
-
456
- let(:options) do
457
- { :modifiers => {
458
- :$orderby => { 'x' => Mongo::Index::ASCENDING }
459
- },
460
- :sort => { 'x' => Mongo::Index::DESCENDING }
461
- }
462
- end
463
-
464
- it 'overrides the modifier value with the option value' do
465
- expect(query_spec[:selector][:$orderby]).to eq(options[:sort])
466
- end
467
- end
468
-
469
- context 'when $comment and comment are specified' do
470
-
471
- let(:options) do
472
- { :modifiers => {
473
- :$comment => 'query1'
474
- },
475
- :comment => 'query2'
476
- }
477
- end
478
-
479
- it 'overrides the modifier value with the option value' do
480
- expect(query_spec[:selector][:$comment]).to eq(options[:comment])
481
- end
482
- end
483
-
484
- context 'when $hint and hint are specified' do
485
-
486
- let(:options) do
487
- { :modifiers => {
488
- :$hint => 'x'
489
- },
490
- :hint => 'y'
491
- }
492
- end
493
-
494
- it 'overrides the modifier value with the option value' do
495
- expect(query_spec[:selector][:$hint]).to eq(options[:hint])
496
- end
497
-
498
- end
499
-
500
- context 'when $maxScan and max_scan are specified' do
501
-
502
- let(:options) do
503
- { :modifiers => {
504
- :$maxScan => 4
505
- },
506
- :max_scan => 5
507
- }
508
- end
509
-
510
- it 'overrides the modifier value with the option value' do
511
- expect(query_spec[:selector][:$maxScan]).to eq(options[:max_scan])
512
- end
513
- end
514
-
515
- context 'when $maxTimeMS and max_time_ms are specified' do
516
-
517
- let(:options) do
518
- { :modifiers => {
519
- :$maxTimeMS => 100
520
- },
521
- :max_time_ms => 200
522
- }
523
- end
524
-
525
- it 'overrides the modifier value with the option value' do
526
- expect(query_spec[:selector][:$maxTimeMS]).to eq(options[:max_time_ms])
527
- end
528
- end
529
-
530
- context 'when $query and a selector are specified' do
531
-
532
- let(:selector) do
533
- { 'y' => 1 }
534
- end
535
-
536
- let(:options) do
537
- { :modifiers => {
538
- :$query => { 'field' => 1 }
539
- }
540
- }
541
- end
542
-
543
- it 'overrides the modifier value with the option value' do
544
- expect(query_spec[:selector][:$query]).to eq(selector)
545
- end
546
- end
547
-
548
-
128
+ it 'returns an enumerator' do
129
+ enumerator.each do |doc|
130
+ expect(doc).to have_key('field')
549
131
  end
550
132
  end
551
-
552
133
  end
553
134
 
554
- context 'when there are no special fields' do
135
+ describe '#close_query' do
555
136
 
556
- before do
557
- expect(Mongo::Operation::Read::Query).to receive(:new) do |spec|
558
- expect(spec[:selector]).to eq(selector)
559
- end.and_call_original
137
+ let(:options) do
138
+ { :batch_size => 1 }
560
139
  end
561
140
 
562
- it 'creates a normal query spec' do
563
- view.each do |doc|
564
- expect(doc).to have_key('field')
565
- end
141
+ let(:cursor) do
142
+ view.instance_variable_get(:@cursor)
566
143
  end
567
- end
568
-
569
- context 'when a block is not provided' do
570
144
 
571
- let(:enumerator) do
572
- view.each
145
+ before do
146
+ view.to_enum.next
147
+ cursor.instance_variable_set(:@cursor_id, 1) unless find_command_enabled?
573
148
  end
574
149
 
575
- it 'returns an enumerator' do
576
- enumerator.each do |doc|
577
- expect(doc).to have_key('field')
578
- end
150
+ it 'sends a kill cursors command for the cursor' do
151
+ expect(cursor).to receive(:kill_cursors).and_call_original
152
+ view.close_query
579
153
  end
580
154
  end
581
155
  end
@@ -583,10 +157,10 @@ describe Mongo::Collection::View do
583
157
  describe '#hash' do
584
158
 
585
159
  let(:other) do
586
- described_class.new(authorized_collection, selector, options)
160
+ described_class.new(authorized_collection, filter, options)
587
161
  end
588
162
 
589
- it 'returns a unique value based on collection, selector, options' do
163
+ it 'returns a unique value based on collection, filter, options' do
590
164
  expect(view.hash).to eq(other.hash)
591
165
  end
592
166
 
@@ -597,7 +171,7 @@ describe Mongo::Collection::View do
597
171
  end
598
172
 
599
173
  let(:other) do
600
- described_class.new(other_collection, selector, options)
174
+ described_class.new(other_collection, filter, options)
601
175
  end
602
176
 
603
177
  it 'returns different hash values' do
@@ -605,14 +179,14 @@ describe Mongo::Collection::View do
605
179
  end
606
180
  end
607
181
 
608
- context 'when two views only have different selectors' do
182
+ context 'when two views only have different filter' do
609
183
 
610
- let(:other_selector) do
184
+ let(:other_filter) do
611
185
  { 'name' => 'Emily' }
612
186
  end
613
187
 
614
188
  let(:other) do
615
- described_class.new(authorized_collection, other_selector, options)
189
+ described_class.new(authorized_collection, other_filter, options)
616
190
  end
617
191
 
618
192
  it 'returns different hash values' do
@@ -627,7 +201,7 @@ describe Mongo::Collection::View do
627
201
  end
628
202
 
629
203
  let(:other) do
630
- described_class.new(authorized_collection, selector, other_options)
204
+ described_class.new(authorized_collection, filter, other_options)
631
205
  end
632
206
 
633
207
  it 'returns different hash values' do
@@ -638,53 +212,111 @@ describe Mongo::Collection::View do
638
212
 
639
213
  describe '#initialize' do
640
214
 
641
- let(:options) do
642
- { :limit => 5 }
643
- end
215
+ context 'when the filter is not a valid document' do
644
216
 
645
- it 'sets the collection' do
646
- expect(view.collection).to eq(authorized_collection)
647
- end
217
+ let(:filter) do
218
+ 'y'
219
+ end
648
220
 
649
- it 'sets the selector' do
650
- expect(view.selector).to eq(selector)
221
+ let(:options) do
222
+ { limit: 5 }
223
+ end
224
+
225
+ it 'raises an error' do
226
+ expect do
227
+ view
228
+ end.to raise_error(Mongo::Error::InvalidDocument)
229
+ end
651
230
  end
652
231
 
653
- it 'dups the selector' do
654
- expect(view.selector).not_to be(selector)
232
+ context 'when the filter and options are standard' do
233
+
234
+ let(:filter) do
235
+ { 'name' => 'test' }
236
+ end
237
+
238
+ let(:options) do
239
+ { 'sort' => { 'name' => 1 }}
240
+ end
241
+
242
+ it 'parses a standard filter' do
243
+ expect(view.filter).to eq(filter)
244
+ end
245
+
246
+ it 'parses standard options' do
247
+ expect(view.options).to eq(options)
248
+ end
655
249
  end
656
250
 
657
- it 'sets the options' do
658
- expect(view.options).to eq(options)
251
+ context 'when the filter contains modifiers' do
252
+
253
+ let(:filter) do
254
+ { :$query => { :name => 'test' }, :$comment => 'testing' }
255
+ end
256
+
257
+ let(:options) do
258
+ { :sort => { name: 1 }}
259
+ end
260
+
261
+ it 'parses a standard filter' do
262
+ expect(view.filter).to eq('name' => 'test')
263
+ end
264
+
265
+ it 'parses standard options' do
266
+ expect(view.options).to eq('sort' => { 'name' => 1 }, 'comment' => 'testing')
267
+ end
659
268
  end
660
269
 
661
- it 'dups the options' do
662
- expect(view.options).not_to be(options)
270
+ context 'when the options contain modifiers' do
271
+
272
+ let(:filter) do
273
+ { 'name' => 'test' }
274
+ end
275
+
276
+ let(:options) do
277
+ { :sort => { name: 1 }, :modifiers => { :$comment => 'testing'}}
278
+ end
279
+
280
+ it 'parses a standard filter' do
281
+ expect(view.filter).to eq('name' => 'test')
282
+ end
283
+
284
+ it 'parses standard options' do
285
+ expect(view.options).to eq('sort' => { 'name' => 1 }, 'comment' => 'testing')
286
+ end
663
287
  end
664
288
 
665
- context 'when the selector is not a valid document' do
289
+ context 'when the filter and options both contain modifiers' do
666
290
 
667
- let(:selector) do
668
- 'y'
291
+ let(:filter) do
292
+ { :$query => { 'name' => 'test' }, :$hint => { name: 1 }}
669
293
  end
670
294
 
671
- it 'raises an error' do
672
- expect do
673
- view
674
- end.to raise_error(Mongo::Error::InvalidDocument)
295
+ let(:options) do
296
+ { :sort => { name: 1 }, :modifiers => { :$comment => 'testing' }}
297
+ end
298
+
299
+ it 'parses a standard filter' do
300
+ expect(view.filter).to eq('name' => 'test')
301
+ end
302
+
303
+ it 'parses standard options' do
304
+ expect(view.options).to eq(
305
+ 'sort' => { 'name' => 1 }, 'comment' => 'testing', 'hint' => { 'name' => 1 }
306
+ )
675
307
  end
676
308
  end
677
309
  end
678
310
 
679
311
  describe '#inspect' do
680
312
 
681
- context 'when there is a namespace, selector, and options' do
313
+ context 'when there is a namespace, filter, and options' do
682
314
 
683
315
  let(:options) do
684
- { :limit => 5 }
316
+ { 'limit' => 5 }
685
317
  end
686
318
 
687
- let(:selector) do
319
+ let(:filter) do
688
320
  { 'name' => 'Emily' }
689
321
  end
690
322
 
@@ -696,8 +328,8 @@ describe Mongo::Collection::View do
696
328
  expect(view.inspect).to match(/.*#{authorized_collection.namespace}.*/)
697
329
  end
698
330
 
699
- it 'returns a string containing the selector' do
700
- expect(view.inspect).to match(/.*#{selector.inspect}.*/)
331
+ it 'returns a string containing the filter' do
332
+ expect(view.inspect).to match(/.*#{filter.inspect}.*/)
701
333
  end
702
334
 
703
335
  it 'returns a string containing the options' do