mongoid 5.4.1 → 6.0.0.beta

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