mongoid 2.4.9 → 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 +869 -8
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -17
  5. data/lib/config/locales/en.yml +441 -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 +16 -6
  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 +100 -42
  16. data/lib/mongoid/collections/retry.rb +2 -3
  17. data/lib/mongoid/components.rb +10 -22
  18. data/lib/mongoid/config/environment.rb +4 -3
  19. data/lib/mongoid/config/inflections.rb +6 -0
  20. data/lib/mongoid/config/options.rb +1 -1
  21. data/lib/mongoid/config/validators/option.rb +25 -0
  22. data/lib/mongoid/config/validators/session.rb +140 -0
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config.rb +87 -233
  25. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  26. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  27. data/lib/mongoid/contextual/atomic.rb +179 -0
  28. data/lib/mongoid/contextual/command.rb +43 -0
  29. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  30. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  31. data/lib/mongoid/contextual/memory.rb +383 -0
  32. data/lib/mongoid/contextual/mongo.rb +543 -0
  33. data/lib/mongoid/contextual.rb +50 -0
  34. data/lib/mongoid/copyable.rb +2 -2
  35. data/lib/mongoid/criteria.rb +436 -248
  36. data/lib/mongoid/criterion/inspection.rb +14 -8
  37. data/lib/mongoid/criterion/scoping.rb +114 -44
  38. data/lib/mongoid/dirty.rb +152 -67
  39. data/lib/mongoid/document.rb +68 -49
  40. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  41. data/lib/mongoid/errors/callback.rb +5 -6
  42. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  43. data/lib/mongoid/errors/document_not_found.rb +98 -17
  44. data/lib/mongoid/errors/eager_load.rb +3 -6
  45. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  46. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  47. data/lib/mongoid/errors/invalid_database.rb +3 -3
  48. data/lib/mongoid/errors/invalid_field.rb +54 -8
  49. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  50. data/lib/mongoid/errors/invalid_find.rb +3 -3
  51. data/lib/mongoid/errors/invalid_index.rb +28 -0
  52. data/lib/mongoid/errors/invalid_options.rb +4 -4
  53. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  54. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  55. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  56. data/lib/mongoid/errors/invalid_time.rb +3 -6
  57. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  58. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  59. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  60. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  61. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  62. data/lib/mongoid/errors/no_default_session.rb +23 -0
  63. data/lib/mongoid/errors/no_environment.rb +3 -3
  64. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -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 +22 -1
  80. data/lib/mongoid/extensions/array.rb +127 -0
  81. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  82. data/lib/mongoid/extensions/boolean.rb +24 -0
  83. data/lib/mongoid/extensions/date.rb +70 -0
  84. data/lib/mongoid/extensions/date_time.rb +68 -0
  85. data/lib/mongoid/extensions/false_class.rb +26 -0
  86. data/lib/mongoid/extensions/float.rb +44 -0
  87. data/lib/mongoid/extensions/hash.rb +91 -0
  88. data/lib/mongoid/extensions/integer.rb +54 -0
  89. data/lib/mongoid/extensions/module.rb +28 -0
  90. data/lib/mongoid/extensions/nil_class.rb +21 -0
  91. data/lib/mongoid/extensions/object.rb +188 -0
  92. data/lib/mongoid/extensions/object_id.rb +53 -0
  93. data/lib/mongoid/extensions/range.rb +55 -0
  94. data/lib/mongoid/extensions/regexp.rb +27 -0
  95. data/lib/mongoid/extensions/set.rb +55 -0
  96. data/lib/mongoid/extensions/string.rb +155 -0
  97. data/lib/mongoid/extensions/symbol.rb +54 -0
  98. data/lib/mongoid/extensions/time.rb +78 -0
  99. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  100. data/lib/mongoid/extensions/true_class.rb +26 -0
  101. data/lib/mongoid/extensions.rb +28 -76
  102. data/lib/mongoid/factory.rb +4 -4
  103. data/lib/mongoid/fields/foreign_key.rb +134 -0
  104. data/lib/mongoid/fields/localized.rb +73 -0
  105. data/lib/mongoid/fields/standard.rb +268 -0
  106. data/lib/mongoid/fields/validators/macro.rb +83 -0
  107. data/lib/mongoid/fields/validators.rb +2 -0
  108. data/lib/mongoid/fields.rb +129 -194
  109. data/lib/mongoid/finders.rb +42 -43
  110. data/lib/mongoid/hierarchy.rb +25 -14
  111. data/lib/mongoid/identity_map.rb +39 -12
  112. data/lib/mongoid/indexes/validators/options.rb +80 -0
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/inspection.rb +1 -1
  115. data/lib/mongoid/javascript.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 +8 -10
  134. data/lib/mongoid/nested_attributes.rb +17 -9
  135. data/lib/mongoid/observer.rb +1 -2
  136. data/lib/mongoid/paranoia.rb +13 -18
  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.rb +6 -19
  159. data/lib/mongoid/persistence.rb +64 -27
  160. data/lib/mongoid/railtie.rb +26 -11
  161. data/lib/mongoid/railties/database.rake +22 -108
  162. data/lib/mongoid/relations/accessors.rb +119 -19
  163. data/lib/mongoid/relations/auto_save.rb +59 -5
  164. data/lib/mongoid/relations/binding.rb +211 -2
  165. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  166. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  167. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  168. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  169. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  170. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  171. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  172. data/lib/mongoid/relations/builder.rb +3 -3
  173. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  174. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  175. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  176. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  177. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  178. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  179. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  180. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  181. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  182. data/lib/mongoid/relations/builders.rb +19 -16
  183. data/lib/mongoid/relations/cascading/delete.rb +12 -4
  184. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  185. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  186. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  187. data/lib/mongoid/relations/cascading.rb +6 -4
  188. data/lib/mongoid/relations/constraint.rb +4 -3
  189. data/lib/mongoid/relations/conversions.rb +5 -6
  190. data/lib/mongoid/relations/cyclic.rb +7 -7
  191. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  192. data/lib/mongoid/relations/embedded/in.rb +23 -12
  193. data/lib/mongoid/relations/embedded/many.rb +99 -148
  194. data/lib/mongoid/relations/embedded/one.rb +25 -14
  195. data/lib/mongoid/relations/macros.rb +105 -60
  196. data/lib/mongoid/relations/many.rb +93 -14
  197. data/lib/mongoid/relations/metadata.rb +231 -45
  198. data/lib/mongoid/relations/nested_builder.rb +3 -5
  199. data/lib/mongoid/relations/one.rb +14 -2
  200. data/lib/mongoid/relations/options.rb +2 -2
  201. data/lib/mongoid/relations/polymorphic.rb +9 -9
  202. data/lib/mongoid/relations/proxy.rb +60 -31
  203. data/lib/mongoid/relations/referenced/in.rb +40 -15
  204. data/lib/mongoid/relations/referenced/many.rb +116 -122
  205. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  206. data/lib/mongoid/relations/referenced/one.rb +34 -13
  207. data/lib/mongoid/relations/reflections.rb +3 -3
  208. data/lib/mongoid/relations/synchronization.rb +19 -23
  209. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  210. data/lib/mongoid/relations/touchable.rb +32 -0
  211. data/lib/mongoid/relations.rb +6 -6
  212. data/lib/mongoid/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +13 -30
  215. data/lib/mongoid/sessions/factory.rb +106 -0
  216. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  217. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions.rb +359 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded/lifecycle.rb +21 -21
  223. data/lib/mongoid/threaded/sessions.rb +0 -0
  224. data/lib/mongoid/threaded.rb +167 -59
  225. data/lib/mongoid/timestamps/created.rb +8 -4
  226. data/lib/mongoid/timestamps/timeless.rb +6 -4
  227. data/lib/mongoid/timestamps/updated.rb +3 -3
  228. data/lib/mongoid/timestamps.rb +1 -1
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations/associated.rb +2 -2
  231. data/lib/mongoid/validations/format.rb +2 -2
  232. data/lib/mongoid/validations/presence.rb +34 -4
  233. data/lib/mongoid/validations/uniqueness.rb +103 -25
  234. data/lib/mongoid/validations.rb +62 -20
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/mongoid.rb +24 -39
  238. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  239. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  240. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  241. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  242. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  243. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  244. data/lib/rails/generators/mongoid_generator.rb +5 -5
  245. data/lib/rails/mongoid.rb +69 -25
  246. metadata +93 -155
  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/master.rb +0 -45
  269. data/lib/mongoid/collections/operations.rb +0 -44
  270. data/lib/mongoid/collections.rb +0 -120
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/mongo.rb +0 -485
  276. data/lib/mongoid/contexts.rb +0 -25
  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 -108
  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 -76
  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 -31
  341. data/lib/mongoid/named_scope.rb +0 -166
  342. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  343. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  344. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  345. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  346. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  347. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  348. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  349. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -1,157 +0,0 @@
1
- # encoding: utf-8
2
- require "mongoid/collections/retry"
3
- require "mongoid/collections/operations"
4
- require "mongoid/collections/master"
5
-
6
- module Mongoid #:nodoc
7
-
8
- # This class is the Mongoid wrapper to the Mongo Ruby driver's collection
9
- # object.
10
- class Collection
11
- attr_reader :counter, :klass, :name
12
-
13
- # All write operations should delegate to the master connection. These
14
- # operations mimic the methods on a Mongo:Collection.
15
- #
16
- # @example Delegate the operation.
17
- # collection.save({ :name => "Al" })
18
- delegate *(Collections::Operations::PROXIED.dup << {:to => :master})
19
-
20
- # Get the unwrapped driver collection for this mongoid collection.
21
- #
22
- # @example Get the driver collection.
23
- # collection.driver
24
- #
25
- # @return [ Mongo::Collection ] The driver collection.
26
- #
27
- # @since 2.2.0
28
- def driver
29
- master.collection
30
- end
31
-
32
- # Find documents from the database given a selector and options.
33
- #
34
- # @example Find documents in the collection.
35
- # collection.find({ :test => "value" })
36
- #
37
- # @param [ Hash ] selector The query selector.
38
- # @param [ Hash ] options The options to pass to the db.
39
- #
40
- # @return [ Cursor ] The results.
41
- def find(selector = {}, options = {})
42
- cursor = Mongoid::Cursor.new(klass, self, master(options).find(selector, options))
43
- if block_given?
44
- yield cursor; cursor.close
45
- else
46
- cursor
47
- end
48
- end
49
-
50
- # Find the first document from the database given a selector and options.
51
- #
52
- # @example Find one document.
53
- # collection.find_one({ :test => "value" })
54
- #
55
- # @param [ Hash ] selector The query selector.
56
- # @param [ Hash ] options The options to pass to the db.
57
- #
58
- # @return [ Document, nil ] A matching document or nil if none found.
59
- def find_one(selector = {}, options = {})
60
- master(options).find_one(selector, options)
61
- end
62
-
63
- # Initialize a new Mongoid::Collection, setting up the master, slave, and
64
- # name attributes. Masters will be used for writes, slaves for reads.
65
- #
66
- # @example Create the new collection.
67
- # Collection.new(masters, slaves, "test")
68
- #
69
- # @param [ Class ] klass The class the collection is for.
70
- # @param [ String ] name The name of the collection.
71
- # @param [ Hash ] options The collection options.
72
- #
73
- # @option options [ true, false ] :capped If the collection is capped.
74
- # @option options [ Integer ] :size The capped collection size.
75
- # @option options [ Integer ] :max The maximum number of docs in the
76
- # capped collection.
77
- def initialize(klass, name, options = {})
78
- @klass, @name, @options = klass, name, options || {}
79
- end
80
-
81
- # Inserts one or more documents in the collection.
82
- #
83
- # @example Insert documents.
84
- # collection.insert(
85
- # { "field" => "value" },
86
- # :safe => true
87
- # )
88
- #
89
- # @param [ Hash, Array<Hash> ] documents A single document or multiples.
90
- # @param [ Hash ] options The options.
91
- #
92
- # @since 2.0.2, batch-relational-insert
93
- def insert(documents, options = {})
94
- consumer = Threaded.insert(name)
95
- if consumer
96
- consumer.consume(documents, options)
97
- else
98
- master(options).insert(documents, options)
99
- end
100
- end
101
-
102
- # Perform a map/reduce on the documents.
103
- #
104
- # @example Perform the map/reduce.
105
- # collection.map_reduce(map, reduce)
106
- #
107
- # @param [ String ] map The map javascript function.
108
- # @param [ String ] reduce The reduce javascript function.
109
- # @param [ Hash ] options The options to pass to the db.
110
- #
111
- # @return [ Cursor ] The results.
112
- def map_reduce(map, reduce, options = {})
113
- master(options).map_reduce(map, reduce, options)
114
- end
115
- alias :mapreduce :map_reduce
116
-
117
- # Return the object responsible for writes to the database. This will
118
- # always return a collection associated with the Master DB.
119
- #
120
- # @example Get the master connection.
121
- # collection.master
122
- #
123
- # @return [ Master ] The master connection.
124
- def master(options = {})
125
- options.delete(:cache)
126
- db = Mongoid.databases[klass.database] || Mongoid.master
127
- @master ||= Collections::Master.new(db, @name, @options)
128
- end
129
-
130
- # Updates one or more documents in the collection.
131
- #
132
- # @example Update documents.
133
- # collection.update(
134
- # { "_id" => BSON::OjectId.new },
135
- # { "$push" => { "addresses" => { "_id" => "street" } } },
136
- # :safe => true
137
- # )
138
- #
139
- # @param [ Hash ] selector The document selector.
140
- # @param [ Hash ] document The modifier.
141
- # @param [ Hash ] options The options.
142
- #
143
- # @since 2.0.0
144
- def update(selector, document, options = {})
145
- updater = Threaded.update_consumer(name)
146
- if updater
147
- updater.consume(selector, document, options)
148
- else
149
- master(options).update(selector, document, options)
150
- end
151
- end
152
-
153
- def drop(*args)
154
- @master = nil if master.drop
155
- end
156
- end
157
- end
@@ -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,120 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc
3
-
4
- # The collections module is used for providing functionality around setting
5
- # up and updating collections.
6
- module Collections
7
- extend ActiveSupport::Concern
8
-
9
- included do
10
- cattr_accessor :_collection, :collection_name
11
- self.collection_name = self.name.collectionize
12
- end
13
-
14
- # Get the collection for the class.
15
- #
16
- # @note Defining methods instead of delegate to avoid calls to
17
- # Kernel.caller for class load performance reasons.
18
- #
19
- # @example Get the collection.
20
- # person.collection
21
- #
22
- # @return [ Collection ] The class collection.
23
- #
24
- # @since 1.0.0
25
- def collection
26
- self.class.collection
27
- end
28
-
29
- # Get the database for the class.
30
- #
31
- # @note Defining methods instead of delegate to avoid calls to
32
- # Kernel.caller for class load performance reasons.
33
- #
34
- # @example Get the database.
35
- # person.db
36
- #
37
- # @return [ DB ] The class db.
38
- #
39
- # @since 1.0.0
40
- def db
41
- self.class.db
42
- end
43
-
44
- module ClassMethods #:nodoc:
45
-
46
- # Returns the collection associated with this +Document+. If the
47
- # document is embedded, there will be no collection associated
48
- # with it unless it's in a cyclic relation.
49
- #
50
- # @example Get the collection.
51
- # Model.collection
52
- #
53
- # @return [ Collection ] The Mongoid collection wrapper.
54
- def collection
55
- raise Errors::InvalidCollection.new(self) if embedded? && !cyclic
56
- self._collection || set_collection
57
- add_indexes; self._collection
58
- end
59
-
60
- # Return the database associated with this collection.
61
- #
62
- # @example Get the database object.
63
- # Model.db
64
- #
65
- # @return [ Mongo::DB ] The Mongo daatabase object.
66
- def db
67
- collection.db
68
- end
69
-
70
- # Convenience method for getting index information from the collection.
71
- #
72
- # @example Get the index information from the collection.
73
- # Model.index_information
74
- #
75
- # @return [ Array ] The collection index information.
76
- def index_information
77
- collection.index_information
78
- end
79
-
80
- # Macro for setting the collection name to store in.
81
- #
82
- # @example Store in a separate collection than the default.
83
- # Model.store_in :population
84
- #
85
- # @example Store in a capped collection.
86
- # Model.store_in :population, :capped => true, :max => 10000
87
- #
88
- # @param [ Symbol ] name The name of the collection.
89
- # @param [ Hash ] options The collection options.
90
- #
91
- # @option options [ true, false ] :capped If the collection is capped.
92
- # @option options [ Integer ] :size The capped collection size.
93
- # @option options [ Integer ] :max The maximum number of docs in the
94
- # capped collection.
95
- def store_in(name, options = {})
96
- self.collection_name = name.to_s
97
- set_collection(options)
98
- end
99
-
100
- protected
101
-
102
- # Set the collection on the class.
103
- #
104
- # @example Set the collection.
105
- # Model.set_collection
106
- #
107
- # @param [ Hash ] options The collection options.
108
- #
109
- # @option options [ true, false ] :capped If the collection is capped.
110
- # @option options [ Integer ] :size The capped collection size.
111
- # @option options [ Integer ] :max The maximum number of docs in the
112
- # capped collection.
113
-
114
- # @return [ Collection ] The Mongoid collection wrapper.
115
- def set_collection(options = {})
116
- self._collection = Collection.new(self, self.collection_name, options)
117
- end
118
- end
119
- end
120
- 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)
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,43 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Contexts #:nodoc:
4
- class Enumerable
5
- class Sort
6
- attr_reader :value, :direction
7
-
8
- # Create a new sorting object. This requires a value and a sort
9
- # direction of +:asc+ or +:desc+.
10
- def initialize(value, direction)
11
- @value = value
12
- @direction = direction
13
- end
14
-
15
- # Return +true+ if the direction is +:asc+, otherwise false.
16
- def ascending?
17
- direction == :asc
18
- end
19
-
20
- # Compare two +Sort+ objects against each other, taking into
21
- # consideration the direction of the sorting.
22
- def <=>(other)
23
- cmp = compare(value, other.value)
24
- ascending? ? cmp : cmp * -1
25
- end
26
-
27
- private
28
-
29
- # Compare two values allowing for nil values.
30
- def compare(a, b)
31
- case
32
- when a.nil?
33
- b.nil? ? 0 : 1
34
- when b.nil?
35
- -1
36
- else
37
- a <=> b
38
- end
39
- end
40
- end
41
- end
42
- end
43
- end