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.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/config/locales/en.yml +23 -16
- data/lib/mongoid.rb +4 -9
- data/lib/mongoid/atomic.rb +1 -1
- data/lib/mongoid/atomic/modifiers.rb +8 -12
- data/lib/mongoid/attributes.rb +9 -11
- data/lib/mongoid/attributes/dynamic.rb +5 -6
- data/lib/mongoid/attributes/nested.rb +1 -1
- data/lib/mongoid/attributes/processing.rb +4 -0
- data/lib/mongoid/attributes/readonly.rb +22 -0
- data/lib/mongoid/cacheable.rb +36 -0
- data/lib/mongoid/changeable.rb +37 -1
- data/lib/mongoid/clients.rb +0 -63
- data/lib/mongoid/clients/factory.rb +0 -2
- data/lib/mongoid/clients/options.rb +54 -249
- data/lib/mongoid/clients/storage_options.rb +1 -69
- data/lib/mongoid/composable.rb +26 -2
- data/lib/mongoid/config.rb +1 -1
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -0
- data/lib/mongoid/contextual/atomic.rb +6 -9
- data/lib/mongoid/contextual/geo_near.rb +2 -3
- data/lib/mongoid/contextual/map_reduce.rb +97 -24
- data/lib/mongoid/contextual/memory.rb +7 -4
- data/lib/mongoid/contextual/mongo.rb +63 -54
- data/lib/mongoid/contextual/none.rb +2 -2
- data/lib/mongoid/copyable.rb +19 -19
- data/lib/mongoid/criteria.rb +5 -4
- data/lib/mongoid/criteria/findable.rb +2 -3
- data/lib/mongoid/criteria/includable.rb +63 -16
- data/lib/mongoid/criteria/marshalable.rb +2 -2
- data/lib/mongoid/criteria/modifiable.rb +17 -1
- data/lib/mongoid/criteria/options.rb +25 -0
- data/lib/mongoid/criteria/queryable.rb +86 -0
- data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
- data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
- data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
- data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +45 -0
- data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
- data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
- data/lib/mongoid/criteria/queryable/key.rb +103 -0
- data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
- data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
- data/lib/mongoid/criteria/queryable/optional.rb +411 -0
- data/lib/mongoid/criteria/queryable/options.rb +136 -0
- data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
- data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
- data/lib/mongoid/criteria/queryable/selector.rb +196 -0
- data/lib/mongoid/criteria/queryable/smash.rb +103 -0
- data/lib/mongoid/document.rb +9 -23
- data/lib/mongoid/errors.rb +2 -1
- data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
- data/lib/mongoid/errors/delete_restriction.rb +2 -2
- data/lib/mongoid/errors/invalid_field.rb +2 -2
- data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
- data/lib/mongoid/errors/invalid_relation.rb +66 -0
- data/lib/mongoid/errors/inverse_not_found.rb +1 -1
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/evolvable.rb +1 -1
- data/lib/mongoid/extensions.rb +0 -5
- data/lib/mongoid/extensions/big_decimal.rb +17 -8
- data/lib/mongoid/extensions/date.rb +4 -1
- data/lib/mongoid/extensions/hash.rb +2 -3
- data/lib/mongoid/extensions/object.rb +2 -2
- data/lib/mongoid/extensions/string.rb +4 -3
- data/lib/mongoid/extensions/time.rb +5 -2
- data/lib/mongoid/factory.rb +1 -0
- data/lib/mongoid/fields/foreign_key.rb +2 -2
- data/lib/mongoid/fields/localized.rb +3 -8
- data/lib/mongoid/fields/validators/macro.rb +18 -0
- data/lib/mongoid/findable.rb +3 -3
- data/lib/mongoid/indexable.rb +17 -16
- data/lib/mongoid/indexable/specification.rb +1 -1
- data/lib/mongoid/indexable/validators/options.rb +1 -2
- data/lib/mongoid/interceptable.rb +6 -17
- data/lib/mongoid/loggable.rb +1 -1
- data/lib/mongoid/matchable.rb +3 -10
- data/lib/mongoid/matchable/gt.rb +2 -0
- data/lib/mongoid/matchable/gte.rb +2 -0
- data/lib/mongoid/matchable/lt.rb +2 -0
- data/lib/mongoid/matchable/lte.rb +2 -0
- data/lib/mongoid/persistable.rb +6 -5
- data/lib/mongoid/persistable/creatable.rb +2 -0
- data/lib/mongoid/persistable/deletable.rb +7 -3
- data/lib/mongoid/persistable/settable.rb +3 -16
- data/lib/mongoid/persistable/updatable.rb +10 -12
- data/lib/mongoid/persistence_context.rb +216 -0
- data/lib/mongoid/query_cache.rb +5 -30
- data/lib/mongoid/relations/accessors.rb +6 -2
- data/lib/mongoid/relations/auto_save.rb +12 -4
- data/lib/mongoid/relations/bindings/embedded/in.rb +4 -0
- data/lib/mongoid/relations/bindings/embedded/many.rb +8 -1
- data/lib/mongoid/relations/bindings/embedded/one.rb +10 -0
- data/lib/mongoid/relations/bindings/referenced/many.rb +4 -0
- data/lib/mongoid/relations/builders.rb +2 -2
- data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
- data/lib/mongoid/relations/conversions.rb +1 -1
- data/lib/mongoid/relations/counter_cache.rb +28 -18
- data/lib/mongoid/relations/eager.rb +19 -7
- data/lib/mongoid/relations/eager/base.rb +5 -5
- data/lib/mongoid/relations/embedded/batchable.rb +9 -33
- data/lib/mongoid/relations/embedded/in.rb +16 -2
- data/lib/mongoid/relations/embedded/many.rb +23 -8
- data/lib/mongoid/relations/embedded/one.rb +17 -2
- data/lib/mongoid/relations/macros.rb +9 -2
- data/lib/mongoid/relations/metadata.rb +3 -3
- data/lib/mongoid/relations/nested_builder.rb +1 -1
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/proxy.rb +2 -33
- data/lib/mongoid/relations/referenced/in.rb +23 -11
- data/lib/mongoid/relations/referenced/many.rb +24 -16
- data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
- data/lib/mongoid/relations/referenced/one.rb +17 -1
- data/lib/mongoid/relations/reflections.rb +3 -5
- data/lib/mongoid/relations/touchable.rb +1 -1
- data/lib/mongoid/reloadable.rb +1 -1
- data/lib/mongoid/scopable.rb +3 -3
- data/lib/mongoid/serializable.rb +2 -3
- data/lib/mongoid/tasks/database.rb +1 -2
- data/lib/mongoid/threaded.rb +4 -4
- data/lib/mongoid/traversable.rb +1 -1
- data/lib/mongoid/validatable.rb +1 -1
- data/lib/mongoid/validatable/macros.rb +2 -4
- data/lib/mongoid/validatable/uniqueness.rb +1 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -7
- data/spec/app/models/album.rb +5 -1
- data/spec/app/models/artist.rb +21 -0
- data/spec/app/models/band.rb +0 -1
- data/spec/app/models/church.rb +0 -2
- data/spec/app/models/ordered_post.rb +5 -0
- data/spec/app/models/oscar.rb +1 -2
- data/spec/app/models/person.rb +3 -1
- data/spec/app/models/post.rb +0 -1
- data/spec/app/models/princess.rb +2 -0
- data/spec/app/models/record.rb +1 -0
- data/spec/app/models/thing.rb +1 -1
- data/spec/config/mongoid.yml +1 -5
- data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
- data/spec/mongoid/atomic_spec.rb +17 -17
- data/spec/mongoid/attributes/nested_spec.rb +14 -14
- data/spec/mongoid/attributes/readonly_spec.rb +87 -44
- data/spec/mongoid/attributes_spec.rb +63 -0
- data/spec/mongoid/cacheable_spec.rb +112 -0
- data/spec/mongoid/changeable_spec.rb +58 -0
- data/spec/mongoid/clients/factory_spec.rb +3 -11
- data/spec/mongoid/clients/options_spec.rb +378 -96
- data/spec/mongoid/clients_spec.rb +207 -170
- data/spec/mongoid/composable_spec.rb +7 -0
- data/spec/mongoid/config_spec.rb +41 -21
- data/spec/mongoid/contextual/atomic_spec.rb +77 -343
- data/spec/mongoid/contextual/map_reduce_spec.rb +119 -111
- data/spec/mongoid/contextual/memory_spec.rb +56 -316
- data/spec/mongoid/contextual/mongo_spec.rb +104 -378
- data/spec/mongoid/copyable_spec.rb +8 -15
- data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
- data/spec/mongoid/criteria/options_spec.rb +29 -0
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
- data/spec/mongoid/{extensions/origin/regexp_raw_spec.rb → criteria/queryable/extensions/regexp_spec.rb} +21 -20
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
- data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
- data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +1786 -0
- data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +4159 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +778 -0
- data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
- data/spec/mongoid/criteria_spec.rb +45 -63
- data/spec/mongoid/document_spec.rb +21 -88
- data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
- data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
- data/spec/mongoid/extensions/date_spec.rb +2 -6
- data/spec/mongoid/extensions/date_time_spec.rb +2 -6
- data/spec/mongoid/extensions/float_spec.rb +8 -1
- data/spec/mongoid/extensions/integer_spec.rb +8 -1
- data/spec/mongoid/extensions/object_spec.rb +11 -0
- data/spec/mongoid/extensions/string_spec.rb +21 -0
- data/spec/mongoid/extensions/time_spec.rb +4 -8
- data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
- data/spec/mongoid/fields/localized_spec.rb +0 -91
- data/spec/mongoid/findable_spec.rb +46 -1
- data/spec/mongoid/indexable_spec.rb +6 -46
- data/spec/mongoid/interceptable_spec.rb +49 -10
- data/spec/mongoid/matchable/gt_spec.rb +11 -0
- data/spec/mongoid/matchable/gte_spec.rb +10 -0
- data/spec/mongoid/matchable/lt_spec.rb +11 -0
- data/spec/mongoid/matchable/lte_spec.rb +11 -0
- data/spec/mongoid/matchable_spec.rb +1 -51
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +1 -1
- data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
- data/spec/mongoid/persistable/savable_spec.rb +30 -30
- data/spec/mongoid/persistable/settable_spec.rb +0 -185
- data/spec/mongoid/persistable/updatable_spec.rb +166 -5
- data/spec/mongoid/persistence_context_spec.rb +654 -0
- data/spec/mongoid/positional_spec.rb +10 -10
- data/spec/mongoid/query_cache_spec.rb +89 -65
- data/spec/mongoid/relations/accessors_spec.rb +1 -1
- data/spec/mongoid/relations/auto_save_spec.rb +39 -6
- data/spec/mongoid/relations/builders_spec.rb +37 -10
- data/spec/mongoid/relations/counter_cache_spec.rb +64 -15
- data/spec/mongoid/relations/cyclic_spec.rb +0 -22
- data/spec/mongoid/relations/embedded/many_spec.rb +9 -41
- data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
- data/spec/mongoid/relations/macros_spec.rb +395 -7
- data/spec/mongoid/relations/proxy_spec.rb +3 -1
- data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
- data/spec/mongoid/relations/referenced/many_spec.rb +6 -29
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +6 -29
- data/spec/mongoid/relations/reflections_spec.rb +9 -9
- data/spec/mongoid/reloadable_spec.rb +51 -0
- data/spec/mongoid/scopable_spec.rb +0 -12
- data/spec/mongoid/serializable_spec.rb +0 -50
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +16 -9
- data/spec/mongoid/validatable_spec.rb +16 -0
- data/spec/spec_helper.rb +10 -10
- metadata +536 -479
- metadata.gz.sig +0 -0
- data/lib/mongoid/clients/thread_options.rb +0 -19
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -20
- data/lib/mongoid/extensions/decimal128.rb +0 -39
- data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
- data/lib/mongoid/matchable/regexp.rb +0 -27
- data/spec/app/models/post_genre.rb +0 -6
- data/spec/mongoid/extensions/decimal128_spec.rb +0 -44
- 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)
|