mongo 1.12.5 → 2.0.0.beta

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 (437) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +64 -0
  5. data/LICENSE +1 -1
  6. data/README.md +23 -125
  7. data/Rakefile +26 -21
  8. data/bin/mongo_console +6 -38
  9. data/lib/mongo.rb +23 -82
  10. data/lib/mongo/address.rb +111 -0
  11. data/lib/mongo/address/ipv4.rb +85 -0
  12. data/lib/mongo/address/ipv6.rb +85 -0
  13. data/lib/mongo/address/unix.rb +76 -0
  14. data/lib/mongo/auth.rb +108 -0
  15. data/lib/mongo/auth/cr.rb +44 -0
  16. data/lib/mongo/auth/cr/conversation.rb +119 -0
  17. data/lib/mongo/auth/executable.rb +52 -0
  18. data/lib/mongo/auth/ldap.rb +48 -0
  19. data/lib/mongo/auth/ldap/conversation.rb +92 -0
  20. data/lib/mongo/auth/roles.rb +104 -0
  21. data/lib/mongo/auth/scram.rb +53 -0
  22. data/lib/mongo/auth/scram/conversation.rb +450 -0
  23. data/lib/mongo/auth/user.rb +159 -0
  24. data/lib/mongo/auth/user/view.rb +102 -0
  25. data/lib/mongo/auth/x509.rb +48 -0
  26. data/lib/mongo/auth/x509/conversation.rb +92 -0
  27. data/lib/mongo/{gridfs.rb → bulk.rb} +2 -5
  28. data/lib/mongo/bulk/bulk_write.rb +307 -0
  29. data/lib/mongo/client.rb +233 -0
  30. data/lib/mongo/cluster.rb +203 -0
  31. data/lib/mongo/cluster/topology.rb +60 -0
  32. data/lib/mongo/cluster/topology/replica_set.rb +160 -0
  33. data/lib/mongo/cluster/topology/sharded.rb +132 -0
  34. data/lib/mongo/cluster/topology/standalone.rb +132 -0
  35. data/lib/mongo/cluster/topology/unknown.rb +155 -0
  36. data/lib/mongo/collection.rb +130 -1101
  37. data/lib/mongo/collection/view.rb +169 -0
  38. data/lib/mongo/collection/view/aggregation.rb +108 -0
  39. data/lib/mongo/collection/view/explainable.rb +49 -0
  40. data/lib/mongo/collection/view/immutable.rb +43 -0
  41. data/lib/mongo/collection/view/iterable.rb +48 -0
  42. data/lib/mongo/collection/view/map_reduce.rb +191 -0
  43. data/lib/mongo/collection/view/readable.rb +363 -0
  44. data/lib/mongo/collection/view/writable.rb +169 -0
  45. data/lib/mongo/cursor.rb +79 -680
  46. data/lib/mongo/database.rb +224 -0
  47. data/lib/mongo/database/view.rb +101 -0
  48. data/lib/mongo/error.rb +81 -0
  49. data/lib/mongo/error/bulk_write_failure.rb +41 -0
  50. data/lib/mongo/{utils/thread_local_variable_manager.rb → error/empty_batch.rb} +22 -8
  51. data/{test/functional/db_connection_test.rb → lib/mongo/error/invalid_bulk_operation.rb} +19 -8
  52. data/lib/mongo/error/invalid_collection_name.rb +39 -0
  53. data/lib/mongo/error/invalid_database_name.rb +39 -0
  54. data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
  55. data/lib/mongo/error/invalid_file.rb +38 -0
  56. data/lib/mongo/error/invalid_nonce.rb +46 -0
  57. data/lib/mongo/error/invalid_replacement_document.rb +39 -0
  58. data/lib/mongo/error/invalid_signature.rb +47 -0
  59. data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
  60. data/lib/mongo/error/max_bson_size.rb +40 -0
  61. data/lib/mongo/error/max_message_size.rb +42 -0
  62. data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
  63. data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
  64. data/lib/mongo/error/parser.rb +77 -0
  65. data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
  66. data/lib/mongo/error/socket_timeout_error.rb +23 -0
  67. data/lib/mongo/error/unsupported_features.rb +43 -0
  68. data/lib/mongo/event.rb +40 -0
  69. data/lib/mongo/event/listeners.rb +63 -0
  70. data/lib/mongo/event/primary_elected.rb +53 -0
  71. data/lib/mongo/event/publisher.rb +42 -0
  72. data/lib/mongo/event/server_added.rb +53 -0
  73. data/lib/mongo/event/server_removed.rb +53 -0
  74. data/lib/mongo/event/subscriber.rb +41 -0
  75. data/lib/mongo/grid.rb +16 -0
  76. data/lib/mongo/grid/file.rb +94 -0
  77. data/lib/mongo/grid/file/chunk.rb +184 -0
  78. data/lib/mongo/grid/file/metadata.rb +223 -0
  79. data/lib/mongo/grid/fs.rb +149 -0
  80. data/lib/mongo/index.rb +64 -0
  81. data/lib/mongo/index/view.rb +205 -0
  82. data/lib/mongo/loggable.rb +126 -0
  83. data/lib/mongo/logger.rb +132 -0
  84. data/lib/mongo/operation.rb +26 -0
  85. data/lib/mongo/operation/aggregate.rb +100 -0
  86. data/lib/mongo/operation/aggregate/result.rb +84 -0
  87. data/lib/mongo/operation/batchable.rb +103 -0
  88. data/lib/mongo/operation/bulk_delete/result.rb +197 -0
  89. data/lib/mongo/operation/bulk_insert/result.rb +195 -0
  90. data/lib/mongo/operation/bulk_update/result.rb +295 -0
  91. data/lib/mongo/operation/command.rb +62 -0
  92. data/lib/mongo/operation/executable.rb +105 -0
  93. data/lib/mongo/operation/kill_cursors.rb +39 -0
  94. data/lib/mongo/operation/limited.rb +37 -0
  95. data/lib/mongo/operation/list_collections/result.rb +116 -0
  96. data/lib/mongo/operation/list_indexes/result.rb +118 -0
  97. data/lib/mongo/operation/map_reduce.rb +96 -0
  98. data/lib/mongo/operation/map_reduce/result.rb +122 -0
  99. data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
  100. data/lib/mongo/operation/read/collections_info.rb +67 -0
  101. data/lib/mongo/operation/read/get_more.rb +71 -0
  102. data/lib/mongo/operation/read/indexes.rb +68 -0
  103. data/lib/mongo/operation/read/list_collections.rb +75 -0
  104. data/lib/mongo/operation/read/list_indexes.rb +77 -0
  105. data/lib/mongo/operation/read/query.rb +71 -0
  106. data/lib/mongo/operation/read_preferrable.rb +34 -0
  107. data/lib/mongo/operation/result.rb +259 -0
  108. data/lib/mongo/operation/specifiable.rb +380 -0
  109. data/lib/mongo/operation/write.rb +25 -0
  110. data/lib/mongo/operation/write/bulk_delete.rb +158 -0
  111. data/lib/mongo/operation/write/bulk_insert.rb +160 -0
  112. data/lib/mongo/operation/write/bulk_update.rb +167 -0
  113. data/lib/mongo/{connection/socket/socket_util.rb → operation/write/command.rb} +9 -24
  114. data/lib/mongo/operation/write/command/create_user.rb +43 -0
  115. data/lib/mongo/operation/write/command/delete.rb +56 -0
  116. data/lib/mongo/operation/write/command/drop_index.rb +51 -0
  117. data/lib/mongo/operation/write/command/ensure_index.rb +55 -0
  118. data/lib/mongo/operation/write/command/insert.rb +55 -0
  119. data/lib/mongo/operation/write/command/remove_user.rb +42 -0
  120. data/lib/mongo/operation/write/command/update.rb +60 -0
  121. data/lib/mongo/operation/write/command/writable.rb +61 -0
  122. data/lib/mongo/operation/write/create_index.rb +84 -0
  123. data/lib/mongo/operation/write/create_user.rb +75 -0
  124. data/lib/mongo/operation/write/delete.rb +91 -0
  125. data/lib/mongo/operation/write/drop_index.rb +62 -0
  126. data/lib/mongo/operation/write/insert.rb +88 -0
  127. data/lib/mongo/operation/write/remove_user.rb +70 -0
  128. data/lib/mongo/operation/write/update.rb +98 -0
  129. data/lib/mongo/protocol.rb +15 -0
  130. data/lib/mongo/protocol/bit_vector.rb +61 -0
  131. data/lib/mongo/protocol/delete.rb +94 -0
  132. data/lib/mongo/protocol/get_more.rb +99 -0
  133. data/lib/mongo/protocol/insert.rb +99 -0
  134. data/lib/mongo/protocol/kill_cursors.rb +74 -0
  135. data/lib/mongo/protocol/message.rb +252 -0
  136. data/lib/mongo/protocol/query.rb +147 -0
  137. data/lib/mongo/protocol/reply.rb +72 -0
  138. data/lib/mongo/protocol/serializers.rb +180 -0
  139. data/lib/mongo/protocol/update.rb +111 -0
  140. data/lib/mongo/server.rb +163 -0
  141. data/lib/mongo/server/connectable.rb +99 -0
  142. data/lib/mongo/server/connection.rb +133 -0
  143. data/lib/mongo/server/connection_pool.rb +141 -0
  144. data/lib/mongo/server/connection_pool/queue.rb +182 -0
  145. data/lib/mongo/server/context.rb +66 -0
  146. data/lib/mongo/server/description.rb +450 -0
  147. data/lib/mongo/server/description/features.rb +85 -0
  148. data/lib/mongo/server/description/inspector.rb +79 -0
  149. data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
  150. data/lib/mongo/server/description/inspector/server_added.rb +59 -0
  151. data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
  152. data/lib/mongo/server/monitor.rb +160 -0
  153. data/lib/mongo/server/monitor/connection.rb +88 -0
  154. data/lib/mongo/server_selector.rb +81 -0
  155. data/lib/mongo/server_selector/nearest.rb +94 -0
  156. data/lib/mongo/server_selector/primary.rb +88 -0
  157. data/lib/mongo/server_selector/primary_preferred.rb +94 -0
  158. data/lib/mongo/server_selector/secondary.rb +91 -0
  159. data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
  160. data/lib/mongo/server_selector/selectable.rb +209 -0
  161. data/lib/mongo/socket.rb +179 -0
  162. data/lib/mongo/socket/ssl.rb +108 -0
  163. data/lib/mongo/socket/tcp.rb +69 -0
  164. data/lib/mongo/socket/unix.rb +66 -0
  165. data/lib/mongo/uri.rb +504 -0
  166. data/lib/mongo/version.rb +21 -0
  167. data/lib/mongo/write_concern.rb +99 -0
  168. data/lib/mongo/write_concern/acknowledged.rb +38 -0
  169. data/lib/mongo/write_concern/normalizable.rb +73 -0
  170. data/lib/mongo/write_concern/unacknowledged.rb +43 -0
  171. data/mongo.gemspec +17 -14
  172. data/spec/mongo/address/ipv4_spec.rb +74 -0
  173. data/spec/mongo/address/ipv6_spec.rb +74 -0
  174. data/spec/mongo/address/unix_spec.rb +30 -0
  175. data/spec/mongo/address_spec.rb +206 -0
  176. data/spec/mongo/auth/cr_spec.rb +59 -0
  177. data/spec/mongo/auth/ldap_spec.rb +40 -0
  178. data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
  179. data/spec/mongo/auth/scram_spec.rb +55 -0
  180. data/spec/mongo/auth/user/view_spec.rb +76 -0
  181. data/spec/mongo/auth/user_spec.rb +190 -0
  182. data/spec/mongo/auth/x509_spec.rb +40 -0
  183. data/spec/mongo/auth_spec.rb +65 -0
  184. data/spec/mongo/bulk/bulk_write_spec.rb +175 -0
  185. data/spec/mongo/client_spec.rb +564 -0
  186. data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
  187. data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
  188. data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
  189. data/spec/mongo/cluster/topology_spec.rb +65 -0
  190. data/spec/mongo/cluster_spec.rb +129 -0
  191. data/spec/mongo/collection/view/aggregation_spec.rb +135 -0
  192. data/spec/mongo/collection/view/explainable_spec.rb +32 -0
  193. data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
  194. data/spec/mongo/collection/view/readable_spec.rb +603 -0
  195. data/spec/mongo/collection/view/writable_spec.rb +504 -0
  196. data/spec/mongo/collection/view_spec.rb +521 -0
  197. data/spec/mongo/collection_spec.rb +362 -0
  198. data/spec/mongo/cursor_spec.rb +295 -0
  199. data/spec/mongo/database_spec.rb +306 -0
  200. data/spec/mongo/error/parser_spec.rb +119 -0
  201. data/spec/mongo/event/publisher_spec.rb +50 -0
  202. data/spec/mongo/event/subscriber_spec.rb +34 -0
  203. data/spec/mongo/grid/file/chunk_spec.rb +226 -0
  204. data/spec/mongo/grid/file/metadata_spec.rb +69 -0
  205. data/spec/mongo/grid/file_spec.rb +138 -0
  206. data/spec/mongo/grid/fs_spec.rb +129 -0
  207. data/spec/mongo/index/view_spec.rb +226 -0
  208. data/spec/mongo/loggable_spec.rb +62 -0
  209. data/spec/mongo/logger_spec.rb +97 -0
  210. data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
  211. data/spec/mongo/operation/aggregate_spec.rb +135 -0
  212. data/spec/mongo/operation/command_spec.rb +106 -0
  213. data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
  214. data/spec/mongo/operation/limited_spec.rb +50 -0
  215. data/spec/mongo/operation/map_reduce_spec.rb +143 -0
  216. data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
  217. data/spec/mongo/operation/read/get_more_spec.rb +81 -0
  218. data/spec/mongo/operation/read/indexes_spec.rb +31 -0
  219. data/spec/mongo/operation/read/query_spec.rb +84 -0
  220. data/spec/mongo/operation/result_spec.rb +275 -0
  221. data/spec/mongo/operation/specifiable_spec.rb +53 -0
  222. data/spec/mongo/operation/write/bulk_delete_spec.rb +473 -0
  223. data/spec/mongo/operation/write/bulk_insert_spec.rb +466 -0
  224. data/spec/mongo/operation/write/bulk_update_spec.rb +524 -0
  225. data/spec/mongo/operation/write/command/delete_spec.rb +116 -0
  226. data/spec/mongo/operation/write/command/insert_spec.rb +117 -0
  227. data/spec/mongo/operation/write/command/update_spec.rb +123 -0
  228. data/spec/mongo/operation/write/create_user_spec.rb +44 -0
  229. data/spec/mongo/operation/write/delete_spec.rb +178 -0
  230. data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
  231. data/spec/mongo/operation/write/ensure_index_spec.rb +81 -0
  232. data/spec/mongo/operation/write/insert_spec.rb +231 -0
  233. data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
  234. data/spec/mongo/operation/write/response_spec.rb +85 -0
  235. data/spec/mongo/operation/write/update_spec.rb +177 -0
  236. data/spec/mongo/protocol/delete_spec.rb +167 -0
  237. data/spec/mongo/protocol/get_more_spec.rb +146 -0
  238. data/spec/mongo/protocol/insert_spec.rb +161 -0
  239. data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
  240. data/spec/mongo/protocol/query_spec.rb +285 -0
  241. data/spec/mongo/protocol/reply_spec.rb +157 -0
  242. data/spec/mongo/protocol/update_spec.rb +186 -0
  243. data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
  244. data/spec/mongo/server/connection_pool_spec.rb +120 -0
  245. data/spec/mongo/server/connection_spec.rb +289 -0
  246. data/spec/mongo/server/description/features_spec.rb +138 -0
  247. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
  248. data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
  249. data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
  250. data/spec/mongo/server/description_spec.rb +510 -0
  251. data/spec/mongo/server/monitor_spec.rb +130 -0
  252. data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
  253. data/spec/mongo/server_selection_rtt_spec.rb +104 -0
  254. data/spec/mongo/server_selection_spec.rb +89 -0
  255. data/spec/mongo/server_selector/nearest_spec.rb +250 -0
  256. data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
  257. data/spec/mongo/server_selector/primary_spec.rb +114 -0
  258. data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
  259. data/spec/mongo/server_selector/secondary_spec.rb +196 -0
  260. data/spec/mongo/server_selector_spec.rb +101 -0
  261. data/spec/mongo/server_spec.rb +131 -0
  262. data/spec/mongo/uri_spec.rb +517 -0
  263. data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
  264. data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
  265. data/spec/mongo_orchestration_spec.rb +70 -0
  266. data/spec/spec_helper.rb +148 -0
  267. data/spec/support/authorization.rb +245 -0
  268. data/spec/support/helpers.rb +140 -0
  269. data/spec/support/matchers.rb +37 -0
  270. data/spec/support/mongo_orchestration.rb +61 -0
  271. data/spec/support/mongo_orchestration/requestable.rb +109 -0
  272. data/spec/support/mongo_orchestration/standalone.rb +57 -0
  273. data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
  274. data/spec/support/sdam/rs/discover_passives.yml +41 -0
  275. data/spec/support/sdam/rs/discover_primary.yml +40 -0
  276. data/spec/support/sdam/rs/discover_secondary.yml +41 -0
  277. data/spec/support/sdam/rs/discovery.yml +195 -0
  278. data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
  279. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
  280. data/spec/support/sdam/rs/member_reconfig.yml +68 -0
  281. data/spec/support/sdam/rs/member_standalone.yml +60 -0
  282. data/spec/support/sdam/rs/new_primary.yml +74 -0
  283. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
  284. data/spec/support/sdam/rs/non_rs_member.yml +31 -0
  285. data/spec/support/sdam/rs/normalize_case.yml +49 -0
  286. data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
  287. data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
  288. data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
  289. data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
  290. data/spec/support/sdam/rs/response_from_removed.yml +63 -0
  291. data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
  292. data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
  293. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
  294. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
  295. data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
  296. data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
  297. data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
  298. data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
  299. data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
  300. data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
  301. data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
  302. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
  303. data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
  304. data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
  305. data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
  306. data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
  307. data/spec/support/sdam/single/not_ok_response.yml +39 -0
  308. data/spec/support/sdam/single/standalone_removed.yml +32 -0
  309. data/spec/support/sdam/single/unavailable_seed.yml +28 -0
  310. data/spec/support/server_discovery_and_monitoring.rb +167 -0
  311. data/spec/support/server_selection.rb +140 -0
  312. data/spec/support/server_selection/rtt/first_value.yml +4 -0
  313. data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
  314. data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
  315. data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
  316. data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
  317. data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
  318. data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
  319. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +32 -0
  320. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +27 -0
  321. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +23 -0
  322. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +32 -0
  323. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +27 -0
  324. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +32 -0
  325. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +32 -0
  326. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +27 -0
  327. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +27 -0
  328. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +41 -0
  329. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +34 -0
  330. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +33 -0
  331. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +39 -0
  332. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +36 -0
  333. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +32 -0
  334. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +23 -0
  335. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +13 -0
  336. data/spec/support/server_selection_rtt.rb +41 -0
  337. data/spec/support/shared/bulk_write.rb +498 -0
  338. data/spec/support/shared/cursor.rb +38 -0
  339. data/spec/support/shared/operation.rb +77 -0
  340. data/spec/support/shared/protocol.rb +31 -0
  341. data/spec/support/shared/server_selector.rb +111 -0
  342. data/spec/support/shared/socket.rb +82 -0
  343. data/spec/support/travis.rb +14 -0
  344. metadata +523 -189
  345. metadata.gz.sig +0 -0
  346. data/VERSION +0 -1
  347. data/lib/mongo/bulk_write_collection_view.rb +0 -387
  348. data/lib/mongo/collection_writer.rb +0 -364
  349. data/lib/mongo/connection/node.rb +0 -249
  350. data/lib/mongo/connection/pool.rb +0 -340
  351. data/lib/mongo/connection/pool_manager.rb +0 -320
  352. data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
  353. data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
  354. data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
  355. data/lib/mongo/connection/socket/unix_socket.rb +0 -39
  356. data/lib/mongo/db.rb +0 -808
  357. data/lib/mongo/exception.rb +0 -145
  358. data/lib/mongo/functional/authentication.rb +0 -455
  359. data/lib/mongo/functional/logging.rb +0 -85
  360. data/lib/mongo/functional/read_preference.rb +0 -183
  361. data/lib/mongo/functional/scram.rb +0 -556
  362. data/lib/mongo/functional/uri_parser.rb +0 -409
  363. data/lib/mongo/functional/write_concern.rb +0 -66
  364. data/lib/mongo/gridfs/grid.rb +0 -112
  365. data/lib/mongo/gridfs/grid_ext.rb +0 -53
  366. data/lib/mongo/gridfs/grid_file_system.rb +0 -163
  367. data/lib/mongo/gridfs/grid_io.rb +0 -484
  368. data/lib/mongo/legacy.rb +0 -140
  369. data/lib/mongo/mongo_client.rb +0 -697
  370. data/lib/mongo/mongo_replica_set_client.rb +0 -535
  371. data/lib/mongo/mongo_sharded_client.rb +0 -159
  372. data/lib/mongo/networking.rb +0 -372
  373. data/lib/mongo/utils/conversions.rb +0 -110
  374. data/lib/mongo/utils/core_ext.rb +0 -70
  375. data/lib/mongo/utils/server_version.rb +0 -69
  376. data/lib/mongo/utils/support.rb +0 -80
  377. data/test/functional/authentication_test.rb +0 -39
  378. data/test/functional/bulk_api_stress_test.rb +0 -133
  379. data/test/functional/bulk_write_collection_view_test.rb +0 -1198
  380. data/test/functional/client_test.rb +0 -627
  381. data/test/functional/collection_test.rb +0 -2175
  382. data/test/functional/collection_writer_test.rb +0 -83
  383. data/test/functional/conversions_test.rb +0 -163
  384. data/test/functional/cursor_fail_test.rb +0 -57
  385. data/test/functional/cursor_message_test.rb +0 -56
  386. data/test/functional/cursor_test.rb +0 -683
  387. data/test/functional/db_api_test.rb +0 -835
  388. data/test/functional/db_test.rb +0 -348
  389. data/test/functional/grid_file_system_test.rb +0 -285
  390. data/test/functional/grid_io_test.rb +0 -252
  391. data/test/functional/grid_test.rb +0 -273
  392. data/test/functional/pool_test.rb +0 -136
  393. data/test/functional/safe_test.rb +0 -98
  394. data/test/functional/support_test.rb +0 -62
  395. data/test/functional/timeout_test.rb +0 -60
  396. data/test/functional/uri_test.rb +0 -446
  397. data/test/functional/write_concern_test.rb +0 -118
  398. data/test/helpers/general.rb +0 -50
  399. data/test/helpers/test_unit.rb +0 -476
  400. data/test/replica_set/authentication_test.rb +0 -37
  401. data/test/replica_set/basic_test.rb +0 -189
  402. data/test/replica_set/client_test.rb +0 -393
  403. data/test/replica_set/connection_test.rb +0 -138
  404. data/test/replica_set/count_test.rb +0 -66
  405. data/test/replica_set/cursor_test.rb +0 -220
  406. data/test/replica_set/insert_test.rb +0 -157
  407. data/test/replica_set/max_values_test.rb +0 -151
  408. data/test/replica_set/pinning_test.rb +0 -105
  409. data/test/replica_set/query_test.rb +0 -73
  410. data/test/replica_set/read_preference_test.rb +0 -219
  411. data/test/replica_set/refresh_test.rb +0 -211
  412. data/test/replica_set/replication_ack_test.rb +0 -95
  413. data/test/sharded_cluster/basic_test.rb +0 -203
  414. data/test/shared/authentication/basic_auth_shared.rb +0 -260
  415. data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
  416. data/test/shared/authentication/gssapi_shared.rb +0 -176
  417. data/test/shared/authentication/sasl_plain_shared.rb +0 -96
  418. data/test/shared/authentication/scram_shared.rb +0 -92
  419. data/test/shared/ssl_shared.rb +0 -235
  420. data/test/test_helper.rb +0 -61
  421. data/test/threading/basic_test.rb +0 -120
  422. data/test/tools/mongo_config.rb +0 -708
  423. data/test/tools/mongo_config_test.rb +0 -160
  424. data/test/unit/client_test.rb +0 -381
  425. data/test/unit/collection_test.rb +0 -166
  426. data/test/unit/connection_test.rb +0 -335
  427. data/test/unit/cursor_test.rb +0 -307
  428. data/test/unit/db_test.rb +0 -136
  429. data/test/unit/grid_test.rb +0 -76
  430. data/test/unit/mongo_sharded_client_test.rb +0 -48
  431. data/test/unit/node_test.rb +0 -93
  432. data/test/unit/pool_manager_test.rb +0 -111
  433. data/test/unit/read_pref_test.rb +0 -406
  434. data/test/unit/read_test.rb +0 -159
  435. data/test/unit/safe_test.rb +0 -158
  436. data/test/unit/sharding_pool_manager_test.rb +0 -84
  437. data/test/unit/write_concern_test.rb +0 -175
@@ -0,0 +1,169 @@
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/collection/view/immutable'
16
+ require 'mongo/collection/view/iterable'
17
+ require 'mongo/collection/view/explainable'
18
+ require 'mongo/collection/view/aggregation'
19
+ require 'mongo/collection/view/map_reduce'
20
+ require 'mongo/collection/view/readable'
21
+ require 'mongo/collection/view/writable'
22
+
23
+ module Mongo
24
+ class Collection
25
+
26
+ # Representation of a query and options producing a result set of documents.
27
+ #
28
+ # A +View+ can be modified using helpers. Helpers can be chained,
29
+ # as each one returns a +View+ if arguments are provided.
30
+ #
31
+ # The query message is sent to the server when a "terminator" is called.
32
+ # For example, when #each is called on a +View+, a Cursor object is
33
+ # created, which then sends the query to the server.
34
+ #
35
+ # A +View+ is not created directly by a user. Rather, +View+
36
+ # creates a +View+ when a CRUD operation is called and returns it to
37
+ # the user to interact with.
38
+ #
39
+ # @note The +View+ API is semipublic.
40
+ # @api semipublic
41
+ class View
42
+ extend Forwardable
43
+ include Enumerable
44
+ include Immutable
45
+ include Iterable
46
+ include Readable
47
+ include Explainable
48
+ include Writable
49
+
50
+ # @return [ View ] The +View+ to query.
51
+ attr_reader :collection
52
+ # @return [ Hash ] The query selector.
53
+ attr_reader :selector
54
+
55
+ # Delegate necessary operations to the collection.
56
+ def_delegators :collection, :client, :cluster, :database, :read_preference, :write_concern
57
+
58
+ # Delegate to the cluster for the next primary.
59
+ def_delegators :cluster, :next_primary
60
+
61
+ # Compare two +View+ objects.
62
+ #
63
+ # @example Compare the view with another object.
64
+ # view == other
65
+ #
66
+ # @return [ true, false ] Equal if collection, selector, and options of two
67
+ # +View+ match.
68
+ #
69
+ # @since 2.0.0
70
+ def ==(other)
71
+ return false unless other.is_a?(View)
72
+ collection == other.collection &&
73
+ selector == other.selector &&
74
+ options == other.options
75
+ end
76
+ alias_method :eql?, :==
77
+
78
+ # A hash value for the +View+ composed of the collection namespace,
79
+ # hash of the options and hash of the selector.
80
+ #
81
+ # @example Get the hash value.
82
+ # view.hash
83
+ #
84
+ # @return [ Integer ] A hash value of the +View+ object.
85
+ #
86
+ # @since 2.0.0
87
+ def hash
88
+ [ collection.namespace, options.hash, selector.hash ].hash
89
+ end
90
+
91
+ # Creates a new +View+.
92
+ #
93
+ # @example Find all users named Emily.
94
+ # View.new(collection, {:name => 'Emily'})
95
+ #
96
+ # @example Find all users named Emily skipping 5 and returning 10.
97
+ # View.new(collection, {:name => 'Emily'}, :skip => 5, :limit => 10)
98
+ #
99
+ # @example Find all users named Emily using a specific read preference.
100
+ # View.new(collection, {:name => 'Emily'}, :read => :secondary_preferred)
101
+ #
102
+ # @param [ Collection ] collection The +Collection+ to query.
103
+ # @param [ Hash ] selector The query selector.
104
+ # @param [ Hash ] options The additional query options.
105
+ #
106
+ # @option options :comment [ String ] Associate a comment with the query.
107
+ # @option options :batch_size [ Integer ] The number of docs to return in
108
+ # each response from MongoDB.
109
+ # @option options :fields [ Hash ] The fields to include or exclude in
110
+ # returned docs.
111
+ # @option options :hint [ Hash ] Override default index selection and force
112
+ # MongoDB to use a specific index for the query.
113
+ # @option options :limit [ Integer ] Max number of docs to return.
114
+ # @option options :max_scan [ Integer ] Constrain the query to only scan the
115
+ # specified number of docs. Use to prevent queries from running too long.
116
+ # @option options :read [ Symbol ] The read preference to use for the query.
117
+ # If none is provided, the collection's default read preference is used.
118
+ # @option options :show_disk_loc [ true, false ] Return disk location info as
119
+ # a field in each doc.
120
+ # @option options :skip [ Integer ] The number of documents to skip.
121
+ # @option options :snapshot [ true, false ] Prevents returning a doc more than
122
+ # once.
123
+ # @option options :sort [ Hash ] The key and direction pairs used to sort the
124
+ # results.
125
+ #
126
+ # @since 2.0.0
127
+ def initialize(collection, selector = {}, options = {})
128
+ @collection = collection
129
+ @selector = selector.dup
130
+ @options = options.dup
131
+ end
132
+
133
+ # Get a human-readable string representation of +View+.
134
+ #
135
+ # @example Get the inspection.
136
+ # view.inspect
137
+ #
138
+ # @return [ String ] A string representation of a +View+ instance.
139
+ #
140
+ # @since 2.0.0
141
+ def inspect
142
+ "<Mongo::Collection::View:0x#{object_id} namespace='#{collection.namespace}" +
143
+ " @selector=#{selector.inspect} @options=#{options.inspect}>"
144
+ end
145
+
146
+ private
147
+
148
+ def initialize_copy(other)
149
+ @collection = other.collection
150
+ @options = other.options.dup
151
+ @selector = other.selector.dup
152
+ end
153
+
154
+ def initial_query_op
155
+ Operation::Read::Query.new(query_spec)
156
+ end
157
+
158
+ def new(options)
159
+ View.new(collection, selector, options)
160
+ end
161
+
162
+ def send_initial_query(server)
163
+ initial_query_op.execute(server.context)
164
+ end
165
+
166
+ def view; self; end
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,108 @@
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
+ class Collection
17
+ class View
18
+
19
+ # Provides behaviour around an aggregation pipeline on a collection view.
20
+ #
21
+ # @since 2.0.0
22
+ class Aggregation
23
+ extend Forwardable
24
+ include Enumerable
25
+ include Immutable
26
+ include Iterable
27
+ include Explainable
28
+
29
+ # @return [ View ] view The collection view.
30
+ attr_reader :view
31
+ # @return [ Array<Hash> ] pipeline The aggregation pipeline.
32
+ attr_reader :pipeline
33
+
34
+ # Delegate necessary operations to the view.
35
+ def_delegators :view, :collection, :read, :cluster
36
+
37
+ # Delegate necessary operations to the collection.
38
+ def_delegators :collection, :database
39
+
40
+ # Set to true if disk usage is allowed during the aggregation.
41
+ #
42
+ # @example Set disk usage flag.
43
+ # aggregation.allow_disk_use(true)
44
+ #
45
+ # @param [ true, false ] value The flag value.
46
+ #
47
+ # @return [ true, false, Aggregation ] The aggregation if a value was
48
+ # set or the value if used as a getter.
49
+ #
50
+ # @since 2.0.0
51
+ def allow_disk_use(value = nil)
52
+ configure(:allowDiskUse, value)
53
+ end
54
+
55
+ # Initialize the aggregation for the provided collection view, pipeline
56
+ # and options.
57
+ #
58
+ # @example Create the new aggregation view.
59
+ # Aggregation.view.new(view, pipeline)
60
+ #
61
+ # @param [ Collection::View ] view The collection view.
62
+ # @param [ Array<Hash> ] pipeline The pipeline of operations.
63
+ # @param [ Hash ] options The aggregation options.
64
+ #
65
+ # @since 2.0.0
66
+ def initialize(view, pipeline, options = {})
67
+ @view = view
68
+ @pipeline = pipeline.dup
69
+ @options = options.dup
70
+ end
71
+
72
+ private
73
+
74
+ def aggregate_spec
75
+ { :selector => {
76
+ :aggregate => collection.name,
77
+ :pipeline => pipeline,
78
+ :cursor => view.batch_size ? { :batchSize => view.batch_size } : {}
79
+ }.merge!(options),
80
+ :db_name => database.name,
81
+ :options => view.options }
82
+ end
83
+
84
+ def explain_options
85
+ { :explain => true }
86
+ end
87
+
88
+ def new(options)
89
+ Aggregation.new(view, pipeline, options)
90
+ end
91
+
92
+ def initial_query_op
93
+ Operation::Aggregate.new(aggregate_spec)
94
+ end
95
+
96
+ def send_initial_query(server)
97
+ begin
98
+ initial_query_op.execute(server.context)
99
+ rescue Mongo::Operation::Aggregate::NeedPrimaryServer
100
+ warn 'Rerouting the Aggregation operation to the primary server.'
101
+ server = ServerSelector.get(mode: :primary).select_server(cluster)
102
+ initial_query_op.execute(server.context)
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,49 @@
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
+ class Collection
17
+ class View
18
+
19
+ # Defines explain related behaviour for collection view.
20
+ #
21
+ # @since 2.0.0
22
+ module Explainable
23
+
24
+ # Get the explain plan for the query.
25
+ #
26
+ # @example Get the explain plan for the query.
27
+ # view.explain
28
+ #
29
+ # @return [ Hash ] A single document with the explain plan.
30
+ #
31
+ # @since 2.0.0
32
+ def explain
33
+ self.class.new(collection, selector, options.merge(explain_options)).first
34
+ end
35
+
36
+ private
37
+
38
+ def explained?
39
+ !!options[:explain]
40
+ end
41
+
42
+ def explain_options
43
+ explain_limit = limit || 0
44
+ { :limit => -explain_limit.abs, :explain => true }
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,43 @@
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
+ class Collection
17
+ class View
18
+ module Immutable
19
+
20
+ # @return [ Hash ] options The additional query options.
21
+ attr_reader :options
22
+
23
+ private
24
+
25
+ # @api private
26
+ #
27
+ # @note In the including class, the method #immutable needs to be
28
+ # implemented in order to define how a new class of that type needs to
29
+ # be instantiated.
30
+ def configure(field, value)
31
+ return options[field] if value.nil?
32
+ new(options.merge(field => value))
33
+ end
34
+
35
+ def configure_flag(flag)
36
+ new(options.dup).tap do |view|
37
+ view.send(:flags).push(flag)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,48 @@
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
+ class Collection
17
+ class View
18
+
19
+ # Defines iteration related behaviour for collection views, including
20
+ # cursor instantiation.
21
+ #
22
+ # @since 2.0.0
23
+ module Iterable
24
+
25
+ # Iterate through documents returned by a query with this +View+.
26
+ #
27
+ # @example Iterate through the result of the view.
28
+ # view.each do |document|
29
+ # p document
30
+ # end
31
+ #
32
+ # @return [ Enumerator ] The enumerator.
33
+ #
34
+ # @since 2.0.0
35
+ #
36
+ # @yieldparam [ Hash ] Each matching document.
37
+ def each
38
+ server = read.select_server(cluster)
39
+ cursor = Cursor.new(view, send_initial_query(server), server).to_enum
40
+ cursor.each do |doc|
41
+ yield doc
42
+ end if block_given?
43
+ cursor
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,191 @@
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
+ class Collection
17
+ class View
18
+
19
+ # Provides behaviour around a map/reduce operation on the collection
20
+ # view.
21
+ #
22
+ # @since 2.0.0
23
+ class MapReduce
24
+ extend Forwardable
25
+ include Enumerable
26
+ include Immutable
27
+ include Iterable
28
+
29
+ # @return [ View ] view The collection view.
30
+ attr_reader :view
31
+
32
+ # @return [ String ] map The map function.
33
+ attr_reader :map
34
+
35
+ # @return [ String ] reduce The reduce function.
36
+ attr_reader :reduce
37
+
38
+ # Delegate necessary operations to the view.
39
+ def_delegators :view, :collection, :read, :cluster
40
+
41
+ # Delegate necessary operations to the collection.
42
+ def_delegators :collection, :database
43
+
44
+ # Set or get the finalize function for the operation.
45
+ #
46
+ # @example Set the finalize function.
47
+ # map_reduce.finalize(function)
48
+ #
49
+ # @param [ String ] function The finalize js function.
50
+ #
51
+ # @return [ MapReduce, String ] The new MapReduce operation or the
52
+ # value of the function.
53
+ #
54
+ # @since 2.0.0
55
+ def finalize(function = nil)
56
+ configure(:finalize, function)
57
+ end
58
+
59
+ # Initialize the map/reduce for the provided collection view, functions
60
+ # and options.
61
+ #
62
+ # @example Create the new map/reduce view.
63
+ #
64
+ # @param [ Collection::View ] view The collection view.
65
+ # @param [ String ] map The map function.
66
+ # @param [ String ] reduce The reduce function.
67
+ # @param [ Hash ] options The map/reduce options.
68
+ #
69
+ # @since 2.0.0
70
+ def initialize(view, map, reduce, options = {})
71
+ @view = view
72
+ @map = map.freeze
73
+ @reduce = reduce.freeze
74
+ @options = options.dup
75
+ end
76
+
77
+ # Set or get the jsMode flag for the operation.
78
+ #
79
+ # @example Set js mode for the operation.
80
+ # map_reduce.js_mode(true)
81
+ #
82
+ # @param [ true, false ] value The jsMode value.
83
+ #
84
+ # @return [ MapReduce, true, false ] The new MapReduce operation or the
85
+ # value of the jsMode flag.
86
+ #
87
+ # @since 2.0.0
88
+ def js_mode(value = nil)
89
+ configure(:jsMode, value)
90
+ end
91
+
92
+ # Set or get the output location for the operation.
93
+ #
94
+ # @example Set the output to inline.
95
+ # map_reduce.out(inline: 1)
96
+ #
97
+ # @example Set the output collection to merge.
98
+ # map_reduce.out(merge: 'users')
99
+ #
100
+ # @example Set the output collection to replace.
101
+ # map_reduce.out(replace: 'users')
102
+ #
103
+ # @example Set the output collection to reduce.
104
+ # map_reduce.out(reduce: 'users')
105
+ #
106
+ # @param [ Hash ] location The output location details.
107
+ #
108
+ # @return [ MapReduce, Hash ] The new MapReduce operation or the value
109
+ # of the output location.
110
+ #
111
+ # @since 2.0.0
112
+ def out(location = nil)
113
+ configure(:out, location)
114
+ end
115
+
116
+ # Set or get a scope on the operation.
117
+ #
118
+ # @example Set the scope value.
119
+ # map_reduce.scope(value: 'test')
120
+ #
121
+ # @param [ Hash ] object The scope object.
122
+ #
123
+ # @return [ MapReduce, Hash ] The new MapReduce operation or thevalue
124
+ # of the scope.
125
+ #
126
+ # @since 2.0.0
127
+ def scope(object = nil)
128
+ configure(:scope, object)
129
+ end
130
+
131
+ private
132
+
133
+ def inline?
134
+ out.nil? || out == { inline: 1 }
135
+ end
136
+
137
+ def map_reduce_spec
138
+ {
139
+ :db_name => database.name,
140
+ :selector => {
141
+ :mapreduce => collection.name,
142
+ :map => map,
143
+ :reduce => reduce,
144
+ :query => view.selector[:$query] || view.selector,
145
+ :out => { inline: 1 }
146
+ }.merge(options).merge(view.options)
147
+ }
148
+ end
149
+
150
+ def new(options)
151
+ MapReduce.new(view, map, reduce, options)
152
+ end
153
+
154
+ def initial_query_op
155
+ Operation::MapReduce.new(map_reduce_spec)
156
+ end
157
+
158
+ def send_initial_query(server)
159
+ result =
160
+ begin
161
+ initial_query_op.execute(server.context)
162
+ rescue Mongo::Error::NeedPrimaryServer
163
+ warn 'Rerouting the MapReduce operation to the primary server.'
164
+ server = ServerSelector.get(mode: :primary).select_server(cluster)
165
+ initial_query_op.execute(server.context)
166
+ end
167
+ if inline?
168
+ result
169
+ else
170
+ send_fetch_query(server)
171
+ end
172
+ end
173
+
174
+ def fetch_query_spec
175
+ { :selector => {},
176
+ :options => {},
177
+ :db_name => database.name,
178
+ :coll_name => out.values.first }
179
+ end
180
+
181
+ def fetch_query_op
182
+ Operation::Read::Query.new(fetch_query_spec)
183
+ end
184
+
185
+ def send_fetch_query(server)
186
+ fetch_query_op.execute(server.context)
187
+ end
188
+ end
189
+ end
190
+ end
191
+ end