mongo 2.5.1 → 2.5.2

Sign up to get free protection for your applications and to get access to all the features.
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