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
@@ -50,7 +50,7 @@ module Mongoid
50
50
  # @example Get the distinct values in null context.
51
51
  # context.distinct(:name)
52
52
  #
53
- # @param [ String, Symbol ] _field The name of the field.
53
+ # @param [ String | Symbol ] _field The name of the field.
54
54
  #
55
55
  # @return [ Array ] An empty Array.
56
56
  def distinct(_field)
@@ -88,13 +88,37 @@ module Mongoid
88
88
  # @example Get the values for null context.
89
89
  # context.pluck(:name)
90
90
  #
91
- # @param [ String, Symbol, Array ] args Field or fields to pluck.
91
+ # @param [ String | Symbol ] *_fields Field or fields to pluck.
92
92
  #
93
93
  # @return [ Array ] An empty Array.
94
- def pluck(*args)
94
+ def pluck(*_fields)
95
95
  []
96
96
  end
97
97
 
98
+ # Pick the field values in null context.
99
+ #
100
+ # @example Get the value for null context.
101
+ # context.pick(:name)
102
+ #
103
+ # @param [ String | Symbol ] *_fields Field or fields to pick.
104
+ #
105
+ # @return [ nil ] Always reeturn nil.
106
+ def pick(*_fields)
107
+ nil
108
+ end
109
+
110
+ # Tally the field values in null context.
111
+ #
112
+ # @example Get the values for null context.
113
+ # context.tally(:name)
114
+ #
115
+ # @param [ String | Symbol ] _field Field to tally.
116
+ #
117
+ # @return [ Hash ] An empty Hash.
118
+ def tally(_field)
119
+ {}
120
+ end
121
+
98
122
  # Create the new null context.
99
123
  #
100
124
  # @example Create the new context.
@@ -105,13 +129,51 @@ module Mongoid
105
129
  @criteria, @klass = criteria, criteria.klass
106
130
  end
107
131
 
132
+ # Always returns nil.
133
+ #
134
+ # @example Get the first document in null context.
135
+ # context.first
136
+ #
137
+ # @param [ Integer ] limit The number of documents to return.
138
+ #
139
+ # @return [ nil ] Always nil.
140
+ def first(limit = nil)
141
+ [] unless limit.nil?
142
+ end
143
+
108
144
  # Always returns nil.
109
145
  #
110
146
  # @example Get the last document in null context.
111
147
  # context.last
112
148
  #
149
+ # @param [ Integer ] limit The number of documents to return.
150
+ #
113
151
  # @return [ nil ] Always nil.
114
- def last; nil; end
152
+ def last(limit = nil)
153
+ [] unless limit.nil?
154
+ end
155
+
156
+ # Returns nil or empty array.
157
+ #
158
+ # @example Take a document in null context.
159
+ # context.take
160
+ #
161
+ # @param [ Integer | nil ] limit The number of documents to take or nil.
162
+ #
163
+ # @return [ [] | nil ] Empty array or nil.
164
+ def take(limit = nil)
165
+ limit ? [] : nil
166
+ end
167
+
168
+ # Always raises an error.
169
+ #
170
+ # @example Take a document in null context.
171
+ # context.take!
172
+ #
173
+ # @raises [ Mongoid::Errors::DocumentNotFound ] always raises.
174
+ def take!
175
+ raise Errors::DocumentNotFound.new(klass, nil, nil)
176
+ end
115
177
 
116
178
  # Always returns zero.
117
179
  #
@@ -10,7 +10,11 @@ module Mongoid
10
10
  # the exception of the document's id, and will reset all the
11
11
  # instance variables.
12
12
  #
13
- # This clone also includes embedded documents.
13
+ # This clone also includes embedded documents. If there is an _id field in
14
+ # the embedded document, it will be maintained, unlike the root's _id.
15
+ #
16
+ # If cloning an embedded child, the embedded parent is not cloned and the
17
+ # embedded_in association is not set.
14
18
  #
15
19
  # @example Clone the document.
16
20
  # document.clone
@@ -19,19 +23,42 @@ module Mongoid
19
23
  def clone
20
24
  # @note This next line is here to address #2704, even though having an
21
25
  # _id and id field in the document would cause problems with Mongoid
22
- # elsewhere.
26
+ # elsewhere. Note this is only done on the root document as we want
27
+ # to maintain the same _id on the embedded documents.
23
28
  attrs = clone_document.except(*self.class.id_fields)
29
+ Copyable.clone_with_hash(self.class, attrs)
30
+ end
31
+ alias :dup :clone
32
+
33
+ private
34
+
35
+ # Create clone of a document of the given klass with the given attributes
36
+ # hash. This is used recursively so that embedded associations are cloned
37
+ # safely.
38
+ #
39
+ # @param klass [ Class ] The class of the document to create.
40
+ # @param attrs [ Hash ] The hash of the attributes.
41
+ #
42
+ # @return [ Document ] The new document.
43
+ def self.clone_with_hash(klass, attrs)
24
44
  dynamic_attrs = {}
25
- _attribute_names = self.attribute_names
45
+ _attribute_names = klass.attribute_names
26
46
  attrs.reject! do |attr_name, value|
27
47
  unless _attribute_names.include?(attr_name)
28
48
  dynamic_attrs[attr_name] = value
29
49
  true
30
50
  end
31
51
  end
32
- self.class.new(attrs).tap do |object|
52
+
53
+ Factory.build(klass, attrs).tap do |object|
33
54
  dynamic_attrs.each do |attr_name, value|
34
- if object.respond_to?("#{attr_name}=")
55
+ assoc = object.embedded_relations[attr_name]
56
+ if assoc&.one? && Hash === value
57
+ object.send("#{attr_name}=", clone_with_hash(assoc.klass, value))
58
+ elsif assoc&.many? && Array === value
59
+ docs = value.map { |h| clone_with_hash(assoc.klass, h) }
60
+ object.send("#{attr_name}=", docs)
61
+ elsif object.respond_to?("#{attr_name}=")
35
62
  object.send("#{attr_name}=", value)
36
63
  else
37
64
  object.attributes[attr_name] = value
@@ -39,9 +66,6 @@ module Mongoid
39
66
  end
40
67
  end
41
68
  end
42
- alias :dup :clone
43
-
44
- private
45
69
 
46
70
  # Clone the document attributes
47
71
  #
@@ -26,15 +26,12 @@ module Mongoid
26
26
  #
27
27
  # @return [ Criteria ] The cloned criteria.
28
28
  def includes(*relations)
29
- extract_includes_list(klass, relations)
29
+ extract_includes_list(klass, nil, relations)
30
30
  clone
31
31
  end
32
32
 
33
33
  # Get a list of criteria that are to be executed for eager loading.
34
34
  #
35
- # @example Get the eager loading inclusions.
36
- # Person.includes(:game).inclusions
37
- #
38
35
  # @return [ Array<Association> ] The inclusions.
39
36
  def inclusions
40
37
  @inclusions ||= []
@@ -42,9 +39,6 @@ module Mongoid
42
39
 
43
40
  # Set the inclusions for the criteria.
44
41
  #
45
- # @example Set the inclusions.
46
- # criteria.inclusions = [ association ]
47
- #
48
42
  # @param [ Array<Association> ] value The inclusions.
49
43
  #
50
44
  # @return [ Array<Association> ] The new inclusions.
@@ -56,30 +50,40 @@ module Mongoid
56
50
 
57
51
  # Add an inclusion definition to the list of inclusions for the criteria.
58
52
  #
59
- # @example Add an inclusion.
60
- # criteria.add_inclusion(Person, :posts)
61
- #
62
- # @param [ Class, String, Symbol ] _klass The class or string/symbol of the class name.
63
- # @param [ Symbol ] association The association.
64
- #
65
- # @raise [ Errors::InvalidIncludes ] If no association is found.
66
- def add_inclusion(_klass, association)
67
- inclusions.push(association) unless inclusions.include?(association)
53
+ # @param [ Association ] association The association.
54
+ # @param [ String ] parent The name of the association above this one in
55
+ # the inclusion tree, if it is a nested inclusion.
56
+ def add_inclusion(association, parent = nil)
57
+ if assoc = inclusions.detect { |a| a == association }
58
+ assoc.parent_inclusions.push(parent) if parent
59
+ else
60
+ assoc = association.dup
61
+ assoc.parent_inclusions = []
62
+ assoc.parent_inclusions.push(parent) if parent
63
+ inclusions.push(assoc)
64
+ end
68
65
  end
69
66
 
70
- def extract_includes_list(_parent_class, *relations_list)
67
+ # Iterate through the list of relations and create the inclusions list.
68
+ #
69
+ # @param [ Class, String, Symbol ] _parent_class The class from which the
70
+ # association originates.
71
+ # @param [ String ] parent The name of the association above this one in
72
+ # the inclusion tree, if it is a nested inclusion.
73
+ # @param relations_list The names of the associations to eager load.
74
+ def extract_includes_list(_parent_class, parent, *relations_list)
71
75
  relations_list.flatten.each do |relation_object|
72
76
  if relation_object.is_a?(Hash)
73
77
  relation_object.each do |relation, _includes|
74
78
  association = _parent_class.reflect_on_association(relation)
75
79
  raise Errors::InvalidIncludes.new(_klass, [ relation ]) unless association
76
- add_inclusion(_parent_class, association)
77
- extract_includes_list(association.klass, _includes)
80
+ add_inclusion(association, parent)
81
+ extract_includes_list(association.klass, association.name, _includes)
78
82
  end
79
83
  else
80
84
  association = _parent_class.reflect_on_association(relation_object)
81
85
  raise Errors::InvalidIncludes.new(_parent_class, [ relation_object ]) unless association
82
- add_inclusion(_parent_class, association)
86
+ add_inclusion(association, parent)
83
87
  end
84
88
  end
85
89
  end
@@ -9,9 +9,12 @@ module Mongoid
9
9
  # @example Dump the criteria.
10
10
  # Marshal.dump(criteria)
11
11
  #
12
+ # Note :mongo is written here for backwards compatibility with Mongoid 7
13
+ # and earlier.
14
+ #
12
15
  # @return [ Array<Object> ] The dumped data.
13
16
  def marshal_dump
14
- data = [ klass, driver, inclusions, documents, strategy, negating ]
17
+ data = [ klass, :mongo, inclusions, documents, strategy, negating ]
15
18
  data.push(scoping_options).push(dump_hash(:selector)).push(dump_hash(:options))
16
19
  end
17
20
 
@@ -23,7 +26,12 @@ module Mongoid
23
26
  # @param [ Array ] data The raw data.
24
27
  def marshal_load(data)
25
28
  @scoping_options, raw_selector, raw_options = data.pop(3)
26
- @klass, @driver, @inclusions, @documents, @strategy, @negating = data
29
+ @klass, driver, @inclusions, @documents, @strategy, @negating = data
30
+
31
+ if driver == :mongo1x
32
+ raise NotImplementedError, "Mongoid no longer supports marshalling with driver version 1.x."
33
+ end
34
+
27
35
  @selector = load_hash(Queryable::Selector, raw_selector)
28
36
  @options = load_hash(Queryable::Options, raw_options)
29
37
  end
@@ -108,18 +108,6 @@ module Mongoid
108
108
  { first => last.to_direction }
109
109
  end
110
110
 
111
- # Update all the values in the hash with the provided block.
112
- #
113
- # @example Update the values in place.
114
- # [ 1, 2, 3 ].update_values(&:to_s)
115
- #
116
- # @param [ Proc ] block The block to execute on each value.
117
- #
118
- # @return [ Array ] the array.
119
- def update_values(&block)
120
- replace(map(&block))
121
- end
122
-
123
111
  private
124
112
 
125
113
  # Converts the array to a multi-dimensional array.
@@ -145,7 +133,8 @@ module Mongoid
145
133
  #
146
134
  # @return [ Object ] The evolved object.
147
135
  def evolve(object)
148
- if object.is_a?(::Array)
136
+ case object
137
+ when ::Array, ::Set
149
138
  object.map { |obj| obj.class.evolve(obj) }
150
139
  else
151
140
  object
@@ -12,18 +12,39 @@ module Mongoid
12
12
  module BigDecimal
13
13
  module ClassMethods
14
14
 
15
- # Evolves the big decimal into a MongoDB friendly value - in this case
16
- # a string.
15
+ # Evolves the big decimal into a MongoDB friendly value.
17
16
  #
18
17
  # @example Evolve the big decimal
19
18
  # BigDecimal.evolve(decimal)
20
19
  #
21
20
  # @param [ BigDecimal ] object The object to convert.
22
21
  #
23
- # @return [ String ] The big decimal as a string.
22
+ # @return [ Object ] The big decimal as a string, a Decimal128,
23
+ # or the inputted object if it is uncastable.
24
24
  def evolve(object)
25
25
  __evolve__(object) do |obj|
26
- obj ? obj.to_s : obj
26
+ return if obj.nil?
27
+ case obj
28
+ when ::BigDecimal
29
+ if Mongoid.map_big_decimal_to_decimal128
30
+ BSON::Decimal128.new(obj)
31
+ else
32
+ obj.to_s
33
+ end
34
+ # Always return on string for backwards compatibility with querying
35
+ # string-backed BigDecimal fields.
36
+ when BSON::Decimal128, String then obj
37
+ else
38
+ if obj.numeric?
39
+ if Mongoid.map_big_decimal_to_decimal128
40
+ BSON::Decimal128.new(object.to_s)
41
+ else
42
+ obj.to_s
43
+ end
44
+ else
45
+ obj
46
+ end
47
+ end
27
48
  end
28
49
  end
29
50
  end
@@ -20,7 +20,7 @@ module Mongoid
20
20
  # @return [ true, false ] The boolean value.
21
21
  def evolve(object)
22
22
  __evolve__(object) do |obj|
23
- obj.to_s =~ (/\A(true|t|yes|y|on|1|1.0)\z/i) ? true : false
23
+ mongoize(obj)
24
24
  end
25
25
  end
26
26
  end
@@ -45,7 +45,12 @@ module Mongoid
45
45
  #
46
46
  # @return [ Time ] The evolved date.
47
47
  def evolve(object)
48
- object.__evolve_date__
48
+ res = begin
49
+ object.try(:__evolve_date__)
50
+ rescue ArgumentError
51
+ nil
52
+ end
53
+ res.nil? ? object : res
49
54
  end
50
55
  end
51
56
  end
@@ -34,7 +34,12 @@ module Mongoid
34
34
  #
35
35
  # @return [ Time ] The evolved date time.
36
36
  def evolve(object)
37
- object.__evolve_time__
37
+ res = begin
38
+ object.try(:__evolve_time__)
39
+ rescue ArgumentError
40
+ nil
41
+ end
42
+ res.nil? ? object : res
38
43
  end
39
44
  end
40
45
  end
@@ -134,20 +134,6 @@ module Mongoid
134
134
  replacement
135
135
  end
136
136
 
137
- # Update all the values in the hash with the provided block.
138
- #
139
- # @example Update the values in place.
140
- # { field: "1" }.update_values(&:to_i)
141
- #
142
- # @param [ Proc ] block The block to execute on each value.
143
- #
144
- # @return [ Hash ] the hash.
145
- def update_values(&block)
146
- each_pair do |key, value|
147
- store(key, block[value])
148
- end
149
- end
150
-
151
137
  private
152
138
 
153
139
  # Apply the provided strategy for the hash with the given object.
@@ -51,7 +51,7 @@ module Mongoid
51
51
  #
52
52
  # @return [ Object ] The converted number.
53
53
  def __numeric__(object)
54
- object.to_s =~ /(\A[-+]?[0-9]+\z)|(\.0+\z)|(\.\z)/ ? object.to_i : Float(object)
54
+ object.to_s.match?(/\A[-+]?[0-9]*[0-9.]0*\z/) ? object.to_i : Float(object)
55
55
  end
56
56
 
57
57
  # Evolve the object to an integer.
@@ -167,7 +167,8 @@ module Mongoid
167
167
  when ::Range
168
168
  object.__evolve_range__
169
169
  else
170
- yield(object)
170
+ res = yield(object)
171
+ res.nil? ? object : res
171
172
  end
172
173
  end
173
174
  end
@@ -43,13 +43,21 @@ module Mongoid
43
43
  # @example Evolve the range.
44
44
  # (11231312..213123131).__evolve_range__
45
45
  #
46
+ # @param [ Object ] serializer The optional serializer for the field.
47
+ #
46
48
  # @return [ Hash ] The $gte/$lte range query.
47
- def __evolve_range__
49
+ #
50
+ # @api private
51
+ def __evolve_range__(serializer: nil)
48
52
  __evolve_range_naive__.transform_values! do |value|
49
- case value
50
- when Time, DateTime then value.__evolve_time__
51
- when Date then value.__evolve_date__
52
- else value
53
+ if serializer
54
+ serializer.evolve(value)
55
+ else
56
+ case value
57
+ when Time, DateTime then value.__evolve_time__
58
+ when Date then value.__evolve_date__
59
+ else value
60
+ end
53
61
  end
54
62
  end
55
63
  end
@@ -28,7 +28,7 @@ module Mongoid
28
28
  # @return [ Regexp ] The evolved regex.
29
29
  def evolve(object)
30
30
  __evolve__(object) do |obj|
31
- ::Regexp.new(obj)
31
+ mongoize(obj)
32
32
  end
33
33
  end
34
34
  end
@@ -59,7 +59,9 @@ module Mongoid
59
59
  #
60
60
  # @return [ Symbol ] The value as a symbol.
61
61
  def evolve(object)
62
- __evolve__(object) { |obj| obj.to_sym }
62
+ __evolve__(object) do |obj|
63
+ obj.try(:to_sym)
64
+ end
63
65
  end
64
66
  end
65
67
  end
@@ -42,7 +42,12 @@ module Mongoid
42
42
  #
43
43
  # @return [ Time ] The evolved date time.
44
44
  def evolve(object)
45
- object.__evolve_time__
45
+ res = begin
46
+ object.try(:__evolve_time__)
47
+ rescue ArgumentError
48
+ nil
49
+ end
50
+ res.nil? ? object : res
46
51
  end
47
52
  end
48
53
  end
@@ -42,7 +42,12 @@ module Mongoid
42
42
  #
43
43
  # @return [ Time ] The evolved date time.
44
44
  def evolve(object)
45
- object.__evolve_time__
45
+ res = begin
46
+ object.try(:__evolve_time__)
47
+ rescue ArgumentError
48
+ nil
49
+ end
50
+ res.nil? ? object : res
46
51
  end
47
52
  end
48
53
  end
@@ -52,6 +52,27 @@ module Mongoid
52
52
  self
53
53
  end
54
54
 
55
+ # Merge criteria with operators using the and operator.
56
+ #
57
+ # @param [ Hash ] criterion The criterion to add to the criteria.
58
+ # @param [ String ] operator The MongoDB operator.
59
+ #
60
+ # @return [ Criteria ] The resulting criteria.
61
+ def and_with_operator(criterion, operator)
62
+ crit = self
63
+ if criterion
64
+ criterion.each_pair do |field, value|
65
+ val = prepare(field, operator, value)
66
+ # The prepare method already takes the negation into account. We
67
+ # set negating to false here so that ``and`` doesn't also apply
68
+ # negation and we have a double negative.
69
+ crit.negating = false
70
+ crit = crit.and(field => val)
71
+ end
72
+ end
73
+ crit
74
+ end
75
+
55
76
  private
56
77
 
57
78
  # Adds the criterion to the existing selection.
@@ -318,15 +318,9 @@ module Mongoid
318
318
  #
319
319
  # @return [ Optional ] The cloned optional.
320
320
  def add_sort_option(options, field, direction)
321
- if driver == :mongo1x
322
- sorting = (options[:sort] || []).dup
323
- sorting.push([ field, direction ])
324
- options.store(:sort, sorting)
325
- else
326
- sorting = (options[:sort] || {}).dup
327
- sorting[field] = direction
328
- options.store(:sort, sorting)
329
- end
321
+ sorting = (options[:sort] || {}).dup
322
+ sorting[field] = direction
323
+ options.store(:sort, sorting)
330
324
  end
331
325
 
332
326
  # Take the provided criterion and store it as an option in the query
@@ -84,7 +84,7 @@ module Mongoid
84
84
  #
85
85
  # @return [ Options ] The copied options.
86
86
  def __deep_copy__
87
- self.class.new(aliases, serializers) do |copy|
87
+ self.class.new(aliases, serializers, associations, aliased_associations) do |copy|
88
88
  each_pair do |key, value|
89
89
  copy.merge!(key => value.__deep_copy__)
90
90
  end