Sha256: 69691b88aa5650f9cbe2026a278c5df0e1771e5024a2d54d067bb1d143dd42ab

Contents?: true

Size: 1.95 KB

Versions: 16

Compression:

Stored size: 1.95 KB

Contents

module ForestLiana
  class LineStatGetter
    attr_accessor :record

    def initialize(resource, params)
      @resource = resource
      @params = params
      @populates = {}
    end

    def perform
      value = @resource.unscoped

      if @params[:filterType] && @params[:filters]
        conditions = []
        filter_operator = " #{@params[:filterType]} ".upcase

        @params[:filters].try(:each) do |filter|
          operator, filter_value = OperatorValueParser.parse(filter[:value])
          conditions <<  OperatorValueParser.get_condition(filter[:field],
            operator, filter_value, @resource)
        end

        value = value.where(conditions.join(filter_operator))
      end

      value = value.send(time_range, @params[:group_by_date_field])
      value = value.group(group_by_field || :id) if group_by_field

      value = value.send(@params[:aggregate].downcase, @params[:aggregate_field])
        .map do |k, v|
          if k.kind_of?(Array)
            {
              label: k[0],
              values: {
                key: populate(k[1]),
                value: v
              }
            }
          else
            {
              label: k,
              values: {
                value: v
              }
            }
          end
        end

      @record = Model::Stat.new(value: value)
    end

    private

    def group_by_field
      field_name = @params[:group_by_field]
      association = @resource.reflect_on_association(field_name) if field_name

      if association
        association.foreign_key
      else
        field_name
      end
    end

    def populate(id)
      @populates[id] ||= begin
        field_name = @params[:group_by_field]
        association = @resource.reflect_on_association(field_name)

        if association
          association.klass.find(id)
        else
          id
        end
      end
    end

    def time_range
      "group_by_#{@params[:time_range].try(:downcase) || 'month'}"
    end

  end
end

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
forest_liana-1.4.2 app/services/forest_liana/line_stat_getter.rb
forest_liana-1.4.1 app/services/forest_liana/line_stat_getter.rb
forest_liana-1.4.0 app/services/forest_liana/line_stat_getter.rb
forest_liana-1.3.53 app/services/forest_liana/line_stat_getter.rb
forest_liana-1.3.52 app/services/forest_liana/line_stat_getter.rb
forest_liana-1.3.51 app/services/forest_liana/line_stat_getter.rb
forest_liana-1.3.50 app/services/forest_liana/line_stat_getter.rb
forest_liana-1.3.49 app/services/forest_liana/line_stat_getter.rb
forest_liana-1.3.48 app/services/forest_liana/line_stat_getter.rb
forest_liana-1.3.47 app/services/forest_liana/line_stat_getter.rb
forest_liana-1.3.46 app/services/forest_liana/line_stat_getter.rb
forest_liana-1.3.45 app/services/forest_liana/line_stat_getter.rb
forest_liana-1.3.44 app/services/forest_liana/line_stat_getter.rb
forest_liana-1.3.43 app/services/forest_liana/line_stat_getter.rb
forest_liana-1.3.42 app/services/forest_liana/line_stat_getter.rb
forest_liana-1.3.41 app/services/forest_liana/line_stat_getter.rb