app/models/indicator.rb
require 'httparty'
class Indicator
include HTTParty
default_timeout 10
class << self
def base_path
"#{ENV['CDB_API_HOST']}?q="
end
def find_all
url = base_path
url += index_query
timeouts do
items_caching do
get(url)['rows'].sort_by { |i| i['indicator_id'] }
end
end
end
def find_indicator(filter_params)
indicator_id = filter_params[:id]
iso = filter_params[:iso].downcase if filter_params[:iso].present?
id_1 = filter_params[:id_1] if filter_params[:id_1].present? && filter_params[:id_1].to_i > 0
area = filter_params[:area] if filter_params[:area].present?
thresh_value = filter_params[:thresh].present? ? filter_params['thresh'].to_i : 25
# Allowed values for thresh: 10, 15, 20, 25, 30, 50, 75
url = base_path
url += show_query(indicator_id, iso, id_1, area, thresh_value) + ' ORDER BY year'
ids = "#{iso}_#{id_1}_#{area}"
puts url
timeouts do
item_caching(indicator_id, ids, nil, thresh_value) do
get(url)['rows'].blank? ? {} : get(url)['rows']
end
end
end
private
def index_query
<<-SQL
SELECT indicator_group, chart_type, description, indicator_id, value_units
FROM #{CDB_INDICATORS_TABLE}
GROUP BY indicator_id, indicator_group, description, value_units, chart_type
SQL
end
def show_query(indicator_id, iso, id_1, area, thresh_value)
filter = <<-SQL
indicator_id = #{indicator_id}
AND value IS NOT NULL
AND thresh = #{thresh_value}
SQL
filter += filter_location(iso, id_1, area) if iso.present?
sql = <<-SQL
SELECT
indicator_id, values.cartodb_id AS cartodb_id,
values.iso, values.sub_nat_id,
values.boundary_code,
values.thresh, values.the_geom,
values.the_geom_webmercator,
values.country AS country_name,
values.country AS admin0_name,
values.year, CAST(values.value AS double precision) AS value,
values.value AS text_value,
subnat.name_1 AS sub_nat_name,
boundaries.boundary_name
FROM #{CDB_INDICATORS_VALUES_TABLE} AS values
LEFT JOIN #{CDB_SUBNAT_TABLE} AS subnat
ON values.sub_nat_id = subnat.id_1 AND values.iso = subnat.iso
LEFT JOIN #{CDB_BOUNDARIES_TABLE} AS boundaries
ON values.boundary_code = boundaries.boundary_code
WHERE #{filter}
SQL
sql.squish
end
def filter_location(iso, id_1, area)
<<-SQL
AND values.iso = UPPER('#{iso}')
AND values.sub_nat_id #{id_1.blank? ? 'IS NULL' : "= #{id_1}" }
#{area.blank? ? "AND values.boundary_code = '#{ADMIN_BOUNDARY_ID}'" : "AND boundaries.cartodb_id = #{area}"}
SQL
end
include Concerns::Cached
end
end