mongoid-multi-db 3.0.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 (276) hide show
  1. data/CHANGELOG.md +615 -0
  2. data/LICENSE +20 -0
  3. data/README.md +62 -0
  4. data/Rakefile +49 -0
  5. data/lib/config/locales/bg.yml +54 -0
  6. data/lib/config/locales/de.yml +54 -0
  7. data/lib/config/locales/en-GB.yml +55 -0
  8. data/lib/config/locales/en.yml +55 -0
  9. data/lib/config/locales/es.yml +52 -0
  10. data/lib/config/locales/fr.yml +55 -0
  11. data/lib/config/locales/hi.yml +46 -0
  12. data/lib/config/locales/hu.yml +57 -0
  13. data/lib/config/locales/id.yml +55 -0
  14. data/lib/config/locales/it.yml +52 -0
  15. data/lib/config/locales/ja.yml +50 -0
  16. data/lib/config/locales/kr.yml +47 -0
  17. data/lib/config/locales/nl.yml +52 -0
  18. data/lib/config/locales/pl.yml +52 -0
  19. data/lib/config/locales/pt-BR.yml +53 -0
  20. data/lib/config/locales/pt.yml +53 -0
  21. data/lib/config/locales/ro.yml +59 -0
  22. data/lib/config/locales/ru.yml +54 -0
  23. data/lib/config/locales/sv.yml +53 -0
  24. data/lib/config/locales/vi.yml +55 -0
  25. data/lib/config/locales/zh-CN.yml +46 -0
  26. data/lib/mongoid.rb +148 -0
  27. data/lib/mongoid/atomic.rb +230 -0
  28. data/lib/mongoid/atomic/modifiers.rb +243 -0
  29. data/lib/mongoid/atomic/paths.rb +3 -0
  30. data/lib/mongoid/atomic/paths/embedded.rb +43 -0
  31. data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
  32. data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
  33. data/lib/mongoid/atomic/paths/root.rb +40 -0
  34. data/lib/mongoid/attributes.rb +234 -0
  35. data/lib/mongoid/attributes/processing.rb +146 -0
  36. data/lib/mongoid/callbacks.rb +135 -0
  37. data/lib/mongoid/collection.rb +153 -0
  38. data/lib/mongoid/collection_proxy.rb +59 -0
  39. data/lib/mongoid/collections.rb +120 -0
  40. data/lib/mongoid/collections/master.rb +45 -0
  41. data/lib/mongoid/collections/operations.rb +44 -0
  42. data/lib/mongoid/collections/retry.rb +46 -0
  43. data/lib/mongoid/components.rb +96 -0
  44. data/lib/mongoid/config.rb +347 -0
  45. data/lib/mongoid/config/database.rb +186 -0
  46. data/lib/mongoid/config/replset_database.rb +82 -0
  47. data/lib/mongoid/connection_proxy.rb +30 -0
  48. data/lib/mongoid/contexts.rb +25 -0
  49. data/lib/mongoid/contexts/enumerable.rb +288 -0
  50. data/lib/mongoid/contexts/enumerable/sort.rb +43 -0
  51. data/lib/mongoid/contexts/mongo.rb +409 -0
  52. data/lib/mongoid/copyable.rb +48 -0
  53. data/lib/mongoid/criteria.rb +418 -0
  54. data/lib/mongoid/criterion/builder.rb +34 -0
  55. data/lib/mongoid/criterion/complex.rb +84 -0
  56. data/lib/mongoid/criterion/creational.rb +34 -0
  57. data/lib/mongoid/criterion/exclusion.rb +108 -0
  58. data/lib/mongoid/criterion/inclusion.rb +305 -0
  59. data/lib/mongoid/criterion/inspection.rb +22 -0
  60. data/lib/mongoid/criterion/optional.rb +232 -0
  61. data/lib/mongoid/criterion/selector.rb +153 -0
  62. data/lib/mongoid/cursor.rb +86 -0
  63. data/lib/mongoid/database_proxy.rb +97 -0
  64. data/lib/mongoid/default_scope.rb +36 -0
  65. data/lib/mongoid/dirty.rb +110 -0
  66. data/lib/mongoid/document.rb +280 -0
  67. data/lib/mongoid/errors.rb +17 -0
  68. data/lib/mongoid/errors/callback.rb +26 -0
  69. data/lib/mongoid/errors/document_not_found.rb +28 -0
  70. data/lib/mongoid/errors/eager_load.rb +25 -0
  71. data/lib/mongoid/errors/invalid_collection.rb +18 -0
  72. data/lib/mongoid/errors/invalid_database.rb +19 -0
  73. data/lib/mongoid/errors/invalid_field.rb +18 -0
  74. data/lib/mongoid/errors/invalid_find.rb +19 -0
  75. data/lib/mongoid/errors/invalid_options.rb +28 -0
  76. data/lib/mongoid/errors/invalid_time.rb +25 -0
  77. data/lib/mongoid/errors/invalid_type.rb +25 -0
  78. data/lib/mongoid/errors/mixed_relations.rb +37 -0
  79. data/lib/mongoid/errors/mongoid_error.rb +26 -0
  80. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
  81. data/lib/mongoid/errors/unsaved_document.rb +23 -0
  82. data/lib/mongoid/errors/unsupported_version.rb +20 -0
  83. data/lib/mongoid/errors/validations.rb +23 -0
  84. data/lib/mongoid/extensions.rb +82 -0
  85. data/lib/mongoid/extensions/array/deletion.rb +29 -0
  86. data/lib/mongoid/extensions/false_class/equality.rb +26 -0
  87. data/lib/mongoid/extensions/hash/criteria_helpers.rb +45 -0
  88. data/lib/mongoid/extensions/hash/scoping.rb +25 -0
  89. data/lib/mongoid/extensions/integer/checks.rb +23 -0
  90. data/lib/mongoid/extensions/nil/collectionization.rb +23 -0
  91. data/lib/mongoid/extensions/object/checks.rb +29 -0
  92. data/lib/mongoid/extensions/object/reflections.rb +48 -0
  93. data/lib/mongoid/extensions/object/substitutable.rb +15 -0
  94. data/lib/mongoid/extensions/object/yoda.rb +44 -0
  95. data/lib/mongoid/extensions/object_id/conversions.rb +60 -0
  96. data/lib/mongoid/extensions/proc/scoping.rb +25 -0
  97. data/lib/mongoid/extensions/string/checks.rb +36 -0
  98. data/lib/mongoid/extensions/string/conversions.rb +22 -0
  99. data/lib/mongoid/extensions/string/inflections.rb +118 -0
  100. data/lib/mongoid/extensions/symbol/checks.rb +23 -0
  101. data/lib/mongoid/extensions/symbol/inflections.rb +66 -0
  102. data/lib/mongoid/extensions/true_class/equality.rb +26 -0
  103. data/lib/mongoid/extras.rb +31 -0
  104. data/lib/mongoid/factory.rb +46 -0
  105. data/lib/mongoid/fields.rb +332 -0
  106. data/lib/mongoid/fields/mappings.rb +41 -0
  107. data/lib/mongoid/fields/serializable.rb +201 -0
  108. data/lib/mongoid/fields/serializable/array.rb +49 -0
  109. data/lib/mongoid/fields/serializable/big_decimal.rb +42 -0
  110. data/lib/mongoid/fields/serializable/bignum.rb +10 -0
  111. data/lib/mongoid/fields/serializable/binary.rb +11 -0
  112. data/lib/mongoid/fields/serializable/boolean.rb +43 -0
  113. data/lib/mongoid/fields/serializable/date.rb +51 -0
  114. data/lib/mongoid/fields/serializable/date_time.rb +28 -0
  115. data/lib/mongoid/fields/serializable/fixnum.rb +10 -0
  116. data/lib/mongoid/fields/serializable/float.rb +32 -0
  117. data/lib/mongoid/fields/serializable/foreign_keys/array.rb +42 -0
  118. data/lib/mongoid/fields/serializable/foreign_keys/object.rb +47 -0
  119. data/lib/mongoid/fields/serializable/hash.rb +11 -0
  120. data/lib/mongoid/fields/serializable/integer.rb +44 -0
  121. data/lib/mongoid/fields/serializable/localized.rb +41 -0
  122. data/lib/mongoid/fields/serializable/nil_class.rb +38 -0
  123. data/lib/mongoid/fields/serializable/object.rb +11 -0
  124. data/lib/mongoid/fields/serializable/object_id.rb +31 -0
  125. data/lib/mongoid/fields/serializable/range.rb +42 -0
  126. data/lib/mongoid/fields/serializable/set.rb +42 -0
  127. data/lib/mongoid/fields/serializable/string.rb +27 -0
  128. data/lib/mongoid/fields/serializable/symbol.rb +27 -0
  129. data/lib/mongoid/fields/serializable/time.rb +23 -0
  130. data/lib/mongoid/fields/serializable/time_with_zone.rb +23 -0
  131. data/lib/mongoid/fields/serializable/timekeeping.rb +106 -0
  132. data/lib/mongoid/finders.rb +152 -0
  133. data/lib/mongoid/hierarchy.rb +120 -0
  134. data/lib/mongoid/identity.rb +92 -0
  135. data/lib/mongoid/identity_map.rb +119 -0
  136. data/lib/mongoid/indexes.rb +54 -0
  137. data/lib/mongoid/inspection.rb +54 -0
  138. data/lib/mongoid/javascript.rb +20 -0
  139. data/lib/mongoid/javascript/functions.yml +63 -0
  140. data/lib/mongoid/json.rb +16 -0
  141. data/lib/mongoid/keys.rb +144 -0
  142. data/lib/mongoid/logger.rb +39 -0
  143. data/lib/mongoid/matchers.rb +32 -0
  144. data/lib/mongoid/matchers/all.rb +21 -0
  145. data/lib/mongoid/matchers/and.rb +30 -0
  146. data/lib/mongoid/matchers/default.rb +70 -0
  147. data/lib/mongoid/matchers/exists.rb +23 -0
  148. data/lib/mongoid/matchers/gt.rb +21 -0
  149. data/lib/mongoid/matchers/gte.rb +21 -0
  150. data/lib/mongoid/matchers/in.rb +21 -0
  151. data/lib/mongoid/matchers/lt.rb +21 -0
  152. data/lib/mongoid/matchers/lte.rb +21 -0
  153. data/lib/mongoid/matchers/ne.rb +21 -0
  154. data/lib/mongoid/matchers/nin.rb +21 -0
  155. data/lib/mongoid/matchers/or.rb +33 -0
  156. data/lib/mongoid/matchers/size.rb +21 -0
  157. data/lib/mongoid/matchers/strategies.rb +93 -0
  158. data/lib/mongoid/multi_database.rb +31 -0
  159. data/lib/mongoid/multi_parameter_attributes.rb +106 -0
  160. data/lib/mongoid/named_scope.rb +146 -0
  161. data/lib/mongoid/nested_attributes.rb +54 -0
  162. data/lib/mongoid/observer.rb +170 -0
  163. data/lib/mongoid/paranoia.rb +158 -0
  164. data/lib/mongoid/persistence.rb +264 -0
  165. data/lib/mongoid/persistence/atomic.rb +223 -0
  166. data/lib/mongoid/persistence/atomic/add_to_set.rb +35 -0
  167. data/lib/mongoid/persistence/atomic/bit.rb +37 -0
  168. data/lib/mongoid/persistence/atomic/inc.rb +31 -0
  169. data/lib/mongoid/persistence/atomic/operation.rb +85 -0
  170. data/lib/mongoid/persistence/atomic/pop.rb +34 -0
  171. data/lib/mongoid/persistence/atomic/pull.rb +34 -0
  172. data/lib/mongoid/persistence/atomic/pull_all.rb +34 -0
  173. data/lib/mongoid/persistence/atomic/push.rb +31 -0
  174. data/lib/mongoid/persistence/atomic/push_all.rb +31 -0
  175. data/lib/mongoid/persistence/atomic/rename.rb +31 -0
  176. data/lib/mongoid/persistence/atomic/sets.rb +30 -0
  177. data/lib/mongoid/persistence/atomic/unset.rb +28 -0
  178. data/lib/mongoid/persistence/deletion.rb +32 -0
  179. data/lib/mongoid/persistence/insertion.rb +41 -0
  180. data/lib/mongoid/persistence/modification.rb +37 -0
  181. data/lib/mongoid/persistence/operations.rb +211 -0
  182. data/lib/mongoid/persistence/operations/embedded/insert.rb +42 -0
  183. data/lib/mongoid/persistence/operations/embedded/remove.rb +40 -0
  184. data/lib/mongoid/persistence/operations/insert.rb +34 -0
  185. data/lib/mongoid/persistence/operations/remove.rb +33 -0
  186. data/lib/mongoid/persistence/operations/update.rb +64 -0
  187. data/lib/mongoid/railtie.rb +126 -0
  188. data/lib/mongoid/railties/database.rake +182 -0
  189. data/lib/mongoid/railties/document.rb +12 -0
  190. data/lib/mongoid/relations.rb +144 -0
  191. data/lib/mongoid/relations/accessors.rb +138 -0
  192. data/lib/mongoid/relations/auto_save.rb +38 -0
  193. data/lib/mongoid/relations/binding.rb +26 -0
  194. data/lib/mongoid/relations/bindings.rb +9 -0
  195. data/lib/mongoid/relations/bindings/embedded/in.rb +69 -0
  196. data/lib/mongoid/relations/bindings/embedded/many.rb +93 -0
  197. data/lib/mongoid/relations/bindings/embedded/one.rb +61 -0
  198. data/lib/mongoid/relations/bindings/referenced/in.rb +76 -0
  199. data/lib/mongoid/relations/bindings/referenced/many.rb +54 -0
  200. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +51 -0
  201. data/lib/mongoid/relations/bindings/referenced/one.rb +58 -0
  202. data/lib/mongoid/relations/builder.rb +57 -0
  203. data/lib/mongoid/relations/builders.rb +83 -0
  204. data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
  205. data/lib/mongoid/relations/builders/embedded/many.rb +40 -0
  206. data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
  207. data/lib/mongoid/relations/builders/nested_attributes/many.rb +110 -0
  208. data/lib/mongoid/relations/builders/nested_attributes/one.rb +135 -0
  209. data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
  210. data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
  211. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +38 -0
  212. data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
  213. data/lib/mongoid/relations/cascading.rb +56 -0
  214. data/lib/mongoid/relations/cascading/delete.rb +19 -0
  215. data/lib/mongoid/relations/cascading/destroy.rb +26 -0
  216. data/lib/mongoid/relations/cascading/nullify.rb +18 -0
  217. data/lib/mongoid/relations/cascading/strategy.rb +26 -0
  218. data/lib/mongoid/relations/constraint.rb +42 -0
  219. data/lib/mongoid/relations/conversions.rb +35 -0
  220. data/lib/mongoid/relations/cyclic.rb +103 -0
  221. data/lib/mongoid/relations/embedded/atomic.rb +89 -0
  222. data/lib/mongoid/relations/embedded/atomic/operation.rb +63 -0
  223. data/lib/mongoid/relations/embedded/atomic/pull.rb +65 -0
  224. data/lib/mongoid/relations/embedded/atomic/push_all.rb +59 -0
  225. data/lib/mongoid/relations/embedded/atomic/set.rb +61 -0
  226. data/lib/mongoid/relations/embedded/atomic/unset.rb +41 -0
  227. data/lib/mongoid/relations/embedded/in.rb +220 -0
  228. data/lib/mongoid/relations/embedded/many.rb +560 -0
  229. data/lib/mongoid/relations/embedded/one.rb +206 -0
  230. data/lib/mongoid/relations/embedded/sort.rb +31 -0
  231. data/lib/mongoid/relations/macros.rb +310 -0
  232. data/lib/mongoid/relations/many.rb +135 -0
  233. data/lib/mongoid/relations/metadata.rb +919 -0
  234. data/lib/mongoid/relations/nested_builder.rb +75 -0
  235. data/lib/mongoid/relations/one.rb +36 -0
  236. data/lib/mongoid/relations/options.rb +47 -0
  237. data/lib/mongoid/relations/polymorphic.rb +40 -0
  238. data/lib/mongoid/relations/proxy.rb +145 -0
  239. data/lib/mongoid/relations/referenced/batch.rb +72 -0
  240. data/lib/mongoid/relations/referenced/batch/insert.rb +57 -0
  241. data/lib/mongoid/relations/referenced/in.rb +262 -0
  242. data/lib/mongoid/relations/referenced/many.rb +623 -0
  243. data/lib/mongoid/relations/referenced/many_to_many.rb +396 -0
  244. data/lib/mongoid/relations/referenced/one.rb +272 -0
  245. data/lib/mongoid/relations/reflections.rb +62 -0
  246. data/lib/mongoid/relations/synchronization.rb +153 -0
  247. data/lib/mongoid/relations/targets.rb +2 -0
  248. data/lib/mongoid/relations/targets/enumerable.rb +372 -0
  249. data/lib/mongoid/reloading.rb +91 -0
  250. data/lib/mongoid/safety.rb +105 -0
  251. data/lib/mongoid/scope.rb +31 -0
  252. data/lib/mongoid/serialization.rb +134 -0
  253. data/lib/mongoid/sharding.rb +61 -0
  254. data/lib/mongoid/state.rb +97 -0
  255. data/lib/mongoid/threaded.rb +530 -0
  256. data/lib/mongoid/threaded/lifecycle.rb +192 -0
  257. data/lib/mongoid/timestamps.rb +15 -0
  258. data/lib/mongoid/timestamps/created.rb +24 -0
  259. data/lib/mongoid/timestamps/timeless.rb +50 -0
  260. data/lib/mongoid/timestamps/updated.rb +26 -0
  261. data/lib/mongoid/validations.rb +140 -0
  262. data/lib/mongoid/validations/associated.rb +46 -0
  263. data/lib/mongoid/validations/uniqueness.rb +145 -0
  264. data/lib/mongoid/version.rb +4 -0
  265. data/lib/mongoid/versioning.rb +185 -0
  266. data/lib/rack/mongoid.rb +2 -0
  267. data/lib/rack/mongoid/middleware/identity_map.rb +38 -0
  268. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  269. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +20 -0
  270. data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
  271. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
  272. data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
  273. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
  274. data/lib/rails/generators/mongoid_generator.rb +70 -0
  275. data/lib/rails/mongoid.rb +91 -0
  276. metadata +465 -0
@@ -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
+ document.cascade!
23
+ yield(document)
24
+ document.freeze
25
+ document.destroyed = true
26
+ IdentityMap.remove(document)
27
+ Threaded.clear_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_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_options!
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,211 @@
1
+ # encoding: utf-8
2
+ require "mongoid/persistence/operations/insert"
3
+ require "mongoid/persistence/operations/remove"
4
+ require "mongoid/persistence/operations/update"
5
+ require "mongoid/persistence/operations/embedded/insert"
6
+ require "mongoid/persistence/operations/embedded/remove"
7
+
8
+ module Mongoid #:nodoc:
9
+ module Persistence #:nodoc:
10
+
11
+ # Persistence operations include this module to get basic functionality
12
+ # on initialization.
13
+ module Operations
14
+
15
+ attr_reader :conflicts, :document
16
+
17
+ # Get the collection we should be persisting to.
18
+ #
19
+ # @example Get the collection.
20
+ # operation.collection
21
+ #
22
+ # @return [ Collection ] The collection to persist to.
23
+ #
24
+ # @since 2.1.0
25
+ def collection
26
+ @collection ||= document._root.collection
27
+ end
28
+
29
+ # Get the atomic delete operations for embedded documents.
30
+ #
31
+ # @example Get the atomic deletes.
32
+ # operation.deletes
33
+ #
34
+ # @return [ Hash ] The atomic delete selector.
35
+ #
36
+ # @since 2.1.0
37
+ def deletes
38
+ { document.atomic_delete_modifier =>
39
+ { document.atomic_path =>
40
+ document._index ? { "_id" => document.id } : true } }
41
+ end
42
+
43
+ # Instantiate the new persistence operation.
44
+ #
45
+ # @example Create the operation.
46
+ # Operation.new(document, { :safe => true }, { "field" => "value" })
47
+ #
48
+ # @param [ Document ] document The document to persist.
49
+ # @param [ Hash ] options The persistence options.
50
+ #
51
+ # @since 2.1.0
52
+ def initialize(document, options = {})
53
+ @document, @options = document, options
54
+ end
55
+
56
+ # Get the atomic insert for embedded documents, either a push or set.
57
+ #
58
+ # @example Get the inserts.
59
+ # operation.inserts
60
+ #
61
+ # @return [ Hash ] The insert ops.
62
+ #
63
+ # @since 2.1.0
64
+ def inserts
65
+ { document.atomic_insert_modifier =>
66
+ { document.atomic_position => document.as_document } }
67
+ end
68
+
69
+ # Should the parent document (in the case of embedded persistence) be
70
+ # notified of the child deletion. This is used when calling delete from
71
+ # the associations themselves.
72
+ #
73
+ # @example Should the parent be notified?
74
+ # operation.notifying_parent?
75
+ #
76
+ # @return [ true, false ] If the parent should be notified.
77
+ #
78
+ # @since 2.1.0
79
+ def notifying_parent?
80
+ @notifying_parent ||= !@options.delete(:suppress)
81
+ end
82
+
83
+ # Get all the options that will be sent to the database. Right now this
84
+ # is only safe mode opts.
85
+ #
86
+ # @example Get the options hash.
87
+ # operation.options
88
+ #
89
+ # @return [ Hash ] The options for the database.
90
+ #
91
+ # @since 2.1.0
92
+ def options
93
+ Safety.merge_safety_options(@options)
94
+ end
95
+
96
+ # Get the parent of the provided document.
97
+ #
98
+ # @example Get the parent.
99
+ # operation.parent
100
+ #
101
+ # @return [ Document ] The parent document.
102
+ #
103
+ # @since 2.1.0
104
+ def parent
105
+ document._parent
106
+ end
107
+
108
+ # Get the atomic selector for the document.
109
+ #
110
+ # @example Get the selector.
111
+ # operation.selector.
112
+ #
113
+ # @return [ Hash ] The mongodb selector.
114
+ #
115
+ # @since 2.1.0
116
+ def selector
117
+ @selector ||= document.atomic_selector
118
+ end
119
+
120
+ # Get the atomic updates for the document without the conflicting
121
+ # modifications.
122
+ #
123
+ # @example Get the atomic updates.
124
+ # operation.updates
125
+ #
126
+ # @return [ Hash ] The updates sans conflicting mods.
127
+ #
128
+ # @since 2.1.0
129
+ def updates
130
+ @updates ||= init_updates
131
+ end
132
+
133
+ # Should we be running validations on this persistence operation?
134
+ # Defaults to true.
135
+ #
136
+ # @example Run validations?
137
+ # operation.validating?
138
+ #
139
+ # @return [ true, false ] If we run validations.
140
+ #
141
+ # @since 2.1.0
142
+ def validating?
143
+ @validating ||= @options[:validate].nil? ? true : @options[:validate]
144
+ end
145
+
146
+ private
147
+
148
+ # Initialize the atomic updates and conflicting modifications.
149
+ #
150
+ # @example Initialize the updates.
151
+ # operation.init_updates
152
+ #
153
+ # @return [ Hash ] The atomic updates.
154
+ #
155
+ # @since 2.1.0
156
+ def init_updates
157
+ document.atomic_updates.tap do |updates|
158
+ @conflicts = updates.delete(:conflicts) || {}
159
+ end
160
+ end
161
+
162
+ class << self
163
+
164
+ # Get the appropriate removal operation based on the document.
165
+ #
166
+ # @example Get the deletion operation.
167
+ # Operations.remove(doc, options)
168
+ #
169
+ # @param [ Document ] doc The document to persist.
170
+ # @param [ Hash ] options The persistence options.
171
+ #
172
+ # @return [ Operations ] The operation.
173
+ #
174
+ # @since 2.1.0
175
+ def remove(doc, options = {})
176
+ (doc.embedded? ? Embedded::Remove : Remove).new(doc, options)
177
+ end
178
+
179
+ # Get the appropriate insertion operation based on the document.
180
+ #
181
+ # @example Get the insertion operation.
182
+ # Operations.insert(doc, options)
183
+ #
184
+ # @param [ Document ] doc The document to persist.
185
+ # @param [ Hash ] options The persistence options.
186
+ #
187
+ # @return [ Operations ] The operation.
188
+ #
189
+ # @since 2.1.0
190
+ def insert(doc, options = {})
191
+ (doc.embedded? ? Embedded::Insert : Insert).new(doc, options)
192
+ end
193
+
194
+ # Get the appropriate update operation based on the document.
195
+ #
196
+ # @example Get the update operation.
197
+ # Operations.update(doc, options)
198
+ #
199
+ # @param [ Document ] doc The document to persist.
200
+ # @param [ Hash ] options The persistence options.
201
+ #
202
+ # @return [ Operations ] The operation.
203
+ #
204
+ # @since 2.1.0
205
+ def update(doc, options = {})
206
+ Update.new(doc, options)
207
+ end
208
+ end
209
+ end
210
+ end
211
+ end
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ module Operations #:nodoc:
5
+ module Embedded #:nodoc:
6
+
7
+ # Insert is a persistence command responsible for taking a document that
8
+ # has not been saved to the database and saving it. This specific class
9
+ # handles the case when the document is embedded in another.
10
+ #
11
+ # The underlying query resembles the following MongoDB query:
12
+ #
13
+ # collection.update(
14
+ # { "_id" : 1 },
15
+ # { "$push" : { "field" : "value" } },
16
+ # false
17
+ # );
18
+ class Insert
19
+ include Insertion, Operations
20
+
21
+ # Insert the new document in the database. If the document's parent is a
22
+ # new record, we will call save on the parent, otherwise we will $push
23
+ # the document onto the parent.
24
+ #
25
+ # @example Insert an embedded document.
26
+ # Insert.persist
27
+ #
28
+ # @return [ Document ] The document to be inserted.
29
+ def persist
30
+ prepare do
31
+ if parent.new?
32
+ parent.insert
33
+ else
34
+ collection.update(parent.atomic_selector, inserts, options)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ module Operations #:nodoc:
5
+ module Embedded #:nodoc:
6
+
7
+ # Remove is a persistence command responsible for deleting a document from
8
+ # the database.
9
+ #
10
+ # The underlying query resembles the following MongoDB query:
11
+ #
12
+ # collection.remove(
13
+ # { "_id" : 1 },
14
+ # false
15
+ # );
16
+ class Remove
17
+ include Deletion, Operations
18
+
19
+ # Remove the document from the database. If the parent is a new record,
20
+ # it will get removed in Ruby only. If the parent is not a new record
21
+ # then either an $unset or $set will occur, depending if it's an
22
+ # embeds_one or embeds_many.
23
+ #
24
+ # @example Remove an embedded document.
25
+ # RemoveEmbedded.persist
26
+ #
27
+ # @return [ true ] Always true.
28
+ def persist
29
+ prepare do |doc|
30
+ parent.remove_child(doc) if notifying_parent?
31
+ if parent.persisted?
32
+ collection.update(parent.atomic_selector, deletes, options)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,34 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ module Operations #:nodoc:
5
+
6
+ # Insert is a persistence command responsible for taking a document that
7
+ # has not been saved to the database and saving it.
8
+ #
9
+ # The underlying query resembles the following MongoDB query:
10
+ #
11
+ # collection.insert(
12
+ # { "_id" : 1, "field" : "value" },
13
+ # false
14
+ # );
15
+ class Insert
16
+ include Insertion, Operations
17
+
18
+ # Insert the new document in the database. This delegates to the standard
19
+ # MongoDB collection's insert command.
20
+ #
21
+ # @example Insert the document.
22
+ # Insert.persist
23
+ #
24
+ # @return [ Document ] The document to be inserted.
25
+ def persist
26
+ prepare do |doc|
27
+ collection.insert(doc.as_document, options)
28
+ IdentityMap.set(doc)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ module Operations #:nodoc:
5
+
6
+ # Remove is a persistence command responsible for deleting a document from
7
+ # the database.
8
+ #
9
+ # The underlying query resembles the following MongoDB query:
10
+ #
11
+ # collection.remove(
12
+ # { "_id" : 1 },
13
+ # false
14
+ # );
15
+ class Remove
16
+ include Deletion, Operations
17
+
18
+ # Remove the document from the database: delegates to the MongoDB
19
+ # collection remove method.
20
+ #
21
+ # @example Remove the document.
22
+ # Remove.persist
23
+ #
24
+ # @return [ true ] Always true.
25
+ def persist
26
+ prepare do |doc|
27
+ collection.remove({ :_id => doc.id }, options)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end