mongoid 7.4.0 → 8.0.1

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 (315) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/lib/config/locales/en.yml +51 -28
  5. data/lib/mongoid/association/accessors.rb +32 -3
  6. data/lib/mongoid/association/bindable.rb +48 -0
  7. data/lib/mongoid/association/builders.rb +4 -2
  8. data/lib/mongoid/association/eager_loadable.rb +29 -7
  9. data/lib/mongoid/association/embedded/batchable.rb +48 -8
  10. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  11. data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
  12. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  13. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  14. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
  15. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  16. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
  17. data/lib/mongoid/association/macros.rb +22 -1
  18. data/lib/mongoid/association/many.rb +5 -0
  19. data/lib/mongoid/association/nested/many.rb +2 -1
  20. data/lib/mongoid/association/proxy.rb +12 -0
  21. data/lib/mongoid/association/referenced/auto_save.rb +3 -2
  22. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  23. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  24. data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
  25. data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
  26. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
  27. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
  28. data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -14
  29. data/lib/mongoid/association/referenced/has_many/proxy.rb +12 -9
  30. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  31. data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
  32. data/lib/mongoid/association/referenced/syncable.rb +2 -2
  33. data/lib/mongoid/association/relatable.rb +38 -4
  34. data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
  35. data/lib/mongoid/attributes/processing.rb +9 -2
  36. data/lib/mongoid/attributes.rb +30 -27
  37. data/lib/mongoid/changeable.rb +37 -2
  38. data/lib/mongoid/clients/options.rb +4 -0
  39. data/lib/mongoid/clients/sessions.rb +2 -14
  40. data/lib/mongoid/config/environment.rb +20 -4
  41. data/lib/mongoid/config.rb +25 -10
  42. data/lib/mongoid/contextual/aggregable/memory.rb +23 -15
  43. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  44. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  45. data/lib/mongoid/contextual/memory.rb +176 -17
  46. data/lib/mongoid/contextual/mongo.rb +226 -206
  47. data/lib/mongoid/contextual/none.rb +66 -4
  48. data/lib/mongoid/copyable.rb +32 -8
  49. data/lib/mongoid/criteria/includable.rb +24 -20
  50. data/lib/mongoid/criteria/marshalable.rb +10 -2
  51. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -13
  52. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  53. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  54. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  55. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  56. data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -14
  57. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  58. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  59. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  60. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
  61. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  62. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  63. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  64. data/lib/mongoid/criteria/queryable/mergeable.rb +21 -0
  65. data/lib/mongoid/criteria/queryable/optional.rb +3 -9
  66. data/lib/mongoid/criteria/queryable/options.rb +1 -1
  67. data/lib/mongoid/criteria/queryable/selectable.rb +28 -34
  68. data/lib/mongoid/criteria/queryable/selector.rb +89 -4
  69. data/lib/mongoid/criteria/queryable/smash.rb +39 -6
  70. data/lib/mongoid/criteria/queryable.rb +11 -6
  71. data/lib/mongoid/criteria.rb +1 -26
  72. data/lib/mongoid/deprecable.rb +36 -0
  73. data/lib/mongoid/deprecation.rb +25 -0
  74. data/lib/mongoid/document.rb +96 -32
  75. data/lib/mongoid/errors/document_not_found.rb +29 -8
  76. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  77. data/lib/mongoid/errors/invalid_field.rb +5 -1
  78. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  79. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  80. data/lib/mongoid/errors.rb +2 -2
  81. data/lib/mongoid/extensions/array.rb +8 -6
  82. data/lib/mongoid/extensions/big_decimal.rb +29 -10
  83. data/lib/mongoid/extensions/binary.rb +42 -0
  84. data/lib/mongoid/extensions/boolean.rb +8 -2
  85. data/lib/mongoid/extensions/date.rb +26 -20
  86. data/lib/mongoid/extensions/date_time.rb +1 -1
  87. data/lib/mongoid/extensions/float.rb +4 -5
  88. data/lib/mongoid/extensions/hash.rb +12 -5
  89. data/lib/mongoid/extensions/integer.rb +4 -5
  90. data/lib/mongoid/extensions/object.rb +2 -0
  91. data/lib/mongoid/extensions/range.rb +41 -10
  92. data/lib/mongoid/extensions/regexp.rb +11 -4
  93. data/lib/mongoid/extensions/set.rb +11 -4
  94. data/lib/mongoid/extensions/string.rb +2 -13
  95. data/lib/mongoid/extensions/symbol.rb +3 -14
  96. data/lib/mongoid/extensions/time.rb +27 -16
  97. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  98. data/lib/mongoid/extensions.rb +1 -0
  99. data/lib/mongoid/factory.rb +42 -7
  100. data/lib/mongoid/fields/foreign_key.rb +7 -0
  101. data/lib/mongoid/fields/validators/macro.rb +3 -9
  102. data/lib/mongoid/fields.rb +194 -28
  103. data/lib/mongoid/findable.rb +27 -7
  104. data/lib/mongoid/indexable/specification.rb +1 -1
  105. data/lib/mongoid/indexable/validators/options.rb +4 -1
  106. data/lib/mongoid/interceptable.rb +69 -9
  107. data/lib/mongoid/persistable/creatable.rb +14 -5
  108. data/lib/mongoid/persistable/updatable.rb +12 -5
  109. data/lib/mongoid/persistable/upsertable.rb +1 -1
  110. data/lib/mongoid/persistence_context.rb +19 -2
  111. data/lib/mongoid/query_cache.rb +6 -258
  112. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  113. data/lib/mongoid/reloadable.rb +7 -3
  114. data/lib/mongoid/selectable.rb +1 -2
  115. data/lib/mongoid/stateful.rb +27 -1
  116. data/lib/mongoid/timestamps/created.rb +1 -1
  117. data/lib/mongoid/timestamps/updated.rb +1 -1
  118. data/lib/mongoid/touchable.rb +2 -3
  119. data/lib/mongoid/traversable.rb +5 -1
  120. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  121. data/lib/mongoid/version.rb +1 -1
  122. data/lib/mongoid/warnings.rb +28 -0
  123. data/lib/mongoid.rb +2 -0
  124. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +11 -5
  125. data/spec/config/mongoid.yml +16 -0
  126. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  127. data/spec/integration/app_spec.rb +28 -26
  128. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  129. data/spec/integration/associations/embedded_dirty_spec.rb +28 -0
  130. data/spec/integration/associations/embedded_spec.rb +15 -0
  131. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  132. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  133. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  134. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  135. data/spec/integration/associations/has_one_spec.rb +97 -1
  136. data/spec/integration/associations/scope_option_spec.rb +1 -1
  137. data/spec/integration/callbacks_models.rb +95 -1
  138. data/spec/integration/callbacks_spec.rb +226 -4
  139. data/spec/integration/criteria/range_spec.rb +95 -1
  140. data/spec/integration/discriminator_key_spec.rb +115 -76
  141. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  142. data/spec/integration/matcher_examples_spec.rb +20 -13
  143. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  144. data/spec/integration/matcher_operator_spec.rb +3 -5
  145. data/spec/integration/persistence/range_field_spec.rb +350 -0
  146. data/spec/lite_spec_helper.rb +1 -1
  147. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  148. data/spec/mongoid/association/depending_spec.rb +9 -9
  149. data/spec/mongoid/association/eager_spec.rb +2 -1
  150. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  151. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  152. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  153. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  154. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +219 -8
  155. data/spec/mongoid/association/embedded/embeds_many_models.rb +157 -0
  156. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  157. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  158. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  159. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  160. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  161. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  162. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  163. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  164. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  165. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  166. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +67 -4
  167. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  168. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  169. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  170. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +8 -8
  171. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +82 -13
  172. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  173. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  174. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  175. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  176. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  177. data/spec/mongoid/association/syncable_spec.rb +14 -0
  178. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  179. data/spec/mongoid/atomic_spec.rb +22 -0
  180. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  181. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  182. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  183. data/spec/mongoid/attributes_spec.rb +524 -27
  184. data/spec/mongoid/changeable_spec.rb +130 -13
  185. data/spec/mongoid/clients/factory_spec.rb +34 -42
  186. data/spec/mongoid/clients/options_spec.rb +1 -0
  187. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  188. data/spec/mongoid/clients_spec.rb +32 -2
  189. data/spec/mongoid/config/environment_spec.rb +39 -1
  190. data/spec/mongoid/config_spec.rb +104 -13
  191. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  192. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  193. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  194. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  195. data/spec/mongoid/contextual/memory_spec.rb +1337 -69
  196. data/spec/mongoid/contextual/mongo_spec.rb +1105 -172
  197. data/spec/mongoid/contextual/none_spec.rb +38 -0
  198. data/spec/mongoid/copyable_spec.rb +451 -1
  199. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  200. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  201. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  202. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  203. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  204. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  205. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  206. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  207. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  208. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  209. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  210. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  211. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  212. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  213. data/spec/mongoid/criteria/queryable/selectable_spec.rb +289 -124
  214. data/spec/mongoid/criteria/queryable/selector_spec.rb +14 -2
  215. data/spec/mongoid/criteria_spec.rb +474 -1198
  216. data/spec/mongoid/document_fields_spec.rb +173 -24
  217. data/spec/mongoid/document_spec.rb +32 -41
  218. data/spec/mongoid/errors/document_not_found_spec.rb +76 -0
  219. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  220. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  221. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  222. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  223. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  224. data/spec/mongoid/extensions/array_spec.rb +16 -2
  225. data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
  226. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  227. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  228. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  229. data/spec/mongoid/extensions/date_spec.rb +71 -1
  230. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  231. data/spec/mongoid/extensions/float_spec.rb +48 -76
  232. data/spec/mongoid/extensions/hash_spec.rb +30 -0
  233. data/spec/mongoid/extensions/integer_spec.rb +45 -66
  234. data/spec/mongoid/extensions/range_spec.rb +255 -54
  235. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  236. data/spec/mongoid/extensions/set_spec.rb +106 -0
  237. data/spec/mongoid/extensions/string_spec.rb +53 -25
  238. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  239. data/spec/mongoid/extensions/time_spec.rb +634 -66
  240. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  241. data/spec/mongoid/factory_spec.rb +61 -1
  242. data/spec/mongoid/fields_spec.rb +321 -50
  243. data/spec/mongoid/findable_spec.rb +80 -15
  244. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  245. data/spec/mongoid/indexable_spec.rb +16 -19
  246. data/spec/mongoid/interceptable_spec.rb +584 -5
  247. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  248. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  249. data/spec/mongoid/mongoizable_spec.rb +285 -0
  250. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  251. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  252. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  253. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  254. data/spec/mongoid/persistence_context_spec.rb +50 -1
  255. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  256. data/spec/mongoid/query_cache_spec.rb +0 -154
  257. data/spec/mongoid/reloadable_spec.rb +35 -2
  258. data/spec/mongoid/scopable_spec.rb +21 -1
  259. data/spec/mongoid/shardable_spec.rb +14 -0
  260. data/spec/mongoid/stateful_spec.rb +28 -0
  261. data/spec/mongoid/timestamps_spec.rb +390 -0
  262. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  263. data/spec/mongoid/touchable_spec.rb +116 -0
  264. data/spec/mongoid/touchable_spec_models.rb +12 -8
  265. data/spec/mongoid/traversable_spec.rb +4 -11
  266. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  267. data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
  268. data/spec/mongoid/warnings_spec.rb +35 -0
  269. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  270. data/spec/rails/mongoid_spec.rb +4 -16
  271. data/spec/shared/lib/mrss/constraints.rb +8 -16
  272. data/spec/shared/lib/mrss/docker_runner.rb +23 -3
  273. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  274. data/spec/shared/lib/mrss/lite_constraints.rb +32 -1
  275. data/spec/shared/share/Dockerfile.erb +34 -48
  276. data/spec/shared/shlib/config.sh +27 -0
  277. data/spec/shared/shlib/server.sh +32 -19
  278. data/spec/shared/shlib/set_env.sh +37 -0
  279. data/spec/support/constraints.rb +24 -0
  280. data/spec/support/macros.rb +39 -0
  281. data/spec/support/models/augmentation.rb +12 -0
  282. data/spec/support/models/band.rb +3 -0
  283. data/spec/support/models/catalog.rb +24 -0
  284. data/spec/support/models/circus.rb +3 -0
  285. data/spec/support/models/code.rb +2 -0
  286. data/spec/support/models/fanatic.rb +8 -0
  287. data/spec/support/models/implant.rb +9 -0
  288. data/spec/support/models/label.rb +2 -0
  289. data/spec/support/models/membership.rb +1 -0
  290. data/spec/support/models/passport.rb +9 -0
  291. data/spec/support/models/person.rb +1 -0
  292. data/spec/support/models/player.rb +2 -0
  293. data/spec/support/models/powerup.rb +12 -0
  294. data/spec/support/models/registry.rb +1 -0
  295. data/spec/support/models/school.rb +14 -0
  296. data/spec/support/models/shield.rb +18 -0
  297. data/spec/support/models/student.rb +14 -0
  298. data/spec/support/models/weapon.rb +12 -0
  299. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  300. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  301. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  302. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  303. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  304. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  305. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  306. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  307. data/spec/support/schema_maps/schema_map_local.json +18 -0
  308. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  309. data/spec/support/spec_config.rb +4 -0
  310. data.tar.gz.sig +0 -0
  311. metadata +76 -13
  312. metadata.gz.sig +0 -0
  313. data/lib/mongoid/errors/eager_load.rb +0 -23
  314. data/lib/mongoid/errors/invalid_value.rb +0 -17
  315. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -142,107 +142,6 @@ describe Mongoid::Criteria::Queryable::Optional do
142
142
  it_behaves_like "a cloning option"
143
143
  end
144
144
  end
145
-
146
- context "when using the mongo-1.x driver syntax" do
147
-
148
- let(:query) do
149
- Mongoid::Query.new({}, {}, :mongo1x)
150
- end
151
-
152
- context "when provided symbols" do
153
-
154
- let(:selection) do
155
- query.send(method, :field_one, :field_two)
156
- end
157
-
158
- it "adds the sorting criteria" do
159
- expect(selection.options).to eq(
160
- { sort: [[ :field_one, 1 ], [ :field_two, 1 ]]}
161
- )
162
- end
163
-
164
- it_behaves_like "a cloning option"
165
- end
166
-
167
- context "when provided an array of symbols" do
168
-
169
- let(:selection) do
170
- query.send(method, [ :field_one, :field_two ])
171
- end
172
-
173
- it "adds the sorting criteria" do
174
- expect(selection.options).to eq(
175
- { sort: [[ :field_one, 1 ], [ :field_two, 1 ]]}
176
- )
177
- end
178
-
179
- it_behaves_like "a cloning option"
180
- end
181
-
182
- context "when provided strings" do
183
-
184
- let(:selection) do
185
- query.send(method, "field_one", "field_two")
186
- end
187
-
188
- it "adds the sorting criteria" do
189
- expect(selection.options).to eq(
190
- { sort: [[ "field_one", 1 ], [ "field_two", 1 ]]}
191
- )
192
- end
193
-
194
- it_behaves_like "a cloning option"
195
- end
196
-
197
- context "when provided an array of strings" do
198
-
199
- let(:selection) do
200
- query.send(method, [ "field_one", "field_two" ])
201
- end
202
-
203
- it "adds the sorting criteria" do
204
- expect(selection.options).to eq(
205
- { sort: [[ "field_one", 1 ], [ "field_two", 1 ]]}
206
- )
207
- end
208
-
209
- it_behaves_like "a cloning option"
210
- end
211
-
212
- context "when provided no options" do
213
-
214
- let(:selection) do
215
- query.send(method)
216
- end
217
-
218
- it "does not add any sorting criteria" do
219
- expect(selection.options).to be_empty
220
- end
221
-
222
- it "returns the query" do
223
- expect(selection).to eq(query)
224
- end
225
-
226
- it_behaves_like "a cloning option"
227
- end
228
-
229
- context "when provided nil" do
230
-
231
- let(:selection) do
232
- query.send(method, nil)
233
- end
234
-
235
- it "does not add any sorting criteria" do
236
- expect(selection.options).to be_empty
237
- end
238
-
239
- it "returns the query" do
240
- expect(selection).to eq(query)
241
- end
242
-
243
- it_behaves_like "a cloning option"
244
- end
245
- end
246
145
  end
247
146
  end
248
147
 
@@ -415,107 +314,6 @@ describe Mongoid::Criteria::Queryable::Optional do
415
314
  it_behaves_like "a cloning option"
416
315
  end
417
316
  end
418
-
419
- context "when using the mongo-1.x driver syntax" do
420
-
421
- let(:query) do
422
- Mongoid::Query.new({}, {}, :mongo1x)
423
- end
424
-
425
- context "when provided symbols" do
426
-
427
- let(:selection) do
428
- query.send(method, :field_one, :field_two)
429
- end
430
-
431
- it "adds the sorting criteria" do
432
- expect(selection.options).to eq(
433
- { sort: [[ :field_one, -1 ], [ :field_two, -1 ]]}
434
- )
435
- end
436
-
437
- it_behaves_like "a cloning option"
438
- end
439
-
440
- context "when provided an array of symbols" do
441
-
442
- let(:selection) do
443
- query.send(method, [ :field_one, :field_two ])
444
- end
445
-
446
- it "adds the sorting criteria" do
447
- expect(selection.options).to eq(
448
- { sort: [[ :field_one, -1 ], [ :field_two, -1 ]]}
449
- )
450
- end
451
-
452
- it_behaves_like "a cloning option"
453
- end
454
-
455
- context "when provided strings" do
456
-
457
- let(:selection) do
458
- query.send(method, "field_one", "field_two")
459
- end
460
-
461
- it "adds the sorting criteria" do
462
- expect(selection.options).to eq(
463
- { sort: [[ "field_one", -1 ], [ "field_two", -1 ]]}
464
- )
465
- end
466
-
467
- it_behaves_like "a cloning option"
468
- end
469
-
470
- context "when provided an array of strings" do
471
-
472
- let(:selection) do
473
- query.send(method, [ "field_one", "field_two" ])
474
- end
475
-
476
- it "adds the sorting criteria" do
477
- expect(selection.options).to eq(
478
- { sort: [[ "field_one", -1 ], [ "field_two", -1 ]]}
479
- )
480
- end
481
-
482
- it_behaves_like "a cloning option"
483
- end
484
-
485
- context "when provided no options" do
486
-
487
- let(:selection) do
488
- query.send(method)
489
- end
490
-
491
- it "does not add any sorting criteria" do
492
- expect(selection.options).to be_empty
493
- end
494
-
495
- it "returns the query" do
496
- expect(selection).to eq(query)
497
- end
498
-
499
- it_behaves_like "a cloning option"
500
- end
501
-
502
- context "when provided nil" do
503
-
504
- let(:selection) do
505
- query.send(method, nil)
506
- end
507
-
508
- it "does not add any sorting criteria" do
509
- expect(selection.options).to be_empty
510
- end
511
-
512
- it "returns the query" do
513
- expect(selection).to eq(query)
514
- end
515
-
516
- it_behaves_like "a cloning option"
517
- end
518
- end
519
317
  end
520
318
  end
521
319
 
@@ -1172,288 +970,6 @@ describe Mongoid::Criteria::Queryable::Optional do
1172
970
  it_behaves_like "a cloning option"
1173
971
  end
1174
972
  end
1175
-
1176
- context "when using the mongo-1.x driver syntax" do
1177
-
1178
- let(:query) do
1179
- Mongoid::Query.new({}, {}, :mongo1x)
1180
- end
1181
-
1182
- context "when provided a hash" do
1183
-
1184
- context "when the hash has integer values" do
1185
-
1186
- let(:selection) do
1187
- query.send("#{method}", field_one: 1, field_two: -1)
1188
- end
1189
-
1190
- it "adds the sorting criteria" do
1191
- expect(selection.options).to eq(
1192
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1193
- )
1194
- end
1195
-
1196
- it_behaves_like "a cloning option"
1197
- end
1198
-
1199
- context "when the hash has symbol values" do
1200
-
1201
- let(:selection) do
1202
- query.send("#{method}", field_one: :asc, field_two: :desc)
1203
- end
1204
-
1205
- it "adds the sorting criteria" do
1206
- expect(selection.options).to eq(
1207
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1208
- )
1209
- end
1210
-
1211
- it_behaves_like "a cloning option"
1212
- end
1213
-
1214
- context "when the hash has string values" do
1215
-
1216
- let(:selection) do
1217
- query.send("#{method}", field_one: "asc", field_two: "desc")
1218
- end
1219
-
1220
- it "adds the sorting criteria" do
1221
- expect(selection.options).to eq(
1222
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1223
- )
1224
- end
1225
-
1226
- it_behaves_like "a cloning option"
1227
- end
1228
- end
1229
-
1230
- context "when provided an array" do
1231
-
1232
- context "when the array is multi-dimensional" do
1233
-
1234
- context "when the arrays have integer values" do
1235
-
1236
- let(:selection) do
1237
- query.send("#{method}", [[ :field_one, 1 ],[ :field_two, -1 ]])
1238
- end
1239
-
1240
- it "adds the sorting criteria" do
1241
- expect(selection.options).to eq(
1242
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1243
- )
1244
- end
1245
-
1246
- it_behaves_like "a cloning option"
1247
- end
1248
-
1249
- context "when the arrays have symbol values" do
1250
-
1251
- let(:selection) do
1252
- query.send("#{method}", [[ :field_one, :asc ],[ :field_two, :desc ]])
1253
- end
1254
-
1255
- it "adds the sorting criteria" do
1256
- expect(selection.options).to eq(
1257
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1258
- )
1259
- end
1260
-
1261
- it_behaves_like "a cloning option"
1262
- end
1263
-
1264
- context "when the arrays have string values" do
1265
-
1266
- let(:selection) do
1267
- query.send("#{method}", [[ :field_one, "asc" ],[ :field_two, "desc" ]])
1268
- end
1269
-
1270
- it "adds the sorting criteria" do
1271
- expect(selection.options).to eq(
1272
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1273
- )
1274
- end
1275
-
1276
- it_behaves_like "a cloning option"
1277
- end
1278
- end
1279
-
1280
- context "when the array is selectable keys" do
1281
-
1282
- let(:selection) do
1283
- query.send("#{method}", [ :field_one.asc, :field_two.desc ])
1284
- end
1285
-
1286
- it "adds the sorting criteria" do
1287
- expect(selection.options).to eq(
1288
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1289
- )
1290
- end
1291
-
1292
- it_behaves_like "a cloning option"
1293
- end
1294
- end
1295
-
1296
- context "when provided values" do
1297
-
1298
- context "when the values are arrays" do
1299
-
1300
- context "when the values have integer directions" do
1301
-
1302
- let(:selection) do
1303
- query.send("#{method}", [ :field_one, 1 ],[ :field_two, -1 ])
1304
- end
1305
-
1306
- it "adds the sorting criteria" do
1307
- expect(selection.options).to eq(
1308
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1309
- )
1310
- end
1311
-
1312
- it_behaves_like "a cloning option"
1313
- end
1314
-
1315
- context "when the values have symbol directions" do
1316
-
1317
- let(:selection) do
1318
- query.send("#{method}", [ :field_one, :asc ],[ :field_two, :desc ])
1319
- end
1320
-
1321
- it "adds the sorting criteria" do
1322
- expect(selection.options).to eq(
1323
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1324
- )
1325
- end
1326
-
1327
- it_behaves_like "a cloning option"
1328
- end
1329
-
1330
- context "when the values have string directions" do
1331
-
1332
- let(:selection) do
1333
- query.send("#{method}", [ :field_one, "asc" ],[ :field_two, "desc" ])
1334
- end
1335
-
1336
- it "adds the sorting criteria" do
1337
- expect(selection.options).to eq(
1338
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1339
- )
1340
- end
1341
-
1342
- it_behaves_like "a cloning option"
1343
- end
1344
- end
1345
-
1346
- context "when the values are selectable keys" do
1347
-
1348
- let(:selection) do
1349
- query.send("#{method}", :field_one.asc, :field_two.desc)
1350
- end
1351
-
1352
- it "adds the sorting criteria" do
1353
- expect(selection.options).to eq(
1354
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1355
- )
1356
- end
1357
-
1358
- it_behaves_like "a cloning option"
1359
- end
1360
- end
1361
-
1362
- context "when provided a string" do
1363
-
1364
- context "when the direction is lowercase" do
1365
-
1366
- context "when abbreviated" do
1367
-
1368
- let(:selection) do
1369
- query.send("#{method}", "field_one asc, field_two desc")
1370
- end
1371
-
1372
- it "adds the sorting criteria" do
1373
- expect(selection.options).to eq(
1374
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1375
- )
1376
- end
1377
-
1378
- it_behaves_like "a cloning option"
1379
- end
1380
-
1381
- context "when spelled out" do
1382
-
1383
- let(:selection) do
1384
- query.send("#{method}", "field_one ascending, field_two descending")
1385
- end
1386
-
1387
- it "adds the sorting criteria" do
1388
- expect(selection.options).to eq(
1389
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1390
- )
1391
- end
1392
-
1393
- it_behaves_like "a cloning option"
1394
- end
1395
- end
1396
-
1397
- context "when the direction is uppercase" do
1398
-
1399
- context "when abbreviated" do
1400
-
1401
- let(:selection) do
1402
- query.send("#{method}", "field_one ASC, field_two DESC")
1403
- end
1404
-
1405
- it "adds the sorting criteria" do
1406
- expect(selection.options).to eq(
1407
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1408
- )
1409
- end
1410
-
1411
- it_behaves_like "a cloning option"
1412
- end
1413
-
1414
- context "when spelled out" do
1415
-
1416
- let(:selection) do
1417
- query.send("#{method}", "field_one ASCENDING, field_two DESCENDING")
1418
- end
1419
-
1420
- it "adds the sorting criteria" do
1421
- expect(selection.options).to eq(
1422
- { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1423
- )
1424
- end
1425
-
1426
- it_behaves_like "a cloning option"
1427
- end
1428
- end
1429
- end
1430
-
1431
- context "when provided no options" do
1432
-
1433
- let(:selection) do
1434
- query.order_by
1435
- end
1436
-
1437
- it "returns the query" do
1438
- expect(selection).to eq(query)
1439
- end
1440
-
1441
- it_behaves_like "a cloning option"
1442
- end
1443
-
1444
- context "when provided nil" do
1445
-
1446
- let(:selection) do
1447
- query.send("#{method}", nil)
1448
- end
1449
-
1450
- it "returns the query" do
1451
- expect(selection).to eq(query)
1452
- end
1453
-
1454
- it_behaves_like "a cloning option"
1455
- end
1456
- end
1457
973
  end
1458
974
  end
1459
975
 
@@ -1344,6 +1344,34 @@ describe Mongoid::Criteria::Queryable::Selectable do
1344
1344
  )
1345
1345
  end
1346
1346
  end
1347
+
1348
+ context 'when any_of has multiple arguments' do
1349
+
1350
+ let(:selection) do
1351
+ query.or(field: [ 1, 2 ]).where(foo: 'bar').any_of({a: 1}, {b: 2})
1352
+ end
1353
+
1354
+ it 'adds the new condition to top level' do
1355
+ expect(selection.selector).to eq(
1356
+ '$or' => [{'field' => [1, 2]}],
1357
+ 'foo' => 'bar',
1358
+ '$and' => [{'$or' => [{'a' => 1}, {'b' => 2}]}],
1359
+ )
1360
+ end
1361
+
1362
+ context 'when query already has a top-level $and' do
1363
+ let(:selection) do
1364
+ query.or(field: [ 1, 2 ]).where('$and' => [foo: 'bar']).any_of({a: 1}, {b: 2})
1365
+ end
1366
+
1367
+ it 'adds the new condition to top level $and' do
1368
+ expect(selection.selector).to eq(
1369
+ '$or' => [{'field' => [1, 2]}],
1370
+ '$and' => [{'foo' => 'bar'}, {'$or' => [{'a' => 1}, {'b' => 2}]}],
1371
+ )
1372
+ end
1373
+ end
1374
+ end
1347
1375
  end
1348
1376
 
1349
1377
  context "when provided multiple criteria" do
@@ -2065,5 +2093,27 @@ describe Mongoid::Criteria::Queryable::Selectable do
2065
2093
  end
2066
2094
  end
2067
2095
  end
2096
+
2097
+ # This test confirms that MONGOID-5097 has been repaired.
2098
+ context "when using exists on a field of type Time" do
2099
+ let(:criteria) do
2100
+ Dictionary.any_of({:published.exists => true}, published: nil)
2101
+ end
2102
+
2103
+ it "doesn't raise an error" do
2104
+ expect do
2105
+ criteria
2106
+ end.to_not raise_error
2107
+ end
2108
+
2109
+ it "generates the correct selector" do
2110
+ expect(criteria.selector).to eq({
2111
+ "$or" => [ {
2112
+ "published" => { "$exists" => true }
2113
+ }, {
2114
+ "published" => nil
2115
+ } ] } )
2116
+ end
2117
+ end
2068
2118
  end
2069
2119
  end