Vizzuality/gfw-climate

View on GitHub
app/models/indicator.rb

Summary

Maintainability
A
2 hrs
Test Coverage
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