mongoid 2.4.9 → 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 +869 -8
  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 -6
  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 +4 -4
  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 +39 -12
  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 +12 -4
  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 -148
  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 +14 -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 -122
  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 +103 -25
  234. data/lib/mongoid/validations.rb +62 -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 +93 -155
  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 -485
  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 -31
  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,18 +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? && !doc.paranoid?
193
- base.add_atomic_pull(doc)
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)
194
139
  else
195
- doc.delete(:suppress => true)
140
+ base.add_atomic_pull(doc)
196
141
  end
197
- unbind_one(doc)
142
+ else
143
+ doc.delete(suppress: true)
198
144
  end
199
- reindex
145
+ unbind_one(doc)
200
146
  end
147
+ reindex
148
+ doc
201
149
  end
202
150
 
203
151
  # Delete all the documents in the association without running callbacks.
@@ -206,13 +154,13 @@ module Mongoid # :nodoc:
206
154
  # person.addresses.delete_all
207
155
  #
208
156
  # @example Conditionally delete documents from the relation.
209
- # person.addresses.delete_all(:conditions => { :street => "Bond" })
157
+ # person.addresses.delete_all({ :street => "Bond" })
210
158
  #
211
159
  # @param [ Hash ] conditions Conditions on which documents to delete.
212
160
  #
213
161
  # @return [ Integer ] The number of documents deleted.
214
162
  def delete_all(conditions = {})
215
- atomically(:$pull) { remove_all(conditions, :delete) }
163
+ remove_all(conditions, :delete)
216
164
  end
217
165
 
218
166
  # Destroy all the documents in the association whilst running callbacks.
@@ -221,13 +169,13 @@ module Mongoid # :nodoc:
221
169
  # person.addresses.destroy_all
222
170
  #
223
171
  # @example Conditionally destroy documents from the relation.
224
- # person.addresses.destroy_all(:conditions => { :street => "Bond" })
172
+ # person.addresses.destroy_all({ :street => "Bond" })
225
173
  #
226
174
  # @param [ Hash ] conditions Conditions on which documents to destroy.
227
175
  #
228
176
  # @return [ Integer ] The number of documents destroyed.
229
177
  def destroy_all(conditions = {})
230
- atomically(:$pull) { remove_all(conditions, :destroy) }
178
+ remove_all(conditions, :destroy)
231
179
  end
232
180
 
233
181
  # Finds a document in this association through several different
@@ -239,11 +187,6 @@ module Mongoid # :nodoc:
239
187
  # @example Find documents for multiple ids.
240
188
  # person.addresses.find([ BSON::ObjectId.new, BSON::ObjectId.new ])
241
189
  #
242
- # @example Find documents based on conditions.
243
- # person.addresses.find(:all, :conditions => { :number => 10 })
244
- # person.addresses.find(:first, :conditions => { :number => 10 })
245
- # person.addresses.find(:last, :conditions => { :number => 10 })
246
- #
247
190
  # @param [ Array<Object> ] args Various arguments.
248
191
  #
249
192
  # @return [ Array<Document>, Document ] A single or multiple documents.
@@ -284,46 +227,45 @@ module Mongoid # :nodoc:
284
227
  target
285
228
  end
286
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
+
287
255
  # Substitutes the supplied target documents for the existing documents
288
256
  # in the relation.
289
257
  #
290
258
  # @example Substitute the relation's target.
291
259
  # person.addresses.substitute([ address ])
292
260
  #
293
- # @param [ Array<Document> ] new_target The replacement array.
294
- # @param [ true, false ] building Are we in build mode?
261
+ # @param [ Array<Document> ] docs The replacement docs.
295
262
  #
296
263
  # @return [ Many ] The proxied relation.
297
264
  #
298
265
  # @since 2.0.0.rc.1
299
- def substitute(replacement)
300
- tap do |proxy|
301
- if replacement.blank?
302
- if _assigning? && !proxy.empty?
303
- base.atomic_unsets.push(_unscoped.first.atomic_path)
304
- end
305
- proxy.clear
306
- else
307
- atomically(:$set) do
308
- base.delayed_atomic_sets.clear
309
- if replacement.first.is_a?(Hash)
310
- replacement = Many.builder(base, metadata, replacement).build
311
- end
312
- docs = replacement.compact
313
- proxy.target = docs
314
- self._unscoped = docs.dup
315
- proxy.target.each_with_index do |doc, index|
316
- integrate(doc)
317
- doc._index = index
318
- doc.save if base.persisted? && !_assigning?
319
- end
320
- if _assigning?
321
- name = _unscoped.first.atomic_path
322
- base.delayed_atomic_sets[name] = proxy.as_document
323
- end
324
- end
325
- end
326
- end
266
+ def substitute(docs)
267
+ batch_replace(docs)
268
+ self
327
269
  end
328
270
 
329
271
  # Return the relation with all previous scoping removed. This is the
@@ -336,9 +278,10 @@ module Mongoid # :nodoc:
336
278
  #
337
279
  # @since 2.4.0
338
280
  def unscoped
339
- klass.criteria(true, false).tap do |criterion|
340
- criterion.documents = _unscoped
341
- end
281
+ criterion = klass.unscoped
282
+ criterion.embedded = true
283
+ criterion.documents = _unscoped
284
+ criterion
342
285
  end
343
286
 
344
287
  private
@@ -381,9 +324,10 @@ module Mongoid # :nodoc:
381
324
  #
382
325
  # @return [ Criteria ] A new criteria.
383
326
  def criteria
384
- klass.criteria(true).tap do |criterion|
385
- criterion.documents = target
386
- end
327
+ criterion = klass.scoped
328
+ criterion.embedded = true
329
+ criterion.documents = target
330
+ criterion
387
331
  end
388
332
 
389
333
  # Deletes one document from the target and unscoped.
@@ -472,32 +416,27 @@ module Mongoid # :nodoc:
472
416
  # @since 2.4.0
473
417
  def scope(docs)
474
418
  return docs unless metadata.order || metadata.klass.default_scoping?
475
- metadata.klass.criteria(true).order_by(metadata.order).tap do |crit|
476
- crit.documents = docs
477
- end.entries
419
+ crit = metadata.klass.order_by(metadata.order)
420
+ crit.embedded = true
421
+ crit.documents = docs
422
+ crit.entries
478
423
  end
479
424
 
480
425
  # Remove all documents from the relation, either with a delete or a
481
426
  # destroy depending on what this was called through.
482
427
  #
483
428
  # @example Destroy documents from the relation.
484
- # relation.remove_all(:conditions => { :num => 1 }, true)
429
+ # relation.remove_all({ :num => 1 }, true)
485
430
  #
486
431
  # @param [ Hash ] conditions Conditions to filter by.
487
432
  # @param [ true, false ] destroy If true then destroy, else delete.
488
433
  #
489
434
  # @return [ Integer ] The number of documents removed.
490
435
  def remove_all(conditions = {}, method = :delete)
491
- criteria = find(:all, conditions || {})
492
- criteria.size.tap do
493
- criteria.each do |doc|
494
- target.delete_one(doc)
495
- _unscoped.delete_one(doc)
496
- doc.send(method, :suppress => true) unless _assigning?
497
- unbind_one(doc)
498
- end
499
- reindex
500
- end
436
+ criteria = where(conditions || {})
437
+ removed = criteria.size
438
+ batch_remove(criteria, method)
439
+ removed
501
440
  end
502
441
 
503
442
  # Get the internal unscoped documents.
@@ -559,6 +498,18 @@ module Mongoid # :nodoc:
559
498
  true
560
499
  end
561
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
+
562
513
  # Returns the macro for this relation. Used mostly as a helper in
563
514
  # reflection.
564
515
  #
@@ -635,7 +586,7 @@ module Mongoid # :nodoc:
635
586
  #
636
587
  # @since 2.1.0
637
588
  def valid_options
638
- [ :as, :cascade_callbacks, :cyclic, :order, :versioned ]
589
+ [ :as, :cascade_callbacks, :cyclic, :order, :versioned, :store_as ]
639
590
  end
640
591
 
641
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