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,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Referenced #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Referenced
5
5
 
6
6
  # This class defines the behaviour for all relations that are a
7
7
  # many-to-many between documents in different collections.
@@ -25,29 +25,52 @@ module Mongoid # :nodoc:
25
25
  #
26
26
  # @since 2.0.0.beta.1
27
27
  def <<(*args)
28
- batched do
29
- [].tap do |ids|
30
- args.flatten.each do |doc|
31
- next unless doc
32
- append(doc)
33
- if persistable? || _creating?
34
- ids.push(doc.id)
35
- doc.save
36
- else
37
- base.send(metadata.foreign_key).push(doc.id)
38
- base.synced[metadata.foreign_key] = false
39
- end
40
- end
41
- if persistable? || _creating?
42
- base.push_all(metadata.foreign_key, ids)
43
- base.synced[metadata.foreign_key] = false
44
- end
28
+ docs = args.flatten
29
+ return concat(docs) if docs.size > 1
30
+ if doc = docs.first
31
+ append(doc)
32
+ base.add_to_set(foreign_key, doc.id)
33
+ if persistable? || _creating?
34
+ doc.save
45
35
  end
46
36
  end
37
+ unsynced(base, foreign_key) and self
47
38
  end
48
- alias :concat :<<
49
39
  alias :push :<<
50
40
 
41
+ # Appends an array of documents to the relation. Performs a batch
42
+ # insert of the documents instead of persisting one at a time.
43
+ #
44
+ # @example Concat with other documents.
45
+ # person.posts.concat([ post_one, post_two ])
46
+ #
47
+ # @param [ Array<Document> ] documents The docs to add.
48
+ #
49
+ # @return [ Array<Document> ] The documents.
50
+ #
51
+ # @since 2.4.0
52
+ def concat(documents)
53
+ ids, docs, inserts = {}, [], []
54
+ documents.each do |doc|
55
+ next unless doc
56
+ append(doc)
57
+ if persistable? || _creating?
58
+ ids[doc.id] = true
59
+ save_or_delay(doc, docs, inserts)
60
+ else
61
+ existing = base.send(foreign_key)
62
+ unless existing.include?(doc.id)
63
+ existing.push(doc.id) and unsynced(base, foreign_key)
64
+ end
65
+ end
66
+ end
67
+ if persistable? || _creating?
68
+ base.push_all(foreign_key, ids.keys)
69
+ end
70
+ persist_delayed(docs, inserts)
71
+ self
72
+ end
73
+
51
74
  # Build a new document from the attributes and append it to this
52
75
  # relation without saving.
53
76
  #
@@ -72,13 +95,13 @@ module Mongoid # :nodoc:
72
95
  options, type = {}, options
73
96
  end
74
97
 
75
- Factory.build(type || klass, attributes, options).tap do |doc|
76
- base.send(metadata.foreign_key).push(doc.id)
77
- append(doc)
78
- doc.apply_proc_defaults
79
- doc.synced[metadata.inverse_foreign_key] = false
80
- yield(doc) if block_given?
81
- end
98
+ doc = Factory.build(type || klass, attributes, options)
99
+ base.send(foreign_key).push(doc.id)
100
+ append(doc)
101
+ doc.apply_post_processed_defaults
102
+ unsynced(doc, inverse_foreign_key)
103
+ yield(doc) if block_given?
104
+ doc
82
105
  end
83
106
  alias :new :build
84
107
 
@@ -95,12 +118,12 @@ module Mongoid # :nodoc:
95
118
  #
96
119
  # @since 2.1.0
97
120
  def delete(document)
98
- super.tap do |doc|
99
- if doc && persistable?
100
- base.pull(metadata.foreign_key, doc.id)
101
- base.synced[metadata.foreign_key] = false
102
- end
121
+ doc = super
122
+ if doc && persistable?
123
+ base.pull(foreign_key, doc.id)
124
+ unsynced(base, foreign_key)
103
125
  end
126
+ doc
104
127
  end
105
128
 
106
129
  # Removes all associations between the base document and the target
@@ -113,12 +136,12 @@ module Mongoid # :nodoc:
113
136
  # @since 2.0.0.rc.1
114
137
  def nullify
115
138
  unless metadata.forced_nil_inverse?
116
- criteria.pull(metadata.inverse_foreign_key, base.id)
139
+ criteria.pull(inverse_foreign_key, base.id)
117
140
  end
118
141
  if persistable?
119
142
  base.set(
120
- metadata.foreign_key,
121
- base.send(metadata.foreign_key).clear
143
+ foreign_key,
144
+ base.send(foreign_key).clear
122
145
  )
123
146
  end
124
147
  target.clear do |doc|
@@ -142,10 +165,9 @@ module Mongoid # :nodoc:
142
165
  #
143
166
  # @since 2.0.0.rc.1
144
167
  def substitute(replacement)
145
- tap do |proxy|
146
- proxy.purge
147
- proxy.push(replacement.compact.uniq) unless replacement.blank?
148
- end
168
+ purge
169
+ push(replacement.compact.uniq) unless replacement.blank?
170
+ self
149
171
  end
150
172
 
151
173
  # Get a criteria for the documents without the default scoping
@@ -158,7 +180,7 @@ module Mongoid # :nodoc:
158
180
  #
159
181
  # @since 2.4.0
160
182
  def unscoped
161
- klass.unscoped.any_in(:_id => base.send(metadata.foreign_key))
183
+ klass.unscoped.any_in(_id: base.send(foreign_key))
162
184
  end
163
185
 
164
186
  private
@@ -198,7 +220,25 @@ module Mongoid # :nodoc:
198
220
  #
199
221
  # @return [ Criteria ] A new criteria.
200
222
  def criteria
201
- ManyToMany.criteria(metadata, base.send(metadata.foreign_key))
223
+ ManyToMany.criteria(metadata, base.send(foreign_key))
224
+ end
225
+
226
+ # Flag the base as unsynced with respect to the foreign key.
227
+ #
228
+ # @api private
229
+ #
230
+ # @example Flag as unsynced.
231
+ # relation.unsynced(doc, :preference_ids)
232
+ #
233
+ # @param [ Document ] doc The document to flag.
234
+ # @param [ Symbol ] key The key to flag on the document.
235
+ #
236
+ # @return [ true ] true.
237
+ #
238
+ # @since 3.0.0
239
+ def unsynced(doc, key)
240
+ doc.synced[key] = false
241
+ true
202
242
  end
203
243
 
204
244
  class << self
@@ -235,7 +275,7 @@ module Mongoid # :nodoc:
235
275
  #
236
276
  # @since 2.1.0
237
277
  def criteria(metadata, object, type = nil)
238
- metadata.klass.any_in(:_id => object)
278
+ metadata.klass.all_of(_id: { "$in" => object })
239
279
  end
240
280
 
241
281
  # Get the criteria that is used to eager load a relation of this
@@ -245,13 +285,15 @@ module Mongoid # :nodoc:
245
285
  # Proxy.eager_load(metadata, criteria)
246
286
  #
247
287
  # @param [ Metadata ] metadata The relation metadata.
248
- # @param [ Criteria ] criteria The criteria being used.
288
+ # @param [ Array<Object> ] ids The ids of the documents to load.
249
289
  #
250
290
  # @return [ Criteria ] The criteria to eager load the relation.
251
291
  #
252
292
  # @since 2.2.0
253
- def eager_load(metadata, criteria)
254
- raise Errors::EagerLoad.new(metadata.name)
293
+ def eager_load(metadata, ids)
294
+ metadata.klass.any_in(_id: ids).each do |doc|
295
+ IdentityMap.set(doc)
296
+ end
255
297
  end
256
298
 
257
299
  # Returns true if the relation is an embedded one. In this case
@@ -267,6 +309,20 @@ module Mongoid # :nodoc:
267
309
  false
268
310
  end
269
311
 
312
+ # Get the foreign key for the provided name.
313
+ #
314
+ # @example Get the foreign key.
315
+ # Referenced::ManyToMany.foreign_key(:person)
316
+ #
317
+ # @param [ Symbol ] name The name.
318
+ #
319
+ # @return [ String ] The foreign key.
320
+ #
321
+ # @since 3.0.0
322
+ def foreign_key(name)
323
+ "#{name.to_s.singularize}#{foreign_key_suffix}"
324
+ end
325
+
270
326
  # Get the default value for the foreign key.
271
327
  #
272
328
  # @example Get the default.
@@ -297,9 +353,9 @@ module Mongoid # :nodoc:
297
353
  # @example Get the macro.
298
354
  # Referenced::ManyToMany.macro
299
355
  #
300
- # @return [ Symbol ] :references_and_referenced_in_many
356
+ # @return [ Symbol ] :has_and_belongs_to_many
301
357
  def macro
302
- :references_and_referenced_in_many
358
+ :has_and_belongs_to_many
303
359
  end
304
360
 
305
361
  # Return the nested builder that is responsible for generating the documents
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Referenced #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Referenced
5
5
 
6
6
  # This class defines the behaviour for all relations that are a
7
7
  # one-to-one between documents in different collections.
@@ -59,8 +59,7 @@ module Mongoid # :nodoc:
59
59
  save if persisted?
60
60
  end
61
61
  end
62
- return nil unless replacement
63
- One.new(base, replacement, metadata)
62
+ One.new(base, replacement, metadata) if replacement
64
63
  end
65
64
 
66
65
  private
@@ -122,7 +121,18 @@ module Mongoid # :nodoc:
122
121
  #
123
122
  # @since 2.1.0
124
123
  def criteria(metadata, object, type = nil)
125
- metadata.klass.where(metadata.foreign_key => object)
124
+ crit = metadata.klass.where(metadata.foreign_key => object)
125
+
126
+ if metadata.polymorphic?
127
+ crit = crit.where(metadata.type => type.name)
128
+ end
129
+
130
+ inverse_metadata = metadata.inverse_metadata(metadata.klass)
131
+ if inverse_metadata.inverse_of_field
132
+ crit = crit.any_in(inverse_metadata.inverse_of_field => [metadata.name, nil])
133
+ end
134
+
135
+ crit
126
136
  end
127
137
 
128
138
  # Get the criteria that is used to eager load a relation of this
@@ -138,10 +148,7 @@ module Mongoid # :nodoc:
138
148
  #
139
149
  # @since 2.2.0
140
150
  def eager_load(metadata, ids)
141
- klass, foreign_key = metadata.klass, metadata.foreign_key
142
- klass.any_in(foreign_key => ids).each do |doc|
143
- IdentityMap.set_one(doc, foreign_key => doc.send(foreign_key))
144
- end
151
+ eager_load_ids(metadata, ids) { |doc, key| IdentityMap.set_one(doc, key) }
145
152
  end
146
153
 
147
154
  # Returns true if the relation is an embedded one. In this case
@@ -157,6 +164,20 @@ module Mongoid # :nodoc:
157
164
  false
158
165
  end
159
166
 
167
+ # Get the foreign key for the provided name.
168
+ #
169
+ # @example Get the foreign key.
170
+ # Referenced::One.foreign_key(:person)
171
+ #
172
+ # @param [ Symbol ] name The name.
173
+ #
174
+ # @return [ String ] The foreign key.
175
+ #
176
+ # @since 3.0.0
177
+ def foreign_key(name)
178
+ "#{name}#{foreign_key_suffix}"
179
+ end
180
+
160
181
  # Get the default value for the foreign key.
161
182
  #
162
183
  # @example Get the default.
@@ -187,9 +208,9 @@ module Mongoid # :nodoc:
187
208
  # @example Get the macro.
188
209
  # Referenced::One.macro
189
210
  #
190
- # @return [ Symbol ] :references_one.
211
+ # @return [ Symbol ] :has_one.
191
212
  def macro
192
- :references_one
213
+ :has_one
193
214
  end
194
215
 
195
216
  # Return the nested builder that is responsible for generating the documents
@@ -254,7 +275,7 @@ module Mongoid # :nodoc:
254
275
  #
255
276
  # @since 2.1.0
256
277
  def valid_options
257
- [ :as, :autosave, :dependent, :foreign_key ]
278
+ [ :as, :autobuild, :autosave, :dependent, :foreign_key ]
258
279
  end
259
280
 
260
281
  # Get the default validation setting for the relation. Determines if
@@ -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
 
5
5
  # The reflections module provides convenience methods that can retrieve
6
6
  # useful information about associations.
@@ -31,7 +31,7 @@ module Mongoid # :nodoc:
31
31
  self.class.reflect_on_all_associations(*macros)
32
32
  end
33
33
 
34
- module ClassMethods #:nodoc
34
+ module ClassMethods
35
35
 
36
36
  # Returns the relation metadata for the supplied name.
37
37
  #
@@ -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
 
5
5
  # This module handles the behaviour for synchronizing foreign keys between
6
6
  # both sides of a many to many relations.
@@ -36,8 +36,6 @@ module Mongoid # :nodoc:
36
36
 
37
37
  # Has the document been synced for the foreign key?
38
38
  #
39
- # @todo Change the sync to be key based.
40
- #
41
39
  # @example Has the document been synced?
42
40
  # document.synced?
43
41
  #
@@ -61,7 +59,7 @@ module Mongoid # :nodoc:
61
59
  #
62
60
  # @since 2.2.1
63
61
  def remove_inverse_keys(meta)
64
- meta.criteria(send(meta.foreign_key)).pull(meta.inverse_foreign_key, id)
62
+ meta.criteria(send(meta.foreign_key), self.class).pull(meta.inverse_foreign_key, id)
65
63
  end
66
64
 
67
65
  # Update the inverse keys for the relation.
@@ -91,15 +89,15 @@ module Mongoid # :nodoc:
91
89
  end
92
90
 
93
91
  unless adds.empty?
94
- meta.criteria(adds).add_to_set(meta.inverse_foreign_key, id)
92
+ meta.criteria(adds, self.class).add_to_set(meta.inverse_foreign_key, id)
95
93
  end
96
94
  unless subs.empty?
97
- meta.criteria(subs).pull(meta.inverse_foreign_key, id)
95
+ meta.criteria(subs, self.class).pull(meta.inverse_foreign_key, id)
98
96
  end
99
97
  end
100
98
  end
101
99
 
102
- module ClassMethods #:nodoc:
100
+ module ClassMethods
103
101
 
104
102
  # Set up the syncing of many to many foreign keys.
105
103
  #
@@ -133,15 +131,14 @@ module Mongoid # :nodoc:
133
131
  #
134
132
  # @since 2.1.0
135
133
  def synced_save(metadata)
136
- tap do
137
- set_callback(
138
- :save,
139
- :after,
140
- :if => lambda { |doc| doc.syncable?(metadata) }
141
- ) do |doc|
142
- doc.update_inverse_keys(metadata)
143
- end
134
+ set_callback(
135
+ :save,
136
+ :after,
137
+ if: ->(doc){ doc.syncable?(metadata) }
138
+ ) do |doc|
139
+ doc.update_inverse_keys(metadata)
144
140
  end
141
+ self
145
142
  end
146
143
 
147
144
  # Set up the sync of inverse keys that needs to happen on a destroy.
@@ -155,14 +152,13 @@ module Mongoid # :nodoc:
155
152
  #
156
153
  # @since 2.2.1
157
154
  def synced_destroy(metadata)
158
- tap do
159
- set_callback(
160
- :destroy,
161
- :after
162
- ) do |doc|
163
- doc.remove_inverse_keys(metadata)
164
- end
155
+ set_callback(
156
+ :destroy,
157
+ :after
158
+ ) do |doc|
159
+ doc.remove_inverse_keys(metadata)
165
160
  end
161
+ self
166
162
  end
167
163
  end
168
164
  end