@@ -75,7 +75,7 @@ def to_pipeline
75
75
76
76
# Get the store name and store value. If the value is of type range,
77
77
# we need may need to change the store_name as well as the store_value,
78
- # therefore, we cannot just use the evole method.
78
+ # therefore, we cannot just use the evolve method.
79
79
#
80
80
# @param [ String ] name The name of the field.
81
81
# @param [ Object ] serializer The optional serializer for the field.
@@ -85,7 +85,7 @@ def to_pipeline
85
85
def store_creds ( name , serializer , value )
86
86
store_name = localized_key ( name , serializer )
87
87
if Range === value
88
- evolve_range ( store_name , serializer , value )
88
+ evolve_top_level_range ( store_name , serializer , value )
89
89
else
90
90
[ store_name , evolve ( serializer , value ) ]
91
91
end
@@ -147,11 +147,14 @@ def evolve_multi(specs)
147
147
#
148
148
# @param [ Object ] serializer The optional serializer for the field.
149
149
# @param [ Object ] value The value to serialize.
150
+ # @param [ Object ] is_raw_value Indicates that the evolve should be
151
+ # processed as a member of a Mongoid::RawValue. Used for recursion.
150
152
#
151
153
# @return [ Object ] The serialized object.
152
- def evolve ( serializer , value )
154
+ def evolve ( serializer , value , is_raw_value = false )
153
155
154
156
if value . is_a? ( Mongoid ::RawValue )
157
+ is_raw_value = true
155
158
value = value . raw_value
156
159
157
160
# Mongoid::RawValue skips any field-specific serialization logic
@@ -160,20 +163,18 @@ def evolve(serializer, value)
160
163
161
164
_value = case value
162
165
when Hash
163
- evolve_hash ( serializer , value )
166
+ evolve_hash ( serializer , value , is_raw_value )
164
167
when Array
165
- evolve_array ( serializer , value )
168
+ evolve_array ( serializer , value , is_raw_value )
166
169
when Range
167
- value . __evolve_range__ ( serializer : serializer )
168
- when Mongoid ::RawValue
169
- value
170
+ evolve_range ( serializer , value , is_raw_value )
170
171
else
171
172
( serializer || value . class ) . evolve ( value )
172
173
end
173
174
_value
174
175
end
175
176
176
- # Evolve a single key selection with array values .
177
+ # Evolve a single key selection with an array value .
177
178
#
178
179
# @api private
179
180
#
@@ -182,15 +183,17 @@ def evolve(serializer, value)
182
183
#
183
184
# @param [ Object ] serializer The optional serializer for the field.
184
185
# @param [ Array<Object> ] value The array to serialize.
186
+ # @param [ Object ] is_raw_value Indicates that the evolve should be
187
+ # processed as a member of a Mongoid::RawValue. Used for recursion.
185
188
#
186
189
# @return [ Object ] The serialized array.
187
- def evolve_array ( serializer , value )
190
+ def evolve_array ( serializer , value , is_raw_value = false )
188
191
value . map do |_value |
189
- evolve ( serializer , _value )
192
+ evolve ( serializer , _value , is_raw_value )
190
193
end
191
194
end
192
195
193
- # Evolve a single key selection with hash values .
196
+ # Evolve a single key selection with a hash value .
194
197
#
195
198
# @api private
196
199
#
@@ -199,19 +202,45 @@ def evolve_array(serializer, value)
199
202
#
200
203
# @param [ Object ] serializer The optional serializer for the field.
201
204
# @param [ Hash ] value The hash to serialize.
205
+ # @param [ Object ] is_raw_value Indicates that the evolve should be
206
+ # processed as a member of a Mongoid::RawValue. Used for recursion.
202
207
#
203
208
# @return [ Object ] The serialized hash.
204
- def evolve_hash ( serializer , value )
209
+ def evolve_hash ( serializer , value , is_raw_value = false )
205
210
value . each_pair do |operator , _value |
206
211
if operator =~ /exists|type|size/
207
212
value [ operator ] = _value
208
213
else
209
- value [ operator ] = evolve ( serializer , _value )
214
+ value [ operator ] = evolve ( serializer , _value , is_raw_value )
210
215
end
211
216
end
212
217
end
213
218
214
- # Evolve a single key selection with range values. This method traverses
219
+ # Evolve a single key selection with a range value.
220
+ #
221
+ # @api private
222
+ #
223
+ # @example Evolve a simple selection.
224
+ # selector.evolve(field, (1..3))
225
+ #
226
+ # @param [ Object ] serializer The optional serializer for the field.
227
+ # @param [ Range ] value The range to serialize.
228
+ # @param [ Object ] is_raw_value Indicates that the evolve should be
229
+ # processed as a member of a Mongoid::RawValue. Used for recursion.
230
+ #
231
+ # @return [ Hash ] The serialized range.
232
+ def evolve_range ( serializer , value , is_raw_value = false )
233
+ if is_raw_value
234
+ # (1..3) becomes { "min" => 1, "max" => 3 }
235
+ value . mongoize
236
+ else
237
+ # (1..3) becomes { "$gte" => 1, "$lte" => 5 }
238
+ value . __evolve_range__ ( serializer : serializer )
239
+ end
240
+ end
241
+
242
+ # Evolve a single key selection with range value at a top-level
243
+ # node in a multi-list selection. This method traverses
215
244
# the association tree to build a query for the given value and
216
245
# serializer. There are three parts to the query here:
217
246
#
@@ -239,12 +268,12 @@ def evolve_hash(serializer, value)
239
268
#
240
269
# @api private
241
270
#
242
- # @param [ String ] key The to store the range for.
271
+ # @param [ String ] key The key to store the range for.
243
272
# @param [ Object ] serializer The optional serializer for the field.
244
273
# @param [ Range ] value The Range to serialize.
245
274
#
246
275
# @return [ Array<String, Hash> ] The store name and serialized Range.
247
- def evolve_range ( key , serializer , value )
276
+ def evolve_top_level_range ( key , serializer , value )
248
277
v = value . __evolve_range__ ( serializer : serializer )
249
278
assocs = [ ]
250
279
Fields . traverse_association_tree ( key , serializers , associations , aliased_associations ) do |meth , obj , is_field |
0 commit comments