class ReportsKits::Reports::Data::AddTableAggregations

Constants

VALID_AGGREGATION_OPERATORS

Attributes

data[RW]
report_options[RW]

Public Class Methods

new(data, report_options:) click to toggle source
# File lib/reports_kits/reports/data/add_table_aggregations.rb, line 9
def initialize(data, report_options:)
  self.data = data
  self.report_options = report_options || {}
end

Public Instance Methods

perform() click to toggle source
# File lib/reports_kits/reports/data/add_table_aggregations.rb, line 14
def perform
  data_with_aggregations
end

Private Instance Methods

aggregate_array(values, operator) click to toggle source
# File lib/reports_kits/reports/data/add_table_aggregations.rb, line 89
def aggregate_array(values, operator)
  operator = operator.try(:to_sym)
  raise ArgumentError.new("Invalid aggregation operator: #{operator}") unless operator.in?(VALID_AGGREGATION_OPERATORS)
  if values.first.is_a?(Numeric)
    values.public_send(operator)
  else
    nil
  end
end
aggregate_array_of_arrays(array_of_arrays, operator) click to toggle source
# File lib/reports_kits/reports/data/add_table_aggregations.rb, line 99
def aggregate_array_of_arrays(array_of_arrays, operator)
  array_of_arrays.map { |values| aggregate_array(values, operator) }
end
column_aggregation_configs() click to toggle source
# File lib/reports_kits/reports/data/add_table_aggregations.rb, line 84
def column_aggregation_configs
  return [] if report_options[:aggregations].blank?
  report_options[:aggregations].select { |config| config[:from] == 'columns' }
end
data_with_aggregations() click to toggle source
# File lib/reports_kits/reports/data/add_table_aggregations.rb, line 20
def data_with_aggregations
  return data if row_aggregation_configs.blank? && column_aggregation_configs.blank?
  {
    entities: entities,
    datasets: datasets
  }
end
datasets() click to toggle source
# File lib/reports_kits/reports/data/add_table_aggregations.rb, line 35
def datasets
  datasets_with_row_aggregations.map do |dataset|
    column_aggregation_configs.each do |config|
      value = aggregate_array(dataset[:values].map(&:formatted), config[:operator])
      dataset[:values] << ReportsKits::Value.new(value, value)
    end
    dataset
  end
end
datasets_with_row_aggregations() click to toggle source
# File lib/reports_kits/reports/data/add_table_aggregations.rb, line 55
def datasets_with_row_aggregations
  @datasets_with_row_aggregations ||= begin
    return original_datasets if row_aggregation_configs.blank?
    row_aggregation_datasets = row_aggregation_configs.map do |config|
      values = original_datasets.map { |dataset| dataset[:values].map(&:formatted) }.transpose
      aggregated_values = aggregate_array_of_arrays(values, config[:operator])
      values = aggregated_values.map { |value| ReportsKits::Value.new(value, value) }
      {
        entity: ReportsKits::Entity.new(config[:label], config[:label], config[:label]),
        values: values
      }
    end
    original_datasets + row_aggregation_datasets
  end
end
entities() click to toggle source
# File lib/reports_kits/reports/data/add_table_aggregations.rb, line 28
def entities
  column_aggregation_entities = column_aggregation_configs.map do |config|
    ReportsKits::Entity.new(config[:label], config[:label], config[:label])
  end
  entities_with_row_aggregations + column_aggregation_entities
end
entities_with_row_aggregations() click to toggle source
# File lib/reports_kits/reports/data/add_table_aggregations.rb, line 45
def entities_with_row_aggregations
  @entities_with_row_aggregations ||= begin
    return original_entities if row_aggregation_configs.blank?
    row_aggregation_entities = row_aggregation_configs.map do |config|
      ReportsKits::Entity.new(config[:label], config[:label], config[:label])
    end
    original_entities + row_aggregation_entities
  end
end
original_datasets() click to toggle source
# File lib/reports_kits/reports/data/add_table_aggregations.rb, line 75
def original_datasets
  data[:datasets]
end
original_entities() click to toggle source
# File lib/reports_kits/reports/data/add_table_aggregations.rb, line 71
def original_entities
  data[:entities]
end
row_aggregation_configs() click to toggle source
# File lib/reports_kits/reports/data/add_table_aggregations.rb, line 79
def row_aggregation_configs
  return [] if report_options[:aggregations].blank?
  report_options[:aggregations].select { |config| config[:from] == 'rows' }
end