mongoid-multi-db 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 (276) hide show
  1. data/CHANGELOG.md +615 -0
  2. data/LICENSE +20 -0
  3. data/README.md +62 -0
  4. data/Rakefile +49 -0
  5. data/lib/config/locales/bg.yml +54 -0
  6. data/lib/config/locales/de.yml +54 -0
  7. data/lib/config/locales/en-GB.yml +55 -0
  8. data/lib/config/locales/en.yml +55 -0
  9. data/lib/config/locales/es.yml +52 -0
  10. data/lib/config/locales/fr.yml +55 -0
  11. data/lib/config/locales/hi.yml +46 -0
  12. data/lib/config/locales/hu.yml +57 -0
  13. data/lib/config/locales/id.yml +55 -0
  14. data/lib/config/locales/it.yml +52 -0
  15. data/lib/config/locales/ja.yml +50 -0
  16. data/lib/config/locales/kr.yml +47 -0
  17. data/lib/config/locales/nl.yml +52 -0
  18. data/lib/config/locales/pl.yml +52 -0
  19. data/lib/config/locales/pt-BR.yml +53 -0
  20. data/lib/config/locales/pt.yml +53 -0
  21. data/lib/config/locales/ro.yml +59 -0
  22. data/lib/config/locales/ru.yml +54 -0
  23. data/lib/config/locales/sv.yml +53 -0
  24. data/lib/config/locales/vi.yml +55 -0
  25. data/lib/config/locales/zh-CN.yml +46 -0
  26. data/lib/mongoid.rb +148 -0
  27. data/lib/mongoid/atomic.rb +230 -0
  28. data/lib/mongoid/atomic/modifiers.rb +243 -0
  29. data/lib/mongoid/atomic/paths.rb +3 -0
  30. data/lib/mongoid/atomic/paths/embedded.rb +43 -0
  31. data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
  32. data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
  33. data/lib/mongoid/atomic/paths/root.rb +40 -0
  34. data/lib/mongoid/attributes.rb +234 -0
  35. data/lib/mongoid/attributes/processing.rb +146 -0
  36. data/lib/mongoid/callbacks.rb +135 -0
  37. data/lib/mongoid/collection.rb +153 -0
  38. data/lib/mongoid/collection_proxy.rb +59 -0
  39. data/lib/mongoid/collections.rb +120 -0
  40. data/lib/mongoid/collections/master.rb +45 -0
  41. data/lib/mongoid/collections/operations.rb +44 -0
  42. data/lib/mongoid/collections/retry.rb +46 -0
  43. data/lib/mongoid/components.rb +96 -0
  44. data/lib/mongoid/config.rb +347 -0
  45. data/lib/mongoid/config/database.rb +186 -0
  46. data/lib/mongoid/config/replset_database.rb +82 -0
  47. data/lib/mongoid/connection_proxy.rb +30 -0
  48. data/lib/mongoid/contexts.rb +25 -0
  49. data/lib/mongoid/contexts/enumerable.rb +288 -0
  50. data/lib/mongoid/contexts/enumerable/sort.rb +43 -0
  51. data/lib/mongoid/contexts/mongo.rb +409 -0
  52. data/lib/mongoid/copyable.rb +48 -0
  53. data/lib/mongoid/criteria.rb +418 -0
  54. data/lib/mongoid/criterion/builder.rb +34 -0
  55. data/lib/mongoid/criterion/complex.rb +84 -0
  56. data/lib/mongoid/criterion/creational.rb +34 -0
  57. data/lib/mongoid/criterion/exclusion.rb +108 -0
  58. data/lib/mongoid/criterion/inclusion.rb +305 -0
  59. data/lib/mongoid/criterion/inspection.rb +22 -0
  60. data/lib/mongoid/criterion/optional.rb +232 -0
  61. data/lib/mongoid/criterion/selector.rb +153 -0
  62. data/lib/mongoid/cursor.rb +86 -0
  63. data/lib/mongoid/database_proxy.rb +97 -0
  64. data/lib/mongoid/default_scope.rb +36 -0
  65. data/lib/mongoid/dirty.rb +110 -0
  66. data/lib/mongoid/document.rb +280 -0
  67. data/lib/mongoid/errors.rb +17 -0
  68. data/lib/mongoid/errors/callback.rb +26 -0
  69. data/lib/mongoid/errors/document_not_found.rb +28 -0
  70. data/lib/mongoid/errors/eager_load.rb +25 -0
  71. data/lib/mongoid/errors/invalid_collection.rb +18 -0
  72. data/lib/mongoid/errors/invalid_database.rb +19 -0
  73. data/lib/mongoid/errors/invalid_field.rb +18 -0
  74. data/lib/mongoid/errors/invalid_find.rb +19 -0
  75. data/lib/mongoid/errors/invalid_options.rb +28 -0
  76. data/lib/mongoid/errors/invalid_time.rb +25 -0
  77. data/lib/mongoid/errors/invalid_type.rb +25 -0
  78. data/lib/mongoid/errors/mixed_relations.rb +37 -0
  79. data/lib/mongoid/errors/mongoid_error.rb +26 -0
  80. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
  81. data/lib/mongoid/errors/unsaved_document.rb +23 -0
  82. data/lib/mongoid/errors/unsupported_version.rb +20 -0
  83. data/lib/mongoid/errors/validations.rb +23 -0
  84. data/lib/mongoid/extensions.rb +82 -0
  85. data/lib/mongoid/extensions/array/deletion.rb +29 -0
  86. data/lib/mongoid/extensions/false_class/equality.rb +26 -0
  87. data/lib/mongoid/extensions/hash/criteria_helpers.rb +45 -0
  88. data/lib/mongoid/extensions/hash/scoping.rb +25 -0
  89. data/lib/mongoid/extensions/integer/checks.rb +23 -0
  90. data/lib/mongoid/extensions/nil/collectionization.rb +23 -0
  91. data/lib/mongoid/extensions/object/checks.rb +29 -0
  92. data/lib/mongoid/extensions/object/reflections.rb +48 -0
  93. data/lib/mongoid/extensions/object/substitutable.rb +15 -0
  94. data/lib/mongoid/extensions/object/yoda.rb +44 -0
  95. data/lib/mongoid/extensions/object_id/conversions.rb +60 -0
  96. data/lib/mongoid/extensions/proc/scoping.rb +25 -0
  97. data/lib/mongoid/extensions/string/checks.rb +36 -0
  98. data/lib/mongoid/extensions/string/conversions.rb +22 -0
  99. data/lib/mongoid/extensions/string/inflections.rb +118 -0
  100. data/lib/mongoid/extensions/symbol/checks.rb +23 -0
  101. data/lib/mongoid/extensions/symbol/inflections.rb +66 -0
  102. data/lib/mongoid/extensions/true_class/equality.rb +26 -0
  103. data/lib/mongoid/extras.rb +31 -0
  104. data/lib/mongoid/factory.rb +46 -0
  105. data/lib/mongoid/fields.rb +332 -0
  106. data/lib/mongoid/fields/mappings.rb +41 -0
  107. data/lib/mongoid/fields/serializable.rb +201 -0
  108. data/lib/mongoid/fields/serializable/array.rb +49 -0
  109. data/lib/mongoid/fields/serializable/big_decimal.rb +42 -0
  110. data/lib/mongoid/fields/serializable/bignum.rb +10 -0
  111. data/lib/mongoid/fields/serializable/binary.rb +11 -0
  112. data/lib/mongoid/fields/serializable/boolean.rb +43 -0
  113. data/lib/mongoid/fields/serializable/date.rb +51 -0
  114. data/lib/mongoid/fields/serializable/date_time.rb +28 -0
  115. data/lib/mongoid/fields/serializable/fixnum.rb +10 -0
  116. data/lib/mongoid/fields/serializable/float.rb +32 -0
  117. data/lib/mongoid/fields/serializable/foreign_keys/array.rb +42 -0
  118. data/lib/mongoid/fields/serializable/foreign_keys/object.rb +47 -0
  119. data/lib/mongoid/fields/serializable/hash.rb +11 -0
  120. data/lib/mongoid/fields/serializable/integer.rb +44 -0
  121. data/lib/mongoid/fields/serializable/localized.rb +41 -0
  122. data/lib/mongoid/fields/serializable/nil_class.rb +38 -0
  123. data/lib/mongoid/fields/serializable/object.rb +11 -0
  124. data/lib/mongoid/fields/serializable/object_id.rb +31 -0
  125. data/lib/mongoid/fields/serializable/range.rb +42 -0
  126. data/lib/mongoid/fields/serializable/set.rb +42 -0
  127. data/lib/mongoid/fields/serializable/string.rb +27 -0
  128. data/lib/mongoid/fields/serializable/symbol.rb +27 -0
  129. data/lib/mongoid/fields/serializable/time.rb +23 -0
  130. data/lib/mongoid/fields/serializable/time_with_zone.rb +23 -0
  131. data/lib/mongoid/fields/serializable/timekeeping.rb +106 -0
  132. data/lib/mongoid/finders.rb +152 -0
  133. data/lib/mongoid/hierarchy.rb +120 -0
  134. data/lib/mongoid/identity.rb +92 -0
  135. data/lib/mongoid/identity_map.rb +119 -0
  136. data/lib/mongoid/indexes.rb +54 -0
  137. data/lib/mongoid/inspection.rb +54 -0
  138. data/lib/mongoid/javascript.rb +20 -0
  139. data/lib/mongoid/javascript/functions.yml +63 -0
  140. data/lib/mongoid/json.rb +16 -0
  141. data/lib/mongoid/keys.rb +144 -0
  142. data/lib/mongoid/logger.rb +39 -0
  143. data/lib/mongoid/matchers.rb +32 -0
  144. data/lib/mongoid/matchers/all.rb +21 -0
  145. data/lib/mongoid/matchers/and.rb +30 -0
  146. data/lib/mongoid/matchers/default.rb +70 -0
  147. data/lib/mongoid/matchers/exists.rb +23 -0
  148. data/lib/mongoid/matchers/gt.rb +21 -0
  149. data/lib/mongoid/matchers/gte.rb +21 -0
  150. data/lib/mongoid/matchers/in.rb +21 -0
  151. data/lib/mongoid/matchers/lt.rb +21 -0
  152. data/lib/mongoid/matchers/lte.rb +21 -0
  153. data/lib/mongoid/matchers/ne.rb +21 -0
  154. data/lib/mongoid/matchers/nin.rb +21 -0
  155. data/lib/mongoid/matchers/or.rb +33 -0
  156. data/lib/mongoid/matchers/size.rb +21 -0
  157. data/lib/mongoid/matchers/strategies.rb +93 -0
  158. data/lib/mongoid/multi_database.rb +31 -0
  159. data/lib/mongoid/multi_parameter_attributes.rb +106 -0
  160. data/lib/mongoid/named_scope.rb +146 -0
  161. data/lib/mongoid/nested_attributes.rb +54 -0
  162. data/lib/mongoid/observer.rb +170 -0
  163. data/lib/mongoid/paranoia.rb +158 -0
  164. data/lib/mongoid/persistence.rb +264 -0
  165. data/lib/mongoid/persistence/atomic.rb +223 -0
  166. data/lib/mongoid/persistence/atomic/add_to_set.rb +35 -0
  167. data/lib/mongoid/persistence/atomic/bit.rb +37 -0
  168. data/lib/mongoid/persistence/atomic/inc.rb +31 -0
  169. data/lib/mongoid/persistence/atomic/operation.rb +85 -0
  170. data/lib/mongoid/persistence/atomic/pop.rb +34 -0
  171. data/lib/mongoid/persistence/atomic/pull.rb +34 -0
  172. data/lib/mongoid/persistence/atomic/pull_all.rb +34 -0
  173. data/lib/mongoid/persistence/atomic/push.rb +31 -0
  174. data/lib/mongoid/persistence/atomic/push_all.rb +31 -0
  175. data/lib/mongoid/persistence/atomic/rename.rb +31 -0
  176. data/lib/mongoid/persistence/atomic/sets.rb +30 -0
  177. data/lib/mongoid/persistence/atomic/unset.rb +28 -0
  178. data/lib/mongoid/persistence/deletion.rb +32 -0
  179. data/lib/mongoid/persistence/insertion.rb +41 -0
  180. data/lib/mongoid/persistence/modification.rb +37 -0
  181. data/lib/mongoid/persistence/operations.rb +211 -0
  182. data/lib/mongoid/persistence/operations/embedded/insert.rb +42 -0
  183. data/lib/mongoid/persistence/operations/embedded/remove.rb +40 -0
  184. data/lib/mongoid/persistence/operations/insert.rb +34 -0
  185. data/lib/mongoid/persistence/operations/remove.rb +33 -0
  186. data/lib/mongoid/persistence/operations/update.rb +64 -0
  187. data/lib/mongoid/railtie.rb +126 -0
  188. data/lib/mongoid/railties/database.rake +182 -0
  189. data/lib/mongoid/railties/document.rb +12 -0
  190. data/lib/mongoid/relations.rb +144 -0
  191. data/lib/mongoid/relations/accessors.rb +138 -0
  192. data/lib/mongoid/relations/auto_save.rb +38 -0
  193. data/lib/mongoid/relations/binding.rb +26 -0
  194. data/lib/mongoid/relations/bindings.rb +9 -0
  195. data/lib/mongoid/relations/bindings/embedded/in.rb +69 -0
  196. data/lib/mongoid/relations/bindings/embedded/many.rb +93 -0
  197. data/lib/mongoid/relations/bindings/embedded/one.rb +61 -0
  198. data/lib/mongoid/relations/bindings/referenced/in.rb +76 -0
  199. data/lib/mongoid/relations/bindings/referenced/many.rb +54 -0
  200. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +51 -0
  201. data/lib/mongoid/relations/bindings/referenced/one.rb +58 -0
  202. data/lib/mongoid/relations/builder.rb +57 -0
  203. data/lib/mongoid/relations/builders.rb +83 -0
  204. data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
  205. data/lib/mongoid/relations/builders/embedded/many.rb +40 -0
  206. data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
  207. data/lib/mongoid/relations/builders/nested_attributes/many.rb +110 -0
  208. data/lib/mongoid/relations/builders/nested_attributes/one.rb +135 -0
  209. data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
  210. data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
  211. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +38 -0
  212. data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
  213. data/lib/mongoid/relations/cascading.rb +56 -0
  214. data/lib/mongoid/relations/cascading/delete.rb +19 -0
  215. data/lib/mongoid/relations/cascading/destroy.rb +26 -0
  216. data/lib/mongoid/relations/cascading/nullify.rb +18 -0
  217. data/lib/mongoid/relations/cascading/strategy.rb +26 -0
  218. data/lib/mongoid/relations/constraint.rb +42 -0
  219. data/lib/mongoid/relations/conversions.rb +35 -0
  220. data/lib/mongoid/relations/cyclic.rb +103 -0
  221. data/lib/mongoid/relations/embedded/atomic.rb +89 -0
  222. data/lib/mongoid/relations/embedded/atomic/operation.rb +63 -0
  223. data/lib/mongoid/relations/embedded/atomic/pull.rb +65 -0
  224. data/lib/mongoid/relations/embedded/atomic/push_all.rb +59 -0
  225. data/lib/mongoid/relations/embedded/atomic/set.rb +61 -0
  226. data/lib/mongoid/relations/embedded/atomic/unset.rb +41 -0
  227. data/lib/mongoid/relations/embedded/in.rb +220 -0
  228. data/lib/mongoid/relations/embedded/many.rb +560 -0
  229. data/lib/mongoid/relations/embedded/one.rb +206 -0
  230. data/lib/mongoid/relations/embedded/sort.rb +31 -0
  231. data/lib/mongoid/relations/macros.rb +310 -0
  232. data/lib/mongoid/relations/many.rb +135 -0
  233. data/lib/mongoid/relations/metadata.rb +919 -0
  234. data/lib/mongoid/relations/nested_builder.rb +75 -0
  235. data/lib/mongoid/relations/one.rb +36 -0
  236. data/lib/mongoid/relations/options.rb +47 -0
  237. data/lib/mongoid/relations/polymorphic.rb +40 -0
  238. data/lib/mongoid/relations/proxy.rb +145 -0
  239. data/lib/mongoid/relations/referenced/batch.rb +72 -0
  240. data/lib/mongoid/relations/referenced/batch/insert.rb +57 -0
  241. data/lib/mongoid/relations/referenced/in.rb +262 -0
  242. data/lib/mongoid/relations/referenced/many.rb +623 -0
  243. data/lib/mongoid/relations/referenced/many_to_many.rb +396 -0
  244. data/lib/mongoid/relations/referenced/one.rb +272 -0
  245. data/lib/mongoid/relations/reflections.rb +62 -0
  246. data/lib/mongoid/relations/synchronization.rb +153 -0
  247. data/lib/mongoid/relations/targets.rb +2 -0
  248. data/lib/mongoid/relations/targets/enumerable.rb +372 -0
  249. data/lib/mongoid/reloading.rb +91 -0
  250. data/lib/mongoid/safety.rb +105 -0
  251. data/lib/mongoid/scope.rb +31 -0
  252. data/lib/mongoid/serialization.rb +134 -0
  253. data/lib/mongoid/sharding.rb +61 -0
  254. data/lib/mongoid/state.rb +97 -0
  255. data/lib/mongoid/threaded.rb +530 -0
  256. data/lib/mongoid/threaded/lifecycle.rb +192 -0
  257. data/lib/mongoid/timestamps.rb +15 -0
  258. data/lib/mongoid/timestamps/created.rb +24 -0
  259. data/lib/mongoid/timestamps/timeless.rb +50 -0
  260. data/lib/mongoid/timestamps/updated.rb +26 -0
  261. data/lib/mongoid/validations.rb +140 -0
  262. data/lib/mongoid/validations/associated.rb +46 -0
  263. data/lib/mongoid/validations/uniqueness.rb +145 -0
  264. data/lib/mongoid/version.rb +4 -0
  265. data/lib/mongoid/versioning.rb +185 -0
  266. data/lib/rack/mongoid.rb +2 -0
  267. data/lib/rack/mongoid/middleware/identity_map.rb +38 -0
  268. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  269. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +20 -0
  270. data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
  271. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
  272. data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
  273. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
  274. data/lib/rails/generators/mongoid_generator.rb +70 -0
  275. data/lib/rails/mongoid.rb +91 -0
  276. metadata +465 -0
@@ -0,0 +1,39 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+
4
+ # The Mongoid logger which wraps some other ruby compliant logger class.
5
+ class Logger
6
+
7
+ delegate :info, :debug, :error, :fatal, :unknown, :to => :logger, :allow_nil => true
8
+
9
+ # Emit a warning log message.
10
+ #
11
+ # @example Log a warning.
12
+ # logger.warn("Danger")
13
+ #
14
+ # @param [ String ] message The warning message.
15
+ def warn(message)
16
+ logger.warn(message) if logger && logger.respond_to?(:warn)
17
+ end
18
+
19
+ # Get the mongoid logger.
20
+ #
21
+ # @example Get the global logger.
22
+ # logger.logger
23
+ #
24
+ # @return [ Logger ] The logger.
25
+ def logger
26
+ Mongoid.logger
27
+ end
28
+
29
+ # Inspect the logger.
30
+ #
31
+ # @example Inspect the logger.
32
+ # logger.inspect
33
+ #
34
+ # @return [ String ] The logger, inspected.
35
+ def inspect
36
+ "#<Mongoid::Logger:0x#{object_id.to_s(16)} @logger=#{logger.inspect}>"
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+ require "mongoid/matchers/strategies"
3
+
4
+ module Mongoid #:nodoc:
5
+
6
+ # This module contains all the behavior for ruby implementations of MongoDB
7
+ # selectors.
8
+ module Matchers
9
+
10
+ # Determines if this document has the attributes to match the supplied
11
+ # MongoDB selector. Used for matching on embedded associations.
12
+ #
13
+ # @example Does the document match?
14
+ # document.matches?(:title => { "$in" => [ "test" ] })
15
+ #
16
+ # @param [ Hash ] selector The MongoDB selector.
17
+ #
18
+ # @return [ true, false ] True if matches, false if not.
19
+ def matches?(selector)
20
+ selector.each_pair do |key, value|
21
+ if value.is_a?(Hash)
22
+ value.each do |item|
23
+ return false unless Strategies.matcher(self, key, Hash[*item]).matches?(Hash[*item])
24
+ end
25
+ else
26
+ return false unless Strategies.matcher(self, key, value).matches?(value)
27
+ end
28
+ end
29
+ return true
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Matchers #:nodoc:
4
+
5
+ # Checks that all values match.
6
+ class All < Default
7
+
8
+ # Return true if the attribute and first value in the hash are equal.
9
+ #
10
+ # @example Do the values match?
11
+ # matcher.matches?({ :key => 10 })
12
+ #
13
+ # @param [ Hash ] value The values to check.
14
+ #
15
+ # @return [ true, false ] If the values match.
16
+ def matches?(value)
17
+ @attribute == value.values.first
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Matchers #:nodoc:
4
+
5
+ # Defines behavior for handling $or expressions in embedded documents.
6
+ class And < Default
7
+
8
+ # Does the supplied query match the attribute?
9
+ #
10
+ # @example Does this match?
11
+ # matcher.matches?("$and" => [ { field => value } ])
12
+ #
13
+ # @param [ Array ] conditions The or expression.
14
+ #
15
+ # @return [ true, false ] True if matches, false if not.
16
+ #
17
+ # @since 2.3.0
18
+ def matches?(conditions)
19
+ conditions.each do |condition|
20
+ condition.keys.each do |k|
21
+ key = k
22
+ value = condition[k]
23
+ return false unless Strategies.matcher(document, key, value).matches?(value)
24
+ end
25
+ end
26
+ true
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,70 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Matchers #:nodoc:
4
+
5
+ # Contains all the default behavior for checking for matching documents
6
+ # given MongoDB expressions.
7
+ class Default
8
+
9
+ attr_accessor :attribute, :document
10
+
11
+ # Creating a new matcher only requires the value.
12
+ #
13
+ # @example Create a new matcher.
14
+ # Default.new("attribute")
15
+ #
16
+ # @param [ Object ] attribute The current attribute to check against.
17
+ #
18
+ # @since 1.0.0
19
+ def initialize(attribute, document = nil)
20
+ @attribute, @document = attribute, document
21
+ end
22
+
23
+ # Return true if the attribute and value are equal, or if it is an array
24
+ # if the value is included.
25
+ #
26
+ # @example Does this value match?
27
+ # default.matches?("value")
28
+ #
29
+ # @param [ Object ] value The value to check if it matches.
30
+ #
31
+ # @return [ true, false ] True if matches, false if not.
32
+ #
33
+ # @since 1.0.0
34
+ def matches?(value)
35
+ attribute.is_a?(Array) && !value.is_a?(Array) ? attribute.include?(value) : value === attribute
36
+ end
37
+
38
+ protected
39
+
40
+ # Convenience method for getting the first value in a hash.
41
+ #
42
+ # @example Get the first value.
43
+ # matcher.first(:test => "value")
44
+ #
45
+ # @param [ Hash ] hash The has to pull from.
46
+ #
47
+ # @return [ Object ] The first value.
48
+ #
49
+ # @since 1.0.0
50
+ def first(hash)
51
+ hash.values.first
52
+ end
53
+
54
+ # If object exists then compare the two, otherwise return false
55
+ #
56
+ # @example Determine if we can compare.
57
+ # matcher.determine("test", "$in")
58
+ #
59
+ # @param [ Object ] value The value to compare with.
60
+ # @param [ Symbol, String ] operator The comparison operation.
61
+ #
62
+ # @return [ true, false ] The comparison or false.
63
+ #
64
+ # @since 1.0.0
65
+ def determine(value, operator)
66
+ attribute ? attribute.send(operator, first(value)) : false
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Matchers #:nodoc:
4
+
5
+ # Checks for existance.
6
+ class Exists < Default
7
+
8
+ # Return true if the attribute exists and checking for existence or
9
+ # return true if the attribute does not exist and checking for
10
+ # non-existence.
11
+ #
12
+ # @example Does anything exist?
13
+ # matcher.matches?({ :key => 10 })
14
+ #
15
+ # @param [ Hash ] value The values to check.
16
+ #
17
+ # @return [ true, false ] If a value exists.
18
+ def matches?(value)
19
+ @attribute.nil? != value.values.first
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Matchers #:nodoc:
4
+
5
+ # Performs Greater Than matching.
6
+ class Gt < Default
7
+
8
+ # Return true if the attribute is greater than the value.
9
+ #
10
+ # @example Do the values match?
11
+ # matcher.matches?({ :key => 10 })
12
+ #
13
+ # @param [ Hash ] value The values to check.
14
+ #
15
+ # @return [ true, false ] If a value exists.
16
+ def matches?(value)
17
+ determine(value, :>)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Matchers #:nodoc:
4
+
5
+ # Performs Greater than or equal to matching.
6
+ class Gte < Default
7
+
8
+ # Return true if the attribute is greater than or equal to the value.
9
+ #
10
+ # @example Do the values match?
11
+ # matcher.matches?({ :key => 10 })
12
+ #
13
+ # @param [ Hash ] value The values to check.
14
+ #
15
+ # @return [ true, false ] If a value exists.
16
+ def matches?(value)
17
+ determine(value, :>=)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Matchers #:nodoc:
4
+
5
+ # Performs matching for any value in an array.
6
+ class In < Default
7
+
8
+ # Return true if the attribute is in the values.
9
+ #
10
+ # @example Do the values match?
11
+ # matcher.matches?({ :key => 10 })
12
+ #
13
+ # @param [ Hash ] value The values to check.
14
+ #
15
+ # @return [ true, false ] If a value exists.
16
+ def matches?(value)
17
+ Array.wrap(@attribute).any? { |e| value.values.first.include?(e) }
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Matchers #:nodoc:
4
+
5
+ # Performs less than matching.
6
+ class Lt < Default
7
+
8
+ # Return true if the attribute is less than the value.
9
+ #
10
+ # @example Do the values match?
11
+ # matcher.matches?({ :key => 10 })
12
+ #
13
+ # @param [ Hash ] value The values to check.
14
+ #
15
+ # @return [ true, false ] If a value exists.
16
+ def matches?(value)
17
+ determine(value, :<)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Matchers #:nodoc:
4
+
5
+ # Performs less than or equal to matching.
6
+ class Lte < Default
7
+
8
+ # Return true if the attribute is less than or equal to the value.
9
+ #
10
+ # @example Do the values match?
11
+ # matcher.matches?({ :key => 10 })
12
+ #
13
+ # @param [ Hash ] value The values to check.
14
+ #
15
+ # @return [ true, false ] If a value exists.
16
+ def matches?(value)
17
+ determine(value, :<=)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Matchers #:nodoc:
4
+
5
+ # Performs non-equivalency checks.
6
+ class Ne < Default
7
+
8
+ # Return true if the attribute and first value are not equal.
9
+ #
10
+ # @example Do the values match?
11
+ # matcher.matches?({ :key => 10 })
12
+ #
13
+ # @param [ Hash ] value The values to check.
14
+ #
15
+ # @return [ true, false ] If a value exists.
16
+ def matches?(value)
17
+ @attribute != value.values.first
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Matchers #:nodoc:
4
+
5
+ # Performs not in checking.
6
+ class Nin < Default
7
+
8
+ # Return true if the attribute is not in the value list.
9
+ #
10
+ # @example Do the values match?
11
+ # matcher.matches?({ :key => 10 })
12
+ #
13
+ # @param [ Hash ] value The values to check.
14
+ #
15
+ # @return [ true, false ] If a value exists.
16
+ def matches?(value)
17
+ Array.wrap(@attribute).none? { |e| value.values.first.include?(e) }
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Matchers #:nodoc:
4
+
5
+ # Defines behavior for handling $or expressions in embedded documents.
6
+ class Or < Default
7
+
8
+ # Does the supplied query match the attribute?
9
+ #
10
+ # @example Does this match?
11
+ # matcher.matches?("$or" => [ { field => value } ])
12
+ #
13
+ # @param [ Array ] conditions The or expression.
14
+ #
15
+ # @return [ true, false ] True if matches, false if not.
16
+ #
17
+ # @since 2.0.0.rc.7
18
+ def matches?(conditions)
19
+ conditions.each do |condition|
20
+ res = true
21
+ condition.keys.each do |k|
22
+ key = k
23
+ value = condition[k]
24
+ res &&= Strategies.matcher(document, key, value).matches?(value)
25
+ break unless res
26
+ end
27
+ return res if res
28
+ end
29
+ return false
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Matchers #:nodoc:
4
+
5
+ # Performs size checking.
6
+ class Size < Default
7
+
8
+ # Return true if the attribute size is equal to the first value.
9
+ #
10
+ # @example Do the values match?
11
+ # matcher.matches?({ :key => 10 })
12
+ #
13
+ # @param [ Hash ] value The values to check.
14
+ #
15
+ # @return [ true, false ] If a value exists.
16
+ def matches?(value)
17
+ @attribute.size == value.values.first
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,93 @@
1
+ # encoding: utf-8
2
+ require "mongoid/matchers/default"
3
+ require "mongoid/matchers/all"
4
+ require "mongoid/matchers/and"
5
+ require "mongoid/matchers/exists"
6
+ require "mongoid/matchers/gt"
7
+ require "mongoid/matchers/gte"
8
+ require "mongoid/matchers/in"
9
+ require "mongoid/matchers/lt"
10
+ require "mongoid/matchers/lte"
11
+ require "mongoid/matchers/ne"
12
+ require "mongoid/matchers/nin"
13
+ require "mongoid/matchers/or"
14
+ require "mongoid/matchers/size"
15
+
16
+ module Mongoid #:nodoc:
17
+ module Matchers #:nodoc:
18
+
19
+ # This module is responsible for returning the correct matcher given a
20
+ # MongoDB query expression.
21
+ module Strategies
22
+ extend self
23
+
24
+ MATCHERS = {
25
+ "$all" => Matchers::All,
26
+ "$and" => Matchers::And,
27
+ "$exists" => Matchers::Exists,
28
+ "$gt" => Matchers::Gt,
29
+ "$gte" => Matchers::Gte,
30
+ "$in" => Matchers::In,
31
+ "$lt" => Matchers::Lt,
32
+ "$lte" => Matchers::Lte,
33
+ "$ne" => Matchers::Ne,
34
+ "$nin" => Matchers::Nin,
35
+ "$or" => Matchers::Or,
36
+ "$size" => Matchers::Size
37
+ }
38
+
39
+ # Get the matcher for the supplied key and value. Will determine the class
40
+ # name from the key.
41
+ #
42
+ # @example Get the matcher.
43
+ # document.matcher(:title, { "$in" => [ "test" ] })
44
+ #
45
+ # @param [ Document ] document The document to check.
46
+ # @param [ Symbol, String ] key The field name.
47
+ # @param [ Object, Hash ] The value or selector.
48
+ #
49
+ # @return [ Matcher ] The matcher.
50
+ #
51
+ # @since 2.0.0.rc.7
52
+ def matcher(document, key, value)
53
+ if value.is_a?(Hash)
54
+ matcher = MATCHERS[value.keys.first]
55
+ if matcher
56
+ matcher.new(extract_attribute(document, key))
57
+ else
58
+ Default.new(extract_attribute(document, key))
59
+ end
60
+ else
61
+ case key
62
+ when "$or" then Matchers::Or.new(value, document)
63
+ when "$and" then Matchers::And.new(value, document)
64
+ else Default.new(extract_attribute(document, key))
65
+ end
66
+ end
67
+ end
68
+
69
+ private
70
+
71
+ # Extract the attribute from the key, being smarter about dot notation.
72
+ #
73
+ # @example Extract the attribute.
74
+ # strategy.extract_attribute(doc, "info.field")
75
+ #
76
+ # @param [ Document ] document The document.
77
+ # @param [ String ] key The key.
78
+ #
79
+ # @return [ Object ] The value of the attribute.
80
+ #
81
+ # @since 2.2.1
82
+ def extract_attribute(document, key)
83
+ if (key_string = key.to_s) =~ /.+\..+/
84
+ key_string.split('.').inject(document.attributes) do |attribs, key|
85
+ attribs.try(:[], key)
86
+ end
87
+ else
88
+ document.attributes[key_string]
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end