mongoid 5.4.0 → 6.4.8

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 (301) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/Rakefile +26 -0
  5. data/lib/config/locales/en.yml +40 -0
  6. data/lib/mongoid/atomic/modifiers.rb +2 -2
  7. data/lib/mongoid/atomic.rb +5 -5
  8. data/lib/mongoid/attributes/readonly.rb +22 -0
  9. data/lib/mongoid/attributes.rb +22 -21
  10. data/lib/mongoid/cacheable.rb +36 -0
  11. data/lib/mongoid/changeable.rb +36 -0
  12. data/lib/mongoid/clients/options.rb +55 -250
  13. data/lib/mongoid/clients/sessions.rb +113 -0
  14. data/lib/mongoid/clients/storage_options.rb +2 -69
  15. data/lib/mongoid/clients.rb +10 -63
  16. data/lib/mongoid/composable.rb +29 -2
  17. data/lib/mongoid/config.rb +1 -0
  18. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  19. data/lib/mongoid/contextual/atomic.rb +4 -4
  20. data/lib/mongoid/contextual/map_reduce.rb +7 -3
  21. data/lib/mongoid/contextual/memory.rb +9 -4
  22. data/lib/mongoid/contextual/mongo.rb +65 -30
  23. data/lib/mongoid/contextual/none.rb +12 -0
  24. data/lib/mongoid/copyable.rb +13 -6
  25. data/lib/mongoid/criteria/marshalable.rb +2 -2
  26. data/lib/mongoid/criteria/modifiable.rb +29 -3
  27. data/lib/mongoid/criteria/options.rb +25 -0
  28. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  29. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  30. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  31. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  32. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  33. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  34. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  35. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  36. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  37. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  38. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  39. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +79 -0
  40. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  41. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  42. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  43. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  44. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  45. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  46. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  47. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  48. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  49. data/lib/mongoid/criteria/queryable/mergeable.rb +273 -0
  50. data/lib/mongoid/criteria/queryable/optional.rb +429 -0
  51. data/lib/mongoid/criteria/queryable/options.rb +153 -0
  52. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  53. data/lib/mongoid/criteria/queryable/selectable.rb +689 -0
  54. data/lib/mongoid/criteria/queryable/selector.rb +212 -0
  55. data/lib/mongoid/criteria/queryable/smash.rb +104 -0
  56. data/lib/mongoid/criteria/queryable.rb +87 -0
  57. data/lib/mongoid/criteria.rb +6 -2
  58. data/lib/mongoid/document.rb +34 -41
  59. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  60. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
  61. data/lib/mongoid/errors/invalid_field.rb +2 -2
  62. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  63. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  64. data/lib/mongoid/errors/invalid_session_use.rb +24 -0
  65. data/lib/mongoid/errors.rb +3 -0
  66. data/lib/mongoid/evolvable.rb +1 -1
  67. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  68. data/lib/mongoid/extensions/date.rb +4 -1
  69. data/lib/mongoid/extensions/decimal128.rb +3 -3
  70. data/lib/mongoid/extensions/hash.rb +1 -0
  71. data/lib/mongoid/extensions/regexp.rb +1 -0
  72. data/lib/mongoid/extensions/string.rb +6 -3
  73. data/lib/mongoid/extensions/time.rb +4 -1
  74. data/lib/mongoid/extensions.rb +0 -4
  75. data/lib/mongoid/factory.rb +2 -1
  76. data/lib/mongoid/fields/validators/macro.rb +18 -0
  77. data/lib/mongoid/findable.rb +2 -2
  78. data/lib/mongoid/indexable.rb +16 -14
  79. data/lib/mongoid/interceptable.rb +9 -22
  80. data/lib/mongoid/matchable/all.rb +2 -2
  81. data/lib/mongoid/matchable/and.rb +3 -3
  82. data/lib/mongoid/matchable/default.rb +2 -2
  83. data/lib/mongoid/matchable/elem_match.rb +28 -0
  84. data/lib/mongoid/matchable/exists.rb +2 -2
  85. data/lib/mongoid/matchable/gt.rb +4 -2
  86. data/lib/mongoid/matchable/gte.rb +4 -2
  87. data/lib/mongoid/matchable/in.rb +2 -2
  88. data/lib/mongoid/matchable/lt.rb +4 -2
  89. data/lib/mongoid/matchable/lte.rb +4 -2
  90. data/lib/mongoid/matchable/ne.rb +2 -2
  91. data/lib/mongoid/matchable/nin.rb +2 -2
  92. data/lib/mongoid/matchable/nor.rb +37 -0
  93. data/lib/mongoid/matchable/or.rb +3 -3
  94. data/lib/mongoid/matchable/regexp.rb +3 -3
  95. data/lib/mongoid/matchable/size.rb +2 -2
  96. data/lib/mongoid/matchable.rb +16 -7
  97. data/lib/mongoid/persistable/creatable.rb +5 -3
  98. data/lib/mongoid/persistable/deletable.rb +5 -3
  99. data/lib/mongoid/persistable/destroyable.rb +1 -5
  100. data/lib/mongoid/persistable/settable.rb +5 -5
  101. data/lib/mongoid/persistable/updatable.rb +7 -14
  102. data/lib/mongoid/persistable/upsertable.rb +2 -1
  103. data/lib/mongoid/persistable.rb +4 -6
  104. data/lib/mongoid/persistence_context.rb +220 -0
  105. data/lib/mongoid/query_cache.rb +67 -23
  106. data/lib/mongoid/railtie.rb +17 -1
  107. data/lib/mongoid/railties/controller_runtime.rb +86 -0
  108. data/lib/mongoid/relations/accessors.rb +3 -0
  109. data/lib/mongoid/relations/auto_save.rb +12 -4
  110. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
  111. data/lib/mongoid/relations/counter_cache.rb +15 -5
  112. data/lib/mongoid/relations/eager/base.rb +3 -3
  113. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
  114. data/lib/mongoid/relations/eager/has_many.rb +1 -1
  115. data/lib/mongoid/relations/eager.rb +6 -11
  116. data/lib/mongoid/relations/embedded/batchable.rb +20 -18
  117. data/lib/mongoid/relations/embedded/in.rb +13 -1
  118. data/lib/mongoid/relations/embedded/many.rb +51 -10
  119. data/lib/mongoid/relations/embedded/one.rb +14 -1
  120. data/lib/mongoid/relations/macros.rb +9 -1
  121. data/lib/mongoid/relations/many.rb +4 -0
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/options.rb +2 -2
  124. data/lib/mongoid/relations/proxy.rb +1 -31
  125. data/lib/mongoid/relations/referenced/in.rb +19 -10
  126. data/lib/mongoid/relations/referenced/many.rb +30 -26
  127. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  128. data/lib/mongoid/relations/referenced/one.rb +15 -1
  129. data/lib/mongoid/relations/synchronization.rb +12 -12
  130. data/lib/mongoid/relations/targets/enumerable.rb +24 -4
  131. data/lib/mongoid/relations/touchable.rb +7 -4
  132. data/lib/mongoid/reloadable.rb +2 -2
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +1 -1
  135. data/lib/mongoid/stateful.rb +1 -0
  136. data/lib/mongoid/tasks/database.rb +3 -2
  137. data/lib/mongoid/threaded.rb +74 -0
  138. data/lib/mongoid/traversable.rb +1 -1
  139. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  140. data/lib/mongoid/version.rb +1 -1
  141. data/lib/mongoid.rb +6 -6
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +18 -3
  143. data/spec/app/models/agent.rb +2 -0
  144. data/spec/app/models/album.rb +5 -1
  145. data/spec/app/models/array_field.rb +7 -0
  146. data/spec/app/models/artist.rb +21 -0
  147. data/spec/app/models/band.rb +3 -0
  148. data/spec/app/models/book.rb +2 -1
  149. data/spec/app/models/delegating_patient.rb +16 -0
  150. data/spec/app/models/dokument.rb +1 -0
  151. data/spec/app/models/ordered_post.rb +5 -0
  152. data/spec/app/models/oscar.rb +1 -2
  153. data/spec/app/models/page.rb +1 -1
  154. data/spec/app/models/person.rb +3 -3
  155. data/spec/app/models/princess.rb +2 -0
  156. data/spec/app/models/record.rb +1 -0
  157. data/spec/app/models/subscription.rb +1 -0
  158. data/spec/app/models/thing.rb +1 -1
  159. data/spec/config/mongoid.yml +15 -0
  160. data/spec/integration/document_spec.rb +22 -0
  161. data/spec/mongoid/atomic/modifiers_spec.rb +3 -3
  162. data/spec/mongoid/atomic_spec.rb +5 -5
  163. data/spec/mongoid/attributes/nested_spec.rb +18 -14
  164. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  165. data/spec/mongoid/attributes_spec.rb +90 -5
  166. data/spec/mongoid/cacheable_spec.rb +112 -0
  167. data/spec/mongoid/changeable_spec.rb +58 -0
  168. data/spec/mongoid/clients/factory_spec.rb +80 -28
  169. data/spec/mongoid/clients/options_spec.rb +396 -95
  170. data/spec/mongoid/clients/sessions_spec.rb +334 -0
  171. data/spec/mongoid/clients_spec.rb +243 -101
  172. data/spec/mongoid/composable_spec.rb +7 -0
  173. data/spec/mongoid/config_spec.rb +67 -11
  174. data/spec/mongoid/contextual/atomic_spec.rb +3 -3
  175. data/spec/mongoid/contextual/geo_near_spec.rb +1 -0
  176. data/spec/mongoid/contextual/mongo_spec.rb +275 -22
  177. data/spec/mongoid/contextual/none_spec.rb +15 -0
  178. data/spec/mongoid/copyable_spec.rb +13 -4
  179. data/spec/mongoid/criteria/modifiable_spec.rb +297 -16
  180. data/spec/mongoid/criteria/options_spec.rb +29 -0
  181. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  182. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  183. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  184. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  185. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  186. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  187. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  188. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  189. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  190. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  191. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  192. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  193. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  194. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  195. data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
  196. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
  197. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  198. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  199. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  200. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  201. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  202. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  203. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  204. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  205. data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
  206. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  207. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  208. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  209. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4242 -0
  210. data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
  211. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  212. data/spec/mongoid/criteria/scopable_spec.rb +81 -0
  213. data/spec/mongoid/criteria_spec.rb +156 -22
  214. data/spec/mongoid/document_spec.rb +100 -90
  215. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  216. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  217. data/spec/mongoid/extensions/big_decimal_spec.rb +321 -19
  218. data/spec/mongoid/extensions/boolean_spec.rb +14 -0
  219. data/spec/mongoid/extensions/date_spec.rb +2 -6
  220. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  221. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  222. data/spec/mongoid/extensions/float_spec.rb +8 -1
  223. data/spec/mongoid/extensions/hash_spec.rb +15 -0
  224. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  225. data/spec/mongoid/extensions/object_spec.rb +11 -0
  226. data/spec/mongoid/extensions/regexp_spec.rb +23 -0
  227. data/spec/mongoid/extensions/string_spec.rb +53 -4
  228. data/spec/mongoid/extensions/time_spec.rb +2 -6
  229. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  230. data/spec/mongoid/factory_spec.rb +11 -0
  231. data/spec/mongoid/fields_spec.rb +1 -1
  232. data/spec/mongoid/findable_spec.rb +47 -2
  233. data/spec/mongoid/indexable_spec.rb +15 -3
  234. data/spec/mongoid/interceptable_spec.rb +85 -19
  235. data/spec/mongoid/matchable/all_spec.rb +4 -4
  236. data/spec/mongoid/matchable/and_spec.rb +10 -10
  237. data/spec/mongoid/matchable/default_spec.rb +12 -12
  238. data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
  239. data/spec/mongoid/matchable/exists_spec.rb +5 -5
  240. data/spec/mongoid/matchable/gt_spec.rb +18 -7
  241. data/spec/mongoid/matchable/gte_spec.rb +17 -7
  242. data/spec/mongoid/matchable/in_spec.rb +5 -5
  243. data/spec/mongoid/matchable/lt_spec.rb +18 -7
  244. data/spec/mongoid/matchable/lte_spec.rb +18 -7
  245. data/spec/mongoid/matchable/ne_spec.rb +5 -5
  246. data/spec/mongoid/matchable/nin_spec.rb +5 -5
  247. data/spec/mongoid/matchable/nor_spec.rb +209 -0
  248. data/spec/mongoid/matchable/or_spec.rb +7 -7
  249. data/spec/mongoid/matchable/regexp_spec.rb +5 -5
  250. data/spec/mongoid/matchable/size_spec.rb +3 -3
  251. data/spec/mongoid/matchable_spec.rb +199 -54
  252. data/spec/mongoid/persistable/creatable_spec.rb +7 -2
  253. data/spec/mongoid/persistable/deletable_spec.rb +35 -1
  254. data/spec/mongoid/persistable/destroyable_spec.rb +25 -2
  255. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  256. data/spec/mongoid/persistable/savable_spec.rb +34 -29
  257. data/spec/mongoid/persistable/settable_spec.rb +77 -27
  258. data/spec/mongoid/persistable/updatable_spec.rb +182 -3
  259. data/spec/mongoid/persistable_spec.rb +16 -16
  260. data/spec/mongoid/persistence_context_spec.rb +694 -0
  261. data/spec/mongoid/positional_spec.rb +1 -1
  262. data/spec/mongoid/query_cache_spec.rb +170 -12
  263. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  264. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  265. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
  266. data/spec/mongoid/relations/builders_spec.rb +37 -10
  267. data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
  268. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
  269. data/spec/mongoid/relations/eager_spec.rb +40 -0
  270. data/spec/mongoid/relations/embedded/many_spec.rb +305 -59
  271. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  272. data/spec/mongoid/relations/macros_spec.rb +415 -7
  273. data/spec/mongoid/relations/metadata_spec.rb +15 -1
  274. data/spec/mongoid/relations/proxy_spec.rb +27 -1
  275. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  276. data/spec/mongoid/relations/referenced/many_spec.rb +35 -25
  277. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
  278. data/spec/mongoid/relations/synchronization_spec.rb +48 -2
  279. data/spec/mongoid/relations/targets/enumerable_spec.rb +108 -0
  280. data/spec/mongoid/relations/touchable_spec.rb +40 -0
  281. data/spec/mongoid/reloadable_spec.rb +51 -0
  282. data/spec/mongoid/scopable_spec.rb +13 -0
  283. data/spec/mongoid/serializable_spec.rb +0 -50
  284. data/spec/mongoid/threaded_spec.rb +68 -0
  285. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  286. data/spec/mongoid/validatable/uniqueness_spec.rb +18 -9
  287. data/spec/mongoid/validatable_spec.rb +16 -0
  288. data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
  289. data/spec/spec_helper.rb +101 -8
  290. data/spec/support/cluster_config.rb +158 -0
  291. data/spec/support/constraints.rb +101 -0
  292. data/spec/support/macros.rb +20 -0
  293. data/spec/support/session_registry.rb +50 -0
  294. data/spec/support/spec_config.rb +42 -0
  295. data.tar.gz.sig +0 -0
  296. metadata +163 -61
  297. metadata.gz.sig +0 -0
  298. data/lib/mongoid/clients/thread_options.rb +0 -19
  299. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  300. data/lib/mongoid/railties/document.rb +0 -12
  301. data/spec/mongoid/railties/document_spec.rb +0 -24
@@ -0,0 +1,90 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ class Criteria
4
+ module Queryable
5
+ module Extensions
6
+
7
+ # This module contains additional numeric behaviour.
8
+ module Numeric
9
+
10
+ # Evolve the numeric value into a mongo friendly date, aka UTC time at
11
+ # midnight.
12
+ #
13
+ # @example Evolve to a date.
14
+ # 125214512412.1123.__evolve_date__
15
+ #
16
+ # @return [ Time ] The time representation at UTC midnight.
17
+ #
18
+ # @since 1.0.0
19
+ def __evolve_date__
20
+ time = ::Time.at(self).utc
21
+ ::Time.utc(time.year, time.month, time.day, 0, 0, 0, 0)
22
+ end
23
+
24
+ # Evolve the numeric value into a mongo friendly time.
25
+ #
26
+ # @example Evolve to a time.
27
+ # 125214512412.1123.__evolve_time__
28
+ #
29
+ # @return [ Time ] The time representation.
30
+ #
31
+ # @since 1.0.0
32
+ def __evolve_time__
33
+ ::Time.at(self).utc
34
+ end
35
+
36
+ # Get the integer as a sort direction.
37
+ #
38
+ # @example Get the integer as a sort direction.
39
+ # 1.to_direction
40
+ #
41
+ # @return [ Integer ] self.
42
+ #
43
+ # @since 1.0.0
44
+ def to_direction; self; end
45
+
46
+ module ClassMethods
47
+
48
+ # Get the object as a numeric.
49
+ #
50
+ # @api private
51
+ #
52
+ # @example Get the object as numeric.
53
+ # Object.__numeric__("1.442")
54
+ #
55
+ # @param [ Object ] object The object to convert.
56
+ #
57
+ # @return [ Object ] The converted number.
58
+ #
59
+ # @since 1.0.0
60
+ def __numeric__(object)
61
+ object.to_s =~ /(^[-+]?[0-9]+$)|(\.0+$)|(\.$)/ ? object.to_i : Float(object)
62
+ end
63
+
64
+ # Evolve the object to an integer.
65
+ #
66
+ # @example Evolve to integers.
67
+ # Integer.evolve("1")
68
+ #
69
+ # @param [ Object ] object The object to evolve.
70
+ #
71
+ # @return [ Integer ] The evolved object.
72
+ #
73
+ # @since 1.0.0
74
+ def evolve(object)
75
+ __evolve__(object) do |obj|
76
+ __numeric__(obj) rescue obj
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ ::Integer.__send__(:include, Mongoid::Criteria::Queryable::Extensions::Numeric)
87
+ ::Integer.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Numeric::ClassMethods)
88
+
89
+ ::Float.__send__(:include, Mongoid::Criteria::Queryable::Extensions::Numeric)
90
+ ::Float.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Numeric::ClassMethods)
@@ -0,0 +1,206 @@
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 Object
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 == self) ? self : [ self, object ].flatten.uniq
22
+ end
23
+
24
+ # Merge this object into the provided array.
25
+ #
26
+ # @example Merge the object into the array.
27
+ # 4.__add_from_array__([ 1, 2 ])
28
+ #
29
+ # @param [ Array ] array The array to add to.
30
+ #
31
+ # @return [ Array ] The merged object.
32
+ #
33
+ # @since 1.0.0
34
+ def __add_from_array__(array)
35
+ array.concat(Array(self)).uniq
36
+ end
37
+
38
+ # Combine the two objects using the intersect strategy.
39
+ #
40
+ # @example Add the object to the array.
41
+ # [ 1, 2, 3 ].__intersect__(4)
42
+ #
43
+ # @param [ Object ] object The object to intersect.
44
+ #
45
+ # @return [ Array ] The result of the intersect.
46
+ #
47
+ # @since 1.0.0
48
+ def __intersect__(object)
49
+ object.__intersect_from_object__(self)
50
+ end
51
+
52
+ # Merge this object into the provided array.
53
+ #
54
+ # @example Merge the object into the array.
55
+ # 4.__intersect_from_array__([ 1, 2 ])
56
+ #
57
+ # @param [ Array ] array The array to intersect to.
58
+ #
59
+ # @return [ Array ] The merged object.
60
+ #
61
+ # @since 1.0.0
62
+ def __intersect_from_array__(array)
63
+ array & Array(self)
64
+ end
65
+
66
+ # Merge this object into the provided array.
67
+ #
68
+ # @example Merge the object into the array.
69
+ # 4.__intersect_from_object__([ 1, 2 ])
70
+ #
71
+ # @param [ Object ] object The value to intersect to.
72
+ #
73
+ # @return [ Array ] The merged object.
74
+ #
75
+ # @since 1.0.0
76
+ def __intersect_from_object__(object)
77
+ Array(object) & Array(self)
78
+ end
79
+
80
+ # Combine the two objects using the union strategy.
81
+ #
82
+ # @example Add the object to the array.
83
+ # [ 1, 2, 3 ].__union__(4)
84
+ #
85
+ # @param [ Object ] object The object to union.
86
+ #
87
+ # @return [ Array ] The result of the union.
88
+ #
89
+ # @since 1.0.0
90
+ def __union__(object)
91
+ object.__union_from_object__(self)
92
+ end
93
+
94
+ # Merge this object into the provided array.
95
+ #
96
+ # @example Merge the object into the array.
97
+ # 4.__union_from_object__([ 1, 2 ])
98
+ #
99
+ # @param [ Object ] object The value to union to.
100
+ #
101
+ # @return [ Array ] The merged object.
102
+ #
103
+ # @since 1.0.0
104
+ def __union_from_object__(object)
105
+ (Array(object) + Array(self)).uniq
106
+ end
107
+
108
+ # Deep copy the object. This is for API compatibility, but needs to be
109
+ # overridden.
110
+ #
111
+ # @example Deep copy the object.
112
+ # 1.__deep_copy__
113
+ #
114
+ # @return [ Object ] self.
115
+ #
116
+ # @since 1.0.0
117
+ def __deep_copy__; self; end
118
+
119
+ # Get the object as an array.
120
+ #
121
+ # @example Get the object as an array.
122
+ # 4.__array__
123
+ #
124
+ # @return [ Array ] The wrapped object.
125
+ #
126
+ # @since 1.0.0
127
+ def __array__
128
+ [ self ]
129
+ end
130
+
131
+ # Get the object as expanded.
132
+ #
133
+ # @example Get the object expanded.
134
+ # obj.__expand_complex__
135
+ #
136
+ # @return [ Object ] self.
137
+ #
138
+ # @since 1.0.5
139
+ def __expand_complex__
140
+ self
141
+ end
142
+
143
+ # Is the object a regex.
144
+ #
145
+ # @example Is the object a regex?
146
+ # obj.regexp?
147
+ #
148
+ # @return [ false ] Always false.
149
+ #
150
+ # @since 1.0.4
151
+ def regexp?
152
+ false
153
+ end
154
+
155
+ module ClassMethods
156
+
157
+ # Evolve the object.
158
+ #
159
+ # @note This is here for API compatibility.
160
+ #
161
+ # @example Evolve an object.
162
+ # Object.evolve("test")
163
+ #
164
+ # @return [ Object ] The provided object.
165
+ #
166
+ # @since 1.0.0
167
+ def evolve(object)
168
+ object
169
+ end
170
+
171
+ private
172
+
173
+ # Evolve the object.
174
+ #
175
+ # @api private
176
+ #
177
+ # @todo Durran refactor out case statement.
178
+ #
179
+ # @example Evolve an object and yield.
180
+ # Object.evolve("test") do |obj|
181
+ # obj.to_s
182
+ # end
183
+ #
184
+ # @return [ Object ] The evolved object.
185
+ #
186
+ # @since 1.0.0
187
+ def __evolve__(object)
188
+ return nil if object.nil?
189
+ case object
190
+ when ::Array
191
+ object.map{ |obj| evolve(obj) }
192
+ when ::Range
193
+ { "$gte" => evolve(object.min), "$lte" => evolve(object.max) }
194
+ else
195
+ yield(object)
196
+ end
197
+ end
198
+ end
199
+ end
200
+ end
201
+ end
202
+ end
203
+ end
204
+
205
+ ::Object.__send__(:include, Mongoid::Criteria::Queryable::Extensions::Object)
206
+ ::Object.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Object::ClassMethods)
@@ -0,0 +1,70 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ class Criteria
4
+ module Queryable
5
+ module Extensions
6
+
7
+ # This module contains additional range behaviour.
8
+ module Range
9
+
10
+ # Get the range as an array.
11
+ #
12
+ # @example Get the range as an array.
13
+ # 1...3.__array__
14
+ #
15
+ # @return [ Array ] The range as an array.
16
+ #
17
+ # @since 1.0.0
18
+ def __array__
19
+ to_a
20
+ end
21
+
22
+ # Convert the range to a min/max mongo friendly query for dates.
23
+ #
24
+ # @example Evolve the range.
25
+ # (11231312..213123131).__evolve_date__
26
+ #
27
+ # @return [ Hash ] The min/max range query with times at midnight.
28
+ #
29
+ # @since 1.0.0
30
+ def __evolve_date__
31
+ { "$gte" => min.__evolve_date__, "$lte" => max.__evolve_date__ }
32
+ end
33
+
34
+ # Convert the range to a min/max mongo friendly query for times.
35
+ #
36
+ # @example Evolve the range.
37
+ # (11231312..213123131).__evolve_date__
38
+ #
39
+ # @return [ Hash ] The min/max range query with times.
40
+ #
41
+ # @since 1.0.0
42
+ def __evolve_time__
43
+ { "$gte" => min.__evolve_time__, "$lte" => max.__evolve_time__ }
44
+ end
45
+
46
+ module ClassMethods
47
+
48
+ # Evolve the range. This will transform it into a $gte/$lte selection.
49
+ #
50
+ # @example Evolve the range.
51
+ # Range.evolve(1..3)
52
+ #
53
+ # @param [ Range ] object The range to evolve.
54
+ #
55
+ # @return [ Hash ] The range as a gte/lte criteria.
56
+ #
57
+ # @since 1.0.0
58
+ def evolve(object)
59
+ return object unless object.is_a?(::Range)
60
+ { "$gte" => object.min, "$lte" => object.max }
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ ::Range.__send__(:include, Mongoid::Criteria::Queryable::Extensions::Range)
70
+ ::Range.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Range::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 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
+
39
+ module Raw
40
+
41
+ # Is the object a regexp?
42
+ #
43
+ # @example Is the object a regex?
44
+ # bson_raw_regexp.regexp?
45
+ #
46
+ # @return [ true ] Always true.
47
+ #
48
+ # @since 5.2.1
49
+ def regexp?; true; end
50
+
51
+ module ClassMethods
52
+
53
+ # Evolve the object into a raw bson regex.
54
+ #
55
+ # @example Evolve the object to a regex.
56
+ # BSON::Regexp::Raw.evolve("^[123]")
57
+ #
58
+ # @param [ BSON::Regexp::Raw, String ] object The object to evolve.
59
+ #
60
+ # @return [ BSON::Regexp::Raw ] The evolved raw regex.
61
+ #
62
+ # @since 5.2.1
63
+ def evolve(object)
64
+ __evolve__(object) do |obj|
65
+ obj.is_a?(String) ? BSON::Regexp::Raw.new(obj) : obj
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ ::Regexp.__send__(:include,Mongoid::Criteria::Queryable::Extensions::Regexp)
77
+ ::Regexp.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Regexp::ClassMethods)
78
+ BSON::Regexp::Raw.__send__(:include,Mongoid::Criteria::Queryable::Extensions::Regexp::Raw)
79
+ BSON::Regexp::Raw.__send__(:extend, Mongoid::Criteria::Queryable::Extensions::Regexp::Raw::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)