mongo 2.5.1 → 2.5.2

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 (275) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +3 -2
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +1 -1
  5. data/lib/mongo/auth/user/view.rb +4 -4
  6. data/lib/mongo/bulk_write.rb +14 -19
  7. data/lib/mongo/cluster.rb +4 -2
  8. data/lib/mongo/cluster/app_metadata.rb +1 -1
  9. data/lib/mongo/cluster/reapers/cursor_reaper.rb +1 -1
  10. data/lib/mongo/collection.rb +13 -13
  11. data/lib/mongo/collection/view.rb +2 -1
  12. data/lib/mongo/collection/view/aggregation.rb +1 -1
  13. data/lib/mongo/collection/view/change_stream.rb +1 -1
  14. data/lib/mongo/collection/view/iterable.rb +4 -4
  15. data/lib/mongo/collection/view/map_reduce.rb +3 -3
  16. data/lib/mongo/collection/view/readable.rb +26 -20
  17. data/lib/mongo/collection/view/writable.rb +12 -12
  18. data/lib/mongo/cursor.rb +4 -7
  19. data/lib/mongo/database.rb +2 -2
  20. data/lib/mongo/database/view.rb +1 -1
  21. data/lib/mongo/grid/stream/write.rb +1 -1
  22. data/lib/mongo/index/view.rb +3 -3
  23. data/lib/mongo/operation.rb +38 -24
  24. data/lib/mongo/operation/aggregate.rb +53 -0
  25. data/lib/mongo/operation/aggregate/command.rb +59 -0
  26. data/lib/mongo/operation/aggregate/op_msg.rb +54 -0
  27. data/lib/mongo/operation/aggregate/result.rb +87 -0
  28. data/lib/mongo/operation/collections_info.rb +62 -0
  29. data/lib/mongo/operation/collections_info/result.rb +39 -0
  30. data/lib/mongo/operation/{executable.rb → command.rb} +16 -13
  31. data/lib/mongo/operation/command/command.rb +38 -0
  32. data/lib/mongo/operation/command/op_msg.rb +53 -0
  33. data/lib/mongo/operation/count.rb +48 -0
  34. data/lib/mongo/operation/count/command.rb +38 -0
  35. data/lib/mongo/operation/count/op_msg.rb +38 -0
  36. data/lib/mongo/operation/create.rb +48 -0
  37. data/lib/mongo/operation/create/command.rb +38 -0
  38. data/lib/mongo/operation/create/op_msg.rb +37 -0
  39. data/lib/mongo/operation/create_index.rb +48 -0
  40. data/lib/mongo/operation/create_index/command.rb +42 -0
  41. data/lib/mongo/operation/create_index/op_msg.rb +41 -0
  42. data/lib/mongo/operation/create_user.rb +48 -0
  43. data/lib/mongo/operation/{commands → create_user}/command.rb +13 -19
  44. data/lib/mongo/operation/create_user/op_msg.rb +41 -0
  45. data/lib/mongo/operation/delete.rb +38 -0
  46. data/lib/mongo/operation/delete/bulk_result.rb +46 -0
  47. data/lib/mongo/operation/delete/command.rb +59 -0
  48. data/lib/mongo/operation/delete/legacy.rb +69 -0
  49. data/lib/mongo/operation/delete/op_msg.rb +60 -0
  50. data/lib/mongo/operation/{write/delete → delete}/result.rb +18 -16
  51. data/lib/mongo/operation/distinct.rb +48 -0
  52. data/lib/mongo/operation/distinct/command.rb +38 -0
  53. data/lib/mongo/operation/distinct/op_msg.rb +38 -0
  54. data/lib/mongo/operation/drop.rb +48 -0
  55. data/lib/mongo/operation/drop/command.rb +38 -0
  56. data/lib/mongo/operation/{commands/count.rb → drop/op_msg.rb} +16 -6
  57. data/lib/mongo/operation/drop_database.rb +48 -0
  58. data/lib/mongo/operation/drop_database/command.rb +38 -0
  59. data/lib/mongo/operation/drop_database/op_msg.rb +37 -0
  60. data/lib/mongo/operation/drop_index.rb +48 -0
  61. data/lib/mongo/operation/drop_index/command.rb +42 -0
  62. data/lib/mongo/operation/{limited.rb → drop_index/op_msg.rb} +19 -15
  63. data/lib/mongo/operation/explain.rb +52 -0
  64. data/lib/mongo/operation/explain/command.rb +54 -0
  65. data/lib/mongo/operation/explain/legacy.rb +53 -0
  66. data/lib/mongo/operation/explain/op_msg.rb +54 -0
  67. data/lib/mongo/operation/explain/result.rb +50 -0
  68. data/lib/mongo/operation/find.rb +52 -0
  69. data/lib/mongo/operation/find/command.rb +54 -0
  70. data/lib/mongo/operation/find/legacy.rb +55 -0
  71. data/lib/mongo/operation/{read/query → find/legacy}/result.rb +3 -3
  72. data/lib/mongo/operation/find/op_msg.rb +59 -0
  73. data/lib/mongo/operation/find/result.rb +60 -0
  74. data/lib/mongo/operation/{commands/users_info/result.rb → get_more.rb} +20 -22
  75. data/lib/mongo/operation/get_more/command.rb +54 -0
  76. data/lib/mongo/operation/{commands/find.rb → get_more/legacy.rb} +15 -8
  77. data/lib/mongo/operation/get_more/op_msg.rb +58 -0
  78. data/lib/mongo/operation/get_more/result.rb +60 -0
  79. data/lib/mongo/operation/indexes.rb +52 -0
  80. data/lib/mongo/operation/indexes/command.rb +54 -0
  81. data/lib/mongo/operation/indexes/legacy.rb +57 -0
  82. data/lib/mongo/operation/indexes/op_msg.rb +54 -0
  83. data/lib/mongo/operation/indexes/result.rb +97 -0
  84. data/lib/mongo/operation/insert.rb +40 -0
  85. data/lib/mongo/operation/insert/bulk_result.rb +70 -0
  86. data/lib/mongo/operation/insert/command.rb +65 -0
  87. data/lib/mongo/operation/insert/legacy.rb +72 -0
  88. data/lib/mongo/operation/insert/op_msg.rb +61 -0
  89. data/lib/mongo/operation/insert/result.rb +64 -0
  90. data/lib/mongo/operation/kill_cursors.rb +25 -14
  91. data/lib/mongo/operation/{takes_write_concern.rb → kill_cursors/command.rb} +14 -12
  92. data/lib/mongo/operation/kill_cursors/legacy.rb +37 -0
  93. data/lib/mongo/operation/kill_cursors/op_msg.rb +37 -0
  94. data/lib/mongo/operation/list_collections.rb +49 -0
  95. data/lib/mongo/operation/list_collections/command.rb +60 -0
  96. data/lib/mongo/operation/list_collections/op_msg.rb +53 -0
  97. data/lib/mongo/operation/list_collections/result.rb +92 -0
  98. data/lib/mongo/operation/map_reduce.rb +49 -0
  99. data/lib/mongo/operation/map_reduce/command.rb +55 -0
  100. data/lib/mongo/operation/map_reduce/op_msg.rb +54 -0
  101. data/lib/mongo/operation/map_reduce/result.rb +129 -0
  102. data/lib/mongo/operation/parallel_scan.rb +49 -0
  103. data/lib/mongo/operation/parallel_scan/command.rb +67 -0
  104. data/lib/mongo/operation/parallel_scan/op_msg.rb +61 -0
  105. data/lib/mongo/operation/parallel_scan/result.rb +61 -0
  106. data/lib/mongo/operation/remove_user.rb +48 -0
  107. data/lib/mongo/operation/remove_user/command.rb +42 -0
  108. data/lib/mongo/operation/remove_user/op_msg.rb +41 -0
  109. data/lib/mongo/operation/result.rb +3 -1
  110. data/lib/mongo/operation/shared/bypass_document_validation.rb +36 -0
  111. data/lib/mongo/operation/{causally_consistent.rb → shared/causal_consistency_supported.rb} +5 -5
  112. data/lib/mongo/operation/shared/executable.rb +45 -0
  113. data/lib/mongo/operation/shared/idable.rb +64 -0
  114. data/lib/mongo/operation/{commands/distinct.rb → shared/limited.rb} +10 -7
  115. data/lib/mongo/operation/{object_id_generator.rb → shared/object_id_generator.rb} +2 -2
  116. data/lib/mongo/operation/{read_preference.rb → shared/read_preference_supported.rb} +14 -24
  117. data/lib/mongo/operation/shared/result/aggregatable.rb +75 -0
  118. data/lib/mongo/operation/shared/sessions_supported.rb +79 -0
  119. data/lib/mongo/operation/{specifiable.rb → shared/specifiable.rb} +40 -4
  120. data/lib/mongo/operation/shared/write.rb +81 -0
  121. data/lib/mongo/operation/shared/write_concern_supported.rb +39 -0
  122. data/lib/mongo/operation/update.rb +38 -0
  123. data/lib/mongo/operation/update/bulk_result.rb +126 -0
  124. data/lib/mongo/operation/update/command.rb +60 -0
  125. data/lib/mongo/operation/update/legacy.rb +80 -0
  126. data/lib/mongo/operation/{write/update → update/legacy}/result.rb +4 -82
  127. data/lib/mongo/operation/update/op_msg.rb +60 -0
  128. data/lib/mongo/operation/update/result.rb +102 -0
  129. data/lib/mongo/operation/update_user.rb +48 -0
  130. data/lib/mongo/operation/update_user/command.rb +41 -0
  131. data/lib/mongo/operation/update_user/op_msg.rb +41 -0
  132. data/lib/mongo/operation/users_info.rb +49 -0
  133. data/lib/mongo/operation/users_info/command.rb +58 -0
  134. data/lib/mongo/operation/users_info/op_msg.rb +57 -0
  135. data/lib/mongo/operation/{commands/collections_info → users_info}/result.rb +18 -17
  136. data/lib/mongo/server.rb +3 -5
  137. data/lib/mongo/server/connectable.rb +3 -3
  138. data/lib/mongo/server/connection.rb +14 -0
  139. data/lib/mongo/server_selector.rb +1 -1
  140. data/lib/mongo/server_selector/selectable.rb +3 -12
  141. data/lib/mongo/session.rb +13 -1
  142. data/lib/mongo/session/session_pool.rb +1 -1
  143. data/lib/mongo/version.rb +1 -1
  144. data/spec/mongo/client_spec.rb +15 -22
  145. data/spec/mongo/cluster/app_metadata_spec.rb +19 -3
  146. data/spec/mongo/cluster/cursor_reaper_spec.rb +37 -0
  147. data/spec/mongo/cluster_spec.rb +2 -2
  148. data/spec/mongo/collection/view/change_stream_spec.rb +2 -2
  149. data/spec/mongo/collection_spec.rb +105 -14
  150. data/spec/mongo/cursor_spec.rb +11 -11
  151. data/spec/mongo/grid/fs_bucket_spec.rb +5 -0
  152. data/spec/mongo/max_staleness_spec.rb +3 -1
  153. data/spec/mongo/operation/{commands/aggregate → aggregate}/result_spec.rb +1 -1
  154. data/spec/mongo/operation/{commands/aggregate_spec.rb → aggregate_spec.rb} +1 -1
  155. data/spec/mongo/operation/{commands/collections_info_spec.rb → collections_info_spec.rb} +4 -2
  156. data/spec/mongo/operation/{commands/command_spec.rb → command_spec.rb} +1 -1
  157. data/spec/mongo/operation/{write/command/create_index_spec.rb → create_index_spec.rb} +1 -1
  158. data/spec/mongo/operation/{write/create_user_spec.rb → create_user_spec.rb} +1 -1
  159. data/spec/mongo/operation/{write/bulk/delete_spec.rb → delete/bulk_spec.rb} +8 -8
  160. data/spec/mongo/operation/delete/command_spec.rb +111 -0
  161. data/spec/mongo/operation/{write/command/delete_spec.rb → delete/op_msg_spec.rb} +40 -34
  162. data/spec/mongo/operation/{write/delete_spec.rb → delete_spec.rb} +7 -7
  163. data/spec/mongo/operation/{write/command/drop_index_spec.rb → drop_index_spec.rb} +1 -1
  164. data/spec/mongo/operation/{read/query_spec.rb → find/legacy_spec.rb} +2 -2
  165. data/spec/mongo/operation/{read/get_more_spec.rb → get_more_spec.rb} +3 -3
  166. data/spec/mongo/operation/{commands/indexes_spec.rb → indexes_spec.rb} +6 -4
  167. data/spec/mongo/operation/{write/bulk/insert_spec.rb → insert/bulk_spec.rb} +9 -9
  168. data/spec/mongo/operation/insert/command_spec.rb +110 -0
  169. data/spec/mongo/operation/{write/command/insert_spec.rb → insert/op_msg_spec.rb} +51 -41
  170. data/spec/mongo/operation/{write/insert_spec.rb → insert_spec.rb} +2 -2
  171. data/spec/mongo/operation/kill_cursors_spec.rb +2 -2
  172. data/spec/mongo/operation/limited_spec.rb +3 -3
  173. data/spec/mongo/operation/{commands/map_reduce_spec.rb → map_reduce_spec.rb} +1 -1
  174. data/spec/mongo/operation/read_preference_spec.rb +2 -2
  175. data/spec/mongo/operation/{write/command/remove_user_spec.rb → remove_user_spec.rb} +1 -1
  176. data/spec/mongo/operation/{write/bulk/update_spec.rb → update/bulk_spec.rb} +8 -8
  177. data/spec/mongo/operation/update/command_spec.rb +114 -0
  178. data/spec/mongo/operation/{write/command/update_spec.rb → update/op_msg_spec.rb} +49 -40
  179. data/spec/mongo/operation/{write/update_spec.rb → update_spec.rb} +6 -6
  180. data/spec/mongo/operation/{write/command/update_user_spec.rb → update_user_spec.rb} +1 -1
  181. data/spec/mongo/server/connection_spec.rb +0 -22
  182. data/spec/mongo/server_selector_spec.rb +55 -0
  183. data/spec/mongo/server_spec.rb +0 -42
  184. data/spec/mongo/session/session_pool_spec.rb +1 -1
  185. data/spec/mongo/uri/srv_protocol_spec.rb +2 -2
  186. data/spec/mongo/uri_spec.rb +2 -2
  187. data/spec/support/gridfs_tests/delete.yml +4 -38
  188. data/spec/support/gridfs_tests/download.yml +12 -30
  189. data/spec/support/server_selection.rb +1 -1
  190. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +0 -1
  191. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_multiple.yml +0 -1
  192. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +0 -1
  193. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PossiblePrimary.yml +15 -0
  194. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PossiblePrimaryNearest.yml +15 -0
  195. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +0 -3
  196. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +0 -1
  197. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +0 -1
  198. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +0 -1
  199. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +0 -1
  200. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +0 -1
  201. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +0 -1
  202. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +0 -1
  203. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_multiple.yml +0 -1
  204. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +0 -1
  205. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +0 -3
  206. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +0 -1
  207. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +0 -1
  208. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml +0 -1
  209. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +0 -1
  210. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +0 -1
  211. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +0 -1
  212. data/spec/support/server_selection/selection/Sharded/read/Nearest.yml +21 -0
  213. data/spec/support/server_selection/selection/Sharded/read/Primary.yml +19 -0
  214. data/spec/support/server_selection/selection/Sharded/read/PrimaryPreferred.yml +21 -0
  215. data/spec/support/server_selection/selection/Sharded/read/Secondary.yml +21 -0
  216. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +0 -5
  217. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +0 -1
  218. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +0 -1
  219. data/spec/support/shared/session.rb +46 -5
  220. metadata +174 -116
  221. metadata.gz.sig +1 -2
  222. data/lib/mongo/operation/commands.rb +0 -31
  223. data/lib/mongo/operation/commands/aggregate.rb +0 -63
  224. data/lib/mongo/operation/commands/aggregate/result.rb +0 -89
  225. data/lib/mongo/operation/commands/collections_info.rb +0 -71
  226. data/lib/mongo/operation/commands/create.rb +0 -49
  227. data/lib/mongo/operation/commands/drop.rb +0 -49
  228. data/lib/mongo/operation/commands/drop_database.rb +0 -49
  229. data/lib/mongo/operation/commands/explain.rb +0 -27
  230. data/lib/mongo/operation/commands/explain/result.rb +0 -52
  231. data/lib/mongo/operation/commands/find/result.rb +0 -62
  232. data/lib/mongo/operation/commands/get_more.rb +0 -27
  233. data/lib/mongo/operation/commands/get_more/result.rb +0 -62
  234. data/lib/mongo/operation/commands/indexes.rb +0 -73
  235. data/lib/mongo/operation/commands/list_collections.rb +0 -48
  236. data/lib/mongo/operation/commands/list_collections/result.rb +0 -94
  237. data/lib/mongo/operation/commands/list_indexes.rb +0 -48
  238. data/lib/mongo/operation/commands/list_indexes/result.rb +0 -98
  239. data/lib/mongo/operation/commands/map_reduce.rb +0 -65
  240. data/lib/mongo/operation/commands/map_reduce/result.rb +0 -131
  241. data/lib/mongo/operation/commands/parallel_scan.rb +0 -54
  242. data/lib/mongo/operation/commands/parallel_scan/result.rb +0 -64
  243. data/lib/mongo/operation/commands/users_info.rb +0 -52
  244. data/lib/mongo/operation/read.rb +0 -16
  245. data/lib/mongo/operation/read/get_more.rb +0 -52
  246. data/lib/mongo/operation/read/query.rb +0 -55
  247. data/lib/mongo/operation/uses_command_op_msg.rb +0 -78
  248. data/lib/mongo/operation/write.rb +0 -22
  249. data/lib/mongo/operation/write/bulk.rb +0 -20
  250. data/lib/mongo/operation/write/bulk/bulkable.rb +0 -82
  251. data/lib/mongo/operation/write/bulk/delete.rb +0 -71
  252. data/lib/mongo/operation/write/bulk/delete/result.rb +0 -71
  253. data/lib/mongo/operation/write/bulk/insert.rb +0 -96
  254. data/lib/mongo/operation/write/bulk/insert/result.rb +0 -129
  255. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +0 -87
  256. data/lib/mongo/operation/write/bulk/mergable.rb +0 -73
  257. data/lib/mongo/operation/write/bulk/update.rb +0 -81
  258. data/lib/mongo/operation/write/bulk/update/result.rb +0 -196
  259. data/lib/mongo/operation/write/command.rb +0 -23
  260. data/lib/mongo/operation/write/command/create_index.rb +0 -79
  261. data/lib/mongo/operation/write/command/create_user.rb +0 -61
  262. data/lib/mongo/operation/write/command/delete.rb +0 -79
  263. data/lib/mongo/operation/write/command/drop_index.rb +0 -80
  264. data/lib/mongo/operation/write/command/insert.rb +0 -69
  265. data/lib/mongo/operation/write/command/remove_user.rb +0 -60
  266. data/lib/mongo/operation/write/command/update.rb +0 -77
  267. data/lib/mongo/operation/write/command/update_user.rb +0 -61
  268. data/lib/mongo/operation/write/command/writable.rb +0 -70
  269. data/lib/mongo/operation/write/delete.rb +0 -75
  270. data/lib/mongo/operation/write/gle.rb +0 -49
  271. data/lib/mongo/operation/write/idable.rb +0 -63
  272. data/lib/mongo/operation/write/insert.rb +0 -74
  273. data/lib/mongo/operation/write/insert/result.rb +0 -62
  274. data/lib/mongo/operation/write/update.rb +0 -91
  275. data/lib/mongo/operation/write/write_command_enabled.rb +0 -77
@@ -0,0 +1,64 @@
1
+ # Copyright (C) 2018 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ module Operation
17
+
18
+ # Shared behavior of operations that require its documents to each have an id.
19
+ #
20
+ # @since 2.5.2
21
+ module Idable
22
+
23
+ def documents
24
+ @documents ||= ensure_ids(super)
25
+ end
26
+
27
+ private
28
+
29
+ # The option for a custom id generator.
30
+ #
31
+ # @since 2.2.0
32
+ ID_GENERATOR = :id_generator.freeze
33
+
34
+ # Get the id generator.
35
+ #
36
+ # @example Get the id generator.
37
+ # idable.id_generator
38
+ #
39
+ # @return [ IdGenerator ] The default or custom id generator.
40
+ #
41
+ # @since 2.2.0
42
+ def id_generator
43
+ @id_generator ||= (spec[ID_GENERATOR] || Operation::ObjectIdGenerator.new)
44
+ end
45
+
46
+ def id(doc)
47
+ doc.respond_to?(:id) ? doc.id : (doc['_id'] || doc[:_id])
48
+ end
49
+
50
+ def has_id?(doc)
51
+ !!id(doc)
52
+ end
53
+
54
+ def ensure_ids(documents)
55
+ @ids = []
56
+ documents.collect do |doc|
57
+ doc_with_id = has_id?(doc) ? doc : doc.merge(_id: id_generator.generate)
58
+ @ids << id(doc_with_id)
59
+ doc_with_id
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2017 MongoDB, Inc.
1
+ # Copyright (C) 2015-2018 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -14,13 +14,16 @@
14
14
 
15
15
  module Mongo
16
16
  module Operation
17
- module Commands
18
17
 
19
- # Encapsulates behaviour for executing a distinct command.
20
- #
21
- # @since 2.5.0
22
- class Distinct < Command
23
- include CausallyConsistent
18
+ # Shared behavior of operations that require its documents to each have an id.
19
+ #
20
+ # @since 2.5.2
21
+ module Limited
22
+
23
+ private
24
+
25
+ def options(server = nil)
26
+ super.merge(limit: -1)
24
27
  end
25
28
  end
26
29
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015 MongoDB, Inc.
1
+ # Copyright (C) 2015-2018 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@ module Mongo
20
20
  # @since 2.2.0
21
21
  class ObjectIdGenerator
22
22
 
23
- # Generate a nwe id.
23
+ # Generate a new id.
24
24
  #
25
25
  # @example Generate the id.
26
26
  # object_id_generator.generate
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2017 MongoDB, Inc.
1
+ # Copyright (C) 2015-2018 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -15,35 +15,30 @@
15
15
  module Mongo
16
16
  module Operation
17
17
 
18
- # Adds behaviour for updating the options and the selector for operations
19
- # that need to take read preference into account.
18
+ # Shared behavior of operations that support read preference.
20
19
  #
21
- # @since 2.0.0
22
- module ReadPreference
23
- include UsesCommandOpMsg
20
+ # @since 2.5.2
21
+ module ReadPreferenceSupported
22
+
23
+ private
24
24
 
25
- # The constant for slave ok flags.
26
- #
27
- # @since 2.0.6
28
25
  SLAVE_OK = :slave_ok
29
26
 
30
- private
27
+ def options(server)
28
+ update_options_for_slave_ok(super, server)
29
+ end
31
30
 
32
31
  def update_selector_for_read_pref(sel, server)
33
32
  if read && server.mongos? && read_pref = read.to_mongos
34
- sel = sel[:$query] ? sel : { :$query => sel }
33
+ sel = sel[:$query] ? sel : {:$query => sel}
35
34
  sel.merge(:$readPreference => read_pref)
36
35
  else
37
36
  sel
38
37
  end
39
38
  end
40
39
 
41
- def slave_ok?(server)
42
- (server.cluster.single? && !server.mongos?) || (read && read.slave_ok?)
43
- end
44
-
45
40
  def update_options_for_slave_ok(opts, server)
46
- if slave_ok?(server)
41
+ if (server.cluster.single? && !server.mongos?) || (read && read.slave_ok?)
47
42
  opts.dup.tap do |o|
48
43
  (o[:flags] ||= []) << SLAVE_OK
49
44
  end
@@ -52,14 +47,9 @@ module Mongo
52
47
  end
53
48
  end
54
49
 
55
- def message(server)
56
- if server.features.op_msg_enabled?
57
- command_op_msg(server, selector, options)
58
- else
59
- sel = update_selector_for_read_pref(selector, server)
60
- opts = update_options_for_slave_ok(options, server)
61
- Protocol::Query.new(db_name, query_coll, sel, opts)
62
- end
50
+ def command(server)
51
+ sel = super
52
+ update_selector_for_read_pref(sel, server)
63
53
  end
64
54
  end
65
55
  end
@@ -0,0 +1,75 @@
1
+ # Copyright (C) 2014-2018 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ module Operation
17
+ class Result
18
+
19
+ # Defines custom behaviour of bulk write results
20
+ #
21
+ # @since 2.0.0
22
+ module Aggregatable
23
+
24
+ # Aggregate the write errors returned from this result.
25
+ #
26
+ # @example Aggregate the write errors.
27
+ # result.aggregate_write_errors(0)
28
+ #
29
+ # @param [ Integer ] count The number of documents already executed.
30
+ #
31
+ # @return [ Array ] The aggregate write errors.
32
+ #
33
+ # @since 2.0.0
34
+ def aggregate_write_errors(count)
35
+ return unless @replies
36
+ @replies.reduce(nil) do |errors, reply|
37
+ if write_errors = reply.documents.first[Error::WRITE_ERRORS]
38
+ wes = write_errors.collect do |we|
39
+ we.merge!('index' => count + we['index'])
40
+ end
41
+ (errors || []) << wes if wes
42
+ end
43
+ end
44
+ end
45
+
46
+ # Aggregate the write concern errors returned from this result.
47
+ #
48
+ # @example Aggregate the write concern errors.
49
+ # result.aggregate_write_concern_errors(100)
50
+ #
51
+ # @param [ Integer ] count The number of documents already executed.
52
+ #
53
+ # @return [ Array ] The aggregate write concern errors.
54
+ #
55
+ # @since 2.0.0
56
+ def aggregate_write_concern_errors(count)
57
+ return unless @replies
58
+ @replies.each_with_index.reduce(nil) do |errors, (reply, _)|
59
+ if write_concern_errors = reply.documents.first[Error::WRITE_CONCERN_ERRORS]
60
+ (errors || []) << write_concern_errors.reduce(nil) do |errs, wce|
61
+ wce.merge!('index' => count + wce['index'])
62
+ (errs || []) << write_concern_error
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+
73
+
74
+
75
+
@@ -0,0 +1,79 @@
1
+ # Copyright (C) 2015-2017 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ module Operation
17
+
18
+ # Shared behavior of operations that support a session.
19
+ #
20
+ # @since 2.5.2
21
+ module SessionsSupported
22
+
23
+ private
24
+
25
+ ZERO_TIMESTAMP = BSON::Timestamp.new(0, 0)
26
+
27
+ READ_PREFERENCE = '$readPreference'.freeze
28
+
29
+ def apply_causal_consistency!(selector, server); end
30
+
31
+ def flags
32
+ acknowledged_write? ? [:none] : [:more_to_come]
33
+ end
34
+
35
+ def apply_cluster_time!(selector, server)
36
+ if !server.standalone?
37
+ cluster_time = [server.cluster_time, (session && session.cluster_time)].max_by do |doc|
38
+ (doc && doc[Cluster::CLUSTER_TIME]) || ZERO_TIMESTAMP
39
+ end
40
+
41
+ if cluster_time && (cluster_time[Cluster::CLUSTER_TIME] > ZERO_TIMESTAMP)
42
+ selector[CLUSTER_TIME] = cluster_time
43
+ end
44
+ end
45
+ end
46
+
47
+ def add_write_concern!(sel)
48
+ if write_concern
49
+ sel[:writeConcern] = write_concern.options
50
+ end
51
+ end
52
+
53
+ def apply_session_id!(selector)
54
+ session.add_id!(selector)
55
+ end
56
+
57
+ def command(server)
58
+ sel = selector(server)
59
+ sel[:writeConcern] = write_concern.options if write_concern
60
+ sel[Protocol::Msg::DATABASE_IDENTIFIER] = db_name
61
+ sel[READ_PREFERENCE] = read.to_doc if read
62
+ if server.features.sessions_enabled?
63
+ apply_cluster_time!(sel, server)
64
+ if acknowledged_write? && session
65
+ sel[:txnNumber] = BSON::Int64.new(txn_num) if txn_num
66
+ apply_session_id!(sel)
67
+ apply_causal_consistency!(sel, server)
68
+ end
69
+ elsif session && session.explicit?
70
+ apply_cluster_time!(sel, server)
71
+ sel[:txnNumber] = BSON::Int64.new(txn_num) if txn_num
72
+ apply_session_id!(sel)
73
+ apply_causal_consistency!(sel, server)
74
+ end
75
+ sel
76
+ end
77
+ end
78
+ end
79
+ end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2017 MongoDB, Inc.
1
+ # Copyright (C) 2014-2018 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -333,7 +333,7 @@ module Mongo
333
333
  # @return [ Hash ] The options.
334
334
  #
335
335
  # @since 2.0.0
336
- def options
336
+ def options(server = nil)
337
337
  spec[OPTIONS] || {}
338
338
  end
339
339
 
@@ -382,7 +382,7 @@ module Mongo
382
382
  #
383
383
  # @since 2.4.0
384
384
  def collation
385
- spec[COLLATION]
385
+ send(self.class::IDENTIFIER).first[COLLATION]
386
386
  end
387
387
 
388
388
  # The selector for from the specification.
@@ -393,7 +393,7 @@ module Mongo
393
393
  # @return [ Hash ] The selector spec.
394
394
  #
395
395
  # @since 2.0.0
396
- def selector
396
+ def selector(server = nil)
397
397
  spec[SELECTOR]
398
398
  end
399
399
 
@@ -526,6 +526,42 @@ module Mongo
526
526
  def txn_num
527
527
  @spec[:txn_num]
528
528
  end
529
+
530
+ # The command.
531
+ #
532
+ # @example Get the command.
533
+ # specifiable.command
534
+ #
535
+ # @return [ Hash ] The command.
536
+ #
537
+ # @since 2.5.2
538
+ def command(server = nil)
539
+ selector(server)
540
+ end
541
+
542
+ # The array filters.
543
+ #
544
+ # @example Get the array filters.
545
+ # specifiable.array_filters
546
+ #
547
+ # @return [ Hash ] The array filters.
548
+ #
549
+ # @since 2.5.2
550
+ def array_filters
551
+ selector[Operation::ARRAY_FILTERS] if selector
552
+ end
553
+
554
+ # Does the operation have an acknowledged write concern.
555
+ #
556
+ # @example Determine whether the operation has an acknoweldged write.
557
+ # specifiable.array_filters
558
+ #
559
+ # @return [ Hash ] The array filters.
560
+ #
561
+ # @since 2.5.2
562
+ def acknowledged_write?
563
+ write_concern.nil? || write_concern.acknowledged?
564
+ end
529
565
  end
530
566
  end
531
567
  end
@@ -0,0 +1,81 @@
1
+ # Copyright (C) 2018 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ module Operation
17
+
18
+ # Shared behavior of operations that write (update, insert, delete).
19
+ #
20
+ # @since 2.5.2
21
+ module Write
22
+
23
+ # Execute the operation.
24
+ #
25
+ # @example
26
+ # operation.execute(server)
27
+ #
28
+ # @param [ Mongo::Server ] server The server to send the operation to.
29
+ #
30
+ # @return [ Mongo::Operation::Result ] The operation result.
31
+ #
32
+ # @since 2.5.2
33
+ def execute(server)
34
+ validate!
35
+ result = if server.features.op_msg_enabled?
36
+ self.class::OpMsg.new(spec).execute(server)
37
+ elsif !acknowledged_write?
38
+ self.class::Legacy.new(spec).execute(server)
39
+ else
40
+ self.class::Command.new(spec).execute(server)
41
+ end
42
+ result.validate!
43
+ end
44
+
45
+ # Execute the bulk write operation.
46
+ #
47
+ # @example
48
+ # operation.bulk_execute(server)
49
+ #
50
+ # @param [ Mongo::Server ] server The server to send the operation to.
51
+ #
52
+ # @return [ Mongo::Operation::Delete::BulkResult,
53
+ # Mongo::Operation::Insert::BulkResult,
54
+ # Mongo::Operation::Update::BulkResult ] The bulk result.
55
+ #
56
+ # @since 2.5.2
57
+ def bulk_execute(server)
58
+ if server.features.op_msg_enabled?
59
+ self.class::OpMsg.new(spec).execute(server).bulk_result
60
+ else
61
+ self.class::Command.new(spec).execute(server).bulk_result
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ def validate!
68
+ if !acknowledged_write?
69
+ if collation
70
+ raise Error::UnsupportedCollation.new(
71
+ Error::UnsupportedCollation::UNACKNOWLEDGED_WRITES_MESSAGE)
72
+ end
73
+ if array_filters
74
+ raise Error::UnsupportedArrayFilters.new(
75
+ Error::UnsupportedArrayFilters::UNACKNOWLEDGED_WRITES_MESSAGE)
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end