mongoid 2.8.1 → 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 +802 -58
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -8
  5. data/lib/config/locales/en.yml +441 -51
  6. data/lib/mongoid.rb +24 -39
  7. data/lib/mongoid/atomic.rb +16 -33
  8. data/lib/mongoid/atomic/modifiers.rb +2 -2
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  11. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  12. data/lib/mongoid/atomic/paths/root.rb +4 -5
  13. data/lib/mongoid/attributes.rb +95 -32
  14. data/lib/mongoid/attributes/processing.rb +14 -10
  15. data/lib/mongoid/attributes/readonly.rb +56 -0
  16. data/lib/mongoid/callbacks.rb +90 -27
  17. data/lib/mongoid/collections/retry.rb +2 -3
  18. data/lib/mongoid/components.rb +11 -23
  19. data/lib/mongoid/config.rb +87 -233
  20. data/lib/mongoid/config/environment.rb +5 -6
  21. data/lib/mongoid/config/inflections.rb +6 -0
  22. data/lib/mongoid/config/options.rb +1 -1
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config/validators/option.rb +25 -0
  25. data/lib/mongoid/config/validators/session.rb +140 -0
  26. data/lib/mongoid/contextual.rb +50 -0
  27. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  28. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  29. data/lib/mongoid/contextual/atomic.rb +179 -0
  30. data/lib/mongoid/contextual/command.rb +43 -0
  31. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  32. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  33. data/lib/mongoid/contextual/memory.rb +383 -0
  34. data/lib/mongoid/contextual/mongo.rb +543 -0
  35. data/lib/mongoid/copyable.rb +3 -34
  36. data/lib/mongoid/criteria.rb +436 -250
  37. data/lib/mongoid/criterion/inspection.rb +14 -8
  38. data/lib/mongoid/criterion/scoping.rb +114 -44
  39. data/lib/mongoid/dirty.rb +152 -67
  40. data/lib/mongoid/document.rb +69 -50
  41. data/lib/mongoid/errors.rb +22 -1
  42. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  43. data/lib/mongoid/errors/callback.rb +5 -6
  44. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  45. data/lib/mongoid/errors/document_not_found.rb +98 -17
  46. data/lib/mongoid/errors/eager_load.rb +3 -6
  47. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  48. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  49. data/lib/mongoid/errors/invalid_database.rb +3 -3
  50. data/lib/mongoid/errors/invalid_field.rb +54 -8
  51. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  52. data/lib/mongoid/errors/invalid_find.rb +3 -3
  53. data/lib/mongoid/errors/invalid_index.rb +28 -0
  54. data/lib/mongoid/errors/invalid_options.rb +4 -4
  55. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  56. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  57. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  58. data/lib/mongoid/errors/invalid_time.rb +3 -6
  59. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  60. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  61. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  62. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  63. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  64. data/lib/mongoid/errors/no_default_session.rb +23 -0
  65. data/lib/mongoid/errors/no_environment.rb +3 -3
  66. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  67. data/lib/mongoid/errors/no_parent.rb +24 -0
  68. data/lib/mongoid/errors/no_session_config.rb +22 -0
  69. data/lib/mongoid/errors/no_session_database.rb +27 -0
  70. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  71. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  72. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  73. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  74. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  75. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  76. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  77. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  78. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  79. data/lib/mongoid/errors/validations.rb +7 -6
  80. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  81. data/lib/mongoid/extensions.rb +28 -76
  82. data/lib/mongoid/extensions/array.rb +127 -0
  83. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  84. data/lib/mongoid/extensions/boolean.rb +24 -0
  85. data/lib/mongoid/extensions/date.rb +70 -0
  86. data/lib/mongoid/extensions/date_time.rb +68 -0
  87. data/lib/mongoid/extensions/false_class.rb +26 -0
  88. data/lib/mongoid/extensions/float.rb +44 -0
  89. data/lib/mongoid/extensions/hash.rb +91 -0
  90. data/lib/mongoid/extensions/integer.rb +54 -0
  91. data/lib/mongoid/extensions/module.rb +28 -0
  92. data/lib/mongoid/extensions/nil_class.rb +21 -0
  93. data/lib/mongoid/extensions/object.rb +188 -0
  94. data/lib/mongoid/extensions/object_id.rb +53 -0
  95. data/lib/mongoid/extensions/range.rb +55 -0
  96. data/lib/mongoid/extensions/regexp.rb +27 -0
  97. data/lib/mongoid/extensions/set.rb +55 -0
  98. data/lib/mongoid/extensions/string.rb +155 -0
  99. data/lib/mongoid/extensions/symbol.rb +54 -0
  100. data/lib/mongoid/extensions/time.rb +78 -0
  101. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  102. data/lib/mongoid/extensions/true_class.rb +26 -0
  103. data/lib/mongoid/factory.rb +1 -1
  104. data/lib/mongoid/fields.rb +129 -194
  105. data/lib/mongoid/fields/foreign_key.rb +134 -0
  106. data/lib/mongoid/fields/localized.rb +73 -0
  107. data/lib/mongoid/fields/standard.rb +268 -0
  108. data/lib/mongoid/fields/validators.rb +2 -0
  109. data/lib/mongoid/fields/validators/macro.rb +83 -0
  110. data/lib/mongoid/finders.rb +42 -43
  111. data/lib/mongoid/hierarchy.rb +25 -14
  112. data/lib/mongoid/identity_map.rb +31 -19
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/indexes/validators/options.rb +80 -0
  115. data/lib/mongoid/inspection.rb +1 -1
  116. data/lib/mongoid/javascript.rb +1 -1
  117. data/lib/mongoid/json.rb +2 -2
  118. data/lib/mongoid/loggable.rb +69 -0
  119. data/lib/mongoid/matchers.rb +1 -1
  120. data/lib/mongoid/matchers/all.rb +7 -8
  121. data/lib/mongoid/matchers/and.rb +3 -3
  122. data/lib/mongoid/matchers/default.rb +6 -4
  123. data/lib/mongoid/matchers/exists.rb +2 -2
  124. data/lib/mongoid/matchers/gt.rb +2 -2
  125. data/lib/mongoid/matchers/gte.rb +2 -2
  126. data/lib/mongoid/matchers/in.rb +3 -7
  127. data/lib/mongoid/matchers/lt.rb +2 -2
  128. data/lib/mongoid/matchers/lte.rb +2 -2
  129. data/lib/mongoid/matchers/ne.rb +2 -2
  130. data/lib/mongoid/matchers/nin.rb +2 -2
  131. data/lib/mongoid/matchers/or.rb +2 -2
  132. data/lib/mongoid/matchers/size.rb +2 -2
  133. data/lib/mongoid/matchers/strategies.rb +3 -3
  134. data/lib/mongoid/multi_parameter_attributes.rb +8 -10
  135. data/lib/mongoid/nested_attributes.rb +17 -9
  136. data/lib/mongoid/observer.rb +1 -2
  137. data/lib/mongoid/paranoia.rb +13 -18
  138. data/lib/mongoid/persistence.rb +43 -39
  139. data/lib/mongoid/persistence/atomic.rb +2 -2
  140. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  141. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  144. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  145. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  146. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  147. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  148. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  149. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  150. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  151. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  152. data/lib/mongoid/persistence/deletion.rb +2 -2
  153. data/lib/mongoid/persistence/insertion.rb +10 -16
  154. data/lib/mongoid/persistence/modification.rb +5 -9
  155. data/lib/mongoid/persistence/operations.rb +6 -19
  156. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  157. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  158. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  159. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  160. data/lib/mongoid/persistence/operations/update.rb +5 -5
  161. data/lib/mongoid/railtie.rb +26 -11
  162. data/lib/mongoid/railties/database.rake +22 -108
  163. data/lib/mongoid/relations.rb +4 -6
  164. data/lib/mongoid/relations/accessors.rb +119 -19
  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 +3 -3
  175. data/lib/mongoid/relations/builders.rb +19 -16
  176. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  177. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  178. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  179. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  180. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  181. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  182. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  183. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  184. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  185. data/lib/mongoid/relations/cascading.rb +6 -4
  186. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  187. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  188. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  189. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  190. data/lib/mongoid/relations/constraint.rb +4 -3
  191. data/lib/mongoid/relations/conversions.rb +5 -6
  192. data/lib/mongoid/relations/cyclic.rb +7 -7
  193. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  194. data/lib/mongoid/relations/embedded/in.rb +23 -12
  195. data/lib/mongoid/relations/embedded/many.rb +99 -161
  196. data/lib/mongoid/relations/embedded/one.rb +25 -14
  197. data/lib/mongoid/relations/macros.rb +105 -61
  198. data/lib/mongoid/relations/many.rb +93 -14
  199. data/lib/mongoid/relations/metadata.rb +200 -45
  200. data/lib/mongoid/relations/nested_builder.rb +3 -5
  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 +60 -31
  205. data/lib/mongoid/relations/referenced/in.rb +40 -15
  206. data/lib/mongoid/relations/referenced/many.rb +117 -132
  207. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  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/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +8 -27
  215. data/lib/mongoid/sessions.rb +359 -0
  216. data/lib/mongoid/sessions/factory.rb +106 -0
  217. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded.rb +167 -59
  223. data/lib/mongoid/threaded/lifecycle.rb +21 -22
  224. data/lib/mongoid/threaded/sessions.rb +0 -0
  225. data/lib/mongoid/timestamps.rb +1 -1
  226. data/lib/mongoid/timestamps/created.rb +8 -4
  227. data/lib/mongoid/timestamps/timeless.rb +6 -4
  228. data/lib/mongoid/timestamps/updated.rb +3 -3
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations.rb +27 -19
  231. data/lib/mongoid/validations/associated.rb +2 -2
  232. data/lib/mongoid/validations/format.rb +2 -2
  233. data/lib/mongoid/validations/presence.rb +31 -5
  234. data/lib/mongoid/validations/uniqueness.rb +9 -12
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  238. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  239. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  240. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  241. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  242. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  243. data/lib/rails/generators/mongoid_generator.rb +5 -5
  244. data/lib/rails/mongoid.rb +69 -25
  245. metadata +110 -137
  246. checksums.yaml +0 -7
  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.rb +0 -120
  269. data/lib/mongoid/collections/master.rb +0 -45
  270. data/lib/mongoid/collections/operations.rb +0 -44
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts.rb +0 -25
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  276. data/lib/mongoid/contexts/mongo.rb +0 -487
  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 -110
  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 -77
  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.rb +0 -89
  343. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  344. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  345. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  346. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  347. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  348. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  349. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -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
@@ -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)
200
- unbind_one(doc)
140
+ base.add_atomic_pull(doc)
201
141
  end
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,55 +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 unless _assigning?
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.delayed_atomic_sets[name].try(:clear)
331
- base._children.each do |child|
332
- child.delayed_atomic_sets.clear
333
- end
334
- base.instance_variable_set(:@_children, nil)
335
- base.delayed_atomic_sets[name] = proxy.as_document
336
- end
337
- end
338
- end
339
- end
266
+ def substitute(docs)
267
+ batch_replace(docs)
268
+ self
340
269
  end
341
270
 
342
271
  # Return the relation with all previous scoping removed. This is the
@@ -349,9 +278,10 @@ module Mongoid # :nodoc:
349
278
  #
350
279
  # @since 2.4.0
351
280
  def unscoped
352
- klass.criteria(true, false).tap do |criterion|
353
- criterion.documents = _unscoped
354
- end
281
+ criterion = klass.unscoped
282
+ criterion.embedded = true
283
+ criterion.documents = _unscoped
284
+ criterion
355
285
  end
356
286
 
357
287
  private
@@ -394,9 +324,10 @@ module Mongoid # :nodoc:
394
324
  #
395
325
  # @return [ Criteria ] A new criteria.
396
326
  def criteria
397
- klass.criteria(true).tap do |criterion|
398
- criterion.documents = target
399
- end
327
+ criterion = klass.scoped
328
+ criterion.embedded = true
329
+ criterion.documents = target
330
+ criterion
400
331
  end
401
332
 
402
333
  # Deletes one document from the target and unscoped.
@@ -485,32 +416,27 @@ module Mongoid # :nodoc:
485
416
  # @since 2.4.0
486
417
  def scope(docs)
487
418
  return docs unless metadata.order || metadata.klass.default_scoping?
488
- metadata.klass.criteria(true).order_by(metadata.order).tap do |crit|
489
- crit.documents = docs
490
- end.entries
419
+ crit = metadata.klass.order_by(metadata.order)
420
+ crit.embedded = true
421
+ crit.documents = docs
422
+ crit.entries
491
423
  end
492
424
 
493
425
  # Remove all documents from the relation, either with a delete or a
494
426
  # destroy depending on what this was called through.
495
427
  #
496
428
  # @example Destroy documents from the relation.
497
- # relation.remove_all(:conditions => { :num => 1 }, true)
429
+ # relation.remove_all({ :num => 1 }, true)
498
430
  #
499
431
  # @param [ Hash ] conditions Conditions to filter by.
500
432
  # @param [ true, false ] destroy If true then destroy, else delete.
501
433
  #
502
434
  # @return [ Integer ] The number of documents removed.
503
435
  def remove_all(conditions = {}, method = :delete)
504
- criteria = find(:all, conditions || {})
505
- criteria.size.tap do
506
- criteria.each do |doc|
507
- target.delete_one(doc)
508
- _unscoped.delete_one(doc)
509
- doc.send(method, :suppress => true) unless _assigning?
510
- unbind_one(doc)
511
- end
512
- reindex
513
- end
436
+ criteria = where(conditions || {})
437
+ removed = criteria.size
438
+ batch_remove(criteria, method)
439
+ removed
514
440
  end
515
441
 
516
442
  # Get the internal unscoped documents.
@@ -572,6 +498,18 @@ module Mongoid # :nodoc:
572
498
  true
573
499
  end
574
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
+
575
513
  # Returns the macro for this relation. Used mostly as a helper in
576
514
  # reflection.
577
515
  #
@@ -648,7 +586,7 @@ module Mongoid # :nodoc:
648
586
  #
649
587
  # @since 2.1.0
650
588
  def valid_options
651
- [ :as, :cascade_callbacks, :cyclic, :order, :versioned ]
589
+ [ :as, :cascade_callbacks, :cyclic, :order, :versioned, :store_as ]
652
590
  end
653
591
 
654
592
  # Get the default validation setting for the relation. Determines if