mongoid 5.4.1 → 6.0.0.beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/config/locales/en.yml +23 -16
  5. data/lib/mongoid.rb +4 -9
  6. data/lib/mongoid/atomic.rb +1 -1
  7. data/lib/mongoid/atomic/modifiers.rb +8 -12
  8. data/lib/mongoid/attributes.rb +9 -11
  9. data/lib/mongoid/attributes/dynamic.rb +5 -6
  10. data/lib/mongoid/attributes/nested.rb +1 -1
  11. data/lib/mongoid/attributes/processing.rb +4 -0
  12. data/lib/mongoid/attributes/readonly.rb +22 -0
  13. data/lib/mongoid/cacheable.rb +36 -0
  14. data/lib/mongoid/changeable.rb +37 -1
  15. data/lib/mongoid/clients.rb +0 -63
  16. data/lib/mongoid/clients/factory.rb +0 -2
  17. data/lib/mongoid/clients/options.rb +54 -249
  18. data/lib/mongoid/clients/storage_options.rb +1 -69
  19. data/lib/mongoid/composable.rb +26 -2
  20. data/lib/mongoid/config.rb +1 -1
  21. data/lib/mongoid/config/options.rb +1 -1
  22. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -0
  23. data/lib/mongoid/contextual/atomic.rb +6 -9
  24. data/lib/mongoid/contextual/geo_near.rb +2 -3
  25. data/lib/mongoid/contextual/map_reduce.rb +97 -24
  26. data/lib/mongoid/contextual/memory.rb +7 -4
  27. data/lib/mongoid/contextual/mongo.rb +63 -54
  28. data/lib/mongoid/contextual/none.rb +2 -2
  29. data/lib/mongoid/copyable.rb +19 -19
  30. data/lib/mongoid/criteria.rb +5 -4
  31. data/lib/mongoid/criteria/findable.rb +2 -3
  32. data/lib/mongoid/criteria/includable.rb +63 -16
  33. data/lib/mongoid/criteria/marshalable.rb +2 -2
  34. data/lib/mongoid/criteria/modifiable.rb +17 -1
  35. data/lib/mongoid/criteria/options.rb +25 -0
  36. data/lib/mongoid/criteria/queryable.rb +86 -0
  37. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  38. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  39. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  40. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  41. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  42. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  43. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  44. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  45. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  46. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  47. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  48. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  49. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +45 -0
  50. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  51. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  52. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  53. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  54. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  55. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  56. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  57. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  58. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  59. data/lib/mongoid/criteria/queryable/optional.rb +411 -0
  60. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  61. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  62. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  63. data/lib/mongoid/criteria/queryable/selector.rb +196 -0
  64. data/lib/mongoid/criteria/queryable/smash.rb +103 -0
  65. data/lib/mongoid/document.rb +9 -23
  66. data/lib/mongoid/errors.rb +2 -1
  67. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  68. data/lib/mongoid/errors/delete_restriction.rb +2 -2
  69. data/lib/mongoid/errors/invalid_field.rb +2 -2
  70. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  71. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  72. data/lib/mongoid/errors/inverse_not_found.rb +1 -1
  73. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  74. data/lib/mongoid/evolvable.rb +1 -1
  75. data/lib/mongoid/extensions.rb +0 -5
  76. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  77. data/lib/mongoid/extensions/date.rb +4 -1
  78. data/lib/mongoid/extensions/hash.rb +2 -3
  79. data/lib/mongoid/extensions/object.rb +2 -2
  80. data/lib/mongoid/extensions/string.rb +4 -3
  81. data/lib/mongoid/extensions/time.rb +5 -2
  82. data/lib/mongoid/factory.rb +1 -0
  83. data/lib/mongoid/fields/foreign_key.rb +2 -2
  84. data/lib/mongoid/fields/localized.rb +3 -8
  85. data/lib/mongoid/fields/validators/macro.rb +18 -0
  86. data/lib/mongoid/findable.rb +3 -3
  87. data/lib/mongoid/indexable.rb +17 -16
  88. data/lib/mongoid/indexable/specification.rb +1 -1
  89. data/lib/mongoid/indexable/validators/options.rb +1 -2
  90. data/lib/mongoid/interceptable.rb +6 -17
  91. data/lib/mongoid/loggable.rb +1 -1
  92. data/lib/mongoid/matchable.rb +3 -10
  93. data/lib/mongoid/matchable/gt.rb +2 -0
  94. data/lib/mongoid/matchable/gte.rb +2 -0
  95. data/lib/mongoid/matchable/lt.rb +2 -0
  96. data/lib/mongoid/matchable/lte.rb +2 -0
  97. data/lib/mongoid/persistable.rb +6 -5
  98. data/lib/mongoid/persistable/creatable.rb +2 -0
  99. data/lib/mongoid/persistable/deletable.rb +7 -3
  100. data/lib/mongoid/persistable/settable.rb +3 -16
  101. data/lib/mongoid/persistable/updatable.rb +10 -12
  102. data/lib/mongoid/persistence_context.rb +216 -0
  103. data/lib/mongoid/query_cache.rb +5 -30
  104. data/lib/mongoid/relations/accessors.rb +6 -2
  105. data/lib/mongoid/relations/auto_save.rb +12 -4
  106. data/lib/mongoid/relations/bindings/embedded/in.rb +4 -0
  107. data/lib/mongoid/relations/bindings/embedded/many.rb +8 -1
  108. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -0
  109. data/lib/mongoid/relations/bindings/referenced/many.rb +4 -0
  110. data/lib/mongoid/relations/builders.rb +2 -2
  111. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  112. data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
  113. data/lib/mongoid/relations/conversions.rb +1 -1
  114. data/lib/mongoid/relations/counter_cache.rb +28 -18
  115. data/lib/mongoid/relations/eager.rb +19 -7
  116. data/lib/mongoid/relations/eager/base.rb +5 -5
  117. data/lib/mongoid/relations/embedded/batchable.rb +9 -33
  118. data/lib/mongoid/relations/embedded/in.rb +16 -2
  119. data/lib/mongoid/relations/embedded/many.rb +23 -8
  120. data/lib/mongoid/relations/embedded/one.rb +17 -2
  121. data/lib/mongoid/relations/macros.rb +9 -2
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/nested_builder.rb +1 -1
  124. data/lib/mongoid/relations/options.rb +2 -2
  125. data/lib/mongoid/relations/proxy.rb +2 -33
  126. data/lib/mongoid/relations/referenced/in.rb +23 -11
  127. data/lib/mongoid/relations/referenced/many.rb +24 -16
  128. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  129. data/lib/mongoid/relations/referenced/one.rb +17 -1
  130. data/lib/mongoid/relations/reflections.rb +3 -5
  131. data/lib/mongoid/relations/touchable.rb +1 -1
  132. data/lib/mongoid/reloadable.rb +1 -1
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +2 -3
  135. data/lib/mongoid/tasks/database.rb +1 -2
  136. data/lib/mongoid/threaded.rb +4 -4
  137. data/lib/mongoid/traversable.rb +1 -1
  138. data/lib/mongoid/validatable.rb +1 -1
  139. data/lib/mongoid/validatable/macros.rb +2 -4
  140. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  141. data/lib/mongoid/version.rb +1 -1
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -7
  143. data/spec/app/models/album.rb +5 -1
  144. data/spec/app/models/artist.rb +21 -0
  145. data/spec/app/models/band.rb +0 -1
  146. data/spec/app/models/church.rb +0 -2
  147. data/spec/app/models/ordered_post.rb +5 -0
  148. data/spec/app/models/oscar.rb +1 -2
  149. data/spec/app/models/person.rb +3 -1
  150. data/spec/app/models/post.rb +0 -1
  151. data/spec/app/models/princess.rb +2 -0
  152. data/spec/app/models/record.rb +1 -0
  153. data/spec/app/models/thing.rb +1 -1
  154. data/spec/config/mongoid.yml +1 -5
  155. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  156. data/spec/mongoid/atomic_spec.rb +17 -17
  157. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  158. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  159. data/spec/mongoid/attributes_spec.rb +63 -0
  160. data/spec/mongoid/cacheable_spec.rb +112 -0
  161. data/spec/mongoid/changeable_spec.rb +58 -0
  162. data/spec/mongoid/clients/factory_spec.rb +3 -11
  163. data/spec/mongoid/clients/options_spec.rb +378 -96
  164. data/spec/mongoid/clients_spec.rb +207 -170
  165. data/spec/mongoid/composable_spec.rb +7 -0
  166. data/spec/mongoid/config_spec.rb +41 -21
  167. data/spec/mongoid/contextual/atomic_spec.rb +77 -343
  168. data/spec/mongoid/contextual/map_reduce_spec.rb +119 -111
  169. data/spec/mongoid/contextual/memory_spec.rb +56 -316
  170. data/spec/mongoid/contextual/mongo_spec.rb +104 -378
  171. data/spec/mongoid/copyable_spec.rb +8 -15
  172. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  173. data/spec/mongoid/criteria/options_spec.rb +29 -0
  174. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  175. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  176. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  177. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  178. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  179. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  180. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  181. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  182. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  183. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  184. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  185. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  186. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  187. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  188. data/spec/mongoid/{extensions/origin/regexp_raw_spec.rb → criteria/queryable/extensions/regexp_spec.rb} +21 -20
  189. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  190. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  191. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  192. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  193. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  194. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  195. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  196. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  197. data/spec/mongoid/criteria/queryable/optional_spec.rb +1786 -0
  198. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  199. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  200. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  201. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4159 -0
  202. data/spec/mongoid/criteria/queryable/selector_spec.rb +778 -0
  203. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  204. data/spec/mongoid/criteria_spec.rb +45 -63
  205. data/spec/mongoid/document_spec.rb +21 -88
  206. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  207. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  208. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  209. data/spec/mongoid/extensions/date_spec.rb +2 -6
  210. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  211. data/spec/mongoid/extensions/float_spec.rb +8 -1
  212. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  213. data/spec/mongoid/extensions/object_spec.rb +11 -0
  214. data/spec/mongoid/extensions/string_spec.rb +21 -0
  215. data/spec/mongoid/extensions/time_spec.rb +4 -8
  216. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  217. data/spec/mongoid/fields/localized_spec.rb +0 -91
  218. data/spec/mongoid/findable_spec.rb +46 -1
  219. data/spec/mongoid/indexable_spec.rb +6 -46
  220. data/spec/mongoid/interceptable_spec.rb +49 -10
  221. data/spec/mongoid/matchable/gt_spec.rb +11 -0
  222. data/spec/mongoid/matchable/gte_spec.rb +10 -0
  223. data/spec/mongoid/matchable/lt_spec.rb +11 -0
  224. data/spec/mongoid/matchable/lte_spec.rb +11 -0
  225. data/spec/mongoid/matchable_spec.rb +1 -51
  226. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  227. data/spec/mongoid/persistable/deletable_spec.rb +1 -1
  228. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  229. data/spec/mongoid/persistable/savable_spec.rb +30 -30
  230. data/spec/mongoid/persistable/settable_spec.rb +0 -185
  231. data/spec/mongoid/persistable/updatable_spec.rb +166 -5
  232. data/spec/mongoid/persistence_context_spec.rb +654 -0
  233. data/spec/mongoid/positional_spec.rb +10 -10
  234. data/spec/mongoid/query_cache_spec.rb +89 -65
  235. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  236. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  237. data/spec/mongoid/relations/builders_spec.rb +37 -10
  238. data/spec/mongoid/relations/counter_cache_spec.rb +64 -15
  239. data/spec/mongoid/relations/cyclic_spec.rb +0 -22
  240. data/spec/mongoid/relations/embedded/many_spec.rb +9 -41
  241. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  242. data/spec/mongoid/relations/macros_spec.rb +395 -7
  243. data/spec/mongoid/relations/proxy_spec.rb +3 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +6 -29
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +6 -29
  247. data/spec/mongoid/relations/reflections_spec.rb +9 -9
  248. data/spec/mongoid/reloadable_spec.rb +51 -0
  249. data/spec/mongoid/scopable_spec.rb +0 -12
  250. data/spec/mongoid/serializable_spec.rb +0 -50
  251. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  252. data/spec/mongoid/validatable/uniqueness_spec.rb +16 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +10 -10
  255. metadata +536 -479
  256. metadata.gz.sig +0 -0
  257. data/lib/mongoid/clients/thread_options.rb +0 -19
  258. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -20
  259. data/lib/mongoid/extensions/decimal128.rb +0 -39
  260. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  261. data/lib/mongoid/matchable/regexp.rb +0 -27
  262. data/spec/app/models/post_genre.rb +0 -6
  263. data/spec/mongoid/extensions/decimal128_spec.rb +0 -44
  264. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
@@ -17,6 +17,7 @@ module Mongoid
17
17
  # @param [ String, Symbol ] name The name of the relation.
18
18
  # @param [ Hash, BSON::ObjectId ] object The id or attributes to use.
19
19
  # @param [ Metadata ] metadata The relation's metadata.
20
+ # @param [ true, false ] building If we are in a build operation.
20
21
  #
21
22
  # @return [ Proxy ] The relation.
22
23
  #
@@ -31,7 +32,7 @@ module Mongoid
31
32
  # @example Create the relation.
32
33
  # person.create_relation(document, metadata)
33
34
  #
34
- # @param [ Document, Array<Document> ] object The relation target.
35
+ # @param [ Document, Array<Document ] object The relation target.
35
36
  # @param [ Metadata ] metadata The relation metadata.
36
37
  #
37
38
  # @return [ Proxy ] The relation.
@@ -159,7 +160,7 @@ module Mongoid
159
160
  #
160
161
  # @since 3.0.0
161
162
  def existence_check(name)
162
- module_eval <<-END, __FILE__, __LINE__ + 1
163
+ module_eval <<-END
163
164
  def #{name}?
164
165
  without_autobuild { !__send__(:#{name}).blank? }
165
166
  end
@@ -229,6 +230,9 @@ module Mongoid
229
230
  if value = get_relation(name, metadata, object)
230
231
  if value.respond_to?(:substitute)
231
232
  set_relation(name, value.substitute(object.substitutable))
233
+ else
234
+ value = __build__(name, value, metadata)
235
+ set_relation(name, value.substitute(object.substitutable))
232
236
  end
233
237
  else
234
238
  __build__(name, object.substitutable, metadata)
@@ -59,17 +59,25 @@ module Mongoid
59
59
  if metadata.autosave? && !metadata.embedded?
60
60
  save_method = :"autosave_documents_for_#{metadata.name}"
61
61
  define_method(save_method) do
62
-
63
62
  if before_callback_halted?
64
63
  self.before_callback_halted = false
65
64
  else
66
65
  __autosaving__ do
67
66
  if relation = ivar(metadata.name)
68
- options = persistence_options || {}
69
67
  if :belongs_to == metadata.macro
70
- relation.with(options).save if changed_for_autosave?(relation)
68
+ if changed_for_autosave?(relation)
69
+ relation.with(persistence_context) do |_relation|
70
+ _relation.save
71
+ end
72
+ end
71
73
  else
72
- Array(relation).each { |d| d.with(options).save if changed_for_autosave?(d) }
74
+ Array(relation).each do |doc|
75
+ if changed_for_autosave?(doc)
76
+ doc.with(persistence_context) do |d|
77
+ d.save
78
+ end
79
+ end
80
+ end
73
81
  end
74
82
  end
75
83
  end
@@ -17,6 +17,8 @@ module Mongoid
17
17
  # name.person.bind(:continue => true)
18
18
  # name.person = Person.new
19
19
  #
20
+ # @param [ Hash ] options The binding options.
21
+ #
20
22
  # @option options [ true, false ] :continue Continue binding the inverse.
21
23
  # @option options [ true, false ] :binding Are we in build mode?
22
24
  #
@@ -40,6 +42,8 @@ module Mongoid
40
42
  # name.person.unbind(:continue => true)
41
43
  # name.person = nil
42
44
  #
45
+ # @param [ Hash ] options The options to pass through.
46
+ #
43
47
  # @option options [ true, false ] :continue Do we continue unbinding?
44
48
  #
45
49
  # @since 2.0.0.rc.1
@@ -14,6 +14,10 @@ module Mongoid
14
14
  # person.addresses.bind_one(address)
15
15
  #
16
16
  # @param [ Document ] doc The single document to bind.
17
+ # @param [ Hash ] options The binding options.
18
+ #
19
+ # @option options [ true, false ] :continue Continue binding the inverse.
20
+ # @option options [ true, false ] :binding Are we in build mode?
17
21
  #
18
22
  # @since 2.0.0.rc.1
19
23
  def bind_one(doc)
@@ -28,7 +32,10 @@ module Mongoid
28
32
  # @example Unbind the document.
29
33
  # person.addresses.unbind_one(document)
30
34
  #
31
- # @param [ Document ] doc The single document to unbind.
35
+ # @param [ Hash ] options The binding options.
36
+ #
37
+ # @option options [ true, false ] :continue Continue binding the inverse.
38
+ # @option options [ true, false ] :binding Are we in build mode?
32
39
  #
33
40
  # @since 2.0.0.rc.1
34
41
  def unbind_one(doc)
@@ -17,6 +17,11 @@ module Mongoid
17
17
  # person.name.bind(:continue => true)
18
18
  # person.name = Name.new
19
19
  #
20
+ # @param [ Hash ] options The options to pass through.
21
+ #
22
+ # @option options [ true, false ] :continue Do we continue binding?
23
+ # @option options [ true, false ] :binding Are we in build mode?
24
+ #
20
25
  # @since 2.0.0.rc.1
21
26
  def bind_one
22
27
  target.parentize(base)
@@ -32,6 +37,11 @@ module Mongoid
32
37
  # person.name.unbind(:continue => true)
33
38
  # person.name = nil
34
39
  #
40
+ # @param [ Hash ] options The options to pass through.
41
+ #
42
+ # @option options [ true, false ] :continue Do we continue unbinding?
43
+ # @option options [ true, false ] :binding Are we in build mode?
44
+ #
35
45
  # @since 2.0.0.rc.1
36
46
  def unbind_one
37
47
  binding do
@@ -13,6 +13,8 @@ module Mongoid
13
13
  # @example Bind one document.
14
14
  # person.posts.bind_one(post)
15
15
  #
16
+ # @param [ Document ] doc The single document to bind.
17
+ #
16
18
  # @since 2.0.0.rc.1
17
19
  def bind_one(doc)
18
20
  binding do
@@ -25,6 +27,8 @@ module Mongoid
25
27
  # @example Unbind the document.
26
28
  # person.posts.unbind_one(document)
27
29
  #
30
+ # @param [ Document ] document The document to unbind.
31
+ #
28
32
  # @since 2.0.0.rc.1
29
33
  def unbind_one(doc)
30
34
  binding do
@@ -64,7 +64,7 @@ module Mongoid
64
64
  # @since 2.0.0.rc.1
65
65
  def builder(name, metadata)
66
66
  re_define_method("build_#{name}") do |*args|
67
- attributes, _options = parse_args(*args)
67
+ attributes, options = parse_args(*args)
68
68
  document = Factory.build(metadata.klass, attributes)
69
69
  _building do
70
70
  child = send("#{name}=", document)
@@ -89,7 +89,7 @@ module Mongoid
89
89
  # @since 2.0.0.rc.1
90
90
  def creator(name, metadata)
91
91
  re_define_method("create_#{name}") do |*args|
92
- attributes, _options = parse_args(*args)
92
+ attributes, options = parse_args(*args)
93
93
  document = Factory.build(metadata.klass, attributes)
94
94
  doc = _assigning do
95
95
  send("#{name}=", document)
@@ -12,7 +12,7 @@ module Mongoid
12
12
  # @example Build the document.
13
13
  # Builder.new(meta, attrs).build
14
14
  #
15
- # @param [ String ] _type Not used in this context.
15
+ # @param [ String ] type Not used in this context.
16
16
  #
17
17
  # @return [ Document ] A single document.
18
18
  def build(_type = nil)
@@ -60,7 +60,7 @@ module Mongoid
60
60
  # @example Is the document destroyable?
61
61
  # destroyable?({ :_destroy => "1" })
62
62
  #
63
- # @param [ Hash ] attributes The attributes to pull the flag from.
63
+ # @parma [ Hash ] attributes The attributes to pull the flag from.
64
64
  #
65
65
  # @return [ true, false ] If the relation can potentially be deleted.
66
66
  def destroyable?(attributes)
@@ -13,7 +13,7 @@ module Mongoid
13
13
  # Conversions.flag(metadata, 15)
14
14
  #
15
15
  # @param [ Object ] object The object to flag.
16
- # @param [ Metadata ] metadata The relation metadata.
16
+ # @param [ Metadata ] The relation metadata.
17
17
  #
18
18
  # @return [ Object ] The provided object.
19
19
  #
@@ -11,11 +11,13 @@ module Mongoid
11
11
  # @example Reset the given counter cache
12
12
  # post.reset_counters(:comments)
13
13
  #
14
- # @param [ Symbol, Array ] counters One or more counter caches to reset
14
+ # @param [ Symbol, Array ] One or more counter caches to reset
15
15
  #
16
16
  # @since 4.0.0
17
17
  def reset_counters(*counters)
18
- self.class.reset_counters(self, *counters)
18
+ self.class.with(persistence_context) do |_class|
19
+ _class.reset_counters(self, *counters)
20
+ end
19
21
  end
20
22
 
21
23
  module ClassMethods
@@ -27,8 +29,8 @@ module Mongoid
27
29
  # @example Reset the given counter cache
28
30
  # Post.reset_counters('50e0edd97c71c17ea9000001', :comments)
29
31
  #
30
- # @param [ String ] id The id of the object that will be reset.
31
- # @param [ Symbol, Array ] counters One or more counter caches to reset
32
+ # @param [ String ] The id of the object that will be reset.
33
+ # @param [ Symbol, Array ] One or more counter caches to reset
32
34
  #
33
35
  # @since 3.1.0
34
36
  def reset_counters(id, *counters)
@@ -49,8 +51,8 @@ module Mongoid
49
51
  # Post.update_counters('50e0edd97c71c17ea9000001',
50
52
  # :comments_count => 5, :likes_count => -2)
51
53
  #
52
- # @param [ String ] id The id of the object to update.
53
- # @param [ Hash ] counters
54
+ # @param [ String ] The id of the object to update.
55
+ # @param [ Hash ] Key = counter_cache and Value = factor.
54
56
  #
55
57
  # @since 3.1.0
56
58
  def update_counters(id, counters)
@@ -64,8 +66,8 @@ module Mongoid
64
66
  # @example Increment comments counter
65
67
  # Post.increment_counter(:comments_count, '50e0edd97c71c17ea9000001')
66
68
  #
67
- # @param [ Symbol ] counter_name Counter cache name
68
- # @param [ String ] id The id of the object that will have its counter incremented.
69
+ # @param [ Symbol ] Counter cache name
70
+ # @param [ String ] The id of the object that will have its counter incremented.
69
71
  #
70
72
  # @since 3.1.0
71
73
  def increment_counter(counter_name, id)
@@ -79,8 +81,8 @@ module Mongoid
79
81
  # @example Decrement comments counter
80
82
  # Post.decrement_counter(:comments_count, '50e0edd97c71c17ea9000001')
81
83
  #
82
- # @param [ Symbol ] counter_name Counter cache name
83
- # @param [ String ] id The id of the object that will have its counter decremented.
84
+ # @param [ Symbol ] Counter cache name
85
+ # @param [ String ] The id of the object that will have its counter decremented.
84
86
  #
85
87
  # @since 3.1.0
86
88
  def decrement_counter(counter_name, id)
@@ -96,7 +98,7 @@ module Mongoid
96
98
  # @example Add the touchable.
97
99
  # Person.add_counter_cache_callbacks(meta)
98
100
  #
99
- # @param [ Metadata ] meta The metadata for the relation.
101
+ # @param [ Metadata ] metadata The metadata for the relation.
100
102
  #
101
103
  # @since 3.1.0
102
104
  def add_counter_cache_callbacks(meta)
@@ -105,18 +107,22 @@ module Mongoid
105
107
 
106
108
  after_update do
107
109
  if record = __send__(name)
108
- foreign_key = meta.foreign_key
110
+ id_field = "#{name}_id"
109
111
 
110
- if attribute_changed?(foreign_key)
111
- original, current = attribute_change(foreign_key)
112
+ if attribute_changed?(id_field)
113
+ original, current = attribute_change(id_field)
112
114
 
113
115
  unless original.nil?
114
- record.class.decrement_counter(cache_column, original)
116
+ record.class.with(persistence_context) do |_class|
117
+ _class.decrement_counter(cache_column, original)
118
+ end
115
119
  end
116
120
 
117
121
  unless current.nil?
118
122
  record[cache_column] = (record[cache_column] || 0) + 1
119
- record.class.increment_counter(cache_column, current) if record.persisted?
123
+ record.class.with(record.persistence_context) do |_class|
124
+ _class.increment_counter(cache_column, current) if record.persisted?
125
+ end
120
126
  end
121
127
  end
122
128
  end
@@ -127,7 +133,9 @@ module Mongoid
127
133
  record[cache_column] = (record[cache_column] || 0) + 1
128
134
 
129
135
  if record.persisted?
130
- record.class.increment_counter(cache_column, record._id)
136
+ record.class.with(record.persistence_context) do |_class|
137
+ _class.increment_counter(cache_column, record._id)
138
+ end
131
139
  record.remove_change(cache_column)
132
140
  end
133
141
  end
@@ -138,7 +146,9 @@ module Mongoid
138
146
  record[cache_column] = (record[cache_column] || 0) - 1 unless record.frozen?
139
147
 
140
148
  if record.persisted?
141
- record.class.decrement_counter(cache_column, record._id)
149
+ record.class.with(record.persistence_context) do |_class|
150
+ _class.decrement_counter(cache_column, record._id)
151
+ end
142
152
  record.remove_change(cache_column)
143
153
  end
144
154
  end
@@ -9,16 +9,28 @@ module Mongoid
9
9
  module Relations
10
10
  module Eager
11
11
 
12
- def eager_loadable?
13
- !criteria.inclusions.empty?
12
+ attr_accessor :eager_loaded
13
+
14
+ def with_eager_loading(document)
15
+ return nil unless document
16
+ doc = Factory.from_db(klass, document, criteria.options[:fields])
17
+ eager_load_one(doc)
18
+ doc
19
+ end
20
+
21
+ def eager_load_one(doc)
22
+ eager_load([doc])
23
+ end
24
+
25
+ def eager_loadable?(document = nil)
26
+ return false if criteria.inclusions.empty?
27
+ !eager_loaded
14
28
  end
15
29
 
16
30
  def eager_load(docs)
17
- docs.tap do |d|
18
- if eager_loadable?
19
- preload(criteria.inclusions, d)
20
- end
21
- end
31
+ return false unless eager_loadable?
32
+ preload(criteria.inclusions, docs)
33
+ self.eager_loaded = true
22
34
  end
23
35
 
24
36
  def preload(relations, docs)
@@ -12,8 +12,8 @@ module Mongoid
12
12
  # @example Create the new belongs to eager load preloader.
13
13
  # BelongsTo.new(relations_metadata, parent_docs)
14
14
  #
15
- # @param [ Array<Metadata> ] associations Relations to eager load
16
- # @param [ Array<Document> ] docs Documents to preload the relations
15
+ # @param [ Array<Metadata> ] Relations to eager load
16
+ # @param [ Array<Document> ] Documents to preload the relations
17
17
  #
18
18
  # @return [ Base ] The eager load preloader
19
19
  #
@@ -84,7 +84,7 @@ module Mongoid
84
84
  # @example Set docs into parent with pk = "foo"
85
85
  # loader.set_on_parent("foo", docs)
86
86
  #
87
- # @param [ ObjectId ] id parent`s id
87
+ # @param [ ObjectId ] parent`s id
88
88
  # @param [ Document, Array ] element to push into the parent
89
89
  #
90
90
  # @since 4.0.0
@@ -140,12 +140,12 @@ module Mongoid
140
140
  # @example Set docs into parent using the current relation name.
141
141
  # loader.set_relation(doc, docs)
142
142
  #
143
- # @param [ Document ] doc
143
+ # @param [ Document ] document
144
144
  # @param [ Document, Array ] element to set into the parent
145
145
  #
146
146
  # @since 4.0.0
147
147
  def set_relation(doc, element)
148
- doc.set_relation(@metadata.name, element) unless doc.blank?
148
+ doc.set_relation(@metadata.name, element)
149
149
  end
150
150
  end
151
151
  end
@@ -13,15 +13,15 @@ module Mongoid
13
13
  # made to the database.
14
14
  #
15
15
  # @example Execute the batch push.
16
- # batchable.batch_push([ doc_one, doc_two ])
16
+ # batchable.batch_insert([ doc_one, doc_two ])
17
17
  #
18
18
  # @param [ Array<Document> ] docs The docs to add.
19
19
  #
20
20
  # @return [ Array<Hash> ] The inserts.
21
21
  #
22
- # @since 5.4.0
23
- def batch_push(docs)
24
- execute_batch_push(docs)
22
+ # @since 3.0.0
23
+ def batch_insert(docs)
24
+ execute_batch_insert(docs, "$pushAll")
25
25
  end
26
26
 
27
27
  # Clear all of the docs out of the relation in a single swipe.
@@ -89,7 +89,7 @@ module Mongoid
89
89
  base.delayed_atomic_sets.clear unless _assigning?
90
90
  docs = normalize_docs(docs).compact
91
91
  target.clear and _unscoped.clear
92
- inserts = execute_batch_set(docs)
92
+ inserts = execute_batch_insert(docs, "$set")
93
93
  add_atomic_sets(inserts)
94
94
  end
95
95
  end
@@ -122,50 +122,26 @@ module Mongoid
122
122
  # @api private
123
123
  #
124
124
  # @example Perform a batch operation.
125
- # batchable.execute_batch_set(docs)
125
+ # batchable.execute_batch(docs, "$set")
126
126
  #
127
127
  # @param [ Array<Document> ] docs The docs to persist.
128
128
  # @param [ String ] operation The atomic operation.
129
129
  #
130
130
  # @return [ Array<Hash> ] The inserts.
131
131
  #
132
- # @since 5.4.0
133
- def execute_batch_set(docs)
132
+ # @since 3.0.0
133
+ def execute_batch_insert(docs, operation)
134
134
  self.inserts_valid = true
135
135
  inserts = pre_process_batch_insert(docs)
136
136
  if insertable?
137
137
  collection.find(selector).update_one(
138
- positionally(selector, '$set' => { path => inserts })
138
+ positionally(selector, operation => { path => inserts })
139
139
  )
140
140
  post_process_batch_insert(docs)
141
141
  end
142
142
  inserts
143
143
  end
144
144
 
145
- # Perform a batch persist of the provided documents with $push and $each.
146
- #
147
- # @api private
148
- #
149
- # @example Perform a batch push.
150
- # batchable.execute_batch_push(docs)
151
- #
152
- # @param [ Array<Document> ] docs The docs to persist.
153
- # @param [ String ] operation The atomic operation.
154
- #
155
- # @return [ Array<Hash> ] The inserts.
156
- #
157
- # @since 5.4.0
158
- def execute_batch_push(docs)
159
- self.inserts_valid = true
160
- pushes = pre_process_batch_insert(docs)
161
- if insertable?
162
- collection.find(selector).update_one(
163
- positionally(selector, '$push' => { path => { '$each' => pushes } }))
164
- post_process_batch_insert(docs)
165
- end
166
- pushes
167
- end
168
-
169
145
  # Are we in a state to be able to batch insert?
170
146
  #
171
147
  # @api private