mongoid 2.4.10 → 3.0.0.rc

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 (351) hide show
  1. data/CHANGELOG.md +843 -9
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -17
  5. data/lib/config/locales/en.yml +441 -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 +16 -9
  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 +100 -42
  16. data/lib/mongoid/collections/retry.rb +2 -3
  17. data/lib/mongoid/components.rb +10 -22
  18. data/lib/mongoid/config/environment.rb +4 -3
  19. data/lib/mongoid/config/inflections.rb +6 -0
  20. data/lib/mongoid/config/options.rb +1 -1
  21. data/lib/mongoid/config/validators/option.rb +25 -0
  22. data/lib/mongoid/config/validators/session.rb +140 -0
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config.rb +87 -233
  25. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  26. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  27. data/lib/mongoid/contextual/atomic.rb +179 -0
  28. data/lib/mongoid/contextual/command.rb +43 -0
  29. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  30. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  31. data/lib/mongoid/contextual/memory.rb +383 -0
  32. data/lib/mongoid/contextual/mongo.rb +543 -0
  33. data/lib/mongoid/contextual.rb +50 -0
  34. data/lib/mongoid/copyable.rb +2 -2
  35. data/lib/mongoid/criteria.rb +436 -248
  36. data/lib/mongoid/criterion/inspection.rb +14 -8
  37. data/lib/mongoid/criterion/scoping.rb +114 -44
  38. data/lib/mongoid/dirty.rb +152 -67
  39. data/lib/mongoid/document.rb +68 -49
  40. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  41. data/lib/mongoid/errors/callback.rb +5 -6
  42. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  43. data/lib/mongoid/errors/document_not_found.rb +98 -17
  44. data/lib/mongoid/errors/eager_load.rb +3 -6
  45. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  46. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  47. data/lib/mongoid/errors/invalid_database.rb +3 -3
  48. data/lib/mongoid/errors/invalid_field.rb +54 -8
  49. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  50. data/lib/mongoid/errors/invalid_find.rb +3 -3
  51. data/lib/mongoid/errors/invalid_index.rb +28 -0
  52. data/lib/mongoid/errors/invalid_options.rb +4 -4
  53. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  54. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  55. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  56. data/lib/mongoid/errors/invalid_time.rb +3 -6
  57. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  58. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  59. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  60. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  61. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  62. data/lib/mongoid/errors/no_default_session.rb +23 -0
  63. data/lib/mongoid/errors/no_environment.rb +3 -3
  64. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -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 +22 -1
  80. data/lib/mongoid/extensions/array.rb +127 -0
  81. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  82. data/lib/mongoid/extensions/boolean.rb +24 -0
  83. data/lib/mongoid/extensions/date.rb +70 -0
  84. data/lib/mongoid/extensions/date_time.rb +68 -0
  85. data/lib/mongoid/extensions/false_class.rb +26 -0
  86. data/lib/mongoid/extensions/float.rb +44 -0
  87. data/lib/mongoid/extensions/hash.rb +91 -0
  88. data/lib/mongoid/extensions/integer.rb +54 -0
  89. data/lib/mongoid/extensions/module.rb +28 -0
  90. data/lib/mongoid/extensions/nil_class.rb +21 -0
  91. data/lib/mongoid/extensions/object.rb +188 -0
  92. data/lib/mongoid/extensions/object_id.rb +53 -0
  93. data/lib/mongoid/extensions/range.rb +55 -0
  94. data/lib/mongoid/extensions/regexp.rb +27 -0
  95. data/lib/mongoid/extensions/set.rb +55 -0
  96. data/lib/mongoid/extensions/string.rb +155 -0
  97. data/lib/mongoid/extensions/symbol.rb +54 -0
  98. data/lib/mongoid/extensions/time.rb +78 -0
  99. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  100. data/lib/mongoid/extensions/true_class.rb +26 -0
  101. data/lib/mongoid/extensions.rb +28 -76
  102. data/lib/mongoid/factory.rb +1 -1
  103. data/lib/mongoid/fields/foreign_key.rb +134 -0
  104. data/lib/mongoid/fields/localized.rb +73 -0
  105. data/lib/mongoid/fields/standard.rb +268 -0
  106. data/lib/mongoid/fields/validators/macro.rb +83 -0
  107. data/lib/mongoid/fields/validators.rb +2 -0
  108. data/lib/mongoid/fields.rb +129 -194
  109. data/lib/mongoid/finders.rb +42 -43
  110. data/lib/mongoid/hierarchy.rb +25 -14
  111. data/lib/mongoid/identity_map.rb +31 -19
  112. data/lib/mongoid/indexes/validators/options.rb +80 -0
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/inspection.rb +1 -1
  115. data/lib/mongoid/javascript.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 +8 -10
  134. data/lib/mongoid/nested_attributes.rb +17 -9
  135. data/lib/mongoid/observer.rb +1 -2
  136. data/lib/mongoid/paranoia.rb +13 -18
  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.rb +6 -19
  159. data/lib/mongoid/persistence.rb +64 -27
  160. data/lib/mongoid/railtie.rb +26 -11
  161. data/lib/mongoid/railties/database.rake +22 -108
  162. data/lib/mongoid/relations/accessors.rb +119 -19
  163. data/lib/mongoid/relations/auto_save.rb +59 -5
  164. data/lib/mongoid/relations/binding.rb +211 -2
  165. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  166. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  167. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  168. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  169. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  170. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  171. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  172. data/lib/mongoid/relations/builder.rb +3 -3
  173. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  174. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  175. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  176. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  177. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  178. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  179. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  180. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  181. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  182. data/lib/mongoid/relations/builders.rb +19 -16
  183. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  184. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  185. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  186. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  187. data/lib/mongoid/relations/cascading.rb +6 -4
  188. data/lib/mongoid/relations/constraint.rb +4 -3
  189. data/lib/mongoid/relations/conversions.rb +5 -6
  190. data/lib/mongoid/relations/cyclic.rb +7 -7
  191. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  192. data/lib/mongoid/relations/embedded/in.rb +23 -12
  193. data/lib/mongoid/relations/embedded/many.rb +99 -160
  194. data/lib/mongoid/relations/embedded/one.rb +25 -14
  195. data/lib/mongoid/relations/macros.rb +105 -60
  196. data/lib/mongoid/relations/many.rb +93 -14
  197. data/lib/mongoid/relations/metadata.rb +231 -45
  198. data/lib/mongoid/relations/nested_builder.rb +3 -5
  199. data/lib/mongoid/relations/one.rb +2 -2
  200. data/lib/mongoid/relations/options.rb +2 -2
  201. data/lib/mongoid/relations/polymorphic.rb +9 -9
  202. data/lib/mongoid/relations/proxy.rb +60 -31
  203. data/lib/mongoid/relations/referenced/in.rb +40 -15
  204. data/lib/mongoid/relations/referenced/many.rb +116 -128
  205. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  206. data/lib/mongoid/relations/referenced/one.rb +34 -13
  207. data/lib/mongoid/relations/reflections.rb +3 -3
  208. data/lib/mongoid/relations/synchronization.rb +19 -23
  209. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  210. data/lib/mongoid/relations/touchable.rb +32 -0
  211. data/lib/mongoid/relations.rb +6 -6
  212. data/lib/mongoid/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +13 -30
  215. data/lib/mongoid/sessions/factory.rb +106 -0
  216. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  217. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions.rb +359 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded/lifecycle.rb +21 -21
  223. data/lib/mongoid/threaded/sessions.rb +0 -0
  224. data/lib/mongoid/threaded.rb +167 -59
  225. data/lib/mongoid/timestamps/created.rb +8 -4
  226. data/lib/mongoid/timestamps/timeless.rb +6 -4
  227. data/lib/mongoid/timestamps/updated.rb +3 -3
  228. data/lib/mongoid/timestamps.rb +1 -1
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations/associated.rb +2 -2
  231. data/lib/mongoid/validations/format.rb +2 -2
  232. data/lib/mongoid/validations/presence.rb +34 -4
  233. data/lib/mongoid/validations/uniqueness.rb +8 -10
  234. data/lib/mongoid/validations.rb +28 -20
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/mongoid.rb +24 -39
  238. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  239. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  240. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  241. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  242. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  243. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  244. data/lib/rails/generators/mongoid_generator.rb +5 -5
  245. data/lib/rails/mongoid.rb +69 -25
  246. metadata +92 -154
  247. data/lib/config/locales/bg.yml +0 -61
  248. data/lib/config/locales/de.yml +0 -61
  249. data/lib/config/locales/en-GB.yml +0 -64
  250. data/lib/config/locales/es.yml +0 -59
  251. data/lib/config/locales/fr.yml +0 -62
  252. data/lib/config/locales/hi.yml +0 -53
  253. data/lib/config/locales/hu.yml +0 -64
  254. data/lib/config/locales/id.yml +0 -62
  255. data/lib/config/locales/it.yml +0 -59
  256. data/lib/config/locales/ja.yml +0 -57
  257. data/lib/config/locales/kr.yml +0 -54
  258. data/lib/config/locales/nl.yml +0 -61
  259. data/lib/config/locales/pl.yml +0 -59
  260. data/lib/config/locales/pt-BR.yml +0 -60
  261. data/lib/config/locales/pt.yml +0 -60
  262. data/lib/config/locales/ro.yml +0 -66
  263. data/lib/config/locales/ru.yml +0 -61
  264. data/lib/config/locales/sv.yml +0 -60
  265. data/lib/config/locales/vi.yml +0 -62
  266. data/lib/config/locales/zh-CN.yml +0 -53
  267. data/lib/mongoid/collection.rb +0 -157
  268. data/lib/mongoid/collections/master.rb +0 -45
  269. data/lib/mongoid/collections/operations.rb +0 -44
  270. data/lib/mongoid/collections.rb +0 -120
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/mongo.rb +0 -487
  276. data/lib/mongoid/contexts.rb +0 -25
  277. data/lib/mongoid/criterion/builder.rb +0 -34
  278. data/lib/mongoid/criterion/complex.rb +0 -84
  279. data/lib/mongoid/criterion/creational.rb +0 -34
  280. data/lib/mongoid/criterion/exclusion.rb +0 -108
  281. data/lib/mongoid/criterion/inclusion.rb +0 -290
  282. data/lib/mongoid/criterion/optional.rb +0 -259
  283. data/lib/mongoid/criterion/selector.rb +0 -177
  284. data/lib/mongoid/cursor.rb +0 -88
  285. data/lib/mongoid/default_scope.rb +0 -36
  286. data/lib/mongoid/errors/invalid_type.rb +0 -25
  287. data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
  288. data/lib/mongoid/extensions/array/deletion.rb +0 -29
  289. data/lib/mongoid/extensions/false_class/equality.rb +0 -26
  290. data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
  291. data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
  292. data/lib/mongoid/extensions/hash/scoping.rb +0 -25
  293. data/lib/mongoid/extensions/integer/checks.rb +0 -23
  294. data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
  295. data/lib/mongoid/extensions/object/checks.rb +0 -29
  296. data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
  297. data/lib/mongoid/extensions/object/reflections.rb +0 -48
  298. data/lib/mongoid/extensions/object/substitutable.rb +0 -15
  299. data/lib/mongoid/extensions/object/yoda.rb +0 -44
  300. data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
  301. data/lib/mongoid/extensions/proc/scoping.rb +0 -25
  302. data/lib/mongoid/extensions/string/checks.rb +0 -36
  303. data/lib/mongoid/extensions/string/conversions.rb +0 -22
  304. data/lib/mongoid/extensions/string/inflections.rb +0 -118
  305. data/lib/mongoid/extensions/symbol/checks.rb +0 -23
  306. data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
  307. data/lib/mongoid/extensions/true_class/equality.rb +0 -26
  308. data/lib/mongoid/extras.rb +0 -31
  309. data/lib/mongoid/fields/internal/array.rb +0 -76
  310. data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
  311. data/lib/mongoid/fields/internal/bignum.rb +0 -10
  312. data/lib/mongoid/fields/internal/binary.rb +0 -11
  313. data/lib/mongoid/fields/internal/boolean.rb +0 -58
  314. data/lib/mongoid/fields/internal/date.rb +0 -51
  315. data/lib/mongoid/fields/internal/date_time.rb +0 -28
  316. data/lib/mongoid/fields/internal/false_class.rb +0 -10
  317. data/lib/mongoid/fields/internal/fixnum.rb +0 -10
  318. data/lib/mongoid/fields/internal/float.rb +0 -47
  319. data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
  320. data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
  321. data/lib/mongoid/fields/internal/hash.rb +0 -11
  322. data/lib/mongoid/fields/internal/integer.rb +0 -59
  323. data/lib/mongoid/fields/internal/localized.rb +0 -62
  324. data/lib/mongoid/fields/internal/nil_class.rb +0 -53
  325. data/lib/mongoid/fields/internal/object.rb +0 -11
  326. data/lib/mongoid/fields/internal/object_id.rb +0 -46
  327. data/lib/mongoid/fields/internal/range.rb +0 -61
  328. data/lib/mongoid/fields/internal/set.rb +0 -57
  329. data/lib/mongoid/fields/internal/string.rb +0 -42
  330. data/lib/mongoid/fields/internal/symbol.rb +0 -43
  331. data/lib/mongoid/fields/internal/time.rb +0 -23
  332. data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
  333. data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
  334. data/lib/mongoid/fields/internal/true_class.rb +0 -10
  335. data/lib/mongoid/fields/mappings.rb +0 -42
  336. data/lib/mongoid/fields/serializable.rb +0 -270
  337. data/lib/mongoid/identity.rb +0 -92
  338. data/lib/mongoid/keys.rb +0 -144
  339. data/lib/mongoid/logger.rb +0 -45
  340. data/lib/mongoid/multi_database.rb +0 -36
  341. data/lib/mongoid/named_scope.rb +0 -166
  342. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  343. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  344. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  345. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  346. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  347. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  348. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  349. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -1,12 +1,14 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Embedded #:nodoc:
2
+ require "mongoid/relations/embedded/batchable"
3
+
4
+ module Mongoid
5
+ module Relations
6
+ module Embedded
5
7
 
6
8
  # This class handles the behaviour for a document that embeds many other
7
9
  # documents within in it as an array.
8
10
  class Many < Relations::Many
9
- include Atomic
11
+ include Batchable
10
12
 
11
13
  # Appends a document or array of documents to the relation. Will set
12
14
  # the parent and update the index in the process.
@@ -25,6 +27,7 @@ module Mongoid # :nodoc:
25
27
  append(doc)
26
28
  doc.save if persistable? && !_assigning?
27
29
  end
30
+ self
28
31
  end
29
32
  alias :push :<<
30
33
 
@@ -37,37 +40,27 @@ module Mongoid # :nodoc:
37
40
  #
38
41
  # @since 2.0.0.rc.1
39
42
  def as_document
40
- [].tap do |attributes|
41
- _unscoped.each do |doc|
42
- attributes.push(doc.as_document)
43
- end
43
+ attributes = []
44
+ _unscoped.each do |doc|
45
+ attributes.push(doc.as_document)
44
46
  end
47
+ attributes
45
48
  end
46
49
 
47
50
  # Appends an array of documents to the relation. Performs a batch
48
51
  # insert of the documents instead of persisting one at a time.
49
52
  #
50
- # @note When performing batch inserts the *after* callbacks will get
51
- # executed before the documents have actually been persisted to the
52
- # database due to an issue with Active Support's callback system - we
53
- # cannot explicitly fire the after callbacks by themselves.
54
- #
55
53
  # @example Concat with other documents.
56
54
  # person.addresses.concat([ address_one, address_two ])
57
55
  #
58
- # @param [ Array<Document> ] documents The docs to add.
56
+ # @param [ Array<Document> ] docs The docs to add.
59
57
  #
60
58
  # @return [ Array<Document> ] The documents.
61
59
  #
62
60
  # @since 2.4.0
63
- def concat(documents)
64
- atomically(:$pushAll) do
65
- documents.each do |doc|
66
- next unless doc
67
- append(doc)
68
- doc.save if persistable?
69
- end
70
- end
61
+ def concat(docs)
62
+ batch_insert(docs)
63
+ self
71
64
  end
72
65
 
73
66
  # Builds a new document in the relation and appends it to the target.
@@ -87,17 +80,15 @@ module Mongoid # :nodoc:
87
80
  #
88
81
  # @return [ Document ] The new document.
89
82
  def build(attributes = {}, options = {}, type = nil)
90
- if options.is_a? Class
83
+ if options.is_a?(Class)
91
84
  options, type = {}, options
92
85
  end
93
-
94
- Factory.build(type || metadata.klass, attributes, options).tap do |doc|
95
- doc.identify
96
- append(doc)
97
- doc.apply_proc_defaults
98
- yield(doc) if block_given?
99
- doc.run_callbacks(:build) { doc }
100
- end
86
+ doc = Factory.build(type || metadata.klass, attributes, options)
87
+ append(doc)
88
+ doc.apply_post_processed_defaults
89
+ yield(doc) if block_given?
90
+ doc.run_callbacks(:build) { doc }
91
+ doc
101
92
  end
102
93
  alias :new :build
103
94
 
@@ -109,12 +100,8 @@ module Mongoid # :nodoc:
109
100
  #
110
101
  # @return [ Many ] The empty relation.
111
102
  def clear
112
- tap do |proxy|
113
- atomically(:$unset) do
114
- proxy.delete_all
115
- _unscoped.clear
116
- end
117
- end
103
+ batch_clear(target.dup)
104
+ self
118
105
  end
119
106
 
120
107
  # Returns a count of the number of documents in the association that have
@@ -131,49 +118,6 @@ module Mongoid # :nodoc:
131
118
  target.select { |doc| doc.persisted? }.size
132
119
  end
133
120
 
134
- # Create a new document in the relation. This is essentially the same
135
- # as doing a #build then #save on the new document.
136
- #
137
- # @example Create a new document in the relation.
138
- # person.movies.create(:name => "Bozo")
139
- #
140
- # @overload create(attributes = {}, options = {}, type = nil)
141
- # @param [ Hash ] attributes The attributes to build the document with.
142
- # @param [ Hash ] options The scoped assignment options.
143
- # @param [ Class ] type Optional class to create the document with.
144
- #
145
- # @overload create(attributes = {}, type = nil)
146
- # @param [ Hash ] attributes The attributes to build the document with.
147
- # @param [ Class ] type Optional class to create the document with.
148
- #
149
- # @return [ Document ] The newly created document.
150
- def create(attributes = {}, options = {}, type = nil, &block)
151
- build(attributes, options, type, &block).tap { |doc| doc.save }
152
- end
153
-
154
- # Create a new document in the relation. This is essentially the same
155
- # as doing a #build then #save on the new document. If validation
156
- # failed on the document an error will get raised.
157
- #
158
- # @example Create the document.
159
- # person.addresses.create!(:street => "Unter der Linden")</tt>
160
- #
161
- # @overload create!(attributes = {}, options = {}, type = nil)
162
- # @param [ Hash ] attributes The attributes to build the document with.
163
- # @param [ Hash ] options The scoped assignment options.
164
- # @param [ Class ] type Optional class to create the document with.
165
- #
166
- # @overload create!(attributes = {}, type = nil)
167
- # @param [ Hash ] attributes The attributes to build the document with.
168
- # @param [ Class ] type Optional class to create the document with.
169
- #
170
- # @raise [ Errors::Validations ] If a validation error occured.
171
- #
172
- # @return [ Document ] The newly created document.
173
- def create!(attributes = {}, options = {}, type = nil, &block)
174
- build(attributes, options, type, &block).tap { |doc| doc.save! }
175
- end
176
-
177
121
  # Delete the supplied document from the target. This method is proxied
178
122
  # in order to reindex the array after the operation occurs.
179
123
  #
@@ -186,22 +130,22 @@ module Mongoid # :nodoc:
186
130
  #
187
131
  # @since 2.0.0.rc.1
188
132
  def delete(document)
189
- target.delete_one(document).tap do |doc|
190
- _unscoped.delete_one(doc)
191
- if doc && !_binding?
192
- if _assigning?
193
- if doc.paranoid?
194
- doc.destroy(:suppress => true)
195
- else
196
- base.add_atomic_pull(doc)
197
- end
133
+ doc = target.delete_one(document)
134
+ _unscoped.delete_one(doc)
135
+ if doc && !_binding?
136
+ if _assigning?
137
+ if doc.paranoid?
138
+ doc.destroy(suppress: true)
198
139
  else
199
- doc.delete(:suppress => true)
140
+ base.add_atomic_pull(doc)
200
141
  end
201
- unbind_one(doc)
142
+ else
143
+ doc.delete(suppress: true)
202
144
  end
203
- reindex
145
+ unbind_one(doc)
204
146
  end
147
+ reindex
148
+ doc
205
149
  end
206
150
 
207
151
  # Delete all the documents in the association without running callbacks.
@@ -210,13 +154,13 @@ module Mongoid # :nodoc:
210
154
  # person.addresses.delete_all
211
155
  #
212
156
  # @example Conditionally delete documents from the relation.
213
- # person.addresses.delete_all(:conditions => { :street => "Bond" })
157
+ # person.addresses.delete_all({ :street => "Bond" })
214
158
  #
215
159
  # @param [ Hash ] conditions Conditions on which documents to delete.
216
160
  #
217
161
  # @return [ Integer ] The number of documents deleted.
218
162
  def delete_all(conditions = {})
219
- atomically(:$pull) { remove_all(conditions, :delete) }
163
+ remove_all(conditions, :delete)
220
164
  end
221
165
 
222
166
  # Destroy all the documents in the association whilst running callbacks.
@@ -225,13 +169,13 @@ module Mongoid # :nodoc:
225
169
  # person.addresses.destroy_all
226
170
  #
227
171
  # @example Conditionally destroy documents from the relation.
228
- # person.addresses.destroy_all(:conditions => { :street => "Bond" })
172
+ # person.addresses.destroy_all({ :street => "Bond" })
229
173
  #
230
174
  # @param [ Hash ] conditions Conditions on which documents to destroy.
231
175
  #
232
176
  # @return [ Integer ] The number of documents destroyed.
233
177
  def destroy_all(conditions = {})
234
- atomically(:$pull) { remove_all(conditions, :destroy) }
178
+ remove_all(conditions, :destroy)
235
179
  end
236
180
 
237
181
  # Finds a document in this association through several different
@@ -243,11 +187,6 @@ module Mongoid # :nodoc:
243
187
  # @example Find documents for multiple ids.
244
188
  # person.addresses.find([ BSON::ObjectId.new, BSON::ObjectId.new ])
245
189
  #
246
- # @example Find documents based on conditions.
247
- # person.addresses.find(:all, :conditions => { :number => 10 })
248
- # person.addresses.find(:first, :conditions => { :number => 10 })
249
- # person.addresses.find(:last, :conditions => { :number => 10 })
250
- #
251
190
  # @param [ Array<Object> ] args Various arguments.
252
191
  #
253
192
  # @return [ Array<Document>, Document ] A single or multiple documents.
@@ -288,54 +227,45 @@ module Mongoid # :nodoc:
288
227
  target
289
228
  end
290
229
 
230
+ # Pop documents off the relation. This can be a single document or
231
+ # multiples, and will automatically persist the changes.
232
+ #
233
+ # @example Pop a single document.
234
+ # relation.pop
235
+ #
236
+ # @example Pop multiple documents.
237
+ # relation.pop(3)
238
+ #
239
+ # @param [ Integer ] count The number of documents to pop, or 1 if not
240
+ # provided.
241
+ #
242
+ # @return [ Document, Array<Document> ] The popped document(s).
243
+ #
244
+ # @since 3.0.0
245
+ def pop(count = nil)
246
+ if count
247
+ if docs = target[target.size - count, target.size]
248
+ docs.each { |doc| delete(doc) }
249
+ end
250
+ else
251
+ delete(target[-1])
252
+ end
253
+ end
254
+
291
255
  # Substitutes the supplied target documents for the existing documents
292
256
  # in the relation.
293
257
  #
294
258
  # @example Substitute the relation's target.
295
259
  # person.addresses.substitute([ address ])
296
260
  #
297
- # @param [ Array<Document> ] new_target The replacement array.
298
- # @param [ true, false ] building Are we in build mode?
261
+ # @param [ Array<Document> ] docs The replacement docs.
299
262
  #
300
263
  # @return [ Many ] The proxied relation.
301
264
  #
302
265
  # @since 2.0.0.rc.1
303
- def substitute(replacement)
304
- tap do |proxy|
305
- if replacement.blank?
306
- if _assigning? && !proxy.empty?
307
- base.atomic_unsets.push(_unscoped.first.atomic_path)
308
- end
309
- proxy.clear
310
- else
311
- atomically(:$set) do
312
- base.delayed_atomic_sets.clear
313
- if replacement.first.is_a?(Hash)
314
- replacement = replacement.map do |doc|
315
- attributes = { :metadata => metadata, :_parent => base }
316
- attributes.merge!(doc)
317
- Factory.build(klass, attributes)
318
- end
319
- end
320
- docs = replacement.compact
321
- proxy.target = docs
322
- self._unscoped = docs.dup
323
- proxy.target.each_with_index do |doc, index|
324
- integrate(doc)
325
- doc._index = index
326
- doc.save if base.persisted? && !_assigning?
327
- end
328
- if _assigning?
329
- name = _unscoped.first.atomic_path
330
- base._children.each do |child|
331
- child.delayed_atomic_sets.clear
332
- end
333
- base.instance_variable_set(:@_children, nil)
334
- base.delayed_atomic_sets[name] = proxy.as_document
335
- end
336
- end
337
- end
338
- end
266
+ def substitute(docs)
267
+ batch_replace(docs)
268
+ self
339
269
  end
340
270
 
341
271
  # Return the relation with all previous scoping removed. This is the
@@ -348,9 +278,10 @@ module Mongoid # :nodoc:
348
278
  #
349
279
  # @since 2.4.0
350
280
  def unscoped
351
- klass.criteria(true, false).tap do |criterion|
352
- criterion.documents = _unscoped
353
- end
281
+ criterion = klass.unscoped
282
+ criterion.embedded = true
283
+ criterion.documents = _unscoped
284
+ criterion
354
285
  end
355
286
 
356
287
  private
@@ -393,9 +324,10 @@ module Mongoid # :nodoc:
393
324
  #
394
325
  # @return [ Criteria ] A new criteria.
395
326
  def criteria
396
- klass.criteria(true).tap do |criterion|
397
- criterion.documents = target
398
- end
327
+ criterion = klass.scoped
328
+ criterion.embedded = true
329
+ criterion.documents = target
330
+ criterion
399
331
  end
400
332
 
401
333
  # Deletes one document from the target and unscoped.
@@ -484,32 +416,27 @@ module Mongoid # :nodoc:
484
416
  # @since 2.4.0
485
417
  def scope(docs)
486
418
  return docs unless metadata.order || metadata.klass.default_scoping?
487
- metadata.klass.criteria(true).order_by(metadata.order).tap do |crit|
488
- crit.documents = docs
489
- end.entries
419
+ crit = metadata.klass.order_by(metadata.order)
420
+ crit.embedded = true
421
+ crit.documents = docs
422
+ crit.entries
490
423
  end
491
424
 
492
425
  # Remove all documents from the relation, either with a delete or a
493
426
  # destroy depending on what this was called through.
494
427
  #
495
428
  # @example Destroy documents from the relation.
496
- # relation.remove_all(:conditions => { :num => 1 }, true)
429
+ # relation.remove_all({ :num => 1 }, true)
497
430
  #
498
431
  # @param [ Hash ] conditions Conditions to filter by.
499
432
  # @param [ true, false ] destroy If true then destroy, else delete.
500
433
  #
501
434
  # @return [ Integer ] The number of documents removed.
502
435
  def remove_all(conditions = {}, method = :delete)
503
- criteria = find(:all, conditions || {})
504
- criteria.size.tap do
505
- criteria.each do |doc|
506
- target.delete_one(doc)
507
- _unscoped.delete_one(doc)
508
- doc.send(method, :suppress => true) unless _assigning?
509
- unbind_one(doc)
510
- end
511
- reindex
512
- end
436
+ criteria = where(conditions || {})
437
+ removed = criteria.size
438
+ batch_remove(criteria, method)
439
+ removed
513
440
  end
514
441
 
515
442
  # Get the internal unscoped documents.
@@ -571,6 +498,18 @@ module Mongoid # :nodoc:
571
498
  true
572
499
  end
573
500
 
501
+ # Returns the suffix of the foreign key field, either "_id" or "_ids".
502
+ #
503
+ # @example Get the suffix for the foreign key.
504
+ # Referenced::Many.foreign_key_suffix
505
+ #
506
+ # @return [ nil ] nil.
507
+ #
508
+ # @since 3.0.0
509
+ def foreign_key_suffix
510
+ nil
511
+ end
512
+
574
513
  # Returns the macro for this relation. Used mostly as a helper in
575
514
  # reflection.
576
515
  #
@@ -647,7 +586,7 @@ module Mongoid # :nodoc:
647
586
  #
648
587
  # @since 2.1.0
649
588
  def valid_options
650
- [ :as, :cascade_callbacks, :cyclic, :order, :versioned ]
589
+ [ :as, :cascade_callbacks, :cyclic, :order, :versioned, :store_as ]
651
590
  end
652
591
 
653
592
  # Get the default validation setting for the relation. Determines if
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Embedded #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Embedded
5
5
 
6
6
  # This class defines the behaviour needed for embedded one to one
7
7
  # relations.
@@ -35,17 +35,16 @@ module Mongoid # :nodoc:
35
35
  #
36
36
  # @since 2.0.0.rc.1
37
37
  def substitute(replacement)
38
- tap do |proxy|
39
- if _assigning?
40
- base.atomic_unsets.push(proxy.atomic_path)
41
- else
42
- proxy.delete if persistable?
43
- end
44
- proxy.unbind_one
45
- return nil unless replacement
46
- proxy.target = replacement
47
- proxy.bind_one
38
+ if _assigning?
39
+ base.atomic_unsets.push(atomic_path)
40
+ else
41
+ delete if persistable?
48
42
  end
43
+ unbind_one
44
+ return nil unless replacement
45
+ self.target = replacement
46
+ bind_one
47
+ self
49
48
  end
50
49
 
51
50
  private
@@ -108,6 +107,18 @@ module Mongoid # :nodoc:
108
107
  true
109
108
  end
110
109
 
110
+ # Returns the suffix of the foreign key field, either "_id" or "_ids".
111
+ #
112
+ # @example Get the suffix for the foreign key.
113
+ # Referenced::Many.foreign_key_suffix
114
+ #
115
+ # @return [ nil ] nil.
116
+ #
117
+ # @since 3.0.0
118
+ def foreign_key_suffix
119
+ nil
120
+ end
121
+
111
122
  # Returns the macro for this relation. Used mostly as a helper in
112
123
  # reflection.
113
124
  #
@@ -184,7 +195,7 @@ module Mongoid # :nodoc:
184
195
  #
185
196
  # @since 2.1.0
186
197
  def valid_options
187
- [ :as, :cascade_callbacks, :cyclic ]
198
+ [ :autobuild, :as, :cascade_callbacks, :cyclic, :store_as ]
188
199
  end
189
200
 
190
201
  # Get the default validation setting for the relation. Determines if