mongoid 2.4.10 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. data/CHANGELOG.md +949 -10
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +3 -17
  5. data/lib/config/locales/en.yml +455 -51
  6. data/lib/mongoid/atomic/modifiers.rb +2 -2
  7. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  8. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/root.rb +4 -5
  11. data/lib/mongoid/atomic.rb +70 -16
  12. data/lib/mongoid/attributes/processing.rb +14 -10
  13. data/lib/mongoid/attributes/readonly.rb +56 -0
  14. data/lib/mongoid/attributes.rb +95 -32
  15. data/lib/mongoid/callbacks.rb +106 -43
  16. data/lib/mongoid/components.rb +12 -23
  17. data/lib/mongoid/config/environment.rb +7 -4
  18. data/lib/mongoid/config/inflections.rb +6 -0
  19. data/lib/mongoid/config/options.rb +1 -1
  20. data/lib/mongoid/config/validators/option.rb +25 -0
  21. data/lib/mongoid/config/validators/session.rb +140 -0
  22. data/lib/mongoid/config/validators.rb +3 -0
  23. data/lib/mongoid/config.rb +104 -225
  24. data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
  25. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  26. data/lib/mongoid/contextual/atomic.rb +179 -0
  27. data/lib/mongoid/contextual/command.rb +43 -0
  28. data/lib/mongoid/contextual/find_and_modify.rb +68 -0
  29. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  30. data/lib/mongoid/contextual/memory.rb +406 -0
  31. data/lib/mongoid/contextual/mongo.rb +662 -0
  32. data/lib/mongoid/contextual.rb +50 -0
  33. data/lib/mongoid/copyable.rb +7 -25
  34. data/lib/mongoid/criteria.rb +515 -245
  35. data/lib/mongoid/criterion/inspection.rb +14 -8
  36. data/lib/mongoid/criterion/scoping.rb +114 -44
  37. data/lib/mongoid/dirty.rb +152 -67
  38. data/lib/mongoid/document.rb +71 -52
  39. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  40. data/lib/mongoid/errors/callback.rb +5 -6
  41. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  42. data/lib/mongoid/errors/document_not_found.rb +98 -17
  43. data/lib/mongoid/errors/eager_load.rb +3 -6
  44. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  45. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  46. data/lib/mongoid/errors/invalid_database.rb +3 -3
  47. data/lib/mongoid/errors/invalid_field.rb +54 -8
  48. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  49. data/lib/mongoid/errors/invalid_find.rb +3 -3
  50. data/lib/mongoid/errors/invalid_index.rb +28 -0
  51. data/lib/mongoid/errors/invalid_options.rb +4 -4
  52. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  53. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  54. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  55. data/lib/mongoid/errors/invalid_time.rb +3 -6
  56. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  57. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  58. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  59. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  60. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  61. data/lib/mongoid/errors/no_default_session.rb +23 -0
  62. data/lib/mongoid/errors/no_environment.rb +3 -3
  63. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  64. data/lib/mongoid/errors/no_metadata.rb +21 -0
  65. data/lib/mongoid/errors/no_parent.rb +24 -0
  66. data/lib/mongoid/errors/no_session_config.rb +22 -0
  67. data/lib/mongoid/errors/no_session_database.rb +27 -0
  68. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  69. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  70. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  71. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  72. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  73. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  74. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  75. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  76. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  77. data/lib/mongoid/errors/validations.rb +7 -6
  78. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  79. data/lib/mongoid/errors.rb +23 -1
  80. data/lib/mongoid/evolvable.rb +19 -0
  81. data/lib/mongoid/extensions/array.rb +164 -0
  82. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  83. data/lib/mongoid/extensions/boolean.rb +24 -0
  84. data/lib/mongoid/extensions/date.rb +70 -0
  85. data/lib/mongoid/extensions/date_time.rb +73 -0
  86. data/lib/mongoid/extensions/false_class.rb +38 -0
  87. data/lib/mongoid/extensions/float.rb +56 -0
  88. data/lib/mongoid/extensions/hash.rb +123 -0
  89. data/lib/mongoid/extensions/integer.rb +66 -0
  90. data/lib/mongoid/extensions/module.rb +28 -0
  91. data/lib/mongoid/extensions/nil_class.rb +21 -0
  92. data/lib/mongoid/extensions/object.rb +238 -0
  93. data/lib/mongoid/extensions/object_id.rb +54 -0
  94. data/lib/mongoid/extensions/range.rb +79 -0
  95. data/lib/mongoid/extensions/regexp.rb +27 -0
  96. data/lib/mongoid/extensions/set.rb +55 -0
  97. data/lib/mongoid/extensions/string.rb +181 -0
  98. data/lib/mongoid/extensions/symbol.rb +54 -0
  99. data/lib/mongoid/extensions/time.rb +78 -0
  100. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  101. data/lib/mongoid/extensions/true_class.rb +38 -0
  102. data/lib/mongoid/extensions.rb +28 -76
  103. data/lib/mongoid/factory.rb +1 -1
  104. data/lib/mongoid/fields/foreign_key.rb +150 -0
  105. data/lib/mongoid/fields/localized.rb +73 -0
  106. data/lib/mongoid/fields/standard.rb +268 -0
  107. data/lib/mongoid/fields/validators/macro.rb +83 -0
  108. data/lib/mongoid/fields/validators.rb +2 -0
  109. data/lib/mongoid/fields.rb +142 -208
  110. data/lib/mongoid/finders.rb +45 -50
  111. data/lib/mongoid/hierarchy.rb +44 -15
  112. data/lib/mongoid/identity_map.rb +49 -21
  113. data/lib/mongoid/indexes/validators/options.rb +80 -0
  114. data/lib/mongoid/indexes.rb +66 -15
  115. data/lib/mongoid/inspection.rb +1 -1
  116. data/lib/mongoid/json.rb +2 -2
  117. data/lib/mongoid/loggable.rb +69 -0
  118. data/lib/mongoid/matchers/all.rb +7 -8
  119. data/lib/mongoid/matchers/and.rb +3 -3
  120. data/lib/mongoid/matchers/default.rb +6 -4
  121. data/lib/mongoid/matchers/exists.rb +2 -2
  122. data/lib/mongoid/matchers/gt.rb +2 -2
  123. data/lib/mongoid/matchers/gte.rb +2 -2
  124. data/lib/mongoid/matchers/in.rb +3 -7
  125. data/lib/mongoid/matchers/lt.rb +2 -2
  126. data/lib/mongoid/matchers/lte.rb +2 -2
  127. data/lib/mongoid/matchers/ne.rb +2 -2
  128. data/lib/mongoid/matchers/nin.rb +2 -2
  129. data/lib/mongoid/matchers/or.rb +2 -2
  130. data/lib/mongoid/matchers/size.rb +2 -2
  131. data/lib/mongoid/matchers/strategies.rb +3 -3
  132. data/lib/mongoid/matchers.rb +1 -1
  133. data/lib/mongoid/multi_parameter_attributes.rb +9 -11
  134. data/lib/mongoid/nested_attributes.rb +17 -9
  135. data/lib/mongoid/observer.rb +1 -2
  136. data/lib/mongoid/paranoia.rb +10 -44
  137. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  138. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  139. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  140. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  141. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  144. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  145. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  146. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  147. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  148. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  149. data/lib/mongoid/persistence/atomic.rb +2 -2
  150. data/lib/mongoid/persistence/deletion.rb +2 -2
  151. data/lib/mongoid/persistence/insertion.rb +10 -16
  152. data/lib/mongoid/persistence/modification.rb +5 -9
  153. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  154. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  155. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  156. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  157. data/lib/mongoid/persistence/operations/update.rb +5 -5
  158. data/lib/mongoid/persistence/operations/upsert.rb +28 -0
  159. data/lib/mongoid/persistence/operations.rb +22 -19
  160. data/lib/mongoid/persistence/upsertion.rb +30 -0
  161. data/lib/mongoid/persistence.rb +94 -39
  162. data/lib/mongoid/railtie.rb +26 -11
  163. data/lib/mongoid/railties/database.rake +22 -108
  164. data/lib/mongoid/relations/accessors.rb +120 -20
  165. data/lib/mongoid/relations/auto_save.rb +59 -5
  166. data/lib/mongoid/relations/binding.rb +211 -2
  167. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  168. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  169. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  170. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  171. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  172. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  173. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  174. data/lib/mongoid/relations/builder.rb +4 -4
  175. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  176. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  177. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  178. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  179. data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -5
  180. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  181. data/lib/mongoid/relations/builders/referenced/many.rb +6 -6
  182. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  183. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  184. data/lib/mongoid/relations/builders.rb +19 -16
  185. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  186. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  187. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  188. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  189. data/lib/mongoid/relations/cascading.rb +10 -7
  190. data/lib/mongoid/relations/constraint.rb +4 -3
  191. data/lib/mongoid/relations/conversions.rb +6 -7
  192. data/lib/mongoid/relations/cyclic.rb +7 -7
  193. data/lib/mongoid/relations/embedded/batchable.rb +347 -0
  194. data/lib/mongoid/relations/embedded/in.rb +23 -12
  195. data/lib/mongoid/relations/embedded/many.rb +100 -161
  196. data/lib/mongoid/relations/embedded/one.rb +25 -14
  197. data/lib/mongoid/relations/macros.rb +105 -60
  198. data/lib/mongoid/relations/many.rb +93 -14
  199. data/lib/mongoid/relations/metadata.rb +277 -47
  200. data/lib/mongoid/relations/nested_builder.rb +4 -6
  201. data/lib/mongoid/relations/one.rb +2 -2
  202. data/lib/mongoid/relations/options.rb +2 -2
  203. data/lib/mongoid/relations/polymorphic.rb +9 -9
  204. data/lib/mongoid/relations/proxy.rb +62 -31
  205. data/lib/mongoid/relations/referenced/in.rb +40 -15
  206. data/lib/mongoid/relations/referenced/many.rb +162 -130
  207. data/lib/mongoid/relations/referenced/many_to_many.rb +104 -48
  208. data/lib/mongoid/relations/referenced/one.rb +34 -13
  209. data/lib/mongoid/relations/reflections.rb +3 -3
  210. data/lib/mongoid/relations/synchronization.rb +19 -23
  211. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  212. data/lib/mongoid/relations/touchable.rb +32 -0
  213. data/lib/mongoid/relations.rb +22 -6
  214. data/lib/mongoid/reloading.rb +12 -14
  215. data/lib/mongoid/scoping.rb +312 -0
  216. data/lib/mongoid/serialization.rb +94 -42
  217. data/lib/mongoid/sessions/factory.rb +108 -0
  218. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  219. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  220. data/lib/mongoid/sessions/validators.rb +2 -0
  221. data/lib/mongoid/sessions.rb +383 -0
  222. data/lib/mongoid/sharding.rb +6 -6
  223. data/lib/mongoid/state.rb +6 -7
  224. data/lib/mongoid/threaded/lifecycle.rb +21 -21
  225. data/lib/mongoid/threaded/sessions.rb +0 -0
  226. data/lib/mongoid/threaded.rb +219 -59
  227. data/lib/mongoid/timestamps/created.rb +8 -4
  228. data/lib/mongoid/timestamps/timeless.rb +6 -4
  229. data/lib/mongoid/timestamps/updated.rb +4 -3
  230. data/lib/mongoid/timestamps.rb +1 -1
  231. data/lib/mongoid/unit_of_work.rb +61 -0
  232. data/lib/mongoid/validations/associated.rb +2 -2
  233. data/lib/mongoid/validations/format.rb +2 -2
  234. data/lib/mongoid/validations/presence.rb +34 -4
  235. data/lib/mongoid/validations/uniqueness.rb +11 -12
  236. data/lib/mongoid/validations.rb +28 -20
  237. data/lib/mongoid/version.rb +2 -2
  238. data/lib/mongoid/versioning.rb +25 -26
  239. data/lib/mongoid.rb +37 -37
  240. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  241. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  242. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +65 -17
  243. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  244. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  245. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  246. data/lib/rails/generators/mongoid_generator.rb +5 -5
  247. data/lib/rails/mongoid.rb +73 -26
  248. metadata +103 -148
  249. data/lib/config/locales/bg.yml +0 -61
  250. data/lib/config/locales/de.yml +0 -61
  251. data/lib/config/locales/en-GB.yml +0 -64
  252. data/lib/config/locales/es.yml +0 -59
  253. data/lib/config/locales/fr.yml +0 -62
  254. data/lib/config/locales/hi.yml +0 -53
  255. data/lib/config/locales/hu.yml +0 -64
  256. data/lib/config/locales/id.yml +0 -62
  257. data/lib/config/locales/it.yml +0 -59
  258. data/lib/config/locales/ja.yml +0 -57
  259. data/lib/config/locales/kr.yml +0 -54
  260. data/lib/config/locales/nl.yml +0 -61
  261. data/lib/config/locales/pl.yml +0 -59
  262. data/lib/config/locales/pt-BR.yml +0 -60
  263. data/lib/config/locales/pt.yml +0 -60
  264. data/lib/config/locales/ro.yml +0 -66
  265. data/lib/config/locales/ru.yml +0 -61
  266. data/lib/config/locales/sv.yml +0 -60
  267. data/lib/config/locales/vi.yml +0 -62
  268. data/lib/config/locales/zh-CN.yml +0 -53
  269. data/lib/mongoid/collection.rb +0 -157
  270. data/lib/mongoid/collections/master.rb +0 -45
  271. data/lib/mongoid/collections/operations.rb +0 -44
  272. data/lib/mongoid/collections/retry.rb +0 -59
  273. data/lib/mongoid/collections.rb +0 -120
  274. data/lib/mongoid/config/database.rb +0 -181
  275. data/lib/mongoid/config/replset_database.rb +0 -80
  276. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  277. data/lib/mongoid/contexts/enumerable.rb +0 -313
  278. data/lib/mongoid/contexts/mongo.rb +0 -487
  279. data/lib/mongoid/contexts.rb +0 -25
  280. data/lib/mongoid/criterion/builder.rb +0 -34
  281. data/lib/mongoid/criterion/complex.rb +0 -84
  282. data/lib/mongoid/criterion/creational.rb +0 -34
  283. data/lib/mongoid/criterion/exclusion.rb +0 -108
  284. data/lib/mongoid/criterion/inclusion.rb +0 -290
  285. data/lib/mongoid/criterion/optional.rb +0 -259
  286. data/lib/mongoid/criterion/selector.rb +0 -177
  287. data/lib/mongoid/cursor.rb +0 -88
  288. data/lib/mongoid/default_scope.rb +0 -36
  289. data/lib/mongoid/errors/invalid_type.rb +0 -25
  290. data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
  291. data/lib/mongoid/extensions/array/deletion.rb +0 -29
  292. data/lib/mongoid/extensions/false_class/equality.rb +0 -26
  293. data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
  294. data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
  295. data/lib/mongoid/extensions/hash/scoping.rb +0 -25
  296. data/lib/mongoid/extensions/integer/checks.rb +0 -23
  297. data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
  298. data/lib/mongoid/extensions/object/checks.rb +0 -29
  299. data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
  300. data/lib/mongoid/extensions/object/reflections.rb +0 -48
  301. data/lib/mongoid/extensions/object/substitutable.rb +0 -15
  302. data/lib/mongoid/extensions/object/yoda.rb +0 -44
  303. data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
  304. data/lib/mongoid/extensions/proc/scoping.rb +0 -25
  305. data/lib/mongoid/extensions/string/checks.rb +0 -36
  306. data/lib/mongoid/extensions/string/conversions.rb +0 -22
  307. data/lib/mongoid/extensions/string/inflections.rb +0 -118
  308. data/lib/mongoid/extensions/symbol/checks.rb +0 -23
  309. data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
  310. data/lib/mongoid/extensions/true_class/equality.rb +0 -26
  311. data/lib/mongoid/extras.rb +0 -31
  312. data/lib/mongoid/fields/internal/array.rb +0 -76
  313. data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
  314. data/lib/mongoid/fields/internal/bignum.rb +0 -10
  315. data/lib/mongoid/fields/internal/binary.rb +0 -11
  316. data/lib/mongoid/fields/internal/boolean.rb +0 -58
  317. data/lib/mongoid/fields/internal/date.rb +0 -51
  318. data/lib/mongoid/fields/internal/date_time.rb +0 -28
  319. data/lib/mongoid/fields/internal/false_class.rb +0 -10
  320. data/lib/mongoid/fields/internal/fixnum.rb +0 -10
  321. data/lib/mongoid/fields/internal/float.rb +0 -47
  322. data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
  323. data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
  324. data/lib/mongoid/fields/internal/hash.rb +0 -11
  325. data/lib/mongoid/fields/internal/integer.rb +0 -59
  326. data/lib/mongoid/fields/internal/localized.rb +0 -62
  327. data/lib/mongoid/fields/internal/nil_class.rb +0 -53
  328. data/lib/mongoid/fields/internal/object.rb +0 -11
  329. data/lib/mongoid/fields/internal/object_id.rb +0 -46
  330. data/lib/mongoid/fields/internal/range.rb +0 -61
  331. data/lib/mongoid/fields/internal/set.rb +0 -57
  332. data/lib/mongoid/fields/internal/string.rb +0 -42
  333. data/lib/mongoid/fields/internal/symbol.rb +0 -43
  334. data/lib/mongoid/fields/internal/time.rb +0 -23
  335. data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
  336. data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
  337. data/lib/mongoid/fields/internal/true_class.rb +0 -10
  338. data/lib/mongoid/fields/mappings.rb +0 -42
  339. data/lib/mongoid/fields/serializable.rb +0 -270
  340. data/lib/mongoid/identity.rb +0 -92
  341. data/lib/mongoid/javascript/functions.yml +0 -63
  342. data/lib/mongoid/javascript.rb +0 -20
  343. data/lib/mongoid/keys.rb +0 -144
  344. data/lib/mongoid/logger.rb +0 -45
  345. data/lib/mongoid/multi_database.rb +0 -36
  346. data/lib/mongoid/named_scope.rb +0 -166
  347. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  348. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  349. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  350. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  351. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  352. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  353. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  354. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  355. data/lib/mongoid/safety.rb +0 -105
  356. data/lib/mongoid/scope.rb +0 -31
@@ -1,22 +1,22 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Relations #:nodoc:
4
- module Targets #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Targets
5
5
 
6
6
  # This class is the wrapper for all relational associations that have a
7
- # target that can be a criteria or array of loaded documents. This
7
+ # target that can be a criteria or array of _loaded documents. This
8
8
  # handles both cases or a combination of the two.
9
9
  class Enumerable
10
10
  include ::Enumerable
11
11
 
12
12
  # The three main instance variables are collections of documents.
13
13
  #
14
- # @attribute [rw] added Documents that have been appended.
15
- # @attribute [rw] loaded Persisted documents that have been loaded.
16
- # @attribute [rw] unloaded A criteria representing persisted docs.
17
- attr_accessor :added, :loaded, :unloaded
14
+ # @attribute [rw] _added Documents that have been appended.
15
+ # @attribute [rw] _loaded Persisted documents that have been _loaded.
16
+ # @attribute [rw] _unloaded A criteria representing persisted docs.
17
+ attr_accessor :_added, :_loaded, :_unloaded
18
18
 
19
- delegate :===, :is_a?, :kind_of?, :to => :added
19
+ delegate :===, :is_a?, :kind_of?, to: []
20
20
 
21
21
  # Check if the enumerable is equal to the other object.
22
22
  #
@@ -44,7 +44,8 @@ module Mongoid #:nodoc:
44
44
  #
45
45
  # @since 2.1.0
46
46
  def <<(document)
47
- added.push(document)
47
+ _added[document.id] = document
48
+ self
48
49
  end
49
50
  alias :push :<<
50
51
 
@@ -59,14 +60,14 @@ module Mongoid #:nodoc:
59
60
  # doc.unbind
60
61
  # end
61
62
  #
62
- # @return [ Array<Document> ] The cleared out added docs.
63
+ # @return [ Array<Document> ] The cleared out _added docs.
63
64
  #
64
65
  # @since 2.1.0
65
66
  def clear
66
67
  if block_given?
67
68
  in_memory { |doc| yield(doc) }
68
69
  end
69
- loaded.clear and added.clear
70
+ _loaded.clear and _added.clear
70
71
  end
71
72
 
72
73
  # Clones each document in the enumerable.
@@ -94,15 +95,15 @@ module Mongoid #:nodoc:
94
95
  #
95
96
  # @since 2.1.0
96
97
  def delete(document)
97
- (loaded.delete(document) || added.delete(document)).tap do |doc|
98
- unless doc
99
- if unloaded && unloaded.where(:_id => document.id).exists?
100
- yield(document) if block_given?
101
- return document
102
- end
98
+ doc = (_loaded.delete(document.id) || _added.delete(document.id))
99
+ unless doc
100
+ if _unloaded && _unloaded.where(_id: document.id).exists?
101
+ yield(document) if block_given?
102
+ return document
103
103
  end
104
- yield(doc) if block_given?
105
104
  end
105
+ yield(doc) if block_given?
106
+ doc
106
107
  end
107
108
 
108
109
  # Deletes every document in the enumerable for where the block returns
@@ -120,50 +121,52 @@ module Mongoid #:nodoc:
120
121
  # @since 2.1.0
121
122
  def delete_if(&block)
122
123
  load_all!
123
- tap do
124
- loaded.delete_if(&block)
125
- added.delete_if(&block)
124
+ deleted = in_memory.select(&block)
125
+ deleted.each do |doc|
126
+ _loaded.delete(doc.id)
127
+ _added.delete(doc.id)
126
128
  end
129
+ self
127
130
  end
128
131
 
129
132
  # Iterating over this enumerable has to handle a few different
130
133
  # scenarios.
131
134
  #
132
- # If the enumerable has its criteria loaded into memory then it yields
133
- # to all the loaded docs and all the added docs.
135
+ # If the enumerable has its criteria _loaded into memory then it yields
136
+ # to all the _loaded docs and all the _added docs.
134
137
  #
135
- # If the enumerable has not loaded the criteria then it iterates over
138
+ # If the enumerable has not _loaded the criteria then it iterates over
136
139
  # the cursor while loading the documents and then iterates over the
137
- # added docs.
140
+ # _added docs.
138
141
  #
139
142
  # @example Iterate over the enumerable.
140
143
  # enumerable.each do |doc|
141
144
  # puts doc
142
145
  # end
143
146
  #
144
- # @return [ true ] That the enumerable is now loaded.
147
+ # @return [ true ] That the enumerable is now _loaded.
145
148
  #
146
149
  # @since 2.1.0
147
150
  def each
148
- if loaded?
149
- loaded.each do |doc|
151
+ if _loaded?
152
+ _loaded.each_pair do |id, doc|
150
153
  yield(doc)
151
154
  end
152
155
  else
153
- unloaded.each do |doc|
154
- document = added.delete_one(doc) || loaded.delete_one(doc) || doc
156
+ _unloaded.each do |doc|
157
+ document = _added.delete(doc.id) || _loaded.delete(doc.id) || doc
155
158
  yield(document)
156
- loaded.push(document)
159
+ _loaded[document.id] = document
157
160
  end
158
161
  end
159
- added.each do |doc|
162
+ _added.each_pair do |id, doc|
160
163
  yield(doc)
161
164
  end
162
165
  @executed = true
163
166
  end
164
167
 
165
168
  # Is the enumerable empty? Will determine if the count is zero based on
166
- # whether or not it is loaded.
169
+ # whether or not it is _loaded.
167
170
  #
168
171
  # @example Is the enumerable empty?
169
172
  # enumerable.empty?
@@ -172,10 +175,10 @@ module Mongoid #:nodoc:
172
175
  #
173
176
  # @since 2.1.0
174
177
  def empty?
175
- if loaded?
178
+ if _loaded?
176
179
  in_memory.count == 0
177
180
  else
178
- unloaded.count + added.count == 0
181
+ _unloaded.count + _added.count == 0
179
182
  end
180
183
  end
181
184
 
@@ -189,7 +192,7 @@ module Mongoid #:nodoc:
189
192
  #
190
193
  # @since 2.1.0
191
194
  def first
192
- added.first || (loaded? ? loaded.first : unloaded.first)
195
+ matching_document(:first)
193
196
  end
194
197
 
195
198
  # Initialize the new enumerable either with a criteria or an array.
@@ -205,12 +208,31 @@ module Mongoid #:nodoc:
205
208
  # @since 2.1.0
206
209
  def initialize(target)
207
210
  if target.is_a?(Criteria)
208
- @added, @loaded, @unloaded = [], [], target
211
+ @_added, @executed, @_loaded, @_unloaded = {}, false, {}, target
209
212
  else
210
- @added, @executed, @loaded = [], true, target
213
+ @_added, @executed = {}, true
214
+ @_loaded = target.inject({}) do |_target, doc|
215
+ _target[doc.id] = doc
216
+ _target
217
+ end
211
218
  end
212
219
  end
213
220
 
221
+ # Does the target include the provided document?
222
+ #
223
+ # @example Does the target include the document?
224
+ # enumerable.include?(document)
225
+ #
226
+ # @param [ Document ] doc The document to check.
227
+ #
228
+ # @return [ true, false ] If the document is in the target.
229
+ #
230
+ # @since 3.0.0
231
+ def include?(doc)
232
+ return super unless _unloaded
233
+ _unloaded.where(_id: doc.id).exists? || _added.has_key?(doc.id)
234
+ end
235
+
214
236
  # Inspection will just inspect the entries for nice array-style
215
237
  # printing.
216
238
  #
@@ -224,8 +246,8 @@ module Mongoid #:nodoc:
224
246
  entries.inspect
225
247
  end
226
248
 
227
- # Return all the documents in the enumerable that have been loaded or
228
- # added.
249
+ # Return all the documents in the enumerable that have been _loaded or
250
+ # _added.
229
251
  #
230
252
  # @note When passed a block it yields to each document.
231
253
  #
@@ -236,9 +258,9 @@ module Mongoid #:nodoc:
236
258
  #
237
259
  # @since 2.1.0
238
260
  def in_memory
239
- (loaded + added).tap do |docs|
240
- docs.each { |doc| yield(doc) } if block_given?
241
- end
261
+ docs = (_loaded.values + _added.values)
262
+ docs.each { |doc| yield(doc) } if block_given?
263
+ docs
242
264
  end
243
265
 
244
266
  # Get the last document in the enumerable. Will check the new
@@ -251,7 +273,7 @@ module Mongoid #:nodoc:
251
273
  #
252
274
  # @since 2.1.0
253
275
  def last
254
- added.last || (loaded? ? loaded.last : unloaded.last)
276
+ matching_document(:last)
255
277
  end
256
278
 
257
279
  # Loads all the documents in the enumerable from the database.
@@ -259,21 +281,21 @@ module Mongoid #:nodoc:
259
281
  # @example Load all the documents.
260
282
  # enumerable.load_all!
261
283
  #
262
- # @return [ true ] That the enumerable is loaded.
284
+ # @return [ true ] That the enumerable is _loaded.
263
285
  #
264
286
  # @since 2.1.0
265
287
  alias :load_all! :entries
266
288
 
267
- # Has the enumerable been loaded? This will be true if the criteria has
289
+ # Has the enumerable been _loaded? This will be true if the criteria has
268
290
  # been executed or we manually load the entire thing.
269
291
  #
270
- # @example Is the enumerable loaded?
271
- # enumerable.loaded?
292
+ # @example Is the enumerable _loaded?
293
+ # enumerable._loaded?
272
294
  #
273
- # @return [ true, false ] If the enumerable has been loaded.
295
+ # @return [ true, false ] If the enumerable has been _loaded.
274
296
  #
275
297
  # @since 2.1.0
276
- def loaded?
298
+ def _loaded?
277
299
  !!@executed
278
300
  end
279
301
 
@@ -286,7 +308,7 @@ module Mongoid #:nodoc:
286
308
  #
287
309
  # @since 2.1.0
288
310
  def reset
289
- loaded.clear and added.clear
311
+ _loaded.clear and _added.clear
290
312
  @executed = false
291
313
  end
292
314
 
@@ -316,11 +338,11 @@ module Mongoid #:nodoc:
316
338
  #
317
339
  # @since 2.1.0
318
340
  def size
319
- count = (unloaded ? unloaded.count : loaded.count)
341
+ count = (_unloaded ? _unloaded.count : _loaded.count)
320
342
  if count.zero?
321
- count + added.count
343
+ count + _added.count
322
344
  else
323
- count + added.count{ |d| d.new_record? }
345
+ count + _added.values.count{ |d| d.new_record? }
324
346
  end
325
347
  end
326
348
  alias :length :size
@@ -332,7 +354,7 @@ module Mongoid #:nodoc:
332
354
  #
333
355
  # @param [ Hash ] options Optional parameters.
334
356
  #
335
- # @return [ String ] The entries all loaded as a string.
357
+ # @return [ String ] The entries all _loaded as a string.
336
358
  #
337
359
  # @since 2.2.0
338
360
  def to_json(options = {})
@@ -346,7 +368,7 @@ module Mongoid #:nodoc:
346
368
  #
347
369
  # @param [ Hash ] options Optional parameters.
348
370
  #
349
- # @return [ Hash ] The entries all loaded as a hash.
371
+ # @return [ Hash ] The entries all _loaded as a hash.
350
372
  #
351
373
  # @since 2.2.0
352
374
  def as_json(options = {})
@@ -372,6 +394,13 @@ module Mongoid #:nodoc:
372
394
  def method_missing(name, *args, &block)
373
395
  entries.send(name, *args, &block)
374
396
  end
397
+
398
+ def matching_document(location)
399
+ _loaded.try(:values).try(location) ||
400
+ _added[_unloaded.try(location).try(:id)] ||
401
+ _unloaded.try(location) ||
402
+ _added.values.try(location)
403
+ end
375
404
  end
376
405
  end
377
406
  end
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Relations
4
+ module Touchable
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ class_attribute :touchables
9
+ self.touchables = []
10
+ end
11
+
12
+ module ClassMethods
13
+
14
+ # Add the metadata to the touchable relations if the touch option was
15
+ # provided.
16
+ #
17
+ # @example Add the touchable.
18
+ # Model.touchable(meta)
19
+ #
20
+ # @param [ Metadata ] metadata The relation metadata.
21
+ #
22
+ # @return [ Class ] The model class.
23
+ #
24
+ # @since 3.0.0
25
+ def touchable(metadata)
26
+ self.touchables.push(metadata.name) if metadata.touchable?
27
+ self
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -13,21 +13,20 @@ require "mongoid/relations/one"
13
13
  require "mongoid/relations/options"
14
14
  require "mongoid/relations/polymorphic"
15
15
  require "mongoid/relations/targets/enumerable"
16
- require "mongoid/relations/embedded/atomic"
17
16
  require "mongoid/relations/embedded/in"
18
17
  require "mongoid/relations/embedded/many"
19
18
  require "mongoid/relations/embedded/one"
20
- require "mongoid/relations/referenced/batch"
21
19
  require "mongoid/relations/referenced/in"
22
20
  require "mongoid/relations/referenced/many"
23
21
  require "mongoid/relations/referenced/many_to_many"
24
22
  require "mongoid/relations/referenced/one"
25
23
  require "mongoid/relations/reflections"
26
24
  require "mongoid/relations/synchronization"
25
+ require "mongoid/relations/touchable"
27
26
  require "mongoid/relations/metadata"
28
27
  require "mongoid/relations/macros"
29
28
 
30
- module Mongoid # :nodoc:
29
+ module Mongoid
31
30
 
32
31
  # All classes and modules under the relations namespace handle the
33
32
  # functionality that has to do with embedded and referenced (relational)
@@ -43,6 +42,7 @@ module Mongoid # :nodoc:
43
42
  include Polymorphic
44
43
  include Reflections
45
44
  include Synchronization
45
+ include Touchable
46
46
 
47
47
  attr_accessor :metadata
48
48
 
@@ -83,6 +83,22 @@ module Mongoid # :nodoc:
83
83
  metadata && metadata.macro == :embeds_one
84
84
  end
85
85
 
86
+ # Get the metadata name for this document. If no metadata was defined
87
+ # will raise an error.
88
+ #
89
+ # @example Get the metadata name.
90
+ # document.metadata_name
91
+ #
92
+ # @raise [ Errors::NoMetadata ] If no metadata is present.
93
+ #
94
+ # @return [ Symbol ] The metadata name.
95
+ #
96
+ # @since 3.0.0
97
+ def metadata_name
98
+ raise Errors::NoMetadata.new(self.class.name) unless metadata
99
+ metadata.name
100
+ end
101
+
86
102
  # Determine if the document is part of an references_many relation.
87
103
  #
88
104
  # @example Is the document in a references many?
@@ -92,7 +108,7 @@ module Mongoid # :nodoc:
92
108
  #
93
109
  # @since 2.0.0.rc.1
94
110
  def referenced_many?
95
- metadata && metadata.macro == :references_many
111
+ metadata && metadata.macro == :has_many
96
112
  end
97
113
 
98
114
  # Determine if the document is part of an references_one relation.
@@ -104,7 +120,7 @@ module Mongoid # :nodoc:
104
120
  #
105
121
  # @since 2.0.0.rc.1
106
122
  def referenced_one?
107
- metadata && metadata.macro == :references_one
123
+ metadata && metadata.macro == :has_one
108
124
  end
109
125
 
110
126
  # Convenience method for iterating through the loaded relations and
@@ -126,7 +142,7 @@ module Mongoid # :nodoc:
126
142
  end
127
143
  end
128
144
 
129
- module ClassMethods #:nodoc:
145
+ module ClassMethods
130
146
 
131
147
  # This is convenience for librarys still on the old API.
132
148
  #
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
  # This module handles reloading behaviour of documents.
4
4
  module Reloading
5
5
 
@@ -16,18 +16,16 @@ module Mongoid #:nodoc:
16
16
  #
17
17
  # @since 1.0.0
18
18
  def reload
19
- _reload.tap do |reloaded|
20
- if Mongoid.raise_not_found_error && reloaded.empty?
21
- raise Errors::DocumentNotFound.new(self.class, id)
22
- end
23
- @attributes = reloaded
24
- end
25
- tap do |doc|
26
- doc.changed_attributes.clear
27
- doc.apply_defaults
28
- doc.reload_relations
29
- doc.run_callbacks(:initialize)
19
+ reloaded = _reload
20
+ if Mongoid.raise_not_found_error && reloaded.empty?
21
+ raise Errors::DocumentNotFound.new(self.class, id, id)
30
22
  end
23
+ @attributes = reloaded
24
+ changed_attributes.clear
25
+ apply_defaults
26
+ reload_relations
27
+ run_callbacks(:initialize)
28
+ self
31
29
  end
32
30
 
33
31
  private
@@ -54,7 +52,7 @@ module Mongoid #:nodoc:
54
52
  #
55
53
  # @since 2.3.2
56
54
  def reload_root_document
57
- {}.merge(collection.find_one(:_id => id) || {})
55
+ {}.merge(collection.find(_id: id).one || {})
58
56
  end
59
57
 
60
58
  # Reload the embedded document.
@@ -67,7 +65,7 @@ module Mongoid #:nodoc:
67
65
  # @since 2.3.2
68
66
  def reload_embedded_document
69
67
  extract_embedded_attributes({}.merge(
70
- _root.collection.find_one(:_id => _root.id)
68
+ _root.collection.find(_id: _root.id).one
71
69
  ))
72
70
  end
73
71