mongoid 2.0.2 → 2.1.0

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 (240) hide show
  1. data/README.rdoc +3 -1
  2. data/Rakefile +3 -2
  3. data/lib/config/locales/bg.yml +6 -0
  4. data/lib/config/locales/de.yml +6 -0
  5. data/lib/config/locales/en-GB.yml +48 -0
  6. data/lib/config/locales/en.yml +6 -3
  7. data/lib/config/locales/es.yml +6 -0
  8. data/lib/config/locales/fr.yml +6 -0
  9. data/lib/config/locales/hi.yml +39 -0
  10. data/lib/config/locales/hu.yml +13 -7
  11. data/lib/config/locales/id.yml +3 -0
  12. data/lib/config/locales/it.yml +7 -1
  13. data/lib/config/locales/ja.yml +4 -1
  14. data/lib/config/locales/kr.yml +9 -34
  15. data/lib/config/locales/nl.yml +6 -0
  16. data/lib/config/locales/pl.yml +6 -0
  17. data/lib/config/locales/pt-BR.yml +6 -0
  18. data/lib/config/locales/pt.yml +6 -0
  19. data/lib/config/locales/ro.yml +6 -0
  20. data/lib/config/locales/ru.yml +6 -0
  21. data/lib/config/locales/sv.yml +6 -0
  22. data/lib/config/locales/vi.yml +3 -0
  23. data/lib/config/locales/zh-CN.yml +6 -0
  24. data/lib/mongoid.rb +51 -45
  25. data/lib/mongoid/atomic.rb +145 -0
  26. data/lib/mongoid/atomic/modifiers.rb +109 -0
  27. data/lib/mongoid/atomic/paths.rb +3 -0
  28. data/lib/mongoid/atomic/paths/embedded.rb +43 -0
  29. data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
  30. data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
  31. data/lib/mongoid/atomic/paths/root.rb +40 -0
  32. data/lib/mongoid/attributes.rb +12 -23
  33. data/lib/mongoid/attributes/processing.rb +5 -5
  34. data/lib/mongoid/callbacks.rb +2 -0
  35. data/lib/mongoid/collection.rb +12 -59
  36. data/lib/mongoid/collections.rb +23 -20
  37. data/lib/mongoid/collections/master.rb +6 -4
  38. data/lib/mongoid/collections/operations.rb +1 -0
  39. data/lib/mongoid/collections/retry.rb +7 -0
  40. data/lib/mongoid/components.rb +2 -2
  41. data/lib/mongoid/config.rb +42 -55
  42. data/lib/mongoid/config/database.rb +6 -2
  43. data/lib/mongoid/config/replset_database.rb +7 -3
  44. data/lib/mongoid/contexts.rb +9 -3
  45. data/lib/mongoid/contexts/enumerable.rb +7 -3
  46. data/lib/mongoid/contexts/mongo.rb +139 -101
  47. data/lib/mongoid/criteria.rb +86 -69
  48. data/lib/mongoid/criterion/complex.rb +32 -5
  49. data/lib/mongoid/criterion/inclusion.rb +4 -2
  50. data/lib/mongoid/criterion/optional.rb +111 -86
  51. data/lib/mongoid/criterion/selector.rb +8 -4
  52. data/lib/mongoid/cursor.rb +27 -27
  53. data/lib/mongoid/dirty.rb +54 -214
  54. data/lib/mongoid/document.rb +37 -39
  55. data/lib/mongoid/errors/document_not_found.rb +3 -4
  56. data/lib/mongoid/errors/invalid_collection.rb +2 -3
  57. data/lib/mongoid/errors/invalid_database.rb +2 -3
  58. data/lib/mongoid/errors/invalid_field.rb +2 -3
  59. data/lib/mongoid/errors/invalid_options.rb +19 -7
  60. data/lib/mongoid/errors/invalid_type.rb +2 -3
  61. data/lib/mongoid/errors/mongoid_error.rb +5 -6
  62. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -3
  63. data/lib/mongoid/errors/unsupported_version.rb +2 -3
  64. data/lib/mongoid/errors/validations.rb +2 -3
  65. data/lib/mongoid/extensions.rb +8 -62
  66. data/lib/mongoid/extensions/array/deletion.rb +29 -0
  67. data/lib/mongoid/extensions/false_class/equality.rb +14 -1
  68. data/lib/mongoid/extensions/hash/criteria_helpers.rb +21 -10
  69. data/lib/mongoid/extensions/hash/scoping.rb +14 -1
  70. data/lib/mongoid/extensions/nil/collectionization.rb +12 -1
  71. data/lib/mongoid/extensions/object/reflections.rb +33 -2
  72. data/lib/mongoid/extensions/object_id/conversions.rb +2 -36
  73. data/lib/mongoid/extensions/proc/scoping.rb +14 -1
  74. data/lib/mongoid/extensions/string/conversions.rb +4 -16
  75. data/lib/mongoid/extensions/string/inflections.rb +35 -14
  76. data/lib/mongoid/extensions/symbol/inflections.rb +38 -12
  77. data/lib/mongoid/extensions/true_class/equality.rb +14 -1
  78. data/lib/mongoid/extras.rb +11 -30
  79. data/lib/mongoid/factory.rb +1 -1
  80. data/lib/mongoid/fields.rb +121 -29
  81. data/lib/mongoid/fields/mappings.rb +36 -0
  82. data/lib/mongoid/fields/serializable.rb +131 -0
  83. data/lib/mongoid/fields/serializable/array.rb +64 -0
  84. data/lib/mongoid/fields/serializable/big_decimal.rb +42 -0
  85. data/lib/mongoid/fields/serializable/bignum.rb +10 -0
  86. data/lib/mongoid/fields/serializable/binary.rb +11 -0
  87. data/lib/mongoid/fields/serializable/boolean.rb +44 -0
  88. data/lib/mongoid/fields/serializable/date.rb +51 -0
  89. data/lib/mongoid/fields/serializable/date_time.rb +28 -0
  90. data/lib/mongoid/fields/serializable/fixnum.rb +10 -0
  91. data/lib/mongoid/fields/serializable/float.rb +33 -0
  92. data/lib/mongoid/fields/serializable/foreign_keys/array.rb +56 -0
  93. data/lib/mongoid/fields/serializable/foreign_keys/object.rb +43 -0
  94. data/lib/mongoid/fields/serializable/hash.rb +25 -0
  95. data/lib/mongoid/fields/serializable/integer.rb +33 -0
  96. data/lib/mongoid/fields/serializable/object.rb +11 -0
  97. data/lib/mongoid/fields/serializable/object_id.rb +32 -0
  98. data/lib/mongoid/fields/serializable/range.rb +42 -0
  99. data/lib/mongoid/fields/serializable/set.rb +42 -0
  100. data/lib/mongoid/fields/serializable/string.rb +28 -0
  101. data/lib/mongoid/fields/serializable/symbol.rb +28 -0
  102. data/lib/mongoid/fields/serializable/time.rb +12 -0
  103. data/lib/mongoid/fields/serializable/time_with_zone.rb +12 -0
  104. data/lib/mongoid/fields/serializable/timekeeping.rb +102 -0
  105. data/lib/mongoid/finders.rb +61 -37
  106. data/lib/mongoid/hierarchy.rb +43 -8
  107. data/lib/mongoid/identity_map.rb +106 -0
  108. data/lib/mongoid/indexes.rb +17 -1
  109. data/lib/mongoid/javascript.rb +2 -3
  110. data/lib/mongoid/keys.rb +10 -21
  111. data/lib/mongoid/logger.rb +22 -1
  112. data/lib/mongoid/matchers/all.rb +10 -0
  113. data/lib/mongoid/matchers/default.rb +1 -1
  114. data/lib/mongoid/matchers/exists.rb +10 -0
  115. data/lib/mongoid/matchers/gt.rb +10 -0
  116. data/lib/mongoid/matchers/gte.rb +10 -0
  117. data/lib/mongoid/matchers/in.rb +10 -0
  118. data/lib/mongoid/matchers/lt.rb +10 -0
  119. data/lib/mongoid/matchers/lte.rb +10 -0
  120. data/lib/mongoid/matchers/ne.rb +10 -0
  121. data/lib/mongoid/matchers/nin.rb +10 -0
  122. data/lib/mongoid/matchers/or.rb +7 -4
  123. data/lib/mongoid/matchers/size.rb +10 -0
  124. data/lib/mongoid/multi_database.rb +26 -6
  125. data/lib/mongoid/multi_parameter_attributes.rb +40 -17
  126. data/lib/mongoid/named_scope.rb +1 -2
  127. data/lib/mongoid/nested_attributes.rb +4 -1
  128. data/lib/mongoid/observer.rb +108 -5
  129. data/lib/mongoid/paranoia.rb +26 -26
  130. data/lib/mongoid/persistence.rb +15 -21
  131. data/lib/mongoid/persistence/atomic.rb +135 -0
  132. data/lib/mongoid/persistence/atomic/add_to_set.rb +11 -8
  133. data/lib/mongoid/persistence/atomic/bit.rb +37 -0
  134. data/lib/mongoid/persistence/atomic/inc.rb +9 -6
  135. data/lib/mongoid/persistence/atomic/operation.rb +48 -7
  136. data/lib/mongoid/persistence/atomic/pop.rb +34 -0
  137. data/lib/mongoid/persistence/atomic/pull.rb +34 -0
  138. data/lib/mongoid/persistence/atomic/pull_all.rb +10 -9
  139. data/lib/mongoid/persistence/atomic/push.rb +8 -5
  140. data/lib/mongoid/persistence/atomic/push_all.rb +31 -0
  141. data/lib/mongoid/persistence/atomic/rename.rb +31 -0
  142. data/lib/mongoid/persistence/atomic/set.rb +30 -0
  143. data/lib/mongoid/persistence/atomic/unset.rb +28 -0
  144. data/lib/mongoid/persistence/deletion.rb +32 -0
  145. data/lib/mongoid/persistence/insertion.rb +41 -0
  146. data/lib/mongoid/persistence/modification.rb +37 -0
  147. data/lib/mongoid/persistence/operations.rb +214 -0
  148. data/lib/mongoid/persistence/operations/embedded/insert.rb +42 -0
  149. data/lib/mongoid/persistence/operations/embedded/remove.rb +40 -0
  150. data/lib/mongoid/persistence/operations/insert.rb +34 -0
  151. data/lib/mongoid/persistence/operations/remove.rb +33 -0
  152. data/lib/mongoid/persistence/operations/update.rb +53 -0
  153. data/lib/mongoid/railtie.rb +21 -33
  154. data/lib/mongoid/railties/database.rake +12 -12
  155. data/lib/mongoid/relations.rb +9 -5
  156. data/lib/mongoid/relations/accessors.rb +15 -36
  157. data/lib/mongoid/relations/auto_save.rb +2 -2
  158. data/lib/mongoid/relations/binding.rb +28 -1
  159. data/lib/mongoid/relations/bindings/embedded/in.rb +17 -30
  160. data/lib/mongoid/relations/bindings/embedded/many.rb +16 -21
  161. data/lib/mongoid/relations/bindings/embedded/one.rb +11 -16
  162. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -32
  163. data/lib/mongoid/relations/bindings/referenced/many.rb +19 -61
  164. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -63
  165. data/lib/mongoid/relations/bindings/referenced/one.rb +18 -26
  166. data/lib/mongoid/relations/builder.rb +4 -2
  167. data/lib/mongoid/relations/builders.rb +21 -2
  168. data/lib/mongoid/relations/builders/embedded/in.rb +5 -1
  169. data/lib/mongoid/relations/builders/embedded/many.rb +12 -4
  170. data/lib/mongoid/relations/builders/embedded/one.rb +5 -1
  171. data/lib/mongoid/relations/builders/nested_attributes/many.rb +2 -2
  172. data/lib/mongoid/relations/builders/nested_attributes/one.rb +1 -1
  173. data/lib/mongoid/relations/builders/referenced/in.rb +2 -5
  174. data/lib/mongoid/relations/builders/referenced/many.rb +2 -3
  175. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +14 -5
  176. data/lib/mongoid/relations/builders/referenced/one.rb +2 -3
  177. data/lib/mongoid/relations/embedded/atomic.rb +2 -2
  178. data/lib/mongoid/relations/embedded/in.rb +72 -41
  179. data/lib/mongoid/relations/embedded/many.rb +116 -120
  180. data/lib/mongoid/relations/embedded/one.rb +59 -41
  181. data/lib/mongoid/relations/embedded/sort.rb +31 -0
  182. data/lib/mongoid/relations/macros.rb +28 -24
  183. data/lib/mongoid/relations/many.rb +10 -103
  184. data/lib/mongoid/relations/metadata.rb +335 -38
  185. data/lib/mongoid/relations/one.rb +7 -32
  186. data/lib/mongoid/relations/options.rb +47 -0
  187. data/lib/mongoid/relations/proxy.rb +29 -28
  188. data/lib/mongoid/relations/referenced/batch.rb +2 -3
  189. data/lib/mongoid/relations/referenced/in.rb +66 -53
  190. data/lib/mongoid/relations/referenced/many.rb +216 -143
  191. data/lib/mongoid/relations/referenced/many_to_many.rb +132 -163
  192. data/lib/mongoid/relations/referenced/one.rb +76 -58
  193. data/lib/mongoid/relations/synchronization.rb +113 -0
  194. data/lib/mongoid/relations/targets.rb +2 -0
  195. data/lib/mongoid/relations/targets/enumerable.rb +329 -0
  196. data/lib/mongoid/safety.rb +24 -156
  197. data/lib/mongoid/serialization.rb +21 -0
  198. data/lib/mongoid/state.rb +34 -0
  199. data/lib/mongoid/threaded.rb +175 -0
  200. data/lib/mongoid/timestamps/updated.rb +1 -1
  201. data/lib/mongoid/validations.rb +3 -7
  202. data/lib/mongoid/version.rb +1 -1
  203. data/lib/mongoid/versioning.rb +61 -7
  204. data/lib/rack/mongoid.rb +2 -0
  205. data/lib/rack/mongoid/middleware/identity_map.rb +38 -0
  206. data/lib/rails/generators/mongoid/model/model_generator.rb +1 -1
  207. data/lib/rails/generators/mongoid/model/templates/{model.rb → model.rb.tt} +0 -0
  208. data/lib/rails/generators/mongoid/observer/observer_generator.rb +1 -1
  209. data/lib/rails/generators/mongoid/observer/templates/{observer.rb → observer.rb.tt} +0 -0
  210. data/lib/rails/mongoid.rb +17 -17
  211. metadata +136 -102
  212. data/lib/mongoid/atomicity.rb +0 -111
  213. data/lib/mongoid/collections/cyclic_iterator.rb +0 -34
  214. data/lib/mongoid/collections/slaves.rb +0 -61
  215. data/lib/mongoid/extensions/array/conversions.rb +0 -23
  216. data/lib/mongoid/extensions/array/parentization.rb +0 -13
  217. data/lib/mongoid/extensions/big_decimal/conversions.rb +0 -19
  218. data/lib/mongoid/extensions/binary/conversions.rb +0 -17
  219. data/lib/mongoid/extensions/boolean/conversions.rb +0 -27
  220. data/lib/mongoid/extensions/date/conversions.rb +0 -25
  221. data/lib/mongoid/extensions/datetime/conversions.rb +0 -12
  222. data/lib/mongoid/extensions/float/conversions.rb +0 -20
  223. data/lib/mongoid/extensions/hash/conversions.rb +0 -19
  224. data/lib/mongoid/extensions/integer/conversions.rb +0 -20
  225. data/lib/mongoid/extensions/object/conversions.rb +0 -25
  226. data/lib/mongoid/extensions/range/conversions.rb +0 -25
  227. data/lib/mongoid/extensions/set/conversions.rb +0 -20
  228. data/lib/mongoid/extensions/symbol/conversions.rb +0 -21
  229. data/lib/mongoid/extensions/time_conversions.rb +0 -38
  230. data/lib/mongoid/field.rb +0 -162
  231. data/lib/mongoid/paths.rb +0 -61
  232. data/lib/mongoid/persistence/command.rb +0 -71
  233. data/lib/mongoid/persistence/insert.rb +0 -53
  234. data/lib/mongoid/persistence/insert_embedded.rb +0 -43
  235. data/lib/mongoid/persistence/remove.rb +0 -44
  236. data/lib/mongoid/persistence/remove_all.rb +0 -40
  237. data/lib/mongoid/persistence/remove_embedded.rb +0 -48
  238. data/lib/mongoid/persistence/update.rb +0 -77
  239. data/lib/mongoid/safe.rb +0 -23
  240. data/lib/mongoid/validations/referenced.rb +0 -58
@@ -3,11 +3,22 @@ module Mongoid #:nodoc:
3
3
  module Persistence #:nodoc:
4
4
  module Atomic #:nodoc:
5
5
 
6
- # This is the superclass for all atomic operation objects.
7
- class Operation
8
- include Mongoid::Safe
6
+ # This is the included module for all atomic operation objects.
7
+ module Operation
9
8
 
10
- attr_reader :document, :field, :value, :options
9
+ attr_accessor :document, :field, :value, :options
10
+
11
+ # Get the collection to be used for persistence.
12
+ #
13
+ # @example Get the collection.
14
+ # operation.collection
15
+ #
16
+ # @return [ Collection ] The root collection.
17
+ #
18
+ # @since 2.1.0
19
+ def collection
20
+ document._root.collection
21
+ end
11
22
 
12
23
  # Initialize the new pullAll operation.
13
24
  #
@@ -21,8 +32,8 @@ module Mongoid #:nodoc:
21
32
  #
22
33
  # @since 2.0.0
23
34
  def initialize(document, field, value, options = {})
24
- @document, @field, @value = document, field, value
25
- @options = { :safe => safe_mode?(options) }
35
+ @document, @field, @value = document, field.to_s, value
36
+ @options = Safety.merge_safety_options(options)
26
37
  end
27
38
 
28
39
  # Get the atomic operation to perform.
@@ -36,7 +47,37 @@ module Mongoid #:nodoc:
36
47
  #
37
48
  # @since 2.0.0
38
49
  def operation(modifier)
39
- { modifier => { field => value } }
50
+ { modifier => { path => value } }
51
+ end
52
+
53
+ # Get the path to the field that is getting atomically updated.
54
+ #
55
+ # @example Get the path.
56
+ # operation.path
57
+ #
58
+ # @return [ String, Symbol ] The path to the field.
59
+ #
60
+ # @since 2.1.0
61
+ def path
62
+ position = document.atomic_position
63
+ position.blank? ? field : "#{position}.#{field}"
64
+ end
65
+
66
+ # All atomic operations use this with a block to ensure saftey options
67
+ # clear out after the execution.
68
+ #
69
+ # @example Prepare the operation.
70
+ # prepare do
71
+ # collection.update
72
+ # end
73
+ #
74
+ # @return [ Object ] The yielded value.
75
+ #
76
+ # @since 2.1.0
77
+ def prepare
78
+ yield(document).tap do
79
+ Threaded.clear_safety_options!
80
+ end
40
81
  end
41
82
  end
42
83
  end
@@ -0,0 +1,34 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ module Atomic #:nodoc:
5
+
6
+ # This class provides the ability to perform an explicit $pop
7
+ # modification on a specific field.
8
+ class Pop
9
+ include Operation
10
+
11
+ # Sends the atomic $pop operation to the database.
12
+ #
13
+ # @example Persist the new values.
14
+ # pop.persist
15
+ #
16
+ # @return [ Object ] The new array value.
17
+ #
18
+ # @since 2.1.0
19
+ def persist
20
+ prepare do
21
+ if document[field]
22
+ values = document.send(field)
23
+ value > 0 ? values.pop : values.shift
24
+ values.tap do
25
+ collection.update(document.atomic_selector, operation("$pop"), options)
26
+ document.remove_change(field) if document.persisted?
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ module Atomic #:nodoc:
5
+
6
+ # This class provides the ability to perform an explicit $pull
7
+ # modification on a specific field.
8
+ class Pull
9
+ include Operation
10
+
11
+ # Sends the atomic $pull operation to the database.
12
+ #
13
+ # @example Persist the new values.
14
+ # pull.persist
15
+ #
16
+ # @return [ Object ] The new array value.
17
+ #
18
+ # @since 2.1.0
19
+ def persist
20
+ prepare do
21
+ if document[field]
22
+ values = document.send(field)
23
+ values.delete(value)
24
+ values.tap do
25
+ collection.update(document.atomic_selector, operation("$pull"), options)
26
+ document.remove_change(field) if document.persisted?
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -5,7 +5,8 @@ module Mongoid #:nodoc:
5
5
 
6
6
  # This class provides the ability to perform an explicit $pullAll
7
7
  # modification on a specific field.
8
- class PullAll < Operation
8
+ class PullAll
9
+ include Operation
9
10
 
10
11
  # Sends the atomic $pullAll operation to the database.
11
12
  #
@@ -16,15 +17,15 @@ module Mongoid #:nodoc:
16
17
  #
17
18
  # @since 2.0.0
18
19
  def persist
19
- if document[field]
20
- values = document.send(field)
21
- values.delete_if { |val| value.include?(val) }
22
- values.tap do
23
- document.collection.update(document._selector, operation("$pullAll"), options)
24
- document.changes.delete(field.to_s) if document.persisted?
20
+ prepare do
21
+ if document[field]
22
+ values = document.send(field)
23
+ values.delete_if { |val| value.include?(val) }
24
+ values.tap do
25
+ collection.update(document.atomic_selector, operation("$pullAll"), options)
26
+ document.remove_change(field) if document.persisted?
27
+ end
25
28
  end
26
- else
27
- return nil
28
29
  end
29
30
  end
30
31
  end
@@ -5,7 +5,8 @@ module Mongoid #:nodoc:
5
5
 
6
6
  # This class provides the ability to perform an explicit $push modification
7
7
  # on a specific field.
8
- class Push < Operation
8
+ class Push
9
+ include Operation
9
10
 
10
11
  # Sends the atomic $push operation to the database.
11
12
  #
@@ -16,10 +17,12 @@ module Mongoid #:nodoc:
16
17
  #
17
18
  # @since 2.0.0
18
19
  def persist
19
- document[field] = [] unless document[field]
20
- document.send(field).push(value).tap do |value|
21
- document.collection.update(document._selector, operation("$push"), options)
22
- document.changes.delete(field.to_s)
20
+ prepare do
21
+ document[field] = [] unless document[field]
22
+ document.send(field).push(value).tap do |value|
23
+ collection.update(document.atomic_selector, operation("$push"), options)
24
+ document.remove_change(field)
25
+ end
23
26
  end
24
27
  end
25
28
  end
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ module Atomic #:nodoc:
5
+
6
+ # This class provides the ability to perform an explicit $pushAll modification
7
+ # on a specific field.
8
+ class PushAll
9
+ include Operation
10
+
11
+ # Sends the atomic $pushAll operation to the database.
12
+ #
13
+ # @example Persist the new values.
14
+ # pushAll.persist
15
+ #
16
+ # @return [ Object ] The new array value.
17
+ #
18
+ # @since 2.1.0
19
+ def persist
20
+ prepare do
21
+ document[field] = [] unless document[field]
22
+ document.send(field).concat(value).tap do |value|
23
+ collection.update(document.atomic_selector, operation("$pushAll"), options)
24
+ document.remove_change(field)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ module Atomic #:nodoc:
5
+
6
+ # Performs an atomic rename operation.
7
+ class Rename
8
+ include Operation
9
+
10
+ # Sends the atomic $inc operation to the database.
11
+ #
12
+ # @example Persist the new values.
13
+ # inc.persist
14
+ #
15
+ # @return [ Object ] The new integer value.
16
+ #
17
+ # @since 2.1.0
18
+ def persist
19
+ prepare do
20
+ @value = value.to_s
21
+ document[value] = document.attributes.delete(field)
22
+ document[value].tap do
23
+ collection.update(document.atomic_selector, operation("$rename"), options)
24
+ document.remove_change(value)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ module Atomic #:nodoc:
5
+
6
+ # This class provides atomic $set behaviour.
7
+ class Set
8
+ include Operation
9
+
10
+ # Sends the atomic $set operation to the database.
11
+ #
12
+ # @example Persist the new values.
13
+ # set.persist
14
+ #
15
+ # @return [ Object ] The new field value.
16
+ #
17
+ # @ssete 2.0.0
18
+ def persist
19
+ prepare do
20
+ value ? document[field] = value : @value = document[field]
21
+ document[field].tap do
22
+ collection.update(document.atomic_selector, operation("$set"), options)
23
+ document.remove_change(field)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ module Atomic #:nodoc:
5
+
6
+ # Performs atomic $unset operations.
7
+ class Unset
8
+ include Operation
9
+
10
+ # Sends the atomic $unset operation to the database.
11
+ #
12
+ # @example Persist the new values.
13
+ # unset.persist
14
+ #
15
+ # @return [ nil ] The new value.
16
+ #
17
+ # @since 2.1.0
18
+ def persist
19
+ prepare do
20
+ document.attributes.delete(field)
21
+ collection.update(document.atomic_selector, operation("$unset"), options)
22
+ document.remove_change(value)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+
5
+ # Contains common logic for delete operations.
6
+ module Deletion
7
+
8
+ # Wrap all the common delete logic for both root and embedded
9
+ # documents and then yield to the block.
10
+ #
11
+ # @example Execute common delete logic.
12
+ # prepare do |doc|
13
+ # collection.remove({ :_id => "value })
14
+ # end
15
+ #
16
+ # @param [ Proc ] block The block to call.
17
+ #
18
+ # @return [ true ] Always true.
19
+ #
20
+ # @since 2.1.0
21
+ def prepare(&block)
22
+ yield(document)
23
+ document.freeze
24
+ document.destroyed = true
25
+ document.cascade!
26
+ IdentityMap.remove(document)
27
+ Threaded.clear_safety_options!
28
+ true
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+
5
+ # Contains common logic for insertion operations.
6
+ module Insertion
7
+
8
+ # Wrap all the common insertion logic for both root and embedded
9
+ # documents and then yield to the block.
10
+ #
11
+ # @example Execute common insertion logic.
12
+ # prepare do |doc|
13
+ # collection.insert({ :field => "value })
14
+ # end
15
+ #
16
+ # @param [ Proc ] block The block to call.
17
+ #
18
+ # @return [ Document ] The inserted document.
19
+ #
20
+ # @since 2.1.0
21
+ def prepare(&block)
22
+ document.tap do |doc|
23
+ unless validating? && document.invalid?(:create)
24
+ result = doc.run_callbacks(:save) do
25
+ doc.run_callbacks(:create) do
26
+ yield(doc)
27
+ doc.new_record = false
28
+ doc.reset_persisted_children and true
29
+ end
30
+ end
31
+
32
+ unless result == false
33
+ doc.move_changes
34
+ Threaded.clear_safety_options!
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+
5
+ # Contains common logic for modification operations.
6
+ module Modification
7
+
8
+ # Wrap all the common modification logic for both root and embedded
9
+ # documents and then yield to the block.
10
+ #
11
+ # @example Execute common modification logic.
12
+ # prepare do |doc|
13
+ # collection.update({ :_id => 1 }, { :field => "value })
14
+ # end
15
+ #
16
+ # @param [ Proc ] block The block to call.
17
+ #
18
+ # @return [ true, false ] If the save passed or not.
19
+ #
20
+ # @since 2.1.0
21
+ def prepare(&block)
22
+ return false if validating? && document.invalid?(:update)
23
+ document.run_callbacks(:save) do
24
+ document.run_callbacks(:update) do
25
+ yield(document); true
26
+ end
27
+ end.tap do |result|
28
+ unless result == false
29
+ document.reset_persisted_children
30
+ document.move_changes
31
+ Threaded.clear_safety_options!
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end