Class: Plucky::Normalizers::CriteriaHashValue

Inherits:
Object
  • Object
show all
Defined in:
lib/toughguy/ext.rb

Instance Method Summary collapse

Instance Method Details

#call(parent_key, key, value) ⇒ Object

add support for specifying ranges



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/toughguy/ext.rb', line 3

def call(parent_key, key, value)
  case value
    when Array, Set
      if object_id?(parent_key)
        value = value.map { |v| to_object_id(v) }
      end

      if nesting_operator?(key)
        value.map  { |v| criteria_hash_class.new(v, options).to_hash }
      elsif parent_key == key && !modifier?(key) && !value.empty?
        # we're not nested and not the value for a symbol operator
        {:$in => value.to_a}
      else
        # we are a value for a symbol operator or nested hash
        value.to_a
      end
    when Time
      value.utc
    when String
      if object_id?(key)
        return to_object_id(value)
      end
      value
    when Range
      v1 = value.begin; v2 = value.end
      if (parent_key == :_id) && v1.is_a?(Time) && v2.is_a?(Time)
        v1 = BSON::ObjectId.from_time(v1)
        v2 = BSON::ObjectId.from_time(v2)
      end
      {'$gte' => v1, (value.exclude_end? ? '$lt' : '$lte') => v2}
    when Hash
      value.each { |k, v| value[k] = call(key, k, v) }
      value
    when Regexp
      Regexp.new(value)
    else
      value
  end
end