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,28 @@
1
+ # encoding: utf-8
2
+ unless defined?(Boolean)
3
+ class Boolean; end
4
+ end
5
+
6
+ if defined?(ActiveSupport)
7
+ unless defined?(ActiveSupport::TimeWithZone)
8
+ require "active_support/time_with_zone"
9
+ end
10
+ require "mongoid/criteria/queryable/extensions/time_with_zone"
11
+ end
12
+
13
+ require "time"
14
+ require "mongoid/criteria/queryable/extensions/object"
15
+ require "mongoid/criteria/queryable/extensions/array"
16
+ require "mongoid/criteria/queryable/extensions/big_decimal"
17
+ require "mongoid/criteria/queryable/extensions/boolean"
18
+ require "mongoid/criteria/queryable/extensions/date"
19
+ require "mongoid/criteria/queryable/extensions/date_time"
20
+ require "mongoid/criteria/queryable/extensions/hash"
21
+ require "mongoid/criteria/queryable/extensions/nil_class"
22
+ require "mongoid/criteria/queryable/extensions/numeric"
23
+ require "mongoid/criteria/queryable/extensions/range"
24
+ require "mongoid/criteria/queryable/extensions/regexp"
25
+ require "mongoid/criteria/queryable/extensions/set"
26
+ require "mongoid/criteria/queryable/extensions/string"
27
+ require "mongoid/criteria/queryable/extensions/symbol"
28
+ require "mongoid/criteria/queryable/extensions/time"
@@ -0,0 +1,185 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ class Criteria
4
+ module Queryable
5
+ module Extensions
6
+
7
+ # The array module adds custom behaviour for Origin onto the Array class.
8
+ module Array
9
+
10
+ # Combine the two objects using the add strategy.
11
+ #
12
+ # @example Add the object to the array.
13
+ # [ 1, 2, 3 ].__add__(4)
14
+ #
15
+ # @param [ Object ] object The object to add.
16
+ #
17
+ # @return [ Object ] The result of the add.
18
+ #
19
+ # @since 1.0.0
20
+ def __add__(object)
21
+ object.__add_from_array__(self)
22
+ end
23
+
24
+ # Return the object as an array.
25
+ #
26
+ # @example Get the array.
27
+ # [ 1, 2 ].__array__
28
+ #
29
+ # @return [ Array ] self
30
+ #
31
+ # @since 1.0.0
32
+ def __array__; self; end
33
+
34
+ # Makes a deep copy of the array, deep copying every element inside the
35
+ # array.
36
+ #
37
+ # @example Get a deep copy of the array.
38
+ # [ 1, 2, 3 ].__deep_copy__
39
+ #
40
+ # @return [ Array ] The deep copy of the array.
41
+ #
42
+ # @since 1.0.0
43
+ def __deep_copy__
44
+ map { |value| value.__deep_copy__ }
45
+ end
46
+
47
+ # Evolve the array into an array of mongo friendly dates. (Times at
48
+ # midnight).
49
+ #
50
+ # @example Evolve the array to dates.
51
+ # [ Date.new(2010, 1, 1) ].__evolve_date__
52
+ #
53
+ # @return [ Array<Time> ] The array as times at midnight UTC.
54
+ #
55
+ # @since 1.0.0
56
+ def __evolve_date__
57
+ map { |value| value.__evolve_date__ }
58
+ end
59
+
60
+ # Get the object as expanded.
61
+ #
62
+ # @example Get the object expanded.
63
+ # obj.__expand_complex__
64
+ #
65
+ # @return [ Array ] The expanded array.
66
+ #
67
+ # @since 1.1.0
68
+ def __expand_complex__
69
+ map do |value|
70
+ value.__expand_complex__
71
+ end
72
+ end
73
+
74
+ # Evolve the array to an array of times.
75
+ #
76
+ # @example Evolve the array to times.
77
+ # [ 1231231231 ].__evolve_time__
78
+ #
79
+ # @return [ Array<Time> ] The array as times.
80
+ #
81
+ # @since 1.0.0
82
+ def __evolve_time__
83
+ map { |value| value.__evolve_time__ }
84
+ end
85
+
86
+ # Combine the two objects using an intersection strategy.
87
+ #
88
+ # @example Interset with the object.
89
+ # [ 1, 2 ].__intersect__(3)
90
+ #
91
+ # @param [ Object ] object The object to intersect with.
92
+ #
93
+ # @return [ Object ] The result of the intersection.
94
+ #
95
+ # @since 1.0.0
96
+ def __intersect__(object)
97
+ object.__intersect_from_array__(self)
98
+ end
99
+
100
+ # Gets the array as options in the proper format to pass as MongoDB sort
101
+ # criteria.
102
+ #
103
+ # @example Get the array as sorting options.
104
+ # [ :field, 1 ].__sort_option__
105
+ #
106
+ # @return [ Hash ] The array as sort criterion.
107
+ #
108
+ # @since 1.0.0
109
+ def __sort_option__
110
+ multi.inject({}) do |options, criteria|
111
+ options.merge!(criteria.__sort_pair__)
112
+ options
113
+ end
114
+ end
115
+
116
+ # Get the array as a sort pair.
117
+ #
118
+ # @example Get the array as field/direction pair.
119
+ # [ field, 1 ].__sort_pair__
120
+ #
121
+ # @return [ Hash ] The field/direction pair.
122
+ #
123
+ # @since 1.0.0
124
+ def __sort_pair__
125
+ { first => last.to_direction }
126
+ end
127
+
128
+ # Update all the values in the hash with the provided block.
129
+ #
130
+ # @example Update the values in place.
131
+ # [ 1, 2, 3 ].update_values(&:to_s)
132
+ #
133
+ # @param [ Proc ] block The block to execute on each value.
134
+ #
135
+ # @return [ Array ] the array.
136
+ #
137
+ # @since 1.0.0
138
+ def update_values(&block)
139
+ replace(map(&block))
140
+ end
141
+
142
+ private
143
+
144
+ # Converts the array to a multi-dimensional array.
145
+ #
146
+ # @api private
147
+ #
148
+ # @example Convert to multi-dimensional.
149
+ # [ 1, 2, 3 ].multi
150
+ #
151
+ # @return [ Array ] The multi-dimensional array.
152
+ #
153
+ # @since 1.0.0
154
+ def multi
155
+ first.is_a?(::Symbol) || first.is_a?(::String) ? [ self ] : self
156
+ end
157
+
158
+ module ClassMethods
159
+
160
+ # Evolve the object when the serializer is defined as an array.
161
+ #
162
+ # @example Evolve the object.
163
+ # Array.evolve(1)
164
+ #
165
+ # @param [ Object ] The object to evolve.
166
+ #
167
+ # @return [ Object ] The evolved object.
168
+ #
169
+ # @since 1.0.0
170
+ def evolve(object)
171
+ if object.is_a?(::Array)
172
+ object.map { |obj| obj.class.evolve(obj) }
173
+ else
174
+ object
175
+ end
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end
181
+ end
182
+ end
183
+
184
+ ::Array.__send__(:include, Mongoid::Criteria::Queryable::Extensions::Array)
185
+ ::Array.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Array::ClassMethods)
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+ require "bigdecimal"
3
+
4
+ module Mongoid
5
+ class Criteria
6
+ module Queryable
7
+ module Extensions
8
+
9
+ # The big decimal module adds custom behaviour for Origin onto the
10
+ # BigDecimal class.
11
+ module BigDecimal
12
+ module ClassMethods
13
+
14
+ # Evolves the big decimal into a MongoDB friendly value - in this case
15
+ # a string.
16
+ #
17
+ # @example Evolve the big decimal
18
+ # BigDecimal.evolve(decimal)
19
+ #
20
+ # @param [ BigDecimal ] object The object to convert.
21
+ #
22
+ # @return [ String ] The big decimal as a string.
23
+ #
24
+ # @since 1.0.0
25
+ def evolve(object)
26
+ __evolve__(object) do |obj|
27
+ obj ? obj.to_s : obj
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ ::BigDecimal.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::BigDecimal::ClassMethods)
@@ -0,0 +1,34 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ class Criteria
4
+ module Queryable
5
+ module Extensions
6
+
7
+ # This module contains extensions for boolean selection.
8
+ module Boolean
9
+ module ClassMethods
10
+
11
+ # Evolve the value into a boolean value stored in MongoDB. Will return
12
+ # true for any of these values: true, t, yes, y, 1, 1.0.
13
+ #
14
+ # @example Evolve the value to a boolean.
15
+ # Boolean.evolve(true)
16
+ #
17
+ # @param [ Object ] The object to evolve.
18
+ #
19
+ # @return [ true, false ] The boolean value.
20
+ #
21
+ # @since 1.0.0
22
+ def evolve(object)
23
+ __evolve__(object) do |obj|
24
+ obj.to_s =~ (/(true|t|yes|y|1|1.0)$/i) ? true : false
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ ::Boolean.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Boolean::ClassMethods)
@@ -0,0 +1,63 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ class Criteria
4
+ module Queryable
5
+ module Extensions
6
+
7
+ # This module contains additional date behaviour.
8
+ module Date
9
+
10
+ # Evolve the date into a mongo friendly time, UTC midnight.
11
+ #
12
+ # @example Evolve the date.
13
+ # date.__evolve_date__
14
+ #
15
+ # @return [ Time ] The date as a UTC time at midnight.
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 date into a time, which is always in the local timezone.
23
+ #
24
+ # @example Evolve the date.
25
+ # date.__evolve_time__
26
+ #
27
+ # @return [ Time ] The date as a local time.
28
+ #
29
+ # @since 1.0.0
30
+ def __evolve_time__
31
+ ::Time.local(year, month, day)
32
+ end
33
+
34
+ module ClassMethods
35
+
36
+ # Evolve the object to an date.
37
+ #
38
+ # @example Evolve dates.
39
+ # Date.evolve(Date.new(1990, 1, 1))
40
+ #
41
+ # @example Evolve string dates.
42
+ # Date.evolve("1990-1-1")
43
+ #
44
+ # @example Evolve date ranges.
45
+ # Date.evolve(Date.new(1990, 1, 1)..Date.new(1990, 1, 4))
46
+ #
47
+ # @param [ Object ] object The object to evolve.
48
+ #
49
+ # @return [ Time ] The evolved date.
50
+ #
51
+ # @since 1.0.0
52
+ def evolve(object)
53
+ object.__evolve_date__
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ ::Date.__send__(:include, Mongoid::Criteria::Queryable::Extensions::Date)
63
+ ::Date.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Date::ClassMethods)
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ class Criteria
4
+ module Queryable
5
+ module Extensions
6
+
7
+ # This module contains additional datetime behaviour.
8
+ module DateTime
9
+
10
+ # Evolve the date time into a mongo friendly UTC time.
11
+ #
12
+ # @example Evolve the date time.
13
+ # date_time.__evolve_time__
14
+ #
15
+ # @return [ Time ] The converted time in UTC.
16
+ #
17
+ # @since 1.0.0
18
+ def __evolve_time__
19
+ usec = strftime("%6N").to_f
20
+ if utc?
21
+ ::Time.utc(year, month, day, hour, min, sec, usec)
22
+ else
23
+ ::Time.local(year, month, day, hour, min, sec, usec).utc
24
+ end
25
+ end
26
+
27
+ module ClassMethods
28
+
29
+ # Evolve the object to an date.
30
+ #
31
+ # @example Evolve dates.
32
+ #
33
+ # @example Evolve string dates.
34
+ #
35
+ # @example Evolve date ranges.
36
+ #
37
+ # @param [ Object ] object The object to evolve.
38
+ #
39
+ # @return [ Time ] The evolved date time.
40
+ #
41
+ # @since 1.0.0
42
+ def evolve(object)
43
+ object.__evolve_time__
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ ::DateTime.__send__(:include, Mongoid::Criteria::Queryable::Extensions::DateTime)
53
+ ::DateTime.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::DateTime::ClassMethods)
@@ -0,0 +1,200 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ class Criteria
4
+ module Queryable
5
+ module Extensions
6
+
7
+ # This module contains additional hash behaviour.
8
+ module Hash
9
+
10
+ # Add an object to a hash using the merge strategies.
11
+ #
12
+ # @example Add an object to a hash.
13
+ # { field: value }.__add__({ field: other_value })
14
+ #
15
+ # @param [ Hash ] object The other hash to add.
16
+ #
17
+ # @return [ Hash ] The hash with object added.
18
+ #
19
+ # @since 1.0.0
20
+ def __add__(object)
21
+ apply_strategy(:__add__, object)
22
+ end
23
+
24
+ # Merge this hash into the provided array.
25
+ #
26
+ # @example Merge the hash into the array.
27
+ # { field: value }.__add_from_array__([ 1, 2 ])
28
+ #
29
+ # @param [ Array ] value The array to add to.
30
+ #
31
+ # @return [ Hash ] The merged hash.
32
+ #
33
+ # @since 1.0.0
34
+ def __add_from_array__(array)
35
+ { keys.first => array.__add__(values.first) }
36
+ end
37
+
38
+ # Add an object to a hash using the merge strategies.
39
+ #
40
+ # @example Add an object to a hash.
41
+ # { field: value }.__intersect__({ field: other_value })
42
+ #
43
+ # @param [ Hash ] object The other hash to intersect.
44
+ #
45
+ # @return [ Hash ] The hash with object intersected.
46
+ #
47
+ # @since 1.0.0
48
+ def __intersect__(object)
49
+ apply_strategy(:__intersect__, object)
50
+ end
51
+
52
+ # Merge this hash into the provided array.
53
+ #
54
+ # @example Merge the hash into the array.
55
+ # { field: value }.__intersect_from_array__([ 1, 2 ])
56
+ #
57
+ # @param [ Array ] value The array to intersect to.
58
+ #
59
+ # @return [ Hash ] The merged hash.
60
+ #
61
+ # @since 1.0.0
62
+ def __intersect_from_array__(array)
63
+ { keys.first => array.__intersect__(values.first) }
64
+ end
65
+
66
+ # Merge this hash into the provided object.
67
+ #
68
+ # @example Merge the hash into the object.
69
+ # { field: value }.__intersect_from_object__([ 1, 2 ])
70
+ #
71
+ # @param [ Object ] value The object to intersect to.
72
+ #
73
+ # @return [ Hash ] The merged hash.
74
+ #
75
+ # @since 1.0.0
76
+ def __intersect_from_object__(object)
77
+ { keys.first => object.__intersect__(values.first) }
78
+ end
79
+
80
+ # Add an object to a hash using the merge strategies.
81
+ #
82
+ # @example Add an object to a hash.
83
+ # { field: value }.__union__({ field: other_value })
84
+ #
85
+ # @param [ Hash ] object The other hash to union.
86
+ #
87
+ # @return [ Hash ] The hash with object unioned.
88
+ #
89
+ # @since 1.0.0
90
+ def __union__(object)
91
+ apply_strategy(:__union__, object)
92
+ end
93
+
94
+ # Merge this hash into the provided object.
95
+ #
96
+ # @example Merge the hash into the object.
97
+ # { field: value }.__union_from_object__([ 1, 2 ])
98
+ #
99
+ # @param [ Object ] value The object to union to.
100
+ #
101
+ # @return [ Hash ] The merged hash.
102
+ #
103
+ # @since 1.0.0
104
+ def __union_from_object__(object)
105
+ { keys.first => object.__union__(values.first) }
106
+ end
107
+
108
+ # Make a deep copy of this hash.
109
+ #
110
+ # @example Make a deep copy of the hash.
111
+ # { field: value }.__deep_copy__
112
+ #
113
+ # @return [ Hash ] The copied hash.
114
+ #
115
+ # @since 1.0.0
116
+ def __deep_copy__
117
+ {}.tap do |copy|
118
+ each_pair do |key, value|
119
+ copy.store(key, value.__deep_copy__)
120
+ end
121
+ end
122
+ end
123
+
124
+ # Get the hash as a sort option.
125
+ #
126
+ # @example Get the hash as a sort option.
127
+ # { field: 1 }.__sort_option__
128
+ #
129
+ # @return [ Hash ] The hash as sort option.
130
+ #
131
+ # @since 1.0.0
132
+ def __sort_option__
133
+ tap do |hash|
134
+ hash.each_pair do |key, value|
135
+ hash.store(key, value.to_direction)
136
+ end
137
+ end
138
+ end
139
+
140
+ # Get the object as expanded.
141
+ #
142
+ # @example Get the object expanded.
143
+ # obj.__expand_complex__
144
+ #
145
+ # @return [ Hash ] The expanded hash.
146
+ #
147
+ # @since 1.0.5
148
+ def __expand_complex__
149
+ replacement = {}
150
+ each_pair do |key, value|
151
+ replacement.merge!(key.__expr_part__(value.__expand_complex__))
152
+ end
153
+ replacement
154
+ end
155
+
156
+ # Update all the values in the hash with the provided block.
157
+ #
158
+ # @example Update the values in place.
159
+ # { field: "1" }.update_values(&:to_i)
160
+ #
161
+ # @param [ Proc ] block The block to execute on each value.
162
+ #
163
+ # @return [ Hash ] the hash.
164
+ #
165
+ # @since 1.0.0
166
+ def update_values(&block)
167
+ each_pair do |key, value|
168
+ store(key, block[value])
169
+ end
170
+ end
171
+
172
+ private
173
+
174
+ # Apply the provided strategy for the hash with the given object.
175
+ #
176
+ # @api private
177
+ #
178
+ # @example Apply the strategy.
179
+ # { field: value }.apply_strategy(:__add__, 1)
180
+ #
181
+ # @param [ Symbol ] strategy The strategy to apply.
182
+ # @param [ Object ] object The object to merge.
183
+ #
184
+ # @return [ Hash ] The merged hash.
185
+ #
186
+ # @since 1.0.0
187
+ def apply_strategy(strategy, object)
188
+ tap do |hash|
189
+ object.each_pair do |key, value|
190
+ hash.store(key, hash[key].send(strategy, value))
191
+ end
192
+ end
193
+ end
194
+ end
195
+ end
196
+ end
197
+ end
198
+ end
199
+
200
+ ::Hash.__send__(:include, Mongoid::Criteria::Queryable::Extensions::Hash)