mongoid 2.8.1 → 3.0.0.rc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. data/CHANGELOG.md +802 -58
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -8
  5. data/lib/config/locales/en.yml +441 -51
  6. data/lib/mongoid.rb +24 -39
  7. data/lib/mongoid/atomic.rb +16 -33
  8. data/lib/mongoid/atomic/modifiers.rb +2 -2
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  11. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  12. data/lib/mongoid/atomic/paths/root.rb +4 -5
  13. data/lib/mongoid/attributes.rb +95 -32
  14. data/lib/mongoid/attributes/processing.rb +14 -10
  15. data/lib/mongoid/attributes/readonly.rb +56 -0
  16. data/lib/mongoid/callbacks.rb +90 -27
  17. data/lib/mongoid/collections/retry.rb +2 -3
  18. data/lib/mongoid/components.rb +11 -23
  19. data/lib/mongoid/config.rb +87 -233
  20. data/lib/mongoid/config/environment.rb +5 -6
  21. data/lib/mongoid/config/inflections.rb +6 -0
  22. data/lib/mongoid/config/options.rb +1 -1
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config/validators/option.rb +25 -0
  25. data/lib/mongoid/config/validators/session.rb +140 -0
  26. data/lib/mongoid/contextual.rb +50 -0
  27. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  28. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  29. data/lib/mongoid/contextual/atomic.rb +179 -0
  30. data/lib/mongoid/contextual/command.rb +43 -0
  31. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  32. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  33. data/lib/mongoid/contextual/memory.rb +383 -0
  34. data/lib/mongoid/contextual/mongo.rb +543 -0
  35. data/lib/mongoid/copyable.rb +3 -34
  36. data/lib/mongoid/criteria.rb +436 -250
  37. data/lib/mongoid/criterion/inspection.rb +14 -8
  38. data/lib/mongoid/criterion/scoping.rb +114 -44
  39. data/lib/mongoid/dirty.rb +152 -67
  40. data/lib/mongoid/document.rb +69 -50
  41. data/lib/mongoid/errors.rb +22 -1
  42. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  43. data/lib/mongoid/errors/callback.rb +5 -6
  44. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  45. data/lib/mongoid/errors/document_not_found.rb +98 -17
  46. data/lib/mongoid/errors/eager_load.rb +3 -6
  47. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  48. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  49. data/lib/mongoid/errors/invalid_database.rb +3 -3
  50. data/lib/mongoid/errors/invalid_field.rb +54 -8
  51. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  52. data/lib/mongoid/errors/invalid_find.rb +3 -3
  53. data/lib/mongoid/errors/invalid_index.rb +28 -0
  54. data/lib/mongoid/errors/invalid_options.rb +4 -4
  55. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  56. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  57. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  58. data/lib/mongoid/errors/invalid_time.rb +3 -6
  59. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  60. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  61. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  62. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  63. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  64. data/lib/mongoid/errors/no_default_session.rb +23 -0
  65. data/lib/mongoid/errors/no_environment.rb +3 -3
  66. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  67. data/lib/mongoid/errors/no_parent.rb +24 -0
  68. data/lib/mongoid/errors/no_session_config.rb +22 -0
  69. data/lib/mongoid/errors/no_session_database.rb +27 -0
  70. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  71. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  72. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  73. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  74. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  75. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  76. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  77. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  78. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  79. data/lib/mongoid/errors/validations.rb +7 -6
  80. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  81. data/lib/mongoid/extensions.rb +28 -76
  82. data/lib/mongoid/extensions/array.rb +127 -0
  83. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  84. data/lib/mongoid/extensions/boolean.rb +24 -0
  85. data/lib/mongoid/extensions/date.rb +70 -0
  86. data/lib/mongoid/extensions/date_time.rb +68 -0
  87. data/lib/mongoid/extensions/false_class.rb +26 -0
  88. data/lib/mongoid/extensions/float.rb +44 -0
  89. data/lib/mongoid/extensions/hash.rb +91 -0
  90. data/lib/mongoid/extensions/integer.rb +54 -0
  91. data/lib/mongoid/extensions/module.rb +28 -0
  92. data/lib/mongoid/extensions/nil_class.rb +21 -0
  93. data/lib/mongoid/extensions/object.rb +188 -0
  94. data/lib/mongoid/extensions/object_id.rb +53 -0
  95. data/lib/mongoid/extensions/range.rb +55 -0
  96. data/lib/mongoid/extensions/regexp.rb +27 -0
  97. data/lib/mongoid/extensions/set.rb +55 -0
  98. data/lib/mongoid/extensions/string.rb +155 -0
  99. data/lib/mongoid/extensions/symbol.rb +54 -0
  100. data/lib/mongoid/extensions/time.rb +78 -0
  101. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  102. data/lib/mongoid/extensions/true_class.rb +26 -0
  103. data/lib/mongoid/factory.rb +1 -1
  104. data/lib/mongoid/fields.rb +129 -194
  105. data/lib/mongoid/fields/foreign_key.rb +134 -0
  106. data/lib/mongoid/fields/localized.rb +73 -0
  107. data/lib/mongoid/fields/standard.rb +268 -0
  108. data/lib/mongoid/fields/validators.rb +2 -0
  109. data/lib/mongoid/fields/validators/macro.rb +83 -0
  110. data/lib/mongoid/finders.rb +42 -43
  111. data/lib/mongoid/hierarchy.rb +25 -14
  112. data/lib/mongoid/identity_map.rb +31 -19
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/indexes/validators/options.rb +80 -0
  115. data/lib/mongoid/inspection.rb +1 -1
  116. data/lib/mongoid/javascript.rb +1 -1
  117. data/lib/mongoid/json.rb +2 -2
  118. data/lib/mongoid/loggable.rb +69 -0
  119. data/lib/mongoid/matchers.rb +1 -1
  120. data/lib/mongoid/matchers/all.rb +7 -8
  121. data/lib/mongoid/matchers/and.rb +3 -3
  122. data/lib/mongoid/matchers/default.rb +6 -4
  123. data/lib/mongoid/matchers/exists.rb +2 -2
  124. data/lib/mongoid/matchers/gt.rb +2 -2
  125. data/lib/mongoid/matchers/gte.rb +2 -2
  126. data/lib/mongoid/matchers/in.rb +3 -7
  127. data/lib/mongoid/matchers/lt.rb +2 -2
  128. data/lib/mongoid/matchers/lte.rb +2 -2
  129. data/lib/mongoid/matchers/ne.rb +2 -2
  130. data/lib/mongoid/matchers/nin.rb +2 -2
  131. data/lib/mongoid/matchers/or.rb +2 -2
  132. data/lib/mongoid/matchers/size.rb +2 -2
  133. data/lib/mongoid/matchers/strategies.rb +3 -3
  134. data/lib/mongoid/multi_parameter_attributes.rb +8 -10
  135. data/lib/mongoid/nested_attributes.rb +17 -9
  136. data/lib/mongoid/observer.rb +1 -2
  137. data/lib/mongoid/paranoia.rb +13 -18
  138. data/lib/mongoid/persistence.rb +43 -39
  139. data/lib/mongoid/persistence/atomic.rb +2 -2
  140. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  141. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  144. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  145. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  146. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  147. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  148. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  149. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  150. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  151. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  152. data/lib/mongoid/persistence/deletion.rb +2 -2
  153. data/lib/mongoid/persistence/insertion.rb +10 -16
  154. data/lib/mongoid/persistence/modification.rb +5 -9
  155. data/lib/mongoid/persistence/operations.rb +6 -19
  156. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  157. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  158. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  159. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  160. data/lib/mongoid/persistence/operations/update.rb +5 -5
  161. data/lib/mongoid/railtie.rb +26 -11
  162. data/lib/mongoid/railties/database.rake +22 -108
  163. data/lib/mongoid/relations.rb +4 -6
  164. data/lib/mongoid/relations/accessors.rb +119 -19
  165. data/lib/mongoid/relations/auto_save.rb +59 -5
  166. data/lib/mongoid/relations/binding.rb +211 -2
  167. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  168. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  169. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  170. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  171. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  172. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  173. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  174. data/lib/mongoid/relations/builder.rb +3 -3
  175. data/lib/mongoid/relations/builders.rb +19 -16
  176. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  177. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  178. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  179. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  180. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  181. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  182. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  183. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  184. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  185. data/lib/mongoid/relations/cascading.rb +6 -4
  186. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  187. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  188. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  189. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  190. data/lib/mongoid/relations/constraint.rb +4 -3
  191. data/lib/mongoid/relations/conversions.rb +5 -6
  192. data/lib/mongoid/relations/cyclic.rb +7 -7
  193. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  194. data/lib/mongoid/relations/embedded/in.rb +23 -12
  195. data/lib/mongoid/relations/embedded/many.rb +99 -161
  196. data/lib/mongoid/relations/embedded/one.rb +25 -14
  197. data/lib/mongoid/relations/macros.rb +105 -61
  198. data/lib/mongoid/relations/many.rb +93 -14
  199. data/lib/mongoid/relations/metadata.rb +200 -45
  200. data/lib/mongoid/relations/nested_builder.rb +3 -5
  201. data/lib/mongoid/relations/one.rb +2 -2
  202. data/lib/mongoid/relations/options.rb +2 -2
  203. data/lib/mongoid/relations/polymorphic.rb +9 -9
  204. data/lib/mongoid/relations/proxy.rb +60 -31
  205. data/lib/mongoid/relations/referenced/in.rb +40 -15
  206. data/lib/mongoid/relations/referenced/many.rb +117 -132
  207. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  208. data/lib/mongoid/relations/referenced/one.rb +34 -13
  209. data/lib/mongoid/relations/reflections.rb +3 -3
  210. data/lib/mongoid/relations/synchronization.rb +19 -23
  211. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  212. data/lib/mongoid/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +8 -27
  215. data/lib/mongoid/sessions.rb +359 -0
  216. data/lib/mongoid/sessions/factory.rb +106 -0
  217. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded.rb +167 -59
  223. data/lib/mongoid/threaded/lifecycle.rb +21 -22
  224. data/lib/mongoid/threaded/sessions.rb +0 -0
  225. data/lib/mongoid/timestamps.rb +1 -1
  226. data/lib/mongoid/timestamps/created.rb +8 -4
  227. data/lib/mongoid/timestamps/timeless.rb +6 -4
  228. data/lib/mongoid/timestamps/updated.rb +3 -3
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations.rb +27 -19
  231. data/lib/mongoid/validations/associated.rb +2 -2
  232. data/lib/mongoid/validations/format.rb +2 -2
  233. data/lib/mongoid/validations/presence.rb +31 -5
  234. data/lib/mongoid/validations/uniqueness.rb +9 -12
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  238. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  239. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  240. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  241. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  242. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  243. data/lib/rails/generators/mongoid_generator.rb +5 -5
  244. data/lib/rails/mongoid.rb +69 -25
  245. metadata +110 -137
  246. checksums.yaml +0 -7
  247. data/lib/config/locales/bg.yml +0 -61
  248. data/lib/config/locales/de.yml +0 -61
  249. data/lib/config/locales/en-GB.yml +0 -64
  250. data/lib/config/locales/es.yml +0 -59
  251. data/lib/config/locales/fr.yml +0 -62
  252. data/lib/config/locales/hi.yml +0 -53
  253. data/lib/config/locales/hu.yml +0 -64
  254. data/lib/config/locales/id.yml +0 -62
  255. data/lib/config/locales/it.yml +0 -59
  256. data/lib/config/locales/ja.yml +0 -57
  257. data/lib/config/locales/kr.yml +0 -54
  258. data/lib/config/locales/nl.yml +0 -61
  259. data/lib/config/locales/pl.yml +0 -59
  260. data/lib/config/locales/pt-BR.yml +0 -60
  261. data/lib/config/locales/pt.yml +0 -60
  262. data/lib/config/locales/ro.yml +0 -66
  263. data/lib/config/locales/ru.yml +0 -61
  264. data/lib/config/locales/sv.yml +0 -60
  265. data/lib/config/locales/vi.yml +0 -62
  266. data/lib/config/locales/zh-CN.yml +0 -53
  267. data/lib/mongoid/collection.rb +0 -157
  268. data/lib/mongoid/collections.rb +0 -120
  269. data/lib/mongoid/collections/master.rb +0 -45
  270. data/lib/mongoid/collections/operations.rb +0 -44
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts.rb +0 -25
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  276. data/lib/mongoid/contexts/mongo.rb +0 -487
  277. data/lib/mongoid/criterion/builder.rb +0 -34
  278. data/lib/mongoid/criterion/complex.rb +0 -84
  279. data/lib/mongoid/criterion/creational.rb +0 -34
  280. data/lib/mongoid/criterion/exclusion.rb +0 -110
  281. data/lib/mongoid/criterion/inclusion.rb +0 -290
  282. data/lib/mongoid/criterion/optional.rb +0 -259
  283. data/lib/mongoid/criterion/selector.rb +0 -177
  284. data/lib/mongoid/cursor.rb +0 -88
  285. data/lib/mongoid/default_scope.rb +0 -36
  286. data/lib/mongoid/errors/invalid_type.rb +0 -25
  287. data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
  288. data/lib/mongoid/extensions/array/deletion.rb +0 -29
  289. data/lib/mongoid/extensions/false_class/equality.rb +0 -26
  290. data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
  291. data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
  292. data/lib/mongoid/extensions/hash/scoping.rb +0 -25
  293. data/lib/mongoid/extensions/integer/checks.rb +0 -23
  294. data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
  295. data/lib/mongoid/extensions/object/checks.rb +0 -29
  296. data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
  297. data/lib/mongoid/extensions/object/reflections.rb +0 -48
  298. data/lib/mongoid/extensions/object/substitutable.rb +0 -15
  299. data/lib/mongoid/extensions/object/yoda.rb +0 -44
  300. data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
  301. data/lib/mongoid/extensions/proc/scoping.rb +0 -25
  302. data/lib/mongoid/extensions/string/checks.rb +0 -36
  303. data/lib/mongoid/extensions/string/conversions.rb +0 -22
  304. data/lib/mongoid/extensions/string/inflections.rb +0 -118
  305. data/lib/mongoid/extensions/symbol/checks.rb +0 -23
  306. data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
  307. data/lib/mongoid/extensions/true_class/equality.rb +0 -26
  308. data/lib/mongoid/extras.rb +0 -31
  309. data/lib/mongoid/fields/internal/array.rb +0 -77
  310. data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
  311. data/lib/mongoid/fields/internal/bignum.rb +0 -10
  312. data/lib/mongoid/fields/internal/binary.rb +0 -11
  313. data/lib/mongoid/fields/internal/boolean.rb +0 -58
  314. data/lib/mongoid/fields/internal/date.rb +0 -51
  315. data/lib/mongoid/fields/internal/date_time.rb +0 -28
  316. data/lib/mongoid/fields/internal/false_class.rb +0 -10
  317. data/lib/mongoid/fields/internal/fixnum.rb +0 -10
  318. data/lib/mongoid/fields/internal/float.rb +0 -47
  319. data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
  320. data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
  321. data/lib/mongoid/fields/internal/hash.rb +0 -11
  322. data/lib/mongoid/fields/internal/integer.rb +0 -59
  323. data/lib/mongoid/fields/internal/localized.rb +0 -62
  324. data/lib/mongoid/fields/internal/nil_class.rb +0 -53
  325. data/lib/mongoid/fields/internal/object.rb +0 -11
  326. data/lib/mongoid/fields/internal/object_id.rb +0 -46
  327. data/lib/mongoid/fields/internal/range.rb +0 -61
  328. data/lib/mongoid/fields/internal/set.rb +0 -57
  329. data/lib/mongoid/fields/internal/string.rb +0 -42
  330. data/lib/mongoid/fields/internal/symbol.rb +0 -43
  331. data/lib/mongoid/fields/internal/time.rb +0 -23
  332. data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
  333. data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
  334. data/lib/mongoid/fields/internal/true_class.rb +0 -10
  335. data/lib/mongoid/fields/mappings.rb +0 -42
  336. data/lib/mongoid/fields/serializable.rb +0 -270
  337. data/lib/mongoid/identity.rb +0 -92
  338. data/lib/mongoid/keys.rb +0 -144
  339. data/lib/mongoid/logger.rb +0 -45
  340. data/lib/mongoid/multi_database.rb +0 -36
  341. data/lib/mongoid/named_scope.rb +0 -166
  342. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  343. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  344. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  345. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  346. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  347. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  348. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  349. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -1,45 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Collections #:nodoc:
4
-
5
- # This class wraps the MongoDB master database.
6
- class Master
7
- include Mongoid::Collections::Retry
8
-
9
- attr_reader :collection
10
-
11
- # All read and write operations should delegate to the master connection.
12
- # These operations mimic the methods on a Mongo:Collection.
13
- #
14
- # @example Proxy the driver save.
15
- # collection.save({ :name => "Al" })
16
- Operations::ALL.each do |name|
17
- class_eval <<-EOS, __FILE__, __LINE__
18
- def #{name}(*args)
19
- retry_on_connection_failure do
20
- collection.#{name}(*args)
21
- end
22
- end
23
- EOS
24
- end
25
-
26
- # Create the new database writer. Will create a collection from the
27
- # master database.
28
- #
29
- # @example Create a new wrapped master.
30
- # Master.new(db, "testing")
31
- #
32
- # @param [ Mongo::DB ] master The master database.
33
- # @param [ String ] name The name of the database.
34
- # @param [ Hash ] options The collection options.
35
- #
36
- # @option options [ true, false ] :capped If the collection is capped.
37
- # @option options [ Integer ] :size The capped collection size.
38
- # @option options [ Integer ] :max The maximum number of docs in the
39
- # capped collection.
40
- def initialize(master, name, options = {})
41
- @collection = master.create_collection(name, options)
42
- end
43
- end
44
- end
45
- end
@@ -1,44 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Collections #:nodoc:
4
- module Operations #:nodoc:
5
-
6
- # Constant definining all the read operations available for a
7
- # Mongo:Collection. This is used in delegation.
8
- READ = [
9
- :[],
10
- :db,
11
- :count,
12
- :distinct,
13
- :find,
14
- :find_one,
15
- :group,
16
- :index_information,
17
- :map_reduce,
18
- :mapreduce,
19
- :stats,
20
- :options
21
- ]
22
-
23
- # Constant definining all the write operations available for a
24
- # Mongo:Collection. This is used in delegation.
25
- WRITE = [
26
- :<<,
27
- :create_index,
28
- :drop,
29
- :drop_index,
30
- :drop_indexes,
31
- :find_and_modify,
32
- :insert,
33
- :remove,
34
- :rename,
35
- :save,
36
- :update
37
- ]
38
-
39
- # Convenience constant for getting back all collection operations.
40
- ALL = (READ + WRITE)
41
- PROXIED = ALL - [ :find, :find_one, :map_reduce, :mapreduce, :update ]
42
- end
43
- end
44
- end
@@ -1,181 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Config #:nodoc:
4
-
5
- # This class handles the configuration and initialization of a mongodb
6
- # database from options.
7
- class Database < Hash
8
-
9
- # Configure the database connections. This will return an array
10
- # containing the master and an array of slaves.
11
- #
12
- # @example Configure the connection.
13
- # db.configure
14
- #
15
- # @return [ Array<Mongo::DB, Array<Mongo:DB>> ] The Mongo databases.
16
- #
17
- # @since 2.0.0.rc.1
18
- def configure
19
- [ master.db(name), slaves.map { |slave| slave.db(name) } ]
20
- end
21
-
22
- # Create the new db configuration class.
23
- #
24
- # @example Initialize the class.
25
- # Config::Database.new(
26
- # false, "uri" => { "mongodb://durran:password@localhost:27017/mongoid" }
27
- # )
28
- #
29
- # @param [ Hash ] options The configuration options.
30
- #
31
- # @option options [ String ] :database The database name.
32
- # @option options [ String ] :host The database host.
33
- # @option options [ String ] :password The password for authentication.
34
- # @option options [ Integer ] :port The port for the database.
35
- # @option options [ String ] :uri The uri for the database.
36
- # @option options [ String ] :username The user for authentication.
37
- #
38
- # @since 2.0.0.rc.1
39
- def initialize(options = {})
40
- merge!(options)
41
- end
42
-
43
- private
44
-
45
- # Do we need to authenticate against the database?
46
- #
47
- # @example Are we authenticating?
48
- # db.authenticating?
49
- #
50
- # @return [ true, false ] True if auth is needed, false if not.
51
- #
52
- # @since 2.0.0.rc.1
53
- def authenticating?
54
- username || password
55
- end
56
-
57
- # Takes the supplied options in the hash and created a URI from them to
58
- # pass to the Mongo connection object.
59
- #
60
- # @example Build the URI.
61
- # db.build_uri
62
- #
63
- # @param [ Hash ] options The options to build with.
64
- #
65
- # @return [ String ] A mongo compliant URI string.
66
- #
67
- # @since 2.0.0.rc.1
68
- def build_uri(options = {})
69
- "mongodb://".tap do |base|
70
- base << "#{username}:#{password}@" if authenticating?
71
- base << "#{options["host"] || "localhost"}:#{options["port"] || 27017}"
72
- base << "/#{self["database"]}" if authenticating?
73
- end
74
- end
75
-
76
- # Create the mongo master connection from either the supplied URI
77
- # or a generated one, while setting pool size and logging.
78
- #
79
- # @example Create the connection.
80
- # db.connection
81
- #
82
- # @return [ Mongo::Connection ] The mongo connection.
83
- #
84
- # @since 2.0.0.rc.1
85
- def master
86
- Mongo::Connection.from_uri(uri(self), optional.symbolize_keys).tap do |conn|
87
- conn.apply_saved_authentication
88
- end
89
- end
90
-
91
- # Create the mongo slave connections from either the supplied URI
92
- # or a generated one, while setting pool size and logging.
93
- #
94
- # @example Create the connection.
95
- # db.connection
96
- #
97
- # @return [ Array<Mongo::Connection> ] The mongo slave connections.
98
- #
99
- # @since 2.0.0.rc.1
100
- def slaves
101
- (self["slaves"] || []).map do |options|
102
- Mongo::Connection.from_uri(uri(options), optional(true).symbolize_keys).tap do |conn|
103
- conn.apply_saved_authentication
104
- end
105
- end
106
- end
107
-
108
- # Should we use a logger?
109
- #
110
- # @example Should we use a logger?
111
- # database.logger?
112
- #
113
- # @return [ true, false ] Defaults to true, false if specifically
114
- # defined.
115
- #
116
- # @since 2.2.0
117
- def logger?
118
- self[:logger].nil? || self[:logger] ? true : false
119
- end
120
-
121
- # Convenience for accessing the hash via dot notation.
122
- #
123
- # @example Access a value in alternate syntax.
124
- # db.host
125
- #
126
- # @return [ Object ] The value in the hash.
127
- #
128
- # @since 2.0.0.rc.1
129
- def method_missing(name, *args, &block)
130
- self[name.to_s]
131
- end
132
-
133
- # Get the name of the database, from either the URI supplied or the
134
- # database value in the options.
135
- #
136
- # @example Get the database name.
137
- # db.name
138
- #
139
- # @return [ String ] The database name.
140
- #
141
- # @since 2.0.0.rc.1
142
- def name
143
- db_name = URI.parse(uri(self)).path.to_s.sub("/", "")
144
- db_name.blank? ? database : db_name
145
- end
146
-
147
- # Get the options used in creating the database connection.
148
- #
149
- # @example Get the options.
150
- # db.options
151
- #
152
- # @param [ true, false ] slave Are the options for a slave db?
153
- #
154
- # @return [ Hash ] The hash of configuration options.
155
- #
156
- # @since 2.0.0.rc.1
157
- def optional(slave = false)
158
- ({
159
- :pool_size => pool_size,
160
- :logger => logger? ? Mongoid::Logger.new : nil,
161
- :slave_ok => slave
162
- }).merge(self).reject { |k,v| Config.blacklisted_options.include? k }.
163
- inject({}) { |memo, (k, v)| memo[k.to_sym] = v; memo}
164
- end
165
-
166
- # Get a Mongo compliant URI for the database connection.
167
- #
168
- # @example Get the URI.
169
- # db.uri
170
- #
171
- # @param [ Hash ] options The options hash.
172
- #
173
- # @return [ String ] The URI for the connection.
174
- #
175
- # @since 2.0.0.rc.1
176
- def uri(options = {})
177
- options["uri"] || build_uri(options)
178
- end
179
- end
180
- end
181
- end
@@ -1,80 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Config #:nodoc:
4
- class ReplsetDatabase < Hash
5
-
6
- # Configure the database connections. This will return an array
7
- # containing one Mongo::DB and nil (to keep compatibility with Mongoid::Config::Database)
8
- # If you want the reads to go to a secondary node use the :read_secondary(true): option
9
- #
10
- # @example Configure the connection.
11
- # db.configure
12
- #
13
- # @return [ Array<Mongo::DB, nil ] The Mongo databases.
14
- #
15
- # @since 2.0.0.rc.5
16
- def configure
17
- # yes, construction is weird but the driver wants
18
- # "A list of host-port pairs ending with a hash containing any options"
19
- # mongo likes symbols
20
- options = reject{ |key, value| Config.blacklisted_options.include?(key.to_s) }
21
- options["logger"] = Mongoid::Logger.new
22
- connection = Mongo::ReplSetConnection.new(hosts.clone, options.symbolize_keys)
23
-
24
- if authenticating?
25
- connection.add_auth(database, username, password, nil)
26
- connection.apply_saved_authentication
27
- end
28
-
29
- [ connection.db(database), nil ]
30
- end
31
-
32
- # Do we need to authenticate against the database?
33
- #
34
- # @example Are we authenticating?
35
- # db.authenticating?
36
- #
37
- # @return [ true, false ] True if auth is needed, false if not.
38
- #
39
- # @since 2.0.2
40
- def authenticating?
41
- username || password
42
- end
43
-
44
- # Convenience for accessing the hash via dot notation.
45
- #
46
- # @example Access a value in alternate syntax.
47
- # db.host
48
- #
49
- # @return [ Object ] The value in the hash.
50
- #
51
- # @since 2.0.2
52
- def method_missing(name, *args, &block)
53
- self[name.to_s]
54
- end
55
-
56
- # Create the new db configuration class.
57
- #
58
- # @example Initialize the class.
59
- # Config::ReplsetDatabase.new(
60
- # "hosts" => [[host1,port1],[host2,port2]]
61
- # )
62
- #
63
- # replSet does not supports auth
64
- #
65
- # @param [ Hash ] options The configuration options.
66
- #
67
- # @option options [ Array ] :hosts The database host.
68
- # @option options [ String ] :database The database name.
69
- # @option options [ Boolean ] :read_secondary Tells the driver to read from secondaries.
70
- # ...
71
- #
72
- # @see Mongo::ReplSetConnection for all options
73
- #
74
- # @since 2.0.0.rc.5
75
- def initialize(options = {})
76
- merge!(options)
77
- end
78
- end
79
- end
80
- end
@@ -1,25 +0,0 @@
1
- # encoding: utf-8
2
- require "mongoid/contexts/enumerable"
3
- require "mongoid/contexts/mongo"
4
-
5
- module Mongoid
6
- module Contexts
7
- extend self
8
-
9
- # Determines the context to be used for this criteria. If the class is an
10
- # embedded document, then the context will be the array in the has_many
11
- # association it is in. If the class is a root, then the database itself
12
- # will be the context.
13
- #
14
- # @example Get the context for the criteria.
15
- # Contexts.context_for(criteria)
16
- #
17
- # @param [ Criteria ] criteria The criteria to use.
18
- # @param [ true, false ] embedded Whether this is on embedded documents.
19
- #
20
- # @return [ Enumerable, Mongo ] The appropriate context.
21
- def context_for(criteria, embedded = false)
22
- embedded ? Enumerable.new(criteria) : Mongo.new(criteria)
23
- end
24
- end
25
- end
@@ -1,313 +0,0 @@
1
- # encoding: utf-8
2
- require 'mongoid/contexts/enumerable/sort'
3
-
4
- module Mongoid #:nodoc:
5
- module Contexts #:nodoc:
6
- class Enumerable
7
- include Relations::Embedded::Atomic
8
-
9
- attr_accessor :collection, :criteria
10
-
11
- delegate :blank?, :empty?, :first, :last, :to => :execute
12
- delegate :klass, :documents, :options, :field_list, :selector, :to => :criteria
13
-
14
- # Return aggregation counts of the grouped documents. This will count by
15
- # the first field provided in the fields array.
16
- #
17
- # @example Aggregate on a field.
18
- # person.addresses.only(:street).aggregate
19
- #
20
- # @return [ Hash ] Field values as keys, count as values
21
- def aggregate
22
- {}.tap do |counts|
23
- group.each_pair { |key, value| counts[key] = value.size }
24
- end
25
- end
26
-
27
- # Get the average value for the supplied field.
28
- #
29
- # @example Get the average.
30
- # context.avg(:age)
31
- #
32
- # @return [ Numeric ] A numeric value that is the average.
33
- def avg(field)
34
- total = sum(field)
35
- total ? (total.to_f / count) : nil
36
- end
37
-
38
- # Gets the number of documents in the array. Delegates to size.
39
- #
40
- # @example Get the count.
41
- # context.count
42
- #
43
- # @return [ Integer ] The count of documents.
44
- def count
45
- @count ||= execute.size
46
- end
47
- alias :length :count
48
- alias :size :count
49
-
50
- # Delete all the documents in the database matching the selector.
51
- #
52
- # @example Delete the documents.
53
- # context.delete_all
54
- #
55
- # @return [ Integer ] The number of documents deleted.
56
- #
57
- # @since 2.0.0.rc.1
58
- def delete_all
59
- atomically(:$pull) do
60
- set_collection
61
- count.tap do
62
- filter.each { |doc| doc.delete }
63
- end
64
- end
65
- end
66
- alias :delete :delete_all
67
-
68
- # Destroy all the documents in the database matching the selector.
69
- #
70
- # @example Destroy the documents.
71
- # context.destroy_all
72
- #
73
- # @return [ Integer ] The number of documents destroyed.
74
- #
75
- # @since 2.0.0.rc.1
76
- def destroy_all
77
- atomically(:$pull) do
78
- set_collection
79
- count.tap do
80
- filter.each { |doc| doc.destroy }
81
- end
82
- end
83
- end
84
- alias :destroy :destroy_all
85
-
86
- # Gets an array of distinct values for the supplied field across the
87
- # entire array or the susbset given the criteria.
88
- #
89
- # @example Get the list of distinct values.
90
- # context.distinct(:title)
91
- #
92
- # @return [ Array<String> ] The distinct values.
93
- def distinct(field)
94
- execute.collect { |doc| doc.send(field) }.uniq
95
- end
96
-
97
- # Enumerable implementation of execute. Returns matching documents for
98
- # the selector, and adds options if supplied.
99
- #
100
- # @example Execute the context.
101
- # context.execute
102
- #
103
- # @return [ Array<Document> ] Documents that matched the selector.
104
- def execute
105
- limit(sort(filter)) || []
106
- end
107
-
108
- # Groups the documents by the first field supplied in the field options.
109
- #
110
- # @example Group the context.
111
- # context.group
112
- #
113
- # @return [ Hash ] Field values as keys, arrays of documents as values.
114
- def group
115
- field = field_list.first
116
- execute.group_by { |doc| doc.send(field) }
117
- end
118
-
119
- # Create the new enumerable context. This will need the selector and
120
- # options from a +Criteria+ and a documents array that is the underlying
121
- # array of embedded documents from a has many association.
122
- #
123
- # @example Create a new context.
124
- # Mongoid::Contexts::Enumerable.new(criteria)
125
- #
126
- # @param [ Criteria ] criteria The criteria for the context.
127
- def initialize(criteria)
128
- @criteria = criteria
129
- end
130
-
131
- # Iterate over each +Document+ in the results. This can take an optional
132
- # block to pass to each argument in the results.
133
- #
134
- # @example Iterate over the documents.
135
- # context.iterate { |doc| p doc }
136
- def iterate(&block)
137
- execute.each(&block)
138
- end
139
-
140
- # Get the largest value for the field in all the documents.
141
- #
142
- # @example Get the max value.
143
- # context.max(:age)
144
- #
145
- # @return [ Numeric ] The numerical largest value.
146
- def max(field)
147
- determine(field, :>=)
148
- end
149
-
150
- # Get the smallest value for the field in all the documents.
151
- #
152
- # @example Get the minimum value.
153
- # context.min(:age)
154
- #
155
- # @return [ Numeric ] The numerical smallest value.
156
- def min(field)
157
- determine(field, :<=)
158
- end
159
-
160
- # Get one document.
161
- #
162
- # @example Get one document.
163
- # context.one
164
- #
165
- # @return [ Document ] The first document in the array.
166
- alias :one :first
167
-
168
- # Get one document and tell the criteria to skip this record on
169
- # successive calls.
170
- #
171
- # @example Shift the documents.
172
- # context.shift
173
- #
174
- # @return [ Document ] The first document in the array.
175
- def shift
176
- first.tap do |document|
177
- self.criteria = criteria.skip((options[:skip] || 0) + 1)
178
- end
179
- end
180
-
181
- # Get the sum of the field values for all the documents.
182
- #
183
- # @example Get the sum of the field.
184
- # context.sum(:cost)
185
- #
186
- # @return [ Numeric ] The numerical sum of all the document field values.
187
- def sum(field)
188
- sum = execute.inject(nil) do |memo, doc|
189
- value = doc.send(field) || 0
190
- memo ? memo += value : value
191
- end
192
- end
193
-
194
- # Very basic update that will perform a simple atomic $set of the
195
- # attributes provided in the hash. Can be expanded to later for more
196
- # robust functionality.
197
- #
198
- # @example Update all matching documents.
199
- # context.update_all(:title => "Sir")
200
- #
201
- # @param [ Hash ] attributes The sets to perform.
202
- #
203
- # @since 2.0.0.rc.6
204
- def update_all(attributes = nil)
205
- iterate do |doc|
206
- doc.update_attributes(attributes || {})
207
- end
208
- end
209
- alias :update :update_all
210
-
211
- protected
212
-
213
- # Get the root class collection name.
214
- #
215
- # @example Get the root class collection name.
216
- # context.collection_name
217
- #
218
- # @return [ String ] The name of the collection.
219
- #
220
- # @since 2.4.3
221
- def collection_name
222
- root ? root.collection_name : nil
223
- end
224
-
225
- # Filters the documents against the criteria's selector
226
- #
227
- # @example Filter the documents.
228
- # context.filter
229
- #
230
- # @return [ Array ] The documents filtered.
231
- def filter
232
- documents.select { |document| document.matches?(selector) }
233
- end
234
-
235
- # If the field exists, perform the comparison and set if true.
236
- #
237
- # @example Compare.
238
- # context.determine
239
- #
240
- # @return [ Array<Document> ] The matching documents.
241
- def determine(field, operator)
242
- matching = documents.inject(nil) do |memo, doc|
243
- value = doc.send(field) || 0
244
- (memo && memo.send(operator, value)) ? memo : value
245
- end
246
- end
247
-
248
- # Limits the result set if skip and limit options.
249
- #
250
- # @example Limit the results.
251
- # context.limit(documents)
252
- #
253
- # @return [ Array<Document> ] The limited documents.
254
- def limit(documents)
255
- skip, limit = options[:skip], options[:limit]
256
- if skip && limit
257
- return documents.slice(skip, limit)
258
- elsif limit
259
- return documents.first(limit)
260
- elsif skip
261
- return documents.slice(skip..-1)
262
- end
263
- documents
264
- end
265
-
266
- # Get the root document for the enumerable.
267
- #
268
- # @example Get the root document.
269
- # context.root
270
- #
271
- # @return [ Document ] The root.
272
- def root
273
- @root ||= documents.first.try(:_root)
274
- end
275
-
276
- # Get the root class for the enumerable.
277
- #
278
- # @example Get the root class.
279
- # context.root_class
280
- #
281
- # @return [ Class ] The root class.
282
- def root_class
283
- @root_class ||= root ? root.class : nil
284
- end
285
-
286
- # Set the collection to the collection of the root document.
287
- #
288
- # @example Set the collection.
289
- # context.set_collection
290
- #
291
- # @return [ Collection ] The root collection.
292
- def set_collection
293
- @collection = root.collection if root && !root.embedded?
294
- end
295
-
296
- # Sorts the result set if sort options have been set.
297
- #
298
- # @example Sort the documents.
299
- # context.sort(documents)
300
- #
301
- # @return [ Array<Document> ] The sorted documents.
302
- def sort(documents)
303
- return documents if options[:sort].blank?
304
- documents.sort_by do |document|
305
- options[:sort].map do |key, direction|
306
- key = key.to_s.gsub(/(.*)\.#{I18n.locale}$/, '\1')
307
- Sort.new(document.send(key), direction)
308
- end
309
- end
310
- end
311
- end
312
- end
313
- end