Class: Mongoid::Criterion::WithinSpacial

Inherits:
Complex
  • Object
show all
Defined in:
lib/mongoid_spacial/criterion/within_spacial.rb

Overview

WithinSpecial criterion is used when performing #within with symbols to get get a shorthand syntax for where clauses.

Examples:

Conversion of a simple to complex criterion.

{ :field => { "$within" => {'$center' => [20,30]} } }
becomes:
{ :field.within(:center) => [20,30] }

Instance Method Summary collapse

Instance Method Details

#to_mongo_query(input) ⇒ Object

Convert input to query for box, polygon, center, and centerSphere

Examples:

within = WithinSpacial.new(opts[:key] => 'point', :operator => 'center')
within.to_mongo_query({:point => [20,30], :max => 5, :unit => :km}) #=>


21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/mongoid_spacial/criterion/within_spacial.rb', line 21

def to_mongo_query(input)
  if ['box','polygon'].index(@operator)
    input = input.values if input.kind_of?(Hash)
    if input.respond_to?(:map)
      input.map!{ |v| (v.respond_to?(:to_lng_lat)) ? v.to_lng_lat : v }
    else
      input
    end
  elsif ['center','centerSphere'].index(@operator)

    if input.kind_of?(Hash) || input.kind_of?(ActiveSupport::OrderedHash)
      raise ':point required to make valid query' unless input[:point]
      input[:point] = input[:point].to_lng_lat if input[:point].respond_to?(:to_lng_lat)
      if input[:max]
        input[:max] = input[:max].to_f

        if unit = Mongoid::Spacial.earth_radius[input[:unit]]
          unit *= Mongoid::Spacial::RAD_PER_DEG unless operator =~ /sphere/i
          input[:unit] = unit
        end

        input[:max] = input[:max]/input[:unit].to_f if input[:unit]

        input = [input[:point],input[:max]]
      else
        input = input[:point]
      end
    end

    if input.kind_of? Array
      input[0] = input[0].to_lng_lat if input[0].respond_to?(:to_lng_lat)
    end

  end
  {'$within' => {"$#{@operator}"=>input} }
end