andrab/ecuacovid

View on GitHub
lib/ecuacovid/data.rb

Summary

Maintainability
B
6 hrs
Test Coverage
require 'ecuacovid/data/client'
require 'ecuacovid/data/handshake'
require 'ecuacovid/data/connection'

module EcuacovidData
    
  class Positives
    attr_accessor :years, :filters
  
    def model
      :positives
    end
  
    def select(record)
      equality = @filters.select {|cond| cond[0] == :created_at && cond[1] == :eq}
      equality.all? {|(field, op, value)| record.send(field) == value}
    end
  end

  class Mortalities
    attr_accessor :years, :filters
  
    def model
      :mortalities
    end
  
    def select(record)
      equality = @filters.select {|cond| cond[0] == :created_at && cond[1] == :eq}
      equality.all? {|(field, op, value)| record.send(field) == value}
    end
  end
  
  class Query
    attr_reader :model
  
    def initialize(filters)
      @filters = filters
    end
  
    def positives
      @model = :positives
      @years = @filters.select {|(field, op, value)| field == :year && op == :eq}

      @includes = @filters.select {|(field, op, value)| op == :in && field == :year}
  
      if @years.empty?
        if @includes.empty?
          @years = [2020, 2021]
        else
          _field, _op, years = @includes.find {|(field, _in, value)| field == :year}
          @years = years
        end
      else
        _field, _op, year = @years.first
        @years = [year]
      end
        
      m = Positives.new
      m.years = @years
      m.filters = @filters
      m
    end

    def mortalities
      @model = :mortalities
      @years = @filters.select {|(field, op, value)| field == :year && op == :eq}

      @includes = @filters.select {|(field, op, value)| op == :in && field == :year}
  
      if @years.empty?
        if @includes.empty?
          @years = [2020, 2021]
        else
          _field, _op, years = @includes.find {|(field, _in, value)| field == :year}
          @years = years
        end
      else
        _field, _op, year = @years.first
        @years = [year]
      end
        
      m = Mortalities.new
      m.years = @years
      m.filters = @filters
      m
    end
  
    class << self
      def where(keys={}, op = :eq)
        klass = Builder.new
        klass.filters = klass.filters + keys.entries.map do |(k, v)|
          [k, op, v]            
        end if keys.class == Hash
    
        klass
      end
    end
  
    class Builder
      attr_writer :filters, :model
  
      def filters
        (@filters ||= [])
      end
  
      def compile
        Query.new(filters).send(@model)
      end
    end
  
  end
  
end