mongoid 5.4.1 → 6.0.0.beta

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 (264) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/config/locales/en.yml +23 -16
  5. data/lib/mongoid.rb +4 -9
  6. data/lib/mongoid/atomic.rb +1 -1
  7. data/lib/mongoid/atomic/modifiers.rb +8 -12
  8. data/lib/mongoid/attributes.rb +9 -11
  9. data/lib/mongoid/attributes/dynamic.rb +5 -6
  10. data/lib/mongoid/attributes/nested.rb +1 -1
  11. data/lib/mongoid/attributes/processing.rb +4 -0
  12. data/lib/mongoid/attributes/readonly.rb +22 -0
  13. data/lib/mongoid/cacheable.rb +36 -0
  14. data/lib/mongoid/changeable.rb +37 -1
  15. data/lib/mongoid/clients.rb +0 -63
  16. data/lib/mongoid/clients/factory.rb +0 -2
  17. data/lib/mongoid/clients/options.rb +54 -249
  18. data/lib/mongoid/clients/storage_options.rb +1 -69
  19. data/lib/mongoid/composable.rb +26 -2
  20. data/lib/mongoid/config.rb +1 -1
  21. data/lib/mongoid/config/options.rb +1 -1
  22. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -0
  23. data/lib/mongoid/contextual/atomic.rb +6 -9
  24. data/lib/mongoid/contextual/geo_near.rb +2 -3
  25. data/lib/mongoid/contextual/map_reduce.rb +97 -24
  26. data/lib/mongoid/contextual/memory.rb +7 -4
  27. data/lib/mongoid/contextual/mongo.rb +63 -54
  28. data/lib/mongoid/contextual/none.rb +2 -2
  29. data/lib/mongoid/copyable.rb +19 -19
  30. data/lib/mongoid/criteria.rb +5 -4
  31. data/lib/mongoid/criteria/findable.rb +2 -3
  32. data/lib/mongoid/criteria/includable.rb +63 -16
  33. data/lib/mongoid/criteria/marshalable.rb +2 -2
  34. data/lib/mongoid/criteria/modifiable.rb +17 -1
  35. data/lib/mongoid/criteria/options.rb +25 -0
  36. data/lib/mongoid/criteria/queryable.rb +86 -0
  37. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  38. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  39. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  40. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  41. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  42. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  43. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  44. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  45. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  46. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  47. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  48. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  49. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +45 -0
  50. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  51. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  52. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  53. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  54. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  55. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  56. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  57. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  58. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  59. data/lib/mongoid/criteria/queryable/optional.rb +411 -0
  60. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  61. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  62. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  63. data/lib/mongoid/criteria/queryable/selector.rb +196 -0
  64. data/lib/mongoid/criteria/queryable/smash.rb +103 -0
  65. data/lib/mongoid/document.rb +9 -23
  66. data/lib/mongoid/errors.rb +2 -1
  67. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  68. data/lib/mongoid/errors/delete_restriction.rb +2 -2
  69. data/lib/mongoid/errors/invalid_field.rb +2 -2
  70. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  71. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  72. data/lib/mongoid/errors/inverse_not_found.rb +1 -1
  73. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  74. data/lib/mongoid/evolvable.rb +1 -1
  75. data/lib/mongoid/extensions.rb +0 -5
  76. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  77. data/lib/mongoid/extensions/date.rb +4 -1
  78. data/lib/mongoid/extensions/hash.rb +2 -3
  79. data/lib/mongoid/extensions/object.rb +2 -2
  80. data/lib/mongoid/extensions/string.rb +4 -3
  81. data/lib/mongoid/extensions/time.rb +5 -2
  82. data/lib/mongoid/factory.rb +1 -0
  83. data/lib/mongoid/fields/foreign_key.rb +2 -2
  84. data/lib/mongoid/fields/localized.rb +3 -8
  85. data/lib/mongoid/fields/validators/macro.rb +18 -0
  86. data/lib/mongoid/findable.rb +3 -3
  87. data/lib/mongoid/indexable.rb +17 -16
  88. data/lib/mongoid/indexable/specification.rb +1 -1
  89. data/lib/mongoid/indexable/validators/options.rb +1 -2
  90. data/lib/mongoid/interceptable.rb +6 -17
  91. data/lib/mongoid/loggable.rb +1 -1
  92. data/lib/mongoid/matchable.rb +3 -10
  93. data/lib/mongoid/matchable/gt.rb +2 -0
  94. data/lib/mongoid/matchable/gte.rb +2 -0
  95. data/lib/mongoid/matchable/lt.rb +2 -0
  96. data/lib/mongoid/matchable/lte.rb +2 -0
  97. data/lib/mongoid/persistable.rb +6 -5
  98. data/lib/mongoid/persistable/creatable.rb +2 -0
  99. data/lib/mongoid/persistable/deletable.rb +7 -3
  100. data/lib/mongoid/persistable/settable.rb +3 -16
  101. data/lib/mongoid/persistable/updatable.rb +10 -12
  102. data/lib/mongoid/persistence_context.rb +216 -0
  103. data/lib/mongoid/query_cache.rb +5 -30
  104. data/lib/mongoid/relations/accessors.rb +6 -2
  105. data/lib/mongoid/relations/auto_save.rb +12 -4
  106. data/lib/mongoid/relations/bindings/embedded/in.rb +4 -0
  107. data/lib/mongoid/relations/bindings/embedded/many.rb +8 -1
  108. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -0
  109. data/lib/mongoid/relations/bindings/referenced/many.rb +4 -0
  110. data/lib/mongoid/relations/builders.rb +2 -2
  111. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  112. data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
  113. data/lib/mongoid/relations/conversions.rb +1 -1
  114. data/lib/mongoid/relations/counter_cache.rb +28 -18
  115. data/lib/mongoid/relations/eager.rb +19 -7
  116. data/lib/mongoid/relations/eager/base.rb +5 -5
  117. data/lib/mongoid/relations/embedded/batchable.rb +9 -33
  118. data/lib/mongoid/relations/embedded/in.rb +16 -2
  119. data/lib/mongoid/relations/embedded/many.rb +23 -8
  120. data/lib/mongoid/relations/embedded/one.rb +17 -2
  121. data/lib/mongoid/relations/macros.rb +9 -2
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/nested_builder.rb +1 -1
  124. data/lib/mongoid/relations/options.rb +2 -2
  125. data/lib/mongoid/relations/proxy.rb +2 -33
  126. data/lib/mongoid/relations/referenced/in.rb +23 -11
  127. data/lib/mongoid/relations/referenced/many.rb +24 -16
  128. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  129. data/lib/mongoid/relations/referenced/one.rb +17 -1
  130. data/lib/mongoid/relations/reflections.rb +3 -5
  131. data/lib/mongoid/relations/touchable.rb +1 -1
  132. data/lib/mongoid/reloadable.rb +1 -1
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +2 -3
  135. data/lib/mongoid/tasks/database.rb +1 -2
  136. data/lib/mongoid/threaded.rb +4 -4
  137. data/lib/mongoid/traversable.rb +1 -1
  138. data/lib/mongoid/validatable.rb +1 -1
  139. data/lib/mongoid/validatable/macros.rb +2 -4
  140. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  141. data/lib/mongoid/version.rb +1 -1
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -7
  143. data/spec/app/models/album.rb +5 -1
  144. data/spec/app/models/artist.rb +21 -0
  145. data/spec/app/models/band.rb +0 -1
  146. data/spec/app/models/church.rb +0 -2
  147. data/spec/app/models/ordered_post.rb +5 -0
  148. data/spec/app/models/oscar.rb +1 -2
  149. data/spec/app/models/person.rb +3 -1
  150. data/spec/app/models/post.rb +0 -1
  151. data/spec/app/models/princess.rb +2 -0
  152. data/spec/app/models/record.rb +1 -0
  153. data/spec/app/models/thing.rb +1 -1
  154. data/spec/config/mongoid.yml +1 -5
  155. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  156. data/spec/mongoid/atomic_spec.rb +17 -17
  157. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  158. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  159. data/spec/mongoid/attributes_spec.rb +63 -0
  160. data/spec/mongoid/cacheable_spec.rb +112 -0
  161. data/spec/mongoid/changeable_spec.rb +58 -0
  162. data/spec/mongoid/clients/factory_spec.rb +3 -11
  163. data/spec/mongoid/clients/options_spec.rb +378 -96
  164. data/spec/mongoid/clients_spec.rb +207 -170
  165. data/spec/mongoid/composable_spec.rb +7 -0
  166. data/spec/mongoid/config_spec.rb +41 -21
  167. data/spec/mongoid/contextual/atomic_spec.rb +77 -343
  168. data/spec/mongoid/contextual/map_reduce_spec.rb +119 -111
  169. data/spec/mongoid/contextual/memory_spec.rb +56 -316
  170. data/spec/mongoid/contextual/mongo_spec.rb +104 -378
  171. data/spec/mongoid/copyable_spec.rb +8 -15
  172. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  173. data/spec/mongoid/criteria/options_spec.rb +29 -0
  174. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  175. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  176. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  177. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  178. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  179. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  180. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  181. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  182. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  183. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  184. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  185. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  186. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  187. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  188. data/spec/mongoid/{extensions/origin/regexp_raw_spec.rb → criteria/queryable/extensions/regexp_spec.rb} +21 -20
  189. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  190. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  191. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  192. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  193. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  194. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  195. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  196. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  197. data/spec/mongoid/criteria/queryable/optional_spec.rb +1786 -0
  198. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  199. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  200. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  201. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4159 -0
  202. data/spec/mongoid/criteria/queryable/selector_spec.rb +778 -0
  203. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  204. data/spec/mongoid/criteria_spec.rb +45 -63
  205. data/spec/mongoid/document_spec.rb +21 -88
  206. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  207. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  208. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  209. data/spec/mongoid/extensions/date_spec.rb +2 -6
  210. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  211. data/spec/mongoid/extensions/float_spec.rb +8 -1
  212. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  213. data/spec/mongoid/extensions/object_spec.rb +11 -0
  214. data/spec/mongoid/extensions/string_spec.rb +21 -0
  215. data/spec/mongoid/extensions/time_spec.rb +4 -8
  216. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  217. data/spec/mongoid/fields/localized_spec.rb +0 -91
  218. data/spec/mongoid/findable_spec.rb +46 -1
  219. data/spec/mongoid/indexable_spec.rb +6 -46
  220. data/spec/mongoid/interceptable_spec.rb +49 -10
  221. data/spec/mongoid/matchable/gt_spec.rb +11 -0
  222. data/spec/mongoid/matchable/gte_spec.rb +10 -0
  223. data/spec/mongoid/matchable/lt_spec.rb +11 -0
  224. data/spec/mongoid/matchable/lte_spec.rb +11 -0
  225. data/spec/mongoid/matchable_spec.rb +1 -51
  226. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  227. data/spec/mongoid/persistable/deletable_spec.rb +1 -1
  228. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  229. data/spec/mongoid/persistable/savable_spec.rb +30 -30
  230. data/spec/mongoid/persistable/settable_spec.rb +0 -185
  231. data/spec/mongoid/persistable/updatable_spec.rb +166 -5
  232. data/spec/mongoid/persistence_context_spec.rb +654 -0
  233. data/spec/mongoid/positional_spec.rb +10 -10
  234. data/spec/mongoid/query_cache_spec.rb +89 -65
  235. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  236. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  237. data/spec/mongoid/relations/builders_spec.rb +37 -10
  238. data/spec/mongoid/relations/counter_cache_spec.rb +64 -15
  239. data/spec/mongoid/relations/cyclic_spec.rb +0 -22
  240. data/spec/mongoid/relations/embedded/many_spec.rb +9 -41
  241. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  242. data/spec/mongoid/relations/macros_spec.rb +395 -7
  243. data/spec/mongoid/relations/proxy_spec.rb +3 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +6 -29
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +6 -29
  247. data/spec/mongoid/relations/reflections_spec.rb +9 -9
  248. data/spec/mongoid/reloadable_spec.rb +51 -0
  249. data/spec/mongoid/scopable_spec.rb +0 -12
  250. data/spec/mongoid/serializable_spec.rb +0 -50
  251. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  252. data/spec/mongoid/validatable/uniqueness_spec.rb +16 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +10 -10
  255. metadata +536 -479
  256. metadata.gz.sig +0 -0
  257. data/lib/mongoid/clients/thread_options.rb +0 -19
  258. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -20
  259. data/lib/mongoid/extensions/decimal128.rb +0 -39
  260. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  261. data/lib/mongoid/matchable/regexp.rb +0 -27
  262. data/spec/app/models/post_genre.rb +0 -6
  263. data/spec/mongoid/extensions/decimal128_spec.rb +0 -44
  264. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
@@ -0,0 +1,45 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ class Criteria
4
+ module Queryable
5
+ module Extensions
6
+
7
+ # This module contains additional regex behaviour.
8
+ module Regexp
9
+
10
+ # Is the object a regexp?
11
+ #
12
+ # @example Is the object a regex?
13
+ # /^[123]/.regexp?
14
+ #
15
+ # @return [ true ] Always true.
16
+ #
17
+ # @since 1.0.0
18
+ def regexp?; true; end
19
+
20
+ module ClassMethods
21
+
22
+ # Evolve the object into a regex.
23
+ #
24
+ # @example Evolve the object to a regex.
25
+ # Regexp.evolve("^[123]")
26
+ #
27
+ # @param [ Regexp, String ] object The object to evolve.
28
+ #
29
+ # @return [ Regexp ] The evolved regex.
30
+ #
31
+ # @since 1.0.0
32
+ def evolve(object)
33
+ __evolve__(object) do |obj|
34
+ ::Regexp.new(obj)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ ::Regexp.__send__(:include,Mongoid::Criteria::Queryable::Extensions::Regexp)
45
+ ::Regexp.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Regexp::ClassMethods)
@@ -0,0 +1,34 @@
1
+ # encoding: utf-8
2
+ require "set"
3
+
4
+ module Mongoid
5
+ class Criteria
6
+ module Queryable
7
+ module Extensions
8
+
9
+ # This module contains additional object behaviour.
10
+ module Set
11
+ module ClassMethods
12
+
13
+ # Evolve the set, casting all its elements.
14
+ #
15
+ # @example Evolve the set.
16
+ # Set.evolve(set)
17
+ #
18
+ # @param [ Set, Object ] object The object to evolve.
19
+ #
20
+ # @return [ Array ] The evolved set.
21
+ #
22
+ # @since 1.0.0
23
+ def evolve(object)
24
+ return object if !object || !object.respond_to?(:map)
25
+ object.map{ |obj| obj.class.evolve(obj) }
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ ::Set.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Set::ClassMethods)
@@ -0,0 +1,137 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ class Criteria
4
+ module Queryable
5
+ module Extensions
6
+
7
+ # This module contains additional object behaviour.
8
+ module String
9
+
10
+ # Evolve the string into a mongodb friendly date.
11
+ #
12
+ # @example Evolve the string.
13
+ # "2012-1-1".__evolve_date__
14
+ #
15
+ # @return [ Time ] The time at UTC midnight.
16
+ #
17
+ # @since 1.0.0
18
+ def __evolve_date__
19
+ time = ::Time.parse(self)
20
+ ::Time.utc(time.year, time.month, time.day, 0, 0, 0, 0)
21
+ end
22
+
23
+ # Evolve the string into a mongodb friendly time.
24
+ #
25
+ # @example Evolve the string.
26
+ # "2012-1-1".__evolve_time__
27
+ #
28
+ # @return [ Time ] The string as a time.
29
+ #
30
+ # @since 1.0.0
31
+ def __evolve_time__
32
+ ::Time.parse(self).utc
33
+ end
34
+
35
+ # Get the string as a mongo expression, adding $ to the front.
36
+ #
37
+ # @example Get the string as an expression.
38
+ # "test".__mongo_expression__
39
+ #
40
+ # @return [ String ] The string with $ at the front.
41
+ #
42
+ # @since 2.0.0
43
+ def __mongo_expression__
44
+ start_with?("$") ? self : "$#{self}"
45
+ end
46
+
47
+ # Get the string as a sort option.
48
+ #
49
+ # @example Get the string as a sort option.
50
+ # "field ASC".__sort_option__
51
+ #
52
+ # @return [ Hash ] The string as a sort option hash.
53
+ #
54
+ # @since 1.0.0
55
+ def __sort_option__
56
+ split(/,/).inject({}) do |hash, spec|
57
+ hash.tap do |_hash|
58
+ field, direction = spec.strip.split(/\s/)
59
+ _hash[field.to_sym] = direction.to_direction
60
+ end
61
+ end
62
+ end
63
+
64
+ # Get the string as a specification.
65
+ #
66
+ # @example Get the string as a criteria.
67
+ # "field".__expr_part__(value)
68
+ #
69
+ # @param [ Object ] value The value of the criteria.
70
+ # @param [ true, false ] negating If the selection should be negated.
71
+ #
72
+ # @return [ Hash ] The selection.
73
+ #
74
+ # @since 1.0.0
75
+ def __expr_part__(value, negating = false)
76
+ ::String.__expr_part__(self, value, negating)
77
+ end
78
+
79
+ # Get the string as a sort direction.
80
+ #
81
+ # @example Get the string as a sort direction.
82
+ # "1".to_direction
83
+ #
84
+ # @return [ Integer ] The direction.
85
+ #
86
+ # @since 1.0.0
87
+ def to_direction
88
+ self =~ /desc/i ? -1 : 1
89
+ end
90
+
91
+ module ClassMethods
92
+
93
+ # Get the value as a expression.
94
+ #
95
+ # @example Get the value as an expression.
96
+ # String.__expr_part__("field", value)
97
+ #
98
+ # @param [ String, Symbol ] key The field key.
99
+ # @param [ Object ] value The value of the criteria.
100
+ # @param [ true, false ] negating If the selection should be negated.
101
+ #
102
+ # @return [ Hash ] The selection.
103
+ #
104
+ # @since 2.0.0
105
+ def __expr_part__(key, value, negating = false)
106
+ if negating
107
+ { key => { "$#{value.regexp? ? "not" : "ne"}" => value }}
108
+ else
109
+ { key => value }
110
+ end
111
+ end
112
+
113
+ # Evolves the string into a MongoDB friendly value - in this case
114
+ # a string.
115
+ #
116
+ # @example Evolve the string
117
+ # String.evolve(1)
118
+ #
119
+ # @param [ Object ] object The object to convert.
120
+ #
121
+ # @return [ String ] The value as a string.
122
+ #
123
+ # @since 1.0.0
124
+ def evolve(object)
125
+ __evolve__(object) do |obj|
126
+ obj.regexp? ? obj : obj.to_s
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
135
+
136
+ ::String.__send__(:include, Mongoid::Criteria::Queryable::Extensions::String)
137
+ ::String.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::String::ClassMethods)
@@ -0,0 +1,79 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ class Criteria
4
+ module Queryable
5
+ module Extensions
6
+
7
+ # This module contains additional symbol behaviour.
8
+ module Symbol
9
+
10
+ # Get the symbol as a specification.
11
+ #
12
+ # @example Get the symbol as a criteria.
13
+ # :field.__expr_part__(value)
14
+ #
15
+ # @param [ Object ] value The value of the criteria.
16
+ # @param [ true, false ] negating If the selection should be negated.
17
+ #
18
+ # @return [ Hash ] The selection.
19
+ #
20
+ # @since 1.0.0
21
+ def __expr_part__(value, negating = false)
22
+ ::String.__expr_part__(self, value, negating)
23
+ end
24
+
25
+ # Get the symbol as a sort direction.
26
+ #
27
+ # @example Get the symbol as a sort direction.
28
+ # "1".to_direction
29
+ #
30
+ # @return [ Integer ] The direction.
31
+ #
32
+ # @since 1.0.0
33
+ def to_direction
34
+ to_s.to_direction
35
+ end
36
+
37
+ module ClassMethods
38
+
39
+ # Adds a method on symbol as a convenience for the MongoDB operator.
40
+ #
41
+ # @example Add the $in method.
42
+ # Symbol.add_key(:in, "$in")
43
+ #
44
+ # @param [ Symbol ] name The name of the method.
45
+ # @param [ Symbol ] strategy The name of the merge strategy.
46
+ # @param [ String ] operator The MongoDB operator.
47
+ # @param [ String ] additional The additional MongoDB operator.
48
+ #
49
+ # @since 1.0.0
50
+ def add_key(name, strategy, operator, additional = nil, &block)
51
+ define_method(name) do
52
+ method = "__#{strategy}__".to_sym
53
+ Key.new(self, method, operator, additional, &block)
54
+ end
55
+ end
56
+
57
+ # Evolves the symbol into a MongoDB friendly value - in this case
58
+ # a symbol.
59
+ #
60
+ # @example Evolve the symbol
61
+ # Symbol.evolve("test")
62
+ #
63
+ # @param [ Object ] object The object to convert.
64
+ #
65
+ # @return [ Symbol ] The value as a symbol.
66
+ #
67
+ # @since 1.0.0
68
+ def evolve(object)
69
+ __evolve__(object) { |obj| obj.to_sym }
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ ::Symbol.__send__(:include, Mongoid::Criteria::Queryable::Extensions::Symbol)
79
+ ::Symbol.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Symbol::ClassMethods)
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ class Criteria
4
+ module Queryable
5
+ module Extensions
6
+
7
+ # This module contains additional time behaviour.
8
+ module Time
9
+
10
+ # Evolve the time as a date, UTC midnight.
11
+ #
12
+ # @example Evolve the time to a date query format.
13
+ # time.__evolve_date__
14
+ #
15
+ # @return [ Time ] The date at midnight UTC.
16
+ #
17
+ # @since 1.0.0
18
+ def __evolve_date__
19
+ ::Time.utc(year, month, day, 0, 0, 0, 0)
20
+ end
21
+
22
+ # Evolve the time into a utc time.
23
+ #
24
+ # @example Evolve the time.
25
+ # time.__evolve_time__
26
+ #
27
+ # @return [ Time ] The time in UTC.
28
+ #
29
+ # @since 1.0.0
30
+ def __evolve_time__
31
+ utc
32
+ end
33
+
34
+ module ClassMethods
35
+
36
+ # Evolve the object to an date.
37
+ #
38
+ # @example Evolve dates.
39
+ #
40
+ # @example Evolve string dates.
41
+ #
42
+ # @example Evolve date ranges.
43
+ #
44
+ # @param [ Object ] object The object to evolve.
45
+ #
46
+ # @return [ Time ] The evolved date time.
47
+ #
48
+ # @since 1.0.0
49
+ def evolve(object)
50
+ object.__evolve_time__
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ ::Time.__send__(:include, Mongoid::Criteria::Queryable::Extensions::Time)
60
+ ::Time.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Time::ClassMethods)
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ class Criteria
4
+ module Queryable
5
+ module Extensions
6
+
7
+ # This module contains additional time with zone behaviour.
8
+ module TimeWithZone
9
+
10
+ # Evolve the time into a utc time.
11
+ #
12
+ # @example Evolve the time.
13
+ # time.__evolve_time__
14
+ #
15
+ # @return [ Time ] The time in UTC.
16
+ #
17
+ # @since 1.0.0
18
+ def __evolve_time__
19
+ utc
20
+ end
21
+
22
+ module ClassMethods
23
+
24
+ # Evolve the object to an date.
25
+ #
26
+ # @example Evolve dates.
27
+ #
28
+ # @example Evolve string dates.
29
+ #
30
+ # @example Evolve date ranges.
31
+ #
32
+ # @param [ Object ] object The object to evolve.
33
+ #
34
+ # @return [ Time ] The evolved date time.
35
+ #
36
+ # @since 1.0.0
37
+ def evolve(object)
38
+ object.__evolve_time__
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ ::ActiveSupport::TimeWithZone.__send__(
48
+ :include,
49
+ Mongoid::Criteria::Queryable::Extensions::TimeWithZone
50
+ )
51
+ ::ActiveSupport::TimeWithZone.__send__(
52
+ :extend,
53
+ Mongoid::Criteria::Queryable::Extensions::TimeWithZone::ClassMethods
54
+ )
@@ -0,0 +1,65 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ class Criteria
4
+ module Queryable
5
+
6
+ # Allows for easy delegation of queryable queryable instance methods to a
7
+ # specific method.
8
+ module Forwardable
9
+
10
+ # Tells queryable with method on the class to delegate to when calling an
11
+ # original selectable or optional method on the class.
12
+ #
13
+ # @example Tell queryable where to select from.
14
+ # class Band
15
+ # extend Queryable::Forwardable
16
+ # select_with :criteria
17
+ #
18
+ # def self.criteria
19
+ # Query.new
20
+ # end
21
+ # end
22
+ #
23
+ # @param [ Symbol ] receiver The name of the receiver method.
24
+ #
25
+ # @return [ Array<Symbol> ] The names of the forwarded methods.
26
+ #
27
+ # @since 1.0.0
28
+ def select_with(receiver)
29
+ (Selectable.forwardables + Optional.forwardables).each do |name|
30
+ __forward__(name, receiver)
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ # Forwards the method name to the provided receiver method.
37
+ #
38
+ # @api private
39
+ #
40
+ # @example Define the forwarding.
41
+ # Model.__forward__(:exists, :criteria)
42
+ #
43
+ # @param [ Symbol ] name The name of the method.
44
+ # @param [ Symbol ] receiver The name of the receiver method.
45
+ #
46
+ # @since 1.0.0
47
+ def __forward__(name, receiver)
48
+ if self.class == Module
49
+ module_eval <<-SEL
50
+ def #{name}(*args, &block)
51
+ #{receiver}.__send__(:#{name}, *args, &block)
52
+ end
53
+ SEL
54
+ else
55
+ (class << self; self; end).class_eval <<-SEL
56
+ def #{name}(*args, &block)
57
+ #{receiver}.__send__(:#{name}, *args, &block)
58
+ end
59
+ SEL
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end