class ReportsKit::ChartDataForDataMethod

Attributes

properties[RW]

Public Class Methods

new(properties) click to toggle source
# File lib/reports_kit/reports/data/chart_data_for_data_method.rb, line 5
def initialize(properties)
  self.properties = properties
end

Public Instance Methods

perform() click to toggle source
# File lib/reports_kit/reports/data/chart_data_for_data_method.rb, line 9
def perform
  klass, method_name = ReportsKit::Utils.string_to_class_method(properties[:data_method], 'data_method')
  raw_data = klass.public_send(method_name, properties)
  {
    raw_data: raw_data,
    formatted_data: format_returned_data(raw_data)
  }
end

Private Instance Methods

format_returned_data(returned_data) click to toggle source
# File lib/reports_kit/reports/data/chart_data_for_data_method.rb, line 20
def format_returned_data(returned_data)
  return [] if returned_data.blank?
  returned_data = returned_data.to_a

  first_key = returned_data.first.first
  if first_key.is_a?(Array) && first_key.length == 2
    format_two_dimensional_returned_data(returned_data)
  else
    {
      labels: returned_data.map(&:first),
      datasets: [
        {
          data: returned_data.map(&:last)
        }
      ]
    }
  end
end
format_two_dimensional_returned_data(returned_data) click to toggle source
# File lib/reports_kit/reports/data/chart_data_for_data_method.rb, line 39
def format_two_dimensional_returned_data(returned_data)
  primary_keys_secondary_keys_values = {}
  secondary_keys_primary_keys_values = {}
  secondary_keys = []
  returned_data.each do |(primary_key, secondary_key), value|
    secondary_keys_primary_keys_values[secondary_key] ||= {}
    secondary_keys_primary_keys_values[secondary_key][primary_key] = value
    primary_keys_secondary_keys_values[primary_key] ||= {}
    primary_keys_secondary_keys_values[primary_key][secondary_key] = value
  end
  primary_keys = primary_keys_secondary_keys_values.keys
  datasets = secondary_keys_primary_keys_values.map do |secondary_key, primary_keys_values|
    {
      label: secondary_key,
      data: primary_keys.map { |primary_key| primary_keys_values[primary_key] || 0 }
    }
  end
  {
    labels: primary_keys,
    datasets: datasets
  }
end