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,61 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Relations #:nodoc:
4
- module Embedded #:nodoc:
5
- module Atomic #:nodoc:
6
-
7
- class Set < Operation
8
-
9
- # Get the merged operations for the single atomic set.
10
- #
11
- # @example Get the operations
12
- # set.operations
13
- #
14
- # @return [ Hash ] The set operations.
15
- #
16
- # @since 2.0.0
17
- def operations
18
- { "$set" => { path => documents } }
19
- end
20
-
21
- private
22
-
23
- # Parses the incoming operations to get the documents to set.
24
- #
25
- # @example Parse the operations.
26
- # set.parse(
27
- # { "addresses" => { "$pushAll" => [{ "_id" => "street" }] } }
28
- # )
29
- #
30
- # @param [ Hash ] operations The ops to parse.
31
- #
32
- # @since 2.0.0
33
- def parse(operations)
34
- modifier = operations.keys.first
35
- extract(modifier, operations[modifier])
36
- end
37
-
38
- # Extract a document from the operation.
39
- #
40
- # @example Extract the document.
41
- # set.extract({ "$pushAll" => [{ "_id" => "street" }] })
42
- #
43
- # @param [ Hash ] operation The op to extract from.
44
- #
45
- # @since 2.0.0
46
- def extract(modifier, operations)
47
- @path = operations.keys.first
48
- case modifier
49
- when "$push"
50
- documents.push(operations[path])
51
- when "$pushAll"
52
- documents.push(operations[path].first)
53
- when "$set"
54
- @documents = operations[path]
55
- end
56
- end
57
- end
58
- end
59
- end
60
- end
61
- end
@@ -1,41 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Relations #:nodoc:
4
- module Embedded #:nodoc:
5
- module Atomic #:nodoc:
6
-
7
- class Unset < Operation
8
-
9
- # Get the merged operations for the single atomic set.
10
- #
11
- # @example Get the operations
12
- # set.operations
13
- #
14
- # @return [ Hash ] The set operations.
15
- #
16
- # @since 2.0.0
17
- def operations
18
- { "$unset" => { path => true } }
19
- end
20
-
21
- private
22
-
23
- # Parses the incoming operations to get the documents to set.
24
- #
25
- # @example Parse the operations.
26
- # set.parse(
27
- # { "addresses" => { "$pushAll" => [{ "_id" => "street" }] } }
28
- # )
29
- #
30
- # @param [ Hash ] operations The ops to parse.
31
- #
32
- # @since 2.0.0
33
- def parse(operations)
34
- modifier = operations.keys.first
35
- @path ||= operations[modifier].keys.first
36
- end
37
- end
38
- end
39
- end
40
- end
41
- end
@@ -1,89 +0,0 @@
1
- # encoding: utf-8
2
- require "mongoid/relations/embedded/atomic/operation"
3
- require "mongoid/relations/embedded/atomic/pull"
4
- require "mongoid/relations/embedded/atomic/push_all"
5
- require "mongoid/relations/embedded/atomic/set"
6
- require "mongoid/relations/embedded/atomic/unset"
7
-
8
- module Mongoid #:nodoc:
9
- module Relations #:nodoc:
10
- module Embedded #:nodoc:
11
-
12
- # This module provides the ability for calls to be declared atomic.
13
- module Atomic
14
-
15
- MODIFIERS = {
16
- :$pull => Pull,
17
- :$pushAll => PushAll,
18
- :$set => Set,
19
- :$unset => Unset
20
- }
21
-
22
- private
23
-
24
- # Executes a block of commands in an atomic fashion. Mongoid will
25
- # intercept all database upserts while in this block and combine them
26
- # into a single database call. When the block concludes the atomic
27
- # update will occur.
28
- #
29
- # Since the collection is accessed through the class it would not be
30
- # thread safe to give it state so we access the atomic updater via the
31
- # current thread.
32
- #
33
- # @note This operation is not safe when attemping to do illegal updates
34
- # for different objects or collections, since the updator is not
35
- # scoped on the thread. This is meant for Mongoid internal use only
36
- # to keep existing design clean.
37
- #
38
- # @example Atomically $set multiple saves.
39
- # atomically(:$set) do
40
- # address_one.save!
41
- # address_two.save!
42
- # end
43
- #
44
- # @example Atomically $pushAll multiple new docs.
45
- # atomically(:$pushAll) do
46
- # person.addresses.push([ address_one, address_two ])
47
- # end
48
- #
49
- # @todo Durran: Move executions to thread local stack.
50
- #
51
- # @param [ Symbol ] modifier The atomic modifier to perform.
52
- # @param [ Proc ] block The block to execute.
53
- #
54
- # @return [ Object ] The result of the operation.
55
- #
56
- # @since 2.0.0
57
- def atomically(modifier, &block)
58
- updater = Threaded.update_consumer(collection_name) ||
59
- Threaded.set_update_consumer(collection_name, MODIFIERS[modifier].new)
60
- count_executions do
61
- block.call if block
62
- end.tap do
63
- if @executions.zero?
64
- Threaded.set_update_consumer(collection_name, nil)
65
- updater.execute(collection)
66
- end
67
- end
68
- end
69
-
70
- # Execute the block, incrementing the executions before the call and
71
- # decrementing them after in order to be able to nest blocks within
72
- # each other.
73
- #
74
- # @example Execute and increment.
75
- # execute { block.call }
76
- #
77
- # @param [ Proc ] block The block to call.
78
- #
79
- # @since 2.0.0
80
- def count_executions(&block)
81
- @executions ||= 0 and @executions += 1
82
- block.call.tap do
83
- @executions -=1
84
- end
85
- end
86
- end
87
- end
88
- end
89
- end
@@ -1,57 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Relations #:nodoc:
4
- module Referenced #:nodoc:
5
- module Batch #:nodoc:
6
-
7
- # Handles all the batch insert collection.
8
- class Insert
9
- attr_accessor :documents, :options
10
-
11
- # Consumes an execution that was supposed to hit the database, but is
12
- # now being deferred to later in favor of a single batch insert.
13
- #
14
- # @example Consume the operation.
15
- # set.consume({ "field" => "value" }, { :safe => true })
16
- #
17
- # @param [ Hash ] document The document to collect.
18
- # @param [ Hash ] options The persistence options.
19
- #
20
- # @option options [ true, false ] :safe Persist in safe mode.
21
- #
22
- # @since 2.0.2, batch-relational-insert
23
- def consume(document, options = {})
24
- @consumed, @options = true, options
25
- (@documents ||= []).push(document)
26
- end
27
-
28
- # Has this operation consumed any executions?
29
- #
30
- # @example Is this consumed?
31
- # insert.consumed?
32
- #
33
- # @return [ true, false ] If the operation has consumed anything.
34
- #
35
- # @since 2.0.2, batch-relational-insert
36
- def consumed?
37
- !!@consumed
38
- end
39
-
40
- # Execute the batch insert operation on the collection.
41
- #
42
- # @example Execute the operation.
43
- # insert.execute(collection)
44
- #
45
- # @param [ Collection ] collection The root collection.
46
- #
47
- # @since 2.0.2, batch-relational-insert
48
- def execute(collection)
49
- if collection && consumed?
50
- collection.insert(documents, options)
51
- end
52
- end
53
- end
54
- end
55
- end
56
- end
57
- end
@@ -1,73 +0,0 @@
1
- # encoding: utf-8
2
- require "mongoid/relations/referenced/batch/insert"
3
-
4
- module Mongoid #:nodoc:
5
- module Relations #:nodoc:
6
- module Referenced #:nodoc:
7
-
8
- # This module provides the ability for single insert calls to be batch
9
- # inserted.
10
- module Batch
11
-
12
- private
13
-
14
- # Executes a number of save calls in a single batch. Mongoid will
15
- # intercept all database inserts while in this block and combine them
16
- # into a single database call. When the block concludes the batch
17
- # insert will occur.
18
- #
19
- # Since the collection is accessed through the class it would not be
20
- # thread safe to give it state so we access the atomic updater via the
21
- # current thread.
22
- #
23
- # @note This operation is not safe when attemping to do illegal updates
24
- # for different objects or collections, since the updator is not
25
- # scoped on the thread. This is meant for Mongoid internal use only
26
- # to keep existing design clean.
27
- #
28
- # @example Batch update multiple appends.
29
- # batched do
30
- # person.posts << [ post_one, post_two, post_three ]
31
- # end
32
- #
33
- # @todo Durran: Move executions to thread local stack.
34
- #
35
- # @param [ Proc ] block The block to execute.
36
- #
37
- # @return [ Object ] The result of the operation.
38
- #
39
- # @since 2.0.2, batch-relational-insert
40
- def batched(&block)
41
- name = collection.name
42
- inserter = Threaded.insert(name) || Threaded.set_insert(name, Insert.new)
43
- count_executions(&block)
44
- ensure
45
- if @executions.zero?
46
- Threaded.set_insert(name, nil)
47
- inserter.execute(collection)
48
- end
49
- end
50
-
51
- # Execute the block, incrementing the executions before the call and
52
- # decrementing them after in order to be able to nest blocks within
53
- # each other.
54
- #
55
- # @todo Durran: Combine common code with embedded atomics.
56
- #
57
- # @example Execute and increment.
58
- # execute { block.call }
59
- #
60
- # @param [ Proc ] block The block to call.
61
- #
62
- # @since 2.0.2, batch-relational-insert
63
- def count_executions
64
- @executions ||= 0
65
- @executions += 1
66
- yield
67
- ensure
68
- @executions -=1
69
- end
70
- end
71
- end
72
- end
73
- end
@@ -1,105 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
-
4
- # The +Safety+ module is used to provide a DSL to execute database operations
5
- # in safe mode on a per query basis, either from the +Document+ class level
6
- # or instance level.
7
- module Safety
8
- extend ActiveSupport::Concern
9
-
10
- # Execute the following instance-level persistence operation in safe mode.
11
- #
12
- # @example Upsert in safe mode.
13
- # person.safely.upsert
14
- #
15
- # @example Destroy in safe mode with w and fsync options.
16
- # person.safely(:w => 2, :fsync => true).destroy
17
- #
18
- # @param [ Hash ] options The safe mode options.
19
- #
20
- # @option options [ Integer ] :w The number of nodes to write to.
21
- # @option options [ Integer ] :wtimeout Time to wait for return from all
22
- # nodes.
23
- # @option options [ true, false ] :fsync Should a fsync occur.
24
- #
25
- # @return [ Proxy ] The safety proxy.
26
- def safely(safety = true)
27
- tap { Threaded.safety_options = safety }
28
- end
29
-
30
- # Execute the following instance-level persistence operation without safe mode.
31
- # Allows per-request overriding of safe mode when the persist_in_safe_mode
32
- # config option is turned on.
33
- #
34
- # @example Upsert in safe mode.
35
- # person.unsafely.upsert
36
- #
37
- # @return [ Proxy ] The safety proxy.
38
- def unsafely
39
- tap { Threaded.safety_options = false }
40
- end
41
-
42
- class << self
43
-
44
- # Static class method of easily getting the desired safe mode options
45
- # from anywhere in the framework.
46
- #
47
- # @example Get the options with safe mode included.
48
- # Safety.merge_safety_options({ :safe => false })
49
- #
50
- # @param [ Hash ] options The persistence options.
51
- #
52
- # @return [ Hash ] The options hash.
53
- #
54
- # @since 2.1.0
55
- def merge_safety_options(options = {})
56
- options ||= {}
57
- return options if options[:safe]
58
-
59
- unless Threaded.safety_options.nil?
60
- safety = Threaded.safety_options
61
- else
62
- safety = Mongoid.persist_in_safe_mode
63
- end
64
- options.merge!({ :safe => safety })
65
- end
66
- end
67
-
68
- module ClassMethods #:nodoc:
69
-
70
- # Execute the following class-level persistence operation in safe mode.
71
- #
72
- # @example Create in safe mode.
73
- # Person.safely.create(:name => "John")
74
- #
75
- # @example Delete all in safe mode with options.
76
- # Person.safely(:w => 2, :fsync => true).delete_all
77
- #
78
- # @param [ Hash ] options The safe mode options.
79
- #
80
- # @option options [ Integer ] :w The number of nodes to write to.
81
- # @option options [ Integer ] :wtimeout Time to wait for return from all
82
- # nodes.
83
- # @option options [ true, false ] :fsync Should a fsync occur.
84
- #
85
- # @return [ Proxy ] The safety proxy.
86
- def safely(safety = true)
87
- tap { Threaded.safety_options = safety }
88
- end
89
-
90
- # Execute the following class-level persistence operation without safe mode.
91
- # Allows per-request overriding of safe mode when the persist_in_safe_mode
92
- # config option is turned on.
93
- #
94
- # @example Upsert in safe mode.
95
- # Person.unsafely.create(:name => "John")
96
- #
97
- # @return [ Proxy ] The safety proxy.
98
- #
99
- # @since 2.3.0
100
- def unsafely
101
- tap { Threaded.safety_options = false }
102
- end
103
- end
104
- end
105
- end
data/lib/mongoid/scope.rb DELETED
@@ -1,31 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- # This module handles behaviour for defining scopes on classes.
4
- class Scope
5
- attr_reader :conditions, :extensions
6
-
7
- # Create the new +Scope+. If a block is passed in, this Scope will store
8
- # the block for future calls to #extend.
9
- #
10
- # @example Create a new scope.
11
- # Scope.new(:title => "Sir")
12
- #
13
- # @param [ Hash ] conditions The scoping limitations.
14
- def initialize(conditions = {}, &block)
15
- @conditions = conditions
16
- @extensions = Module.new(&block) if block_given?
17
- end
18
-
19
- # Extend a supplied criteria.
20
- #
21
- # @example Extend the criteria.
22
- # scope.extend(criteria)
23
- #
24
- # @param [ Criteria } criteria A mongoid criteria to extend.
25
- #
26
- # @return [ Criteria ] The new criteria object.
27
- def extend(criteria)
28
- extensions ? criteria.extend(extensions) : criteria
29
- end
30
- end
31
- end