Sha256: 18f2aa01a9e0732c884d460f0a1184adf59fde7a2fd199dee09125bf49e6c685

Contents?: true

Size: 1.6 KB

Versions: 1

Compression:

Stored size: 1.6 KB

Contents

module ActiveHashRelation
  class Aggregation
    include Helpers

    attr_reader :configuration, :params, :resource, :model

    def initialize(resource, params, model: nil)
      @configuration = Module.nesting.last.configuration
      @resource = resource
      @params = HashWithIndifferentAccess.new(params)
      @model = model

      unless @model
        @model = model_class_name(@resource)
      end
    end

    def apply
      if params[:aggregate].is_a? Hash
        meta_attributes = HashWithIndifferentAccess.new

        @model.columns.each do |c|
          next unless params[:aggregate][c.name.to_s].is_a? Hash

          case c.type
          when :integer, :float, :decimal
            meta_attributes[c.name.to_s] = apply_aggregations(
              {avg: :average, sum: :sum, max: :maximum, min: :minimum},
              params[:aggregate][c.name.to_s],
              c.name.to_s
            )
          when :date, :datetime, :timestamp
            meta_attributes[c.name.to_s] = apply_aggregations(
              {max: :maximum, min: :minimum},
              params[:aggregate][c.name.to_s],
              c.name.to_s
            )
          end
        end
      end

      return meta_attributes
    end

    def apply_aggregations(available_aggr, asked_aggr, column)
      meta_attributes = HashWithIndifferentAccess.new

      available_aggr.each do |k, v|
        if asked_aggr[k] == true
          meta_attributes[k] = resource.send(v,column)
          meta_attributes[k] = meta_attributes[k].to_f if meta_attributes[k].is_a? BigDecimal
        end
      end

      return meta_attributes
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
active_hash_relation-0.0.3 lib/active_hash_relation/aggregation.rb