class ReportsKits::Reports::Data::Generate

Constants

ROUND_PRECISION

Attributes

context_record[RW]
properties[RW]

Public Class Methods

new(properties, context_record: nil, context_params: nil) click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 9
def initialize(properties, context_record: nil, context_params: nil)
  self.properties = properties.deep_symbolize_keys
  self.properties = ReportsKits.configuration.default_properties.deep_merge(self.properties) if ReportsKits.configuration.default_properties
  self.properties[:context_params] = context_params if context_params
  self.properties = NormalizeProperties.new(self.properties).perform
  self.context_record = context_record
end

Public Instance Methods

perform() click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 17
def perform
  data = ReportsKits::Cache.get(properties, context_record)
  return data.deep_symbolize_keys if data

  data_method_data = ChartDataForDataMethod.new(properties).perform if has_data_method?
  chart_data = data_method_data ? data_method_data[:formatted_data] : properties_to_chart_data
  data = { chart_data: chart_data }
  data = ChartOptions.new(data, options: properties[:chart], inferred_options: inferred_options).perform
  data[:report_options] = report_options if report_options
  data = format_table_data(data, data_method_data) if table_or_csv?
  ReportsKits::Cache.set(properties, context_record, data)
  data
end

Private Instance Methods

csv_data_format_method() click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 121
def csv_data_format_method
  ReportsKits.configuration.custom_method(report_options.try(:[], :csv_data_format_method))
end
data_format_method() click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 117
def data_format_method
  ReportsKits.configuration.custom_method(report_options.try(:[], :data_format_method))
end
format() click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 125
def format
  properties[:format]
end
format_chart_data(raw_data) click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 50
def format_chart_data(raw_data)
  chart_data = {}
  chart_data[:labels] = raw_data[:entities].map(&:label)
  chart_data[:datasets] = raw_data[:datasets].map do |raw_dataset|
    {
      label: raw_dataset[:entity].label,
      data: raw_dataset[:values].map(&:formatted)
    }
  end
  chart_data
end
format_csv_times(raw_data) click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 129
def format_csv_times(raw_data)
  return raw_data unless primary_dimension.configured_by_time?
  raw_data[:entities] = raw_data[:entities].map do |entity|
    entity.label = Utils.format_csv_time(entity.instance)
    entity
  end
  raw_data
end
format_table_data(data, data_method_data) click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 62
def format_table_data(data, data_method_data)
  data[:type] = format
  if has_data_method?
    data[:table_data] = data_method_data[:raw_data]
    return data
  end
  data[:table_data] = Data::FormatTable.new(
    data.delete(:chart_data),
    format: format,
    first_column_label: primary_dimension.try(:label),
    report_options: report_options
  ).perform
  data
end
has_data_method?() click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 33
def has_data_method?
  properties[:data_method].present?
end
inferred_options() click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 146
def inferred_options
  return {} if has_data_method?
  {
    x_axis_label: primary_dimension.label,
    y_axis_label: serieses.length == 1 ? serieses.first.label : nil
  }
end
inferred_order() click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 97
def inferred_order
  return Order.new('dimension1', nil, 'asc') if primary_dimension.configured_by_time?
  Order.new('count', nil, 'desc')
end
limit() click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 93
def limit
  properties[:limit]
end
order() click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 86
def order
  @order ||= begin
    return Order.parse(properties[:order]) if properties[:order].present?
    inferred_order
  end
end
primary_dimension() click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 138
def primary_dimension
  serieses.first.dimensions.first
end
properties_to_chart_data() click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 37
def properties_to_chart_data
  if two_dimensions?
    raw_data = Data::FormatTwoDimensions.new(serieses.first, serieses_results.first.last, order: order, limit: limit).perform
  else
    raw_data = Data::FormatOneDimension.new(serieses_results, order: order, limit: limit).perform
  end
  raw_data = format_csv_times(raw_data) if format == 'csv'
  raw_data = Data::AddTableAggregations.new(raw_data, report_options: report_options).perform if table_or_csv?
  raw_data = data_format_method.call(data: raw_data, properties: properties, context_record: context_record) if data_format_method
  raw_data = csv_data_format_method.call(data: raw_data, properties: properties, context_record: context_record) if csv_data_format_method && format == 'csv'
  format_chart_data(raw_data)
end
report_options() click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 106
def report_options
  report_options = properties[:report_options] || {}
  head_rows_count = report_options[:head_rows_count]
  foot_rows_count = report_options[:foot_rows_count]
  foot_rows_count ||= report_options[:aggregations].count { |config| config[:from] == 'rows' } if report_options[:aggregations]

  report_options[:head_rows_count] = head_rows_count if head_rows_count && head_rows_count > 0
  report_options[:foot_rows_count] = foot_rows_count if foot_rows_count && foot_rows_count > 0
  report_options.presence
end
serieses() click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 102
def serieses
  @serieses ||= Series.new_from_properties!(properties, context_record: context_record)
end
serieses_results() click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 77
def serieses_results
  @serieses_results ||= GenerateForProperties.new(properties, context_record: context_record).perform
end
table_or_csv?() click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 142
def table_or_csv?
  format.in?(%w(table csv))
end
two_dimensions?() click to toggle source
# File lib/reports_kits/reports/data/generate.rb, line 81
def two_dimensions?
  dimension_keys = serieses_results.first.last.keys
  dimension_keys.first.is_a?(Array)
end