Class: FacilitiesQuery::RadialQuery

Inherits:
Base
  • Object
show all
Defined in:
app/models/facilities_query/radial_query.rb

Constant Summary collapse

METERS_PER_MILE =
1609.344

Instance Attribute Summary

Attributes inherited from Base

#params

Instance Method Summary collapse

Methods inherited from Base

#get_facility_data, #ids_for_types, #initialize, #service_condition

Constructor Details

This class inherits a constructor from FacilitiesQuery::Base

Instance Method Details

#build_distance_result_set(lat, long, type, services, ids, limit = nil) ⇒ Object

rubocop:disable Metrics/ParameterLists



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'app/models/facilities_query/radial_query.rb', line 21

def build_distance_result_set(lat, long, type, services, ids, limit = nil)
  conditions = limit.nil? ? {} : "where distance < #{limit}"
  ids_map = ids_for_types(ids) unless ids.nil?
  result_set = BaseFacility::TYPES.flat_map do |facility_type|
    facilities = get_facility_data(
      conditions,
      type,
      facility_type,
      services,
      distance_query(lat, long)
    )
    if ids_map
      ids_for_type = ids_map[BaseFacility::PREFIX_MAP[BaseFacility::TYPE_NAME_MAP[facility_type]]]
      facilities = facilities.where(unique_id: ids_for_type)
    end
    facilities
  end
  result_set.sort_by(&:distance)
end

#distance_query(lat, long) ⇒ Object

The distance attribute is only set if lat/long are sent in as params



43
44
45
46
47
48
49
# File 'app/models/facilities_query/radial_query.rb', line 43

def distance_query(lat, long)
  <<-SQL.squish
    base_facilities.*,
    ST_Distance(base_facilities.location,
    ST_MakePoint(#{long},#{lat})) / #{METERS_PER_MILE} AS distance
  SQL
end

#runObject



7
8
9
10
11
12
13
14
15
16
17
18
# File 'app/models/facilities_query/radial_query.rb', line 7

def run
  # check for radial limiter if so grab all where distance < distance_query
  limit = Float(params[:radial_limit]) if params[:radial_limit]
  build_distance_result_set(
    Float(params[:lat]),
    Float(params[:long]),
    params[:type],
    params[:services],
    params[:ids],
    limit
  )
end