mongoid 2.4.10 → 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 (356) hide show
  1. data/CHANGELOG.md +949 -10
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +3 -17
  5. data/lib/config/locales/en.yml +455 -51
  6. data/lib/mongoid/atomic/modifiers.rb +2 -2
  7. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  8. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/root.rb +4 -5
  11. data/lib/mongoid/atomic.rb +70 -16
  12. data/lib/mongoid/attributes/processing.rb +14 -10
  13. data/lib/mongoid/attributes/readonly.rb +56 -0
  14. data/lib/mongoid/attributes.rb +95 -32
  15. data/lib/mongoid/callbacks.rb +106 -43
  16. data/lib/mongoid/components.rb +12 -23
  17. data/lib/mongoid/config/environment.rb +7 -4
  18. data/lib/mongoid/config/inflections.rb +6 -0
  19. data/lib/mongoid/config/options.rb +1 -1
  20. data/lib/mongoid/config/validators/option.rb +25 -0
  21. data/lib/mongoid/config/validators/session.rb +140 -0
  22. data/lib/mongoid/config/validators.rb +3 -0
  23. data/lib/mongoid/config.rb +104 -225
  24. data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
  25. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  26. data/lib/mongoid/contextual/atomic.rb +179 -0
  27. data/lib/mongoid/contextual/command.rb +43 -0
  28. data/lib/mongoid/contextual/find_and_modify.rb +68 -0
  29. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  30. data/lib/mongoid/contextual/memory.rb +406 -0
  31. data/lib/mongoid/contextual/mongo.rb +662 -0
  32. data/lib/mongoid/contextual.rb +50 -0
  33. data/lib/mongoid/copyable.rb +7 -25
  34. data/lib/mongoid/criteria.rb +515 -245
  35. data/lib/mongoid/criterion/inspection.rb +14 -8
  36. data/lib/mongoid/criterion/scoping.rb +114 -44
  37. data/lib/mongoid/dirty.rb +152 -67
  38. data/lib/mongoid/document.rb +71 -52
  39. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  40. data/lib/mongoid/errors/callback.rb +5 -6
  41. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  42. data/lib/mongoid/errors/document_not_found.rb +98 -17
  43. data/lib/mongoid/errors/eager_load.rb +3 -6
  44. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  45. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  46. data/lib/mongoid/errors/invalid_database.rb +3 -3
  47. data/lib/mongoid/errors/invalid_field.rb +54 -8
  48. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  49. data/lib/mongoid/errors/invalid_find.rb +3 -3
  50. data/lib/mongoid/errors/invalid_index.rb +28 -0
  51. data/lib/mongoid/errors/invalid_options.rb +4 -4
  52. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  53. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  54. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  55. data/lib/mongoid/errors/invalid_time.rb +3 -6
  56. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  57. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  58. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  59. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  60. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  61. data/lib/mongoid/errors/no_default_session.rb +23 -0
  62. data/lib/mongoid/errors/no_environment.rb +3 -3
  63. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  64. data/lib/mongoid/errors/no_metadata.rb +21 -0
  65. data/lib/mongoid/errors/no_parent.rb +24 -0
  66. data/lib/mongoid/errors/no_session_config.rb +22 -0
  67. data/lib/mongoid/errors/no_session_database.rb +27 -0
  68. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  69. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  70. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  71. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  72. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  73. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  74. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  75. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  76. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  77. data/lib/mongoid/errors/validations.rb +7 -6
  78. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  79. data/lib/mongoid/errors.rb +23 -1
  80. data/lib/mongoid/evolvable.rb +19 -0
  81. data/lib/mongoid/extensions/array.rb +164 -0
  82. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  83. data/lib/mongoid/extensions/boolean.rb +24 -0
  84. data/lib/mongoid/extensions/date.rb +70 -0
  85. data/lib/mongoid/extensions/date_time.rb +73 -0
  86. data/lib/mongoid/extensions/false_class.rb +38 -0
  87. data/lib/mongoid/extensions/float.rb +56 -0
  88. data/lib/mongoid/extensions/hash.rb +123 -0
  89. data/lib/mongoid/extensions/integer.rb +66 -0
  90. data/lib/mongoid/extensions/module.rb +28 -0
  91. data/lib/mongoid/extensions/nil_class.rb +21 -0
  92. data/lib/mongoid/extensions/object.rb +238 -0
  93. data/lib/mongoid/extensions/object_id.rb +54 -0
  94. data/lib/mongoid/extensions/range.rb +79 -0
  95. data/lib/mongoid/extensions/regexp.rb +27 -0
  96. data/lib/mongoid/extensions/set.rb +55 -0
  97. data/lib/mongoid/extensions/string.rb +181 -0
  98. data/lib/mongoid/extensions/symbol.rb +54 -0
  99. data/lib/mongoid/extensions/time.rb +78 -0
  100. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  101. data/lib/mongoid/extensions/true_class.rb +38 -0
  102. data/lib/mongoid/extensions.rb +28 -76
  103. data/lib/mongoid/factory.rb +1 -1
  104. data/lib/mongoid/fields/foreign_key.rb +150 -0
  105. data/lib/mongoid/fields/localized.rb +73 -0
  106. data/lib/mongoid/fields/standard.rb +268 -0
  107. data/lib/mongoid/fields/validators/macro.rb +83 -0
  108. data/lib/mongoid/fields/validators.rb +2 -0
  109. data/lib/mongoid/fields.rb +142 -208
  110. data/lib/mongoid/finders.rb +45 -50
  111. data/lib/mongoid/hierarchy.rb +44 -15
  112. data/lib/mongoid/identity_map.rb +49 -21
  113. data/lib/mongoid/indexes/validators/options.rb +80 -0
  114. data/lib/mongoid/indexes.rb +66 -15
  115. data/lib/mongoid/inspection.rb +1 -1
  116. data/lib/mongoid/json.rb +2 -2
  117. data/lib/mongoid/loggable.rb +69 -0
  118. data/lib/mongoid/matchers/all.rb +7 -8
  119. data/lib/mongoid/matchers/and.rb +3 -3
  120. data/lib/mongoid/matchers/default.rb +6 -4
  121. data/lib/mongoid/matchers/exists.rb +2 -2
  122. data/lib/mongoid/matchers/gt.rb +2 -2
  123. data/lib/mongoid/matchers/gte.rb +2 -2
  124. data/lib/mongoid/matchers/in.rb +3 -7
  125. data/lib/mongoid/matchers/lt.rb +2 -2
  126. data/lib/mongoid/matchers/lte.rb +2 -2
  127. data/lib/mongoid/matchers/ne.rb +2 -2
  128. data/lib/mongoid/matchers/nin.rb +2 -2
  129. data/lib/mongoid/matchers/or.rb +2 -2
  130. data/lib/mongoid/matchers/size.rb +2 -2
  131. data/lib/mongoid/matchers/strategies.rb +3 -3
  132. data/lib/mongoid/matchers.rb +1 -1
  133. data/lib/mongoid/multi_parameter_attributes.rb +9 -11
  134. data/lib/mongoid/nested_attributes.rb +17 -9
  135. data/lib/mongoid/observer.rb +1 -2
  136. data/lib/mongoid/paranoia.rb +10 -44
  137. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  138. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  139. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  140. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  141. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  144. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  145. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  146. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  147. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  148. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  149. data/lib/mongoid/persistence/atomic.rb +2 -2
  150. data/lib/mongoid/persistence/deletion.rb +2 -2
  151. data/lib/mongoid/persistence/insertion.rb +10 -16
  152. data/lib/mongoid/persistence/modification.rb +5 -9
  153. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  154. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  155. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  156. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  157. data/lib/mongoid/persistence/operations/update.rb +5 -5
  158. data/lib/mongoid/persistence/operations/upsert.rb +28 -0
  159. data/lib/mongoid/persistence/operations.rb +22 -19
  160. data/lib/mongoid/persistence/upsertion.rb +30 -0
  161. data/lib/mongoid/persistence.rb +94 -39
  162. data/lib/mongoid/railtie.rb +26 -11
  163. data/lib/mongoid/railties/database.rake +22 -108
  164. data/lib/mongoid/relations/accessors.rb +120 -20
  165. data/lib/mongoid/relations/auto_save.rb +59 -5
  166. data/lib/mongoid/relations/binding.rb +211 -2
  167. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  168. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  169. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  170. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  171. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  172. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  173. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  174. data/lib/mongoid/relations/builder.rb +4 -4
  175. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  176. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  177. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  178. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  179. data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -5
  180. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  181. data/lib/mongoid/relations/builders/referenced/many.rb +6 -6
  182. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  183. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  184. data/lib/mongoid/relations/builders.rb +19 -16
  185. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  186. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  187. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  188. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  189. data/lib/mongoid/relations/cascading.rb +10 -7
  190. data/lib/mongoid/relations/constraint.rb +4 -3
  191. data/lib/mongoid/relations/conversions.rb +6 -7
  192. data/lib/mongoid/relations/cyclic.rb +7 -7
  193. data/lib/mongoid/relations/embedded/batchable.rb +347 -0
  194. data/lib/mongoid/relations/embedded/in.rb +23 -12
  195. data/lib/mongoid/relations/embedded/many.rb +100 -161
  196. data/lib/mongoid/relations/embedded/one.rb +25 -14
  197. data/lib/mongoid/relations/macros.rb +105 -60
  198. data/lib/mongoid/relations/many.rb +93 -14
  199. data/lib/mongoid/relations/metadata.rb +277 -47
  200. data/lib/mongoid/relations/nested_builder.rb +4 -6
  201. data/lib/mongoid/relations/one.rb +2 -2
  202. data/lib/mongoid/relations/options.rb +2 -2
  203. data/lib/mongoid/relations/polymorphic.rb +9 -9
  204. data/lib/mongoid/relations/proxy.rb +62 -31
  205. data/lib/mongoid/relations/referenced/in.rb +40 -15
  206. data/lib/mongoid/relations/referenced/many.rb +162 -130
  207. data/lib/mongoid/relations/referenced/many_to_many.rb +104 -48
  208. data/lib/mongoid/relations/referenced/one.rb +34 -13
  209. data/lib/mongoid/relations/reflections.rb +3 -3
  210. data/lib/mongoid/relations/synchronization.rb +19 -23
  211. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  212. data/lib/mongoid/relations/touchable.rb +32 -0
  213. data/lib/mongoid/relations.rb +22 -6
  214. data/lib/mongoid/reloading.rb +12 -14
  215. data/lib/mongoid/scoping.rb +312 -0
  216. data/lib/mongoid/serialization.rb +94 -42
  217. data/lib/mongoid/sessions/factory.rb +108 -0
  218. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  219. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  220. data/lib/mongoid/sessions/validators.rb +2 -0
  221. data/lib/mongoid/sessions.rb +383 -0
  222. data/lib/mongoid/sharding.rb +6 -6
  223. data/lib/mongoid/state.rb +6 -7
  224. data/lib/mongoid/threaded/lifecycle.rb +21 -21
  225. data/lib/mongoid/threaded/sessions.rb +0 -0
  226. data/lib/mongoid/threaded.rb +219 -59
  227. data/lib/mongoid/timestamps/created.rb +8 -4
  228. data/lib/mongoid/timestamps/timeless.rb +6 -4
  229. data/lib/mongoid/timestamps/updated.rb +4 -3
  230. data/lib/mongoid/timestamps.rb +1 -1
  231. data/lib/mongoid/unit_of_work.rb +61 -0
  232. data/lib/mongoid/validations/associated.rb +2 -2
  233. data/lib/mongoid/validations/format.rb +2 -2
  234. data/lib/mongoid/validations/presence.rb +34 -4
  235. data/lib/mongoid/validations/uniqueness.rb +11 -12
  236. data/lib/mongoid/validations.rb +28 -20
  237. data/lib/mongoid/version.rb +2 -2
  238. data/lib/mongoid/versioning.rb +25 -26
  239. data/lib/mongoid.rb +37 -37
  240. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  241. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  242. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +65 -17
  243. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  244. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  245. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  246. data/lib/rails/generators/mongoid_generator.rb +5 -5
  247. data/lib/rails/mongoid.rb +73 -26
  248. metadata +103 -148
  249. data/lib/config/locales/bg.yml +0 -61
  250. data/lib/config/locales/de.yml +0 -61
  251. data/lib/config/locales/en-GB.yml +0 -64
  252. data/lib/config/locales/es.yml +0 -59
  253. data/lib/config/locales/fr.yml +0 -62
  254. data/lib/config/locales/hi.yml +0 -53
  255. data/lib/config/locales/hu.yml +0 -64
  256. data/lib/config/locales/id.yml +0 -62
  257. data/lib/config/locales/it.yml +0 -59
  258. data/lib/config/locales/ja.yml +0 -57
  259. data/lib/config/locales/kr.yml +0 -54
  260. data/lib/config/locales/nl.yml +0 -61
  261. data/lib/config/locales/pl.yml +0 -59
  262. data/lib/config/locales/pt-BR.yml +0 -60
  263. data/lib/config/locales/pt.yml +0 -60
  264. data/lib/config/locales/ro.yml +0 -66
  265. data/lib/config/locales/ru.yml +0 -61
  266. data/lib/config/locales/sv.yml +0 -60
  267. data/lib/config/locales/vi.yml +0 -62
  268. data/lib/config/locales/zh-CN.yml +0 -53
  269. data/lib/mongoid/collection.rb +0 -157
  270. data/lib/mongoid/collections/master.rb +0 -45
  271. data/lib/mongoid/collections/operations.rb +0 -44
  272. data/lib/mongoid/collections/retry.rb +0 -59
  273. data/lib/mongoid/collections.rb +0 -120
  274. data/lib/mongoid/config/database.rb +0 -181
  275. data/lib/mongoid/config/replset_database.rb +0 -80
  276. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  277. data/lib/mongoid/contexts/enumerable.rb +0 -313
  278. data/lib/mongoid/contexts/mongo.rb +0 -487
  279. data/lib/mongoid/contexts.rb +0 -25
  280. data/lib/mongoid/criterion/builder.rb +0 -34
  281. data/lib/mongoid/criterion/complex.rb +0 -84
  282. data/lib/mongoid/criterion/creational.rb +0 -34
  283. data/lib/mongoid/criterion/exclusion.rb +0 -108
  284. data/lib/mongoid/criterion/inclusion.rb +0 -290
  285. data/lib/mongoid/criterion/optional.rb +0 -259
  286. data/lib/mongoid/criterion/selector.rb +0 -177
  287. data/lib/mongoid/cursor.rb +0 -88
  288. data/lib/mongoid/default_scope.rb +0 -36
  289. data/lib/mongoid/errors/invalid_type.rb +0 -25
  290. data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
  291. data/lib/mongoid/extensions/array/deletion.rb +0 -29
  292. data/lib/mongoid/extensions/false_class/equality.rb +0 -26
  293. data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
  294. data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
  295. data/lib/mongoid/extensions/hash/scoping.rb +0 -25
  296. data/lib/mongoid/extensions/integer/checks.rb +0 -23
  297. data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
  298. data/lib/mongoid/extensions/object/checks.rb +0 -29
  299. data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
  300. data/lib/mongoid/extensions/object/reflections.rb +0 -48
  301. data/lib/mongoid/extensions/object/substitutable.rb +0 -15
  302. data/lib/mongoid/extensions/object/yoda.rb +0 -44
  303. data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
  304. data/lib/mongoid/extensions/proc/scoping.rb +0 -25
  305. data/lib/mongoid/extensions/string/checks.rb +0 -36
  306. data/lib/mongoid/extensions/string/conversions.rb +0 -22
  307. data/lib/mongoid/extensions/string/inflections.rb +0 -118
  308. data/lib/mongoid/extensions/symbol/checks.rb +0 -23
  309. data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
  310. data/lib/mongoid/extensions/true_class/equality.rb +0 -26
  311. data/lib/mongoid/extras.rb +0 -31
  312. data/lib/mongoid/fields/internal/array.rb +0 -76
  313. data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
  314. data/lib/mongoid/fields/internal/bignum.rb +0 -10
  315. data/lib/mongoid/fields/internal/binary.rb +0 -11
  316. data/lib/mongoid/fields/internal/boolean.rb +0 -58
  317. data/lib/mongoid/fields/internal/date.rb +0 -51
  318. data/lib/mongoid/fields/internal/date_time.rb +0 -28
  319. data/lib/mongoid/fields/internal/false_class.rb +0 -10
  320. data/lib/mongoid/fields/internal/fixnum.rb +0 -10
  321. data/lib/mongoid/fields/internal/float.rb +0 -47
  322. data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
  323. data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
  324. data/lib/mongoid/fields/internal/hash.rb +0 -11
  325. data/lib/mongoid/fields/internal/integer.rb +0 -59
  326. data/lib/mongoid/fields/internal/localized.rb +0 -62
  327. data/lib/mongoid/fields/internal/nil_class.rb +0 -53
  328. data/lib/mongoid/fields/internal/object.rb +0 -11
  329. data/lib/mongoid/fields/internal/object_id.rb +0 -46
  330. data/lib/mongoid/fields/internal/range.rb +0 -61
  331. data/lib/mongoid/fields/internal/set.rb +0 -57
  332. data/lib/mongoid/fields/internal/string.rb +0 -42
  333. data/lib/mongoid/fields/internal/symbol.rb +0 -43
  334. data/lib/mongoid/fields/internal/time.rb +0 -23
  335. data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
  336. data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
  337. data/lib/mongoid/fields/internal/true_class.rb +0 -10
  338. data/lib/mongoid/fields/mappings.rb +0 -42
  339. data/lib/mongoid/fields/serializable.rb +0 -270
  340. data/lib/mongoid/identity.rb +0 -92
  341. data/lib/mongoid/javascript/functions.yml +0 -63
  342. data/lib/mongoid/javascript.rb +0 -20
  343. data/lib/mongoid/keys.rb +0 -144
  344. data/lib/mongoid/logger.rb +0 -45
  345. data/lib/mongoid/multi_database.rb +0 -36
  346. data/lib/mongoid/named_scope.rb +0 -166
  347. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  348. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  349. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  350. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  351. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  352. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  353. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  354. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  355. data/lib/mongoid/safety.rb +0 -105
  356. data/lib/mongoid/scope.rb +0 -31
@@ -0,0 +1,347 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Relations
4
+ module Embedded
5
+
6
+ # Contains behaviour for executing operations in batch on embedded
7
+ # documents.
8
+ module Batchable
9
+
10
+ # Insert new documents as a batch push ($pushAll). This ensures that
11
+ # all callbacks are run at the appropriate time and only 1 request is
12
+ # made to the database.
13
+ #
14
+ # @example Execute the batch push.
15
+ # batchable.batch_insert([ doc_one, doc_two ])
16
+ #
17
+ # @param [ Array<Document> ] docs The docs to add.
18
+ #
19
+ # @return [ Array<Hash> ] The inserts.
20
+ #
21
+ # @since 3.0.0
22
+ def batch_insert(docs)
23
+ execute_batch_insert(docs, "$pushAll")
24
+ end
25
+
26
+ # Clear all of the docs out of the relation in a single swipe.
27
+ #
28
+ # @example Clear all docs.
29
+ # batchable.batch_clear(docs)
30
+ #
31
+ # @param [ Array<Document> ] docs The docs to clear.
32
+ #
33
+ # @return [ Array ] The empty array.
34
+ #
35
+ # @since 3.0.0
36
+ def batch_clear(docs)
37
+ pre_process_batch_remove(docs, :delete)
38
+ unless docs.empty?
39
+ collection.find(selector).update("$unset" => { path => true })
40
+ post_process_batch_remove(docs, :delete)
41
+ end
42
+ _unscoped.clear
43
+ end
44
+
45
+ # Batch remove the provided documents as a $pullAll.
46
+ #
47
+ # @example Batch remove the documents.
48
+ # batchable.batch_remove([ doc_one, doc_two ])
49
+ #
50
+ # @param [ Array<Document> ] docs The docs to remove.
51
+ # @param [ Symbol ] method Delete or destroy.
52
+ #
53
+ # @since 3.0.0
54
+ def batch_remove(docs, method = :delete)
55
+ removals = pre_process_batch_remove(docs, method)
56
+ if !docs.empty? && !_assigning?
57
+ collection.find(selector).update("$pullAll" => { path => removals })
58
+ post_process_batch_remove(docs, method)
59
+ end
60
+ Threaded.clear_options!
61
+ reindex
62
+ end
63
+
64
+ # Batch replace the provided documents as a $set.
65
+ #
66
+ # @example Batch replace the documents.
67
+ # batchable.batch_replace([ doc_one, doc_two ])
68
+ #
69
+ # @param [ Array<Document> ] docs The docs to replace with.
70
+ #
71
+ # @return [ Array<Hash> ] The inserts.
72
+ #
73
+ # @since 3.0.0
74
+ def batch_replace(docs)
75
+ if docs.blank?
76
+ if _assigning? && !empty?
77
+ base.add_atomic_unset(first)
78
+ end
79
+ batch_remove(target.dup)
80
+ else
81
+ base.delayed_atomic_sets.clear unless _assigning?
82
+ docs = normalize_docs(docs).compact
83
+ target.clear and _unscoped.clear
84
+ inserts = execute_batch_insert(docs, "$set")
85
+ add_atomic_sets(inserts)
86
+ end
87
+ end
88
+
89
+ private
90
+
91
+ # Add the atomic sets to the base document.
92
+ #
93
+ # @api private
94
+ #
95
+ # @example Add the atomic sets.
96
+ # batchable.add_atomic_sets([{ field: value }])
97
+ #
98
+ # @param [ Array<Hash> ] sets The atomic sets.
99
+ #
100
+ # @since 3.0.0
101
+ def add_atomic_sets(sets)
102
+ if _assigning?
103
+ base.delayed_atomic_sets[path].try(:clear)
104
+ base.collect_children.each do |child|
105
+ child.delayed_atomic_sets.clear
106
+ end
107
+ base.delayed_atomic_sets[path] = sets
108
+ end
109
+ end
110
+
111
+ # Perform a batch persist of the provided documents with the supplied
112
+ # operation.
113
+ #
114
+ # @api private
115
+ #
116
+ # @example Perform a batch operation.
117
+ # batchable.execute_batch(docs, "$set")
118
+ #
119
+ # @param [ Array<Document> ] docs The docs to persist.
120
+ # @param [ String ] operation The atomic operation.
121
+ #
122
+ # @return [ Array<Hash> ] The inserts.
123
+ #
124
+ # @since 3.0.0
125
+ def execute_batch_insert(docs, operation)
126
+ self.inserts_valid = true
127
+ inserts = pre_process_batch_insert(docs)
128
+ if insertable?
129
+ collection.find(selector).update(operation => { path => inserts })
130
+ post_process_batch_insert(docs)
131
+ end
132
+ inserts
133
+ end
134
+
135
+ # Are we in a state to be able to batch insert?
136
+ #
137
+ # @api private
138
+ #
139
+ # @example Can inserts be performed?
140
+ # batchable.insertable?
141
+ #
142
+ # @return [ true, false ] If inserts can be performed.
143
+ #
144
+ # @since 3.0.0
145
+ def insertable?
146
+ persistable? && !_assigning? && inserts_valid
147
+ end
148
+
149
+ # Are the inserts currently valid?
150
+ #
151
+ # @api private
152
+ #
153
+ # @example Are the inserts currently valid.
154
+ # batchable.inserts_valid
155
+ #
156
+ # @return [ true, false ] If inserts are currently valid.
157
+ #
158
+ # @since 3.0.0
159
+ def inserts_valid
160
+ @inserts_valid
161
+ end
162
+
163
+ # Set the inserts valid flag.
164
+ #
165
+ # @api private
166
+ #
167
+ # @example Set the flag.
168
+ # batchable.inserts_valid = true
169
+ #
170
+ # @param [ true, false ] value The flag.
171
+ #
172
+ # @return [ true, false ] The flag.
173
+ #
174
+ # @since 3.0.0
175
+ def inserts_valid=(value)
176
+ @inserts_valid = value
177
+ end
178
+
179
+ # Normalize the documents, in case they were provided as an array of
180
+ # hashes.
181
+ #
182
+ # @api private
183
+ #
184
+ # @example Normalize the docs.
185
+ # batchable.normalize_docs(docs)
186
+ #
187
+ # @param [ Array<Hash, Document> ] docs The docs to normalize.
188
+ #
189
+ # @return [ Array<Document> ] The docs.
190
+ #
191
+ # @since 3.0.0
192
+ def normalize_docs(docs)
193
+ if docs.first.is_a?(::Hash)
194
+ docs.map do |doc|
195
+ attributes = { metadata: metadata, _parent: base }
196
+ attributes.merge!(doc)
197
+ Factory.build(klass, attributes)
198
+ end
199
+ else
200
+ docs
201
+ end
202
+ end
203
+
204
+ # Get the atomic path.
205
+ #
206
+ # @api private
207
+ #
208
+ # @example Get the atomic path.
209
+ # batchable.path
210
+ #
211
+ # @return [ String ] The atomic path.
212
+ #
213
+ # @since 3.0.0
214
+ def path
215
+ @path ||= _unscoped.first.atomic_path
216
+ end
217
+
218
+ # Set the atomic path.
219
+ #
220
+ # @api private
221
+ #
222
+ # @example Set the atomic path.
223
+ # batchable.path = "addresses"
224
+ #
225
+ # @param [ String ] value The path.
226
+ #
227
+ # @return [ String ] The path.
228
+ #
229
+ # @since 3.0.0
230
+ def path=(value)
231
+ @path = value
232
+ end
233
+
234
+ # Get the selector for executing atomic operations on the collection.
235
+ #
236
+ # @api private
237
+ #
238
+ # @example Get the selector.
239
+ # batchable.selector
240
+ #
241
+ # @return [ Hash ] The atomic selector.
242
+ #
243
+ # @since 3.0.0
244
+ def selector
245
+ @selector ||= base.atomic_selector
246
+ end
247
+
248
+ # Pre processes the batch insert for the provided documents.
249
+ #
250
+ # @api private
251
+ #
252
+ # @example Pre process the documents.
253
+ # batchable.pre_process_batch_insert(docs)
254
+ #
255
+ # @param [ Array<Document> ] docs The documents.
256
+ #
257
+ # @return [ Array<Hash> ] The documents as an array of hashes.
258
+ #
259
+ # @since 3.0.0
260
+ def pre_process_batch_insert(docs)
261
+ docs.map do |doc|
262
+ next unless doc
263
+ append(doc)
264
+ if persistable? && !_assigning?
265
+ self.path = doc.atomic_path unless path
266
+ if doc.valid?(:create)
267
+ doc.run_before_callbacks(:save, :create)
268
+ else
269
+ self.inserts_valid = false
270
+ end
271
+ end
272
+ doc.as_document
273
+ end
274
+ end
275
+
276
+ # Pre process the batch removal.
277
+ #
278
+ # @api private
279
+ #
280
+ # @example Pre process the documents.
281
+ # batchable.pre_process_batch_remove(docs, :delete)
282
+ #
283
+ # @param [ Array<Document> ] docs The documents.
284
+ # @param [ Symbol ] method Delete or destroy.
285
+ #
286
+ # @return [ Array<Hash> ] The documents as hashes.
287
+ #
288
+ # @since 3.0.0
289
+ def pre_process_batch_remove(docs, method)
290
+ docs.map do |doc|
291
+ self.path = doc.atomic_path unless path
292
+ if !_assigning? && !metadata.versioned?
293
+ doc.cascade!
294
+ doc.run_before_callbacks(:destroy) if method == :destroy
295
+ end
296
+ target.delete_one(doc)
297
+ _unscoped.delete_one(doc)
298
+ unbind_one(doc)
299
+ doc.as_document
300
+ end
301
+ end
302
+
303
+ # Post process the documents after batch insert.
304
+ #
305
+ # @api private
306
+ #
307
+ # @example Post process the documents.
308
+ # batchable.post_process_batch_insert(docs)
309
+ #
310
+ # @param [ Array<Documents> ] docs The inserted docs.
311
+ #
312
+ # @return [ Enumerable ] The document enum.
313
+ #
314
+ # @since 3.0.0
315
+ def post_process_batch_insert(docs)
316
+ docs.each do |doc|
317
+ doc.new_record = false
318
+ doc.run_after_callbacks(:create, :save)
319
+ doc.post_persist
320
+ end
321
+ end
322
+
323
+ # Post process the batch removal.
324
+ #
325
+ # @api private
326
+ #
327
+ # @example Post process the documents.
328
+ # batchable.post_process_batch_remove(docs, :delete)
329
+ #
330
+ # @param [ Array<Document> ] docs The documents.
331
+ # @param [ Symbol ] method Delete or destroy.
332
+ #
333
+ # @return [ Array<Document> ] The documents.
334
+ #
335
+ # @since 3.0.0
336
+ def post_process_batch_remove(docs, method)
337
+ docs.each do |doc|
338
+ doc.run_after_callbacks(:destroy) if method == :destroy
339
+ doc.freeze
340
+ doc.destroyed = true
341
+ IdentityMap.remove(doc)
342
+ end
343
+ end
344
+ end
345
+ end
346
+ end
347
+ end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
4
  module Embedded
5
5
 
6
6
  # This class defines the behaviour necessary to handle relations that are
@@ -37,16 +37,15 @@ module Mongoid # :nodoc:
37
37
  #
38
38
  # @since 2.0.0.rc.1
39
39
  def substitute(replacement)
40
- tap do |proxy|
41
- proxy.unbind_one
42
- unless replacement
43
- base.delete if persistable?
44
- return nil
45
- end
46
- base.new_record = true
47
- proxy.target = replacement
48
- proxy.bind_one
40
+ unbind_one
41
+ unless replacement
42
+ base.delete if persistable?
43
+ return nil
49
44
  end
45
+ base.new_record = true
46
+ self.target = replacement
47
+ bind_one
48
+ self
50
49
  end
51
50
 
52
51
  private
@@ -123,6 +122,18 @@ module Mongoid # :nodoc:
123
122
  true
124
123
  end
125
124
 
125
+ # Returns the suffix of the foreign key field, either "_id" or "_ids".
126
+ #
127
+ # @example Get the suffix for the foreign key.
128
+ # Referenced::Many.foreign_key_suffix
129
+ #
130
+ # @return [ nil ] nil.
131
+ #
132
+ # @since 3.0.0
133
+ def foreign_key_suffix
134
+ nil
135
+ end
136
+
126
137
  # Returns the macro for this relation. Used mostly as a helper in
127
138
  # reflection.
128
139
  #
@@ -198,7 +209,7 @@ module Mongoid # :nodoc:
198
209
  #
199
210
  # @since 2.1.0
200
211
  def valid_options
201
- [ :cyclic, :polymorphic ]
212
+ [ :autobuild, :cyclic, :polymorphic ]
202
213
  end
203
214
 
204
215
  # Get the default validation setting for the relation. Determines if