class ReportsKit::Reports::Data::FormatOneDimension

Attributes

limit[RW]
order[RW]
serieses[RW]
serieses_results[RW]

Public Class Methods

new(serieses_results, order:, limit:) click to toggle source
# File lib/reports_kit/reports/data/format_one_dimension.rb, line 7
def initialize(serieses_results, order:, limit:)
  self.serieses_results = serieses_results
  self.serieses = serieses_results.keys
  self.order = order
  self.limit = limit
end

Public Instance Methods

perform() click to toggle source
# File lib/reports_kit/reports/data/format_one_dimension.rb, line 14
def perform
  {
    entities: entities,
    datasets: datasets
  }
end

Private Instance Methods

datasets() click to toggle source
# File lib/reports_kit/reports/data/format_one_dimension.rb, line 29
def datasets
  sorted_serieses_results.map do |series, result|
    values = result.values.map do |raw_value|
      Utils.raw_value_to_value(raw_value, series.value_format_method)
    end
    {
      entity: series,
      values: values
    }
  end
end
dimension_ids_dimension_instances() click to toggle source
# File lib/reports_kit/reports/data/format_one_dimension.rb, line 65
def dimension_ids_dimension_instances
  @dimension_ids_dimension_instances ||= begin
    dimension_ids = raw_dimension_keys
    Utils.dimension_to_dimension_ids_dimension_instances(primary_dimension_with_series, dimension_ids)
  end
end
dimension_keys() click to toggle source
# File lib/reports_kit/reports/data/format_one_dimension.rb, line 57
def dimension_keys
  dimension_summaries.map(&:first)
end
dimension_keys_sorted_by_label() click to toggle source
# File lib/reports_kit/reports/data/format_one_dimension.rb, line 53
def dimension_keys_sorted_by_label
  dimension_summaries.sort_by { |key, label| label.is_a?(String) ? label.downcase : label }.map(&:first)
end
dimension_summaries() click to toggle source
# File lib/reports_kit/reports/data/format_one_dimension.rb, line 41
def dimension_summaries
  @dimension_summaries ||= raw_dimension_keys.map do |dimension_key|
    label = Utils.dimension_key_to_label(dimension_key, primary_dimension_with_series, dimension_ids_dimension_instances)
    next if label.blank?
    [dimension_key, label]
  end.compact
end
entities() click to toggle source
# File lib/reports_kit/reports/data/format_one_dimension.rb, line 23
def entities
  sorted_dimension_keys.map do |key|
    Utils.dimension_key_to_entity(key, primary_dimension_with_series, dimension_ids_dimension_instances)
  end
end
filter_dimension_keys_values(dimension_keys_values) click to toggle source
# File lib/reports_kit/reports/data/format_one_dimension.rb, line 134
def filter_dimension_keys_values(dimension_keys_values)
  dimension_keys_values.select { |key, values| dimension_keys.include?(key) }
end
primary_dimension_with_series() click to toggle source
# File lib/reports_kit/reports/data/format_one_dimension.rb, line 72
def primary_dimension_with_series
  @primary_dimension_with_series ||= DimensionWithSeries.new(dimension: primary_series.dimensions.first, series: primary_series)
end
primary_series() click to toggle source
# File lib/reports_kit/reports/data/format_one_dimension.rb, line 76
def primary_series
  serieses.first
end
raw_dimension_keys() click to toggle source
# File lib/reports_kit/reports/data/format_one_dimension.rb, line 61
def raw_dimension_keys
  serieses_results.first.last.keys
end
sorted_dimension_keys() click to toggle source
# File lib/reports_kit/reports/data/format_one_dimension.rb, line 49
def sorted_dimension_keys
  sorted_serieses_results.first.last.keys
end
sorted_serieses_results() click to toggle source
# File lib/reports_kit/reports/data/format_one_dimension.rb, line 80
def sorted_serieses_results
  @sorted_serieses_results ||= begin
    if order.relation == 'dimension1' && order.field == 'label'
      sorted_serieses_results = serieses_results.map do |series, dimension_keys_values|
        dimension_keys_values = filter_dimension_keys_values(dimension_keys_values)
        sorted_dimension_keys_values = dimension_keys_values.sort_by { |key, _| dimension_keys_sorted_by_label.index(key) }
        sorted_dimension_keys_values = sorted_dimension_keys_values.reverse if order.direction == 'desc'
        [series, Hash[sorted_dimension_keys_values]]
      end
    elsif (order.relation == 'dimension1' && order.field.nil?) || (order.relation == 0)
      sorted_serieses_results = serieses_results.map do |series, dimension_keys_values|
        dimension_keys_values = filter_dimension_keys_values(dimension_keys_values)
        sorted_dimension_keys_values = dimension_keys_values.sort_by(&:first)
        sorted_dimension_keys_values = sorted_dimension_keys_values.reverse if order.direction == 'desc'
        [series, Hash[sorted_dimension_keys_values]]
      end
    elsif order.relation.is_a?(Fixnum)
      series_index = order.relation - 1
      raise ArgumentError.new("Invalid order column: #{order.relation}") unless series_index.in?((0..(serieses_results.length - 1)))
      dimension_keys_values = serieses_results.values.to_a[series_index]
      sorted_dimension_keys = dimension_keys_values.sort_by(&:last).map(&:first)
      sorted_dimension_keys = sorted_dimension_keys.reverse if order.direction == 'desc'
      sorted_serieses_results = serieses_results.map do |series, dimension_keys_values|
        dimension_keys_values = filter_dimension_keys_values(dimension_keys_values)
        dimension_keys_values = dimension_keys_values.sort_by { |dimension_key, _| sorted_dimension_keys.index(dimension_key) }
        [series, Hash[dimension_keys_values]]
      end
    elsif order.relation == 'count'
      dimension_keys_sums = Hash.new(0)
      serieses_results.values.each do |dimension_keys_values|
        dimension_keys_values = filter_dimension_keys_values(dimension_keys_values)
        dimension_keys_values.each do |dimension_key, value|
          dimension_keys_sums[dimension_key] += value
        end
      end
      sorted_dimension_keys = dimension_keys_sums.sort_by(&:last).map(&:first)
      sorted_dimension_keys = sorted_dimension_keys.reverse if order.direction == 'desc'
      sorted_serieses_results = serieses_results.map do |series, dimension_keys_values|
        dimension_keys_values = filter_dimension_keys_values(dimension_keys_values)
        dimension_keys_values = dimension_keys_values.sort_by { |dimension_key, _| sorted_dimension_keys.index(dimension_key) }
        [series, Hash[dimension_keys_values]]
      end
    else
      sorted_serieses_results = serieses_results
    end
    if limit
      sorted_serieses_results = sorted_serieses_results.map do |series, results|
        [series, Hash[results.to_a.take(limit)]]
      end
    end
    Hash[sorted_serieses_results]
  end
end