class ReportsKit::Reports::Series

Constants

VALID_KEYS

Attributes

context_record[RW]
contextual_filters[RW]
dimensions[RW]
filters[RW]
properties[RW]

Public Class Methods

new(properties, context_record: nil) click to toggle source
# File lib/reports_kit/reports/series.rb, line 8
def initialize(properties, context_record: nil)
  properties = { measure: properties } if properties.is_a?(String)
  properties = properties.deep_symbolize_keys.dup
  measure_properties = properties[:measure]
  properties[:measure] = measure_properties
  properties[:measure] = { key: properties[:measure] } if properties[:measure].is_a?(String)
  raise ArgumentError.new("Measure properties must be a String or Hash, not a #{properties.class.name}: #{properties.inspect}") unless properties.is_a?(Hash)

  contextual_filter_keys = properties[:contextual_filters] || []
  dimension_hashes = properties[:dimensions] || []
  dimension_hashes = dimension_hashes.values if dimension_hashes.is_a?(Hash) && dimension_hashes.key?(:'0')
  filter_hashes = properties[:filters] || []
  filter_hashes = filter_hashes.values if filter_hashes.is_a?(Hash) && filter_hashes.key?(:'0')

  self.properties = properties
  self.context_record = context_record
  self.dimensions = dimension_hashes.map { |dimension_hash| DimensionWithSeries.new(dimension: Dimension.new(dimension_hash), series: self) }
  self.filters = filter_hashes.map { |filter_hash| FilterWithSeries.new(filter: Filter.new(filter_hash), series: self) }
  self.contextual_filters = contextual_filter_keys.map { |key| ContextualFilter.new(key, model_class) }
end
new_from_properties!(properties, context_record:) click to toggle source
# File lib/reports_kit/reports/series.rb, line 106
def self.new_from_properties!(properties, context_record:)
  series_hashes = properties[:series].presence || properties.slice(*Series::VALID_KEYS)
  series_hashes = [series_hashes] if series_hashes.is_a?(Hash)
  raise ArgumentError.new('At least one series must be configured') if series_hashes.blank?

  series_hashes.map do |series_hash|
    if series_hash[:composite_operator].present?
      CompositeSeries.new(series_hash, context_record: context_record)
    else
      new(series_hash, context_record: context_record)
    end
  end
end

Public Instance Methods

aggregate_function() click to toggle source
# File lib/reports_kit/reports/series.rb, line 49
def aggregate_function
  aggregation_expression || [:count, model_class.primary_key]
end
aggregation_config() click to toggle source
# File lib/reports_kit/reports/series.rb, line 67
def aggregation_config
  @aggregation_config ||= begin
    return unless aggregation_key
    raise ArgumentError.new("A '#{aggregation_key}' aggregation on the #{model_class} model hasn't been configured") unless model_class.respond_to?(:reports_kit_configuration)
    config = model_class.reports_kit_configuration.aggregations.find { |aggregation| aggregation[:key] == aggregation_key }
    raise ArgumentError.new("A '#{aggregation_key}' aggregation on the #{model_class} model hasn't been configured") unless config
    config
  end
end
aggregation_expression() click to toggle source
# File lib/reports_kit/reports/series.rb, line 53
def aggregation_expression
  return unless aggregation_config
  expression = aggregation_config[:expression]
  if expression.is_a?(Array)
    expression
  else
    raise ArgumentError.new("The '#{aggregation_key}' aggregation on the #{model_class} model isn't valid")
  end
end
aggregation_key() click to toggle source
# File lib/reports_kit/reports/series.rb, line 63
def aggregation_key
  properties[:measure][:aggregation]
end
base_relation() click to toggle source
# File lib/reports_kit/reports/series.rb, line 77
def base_relation
  return context_record.public_send(relation_name) if context_record
  model_class
end
edit_relation_method() click to toggle source
# File lib/reports_kit/reports/series.rb, line 41
def edit_relation_method
  ReportsKit.configuration.custom_method(properties[:report_options].try(:[], :edit_relation_method))
end
filtered_relation() click to toggle source
# File lib/reports_kit/reports/series.rb, line 91
def filtered_relation
  relation = base_relation
  filters.each do |filter|
    relation = filter.apply(relation)
  end
  contextual_filters.each do |filter|
    relation = filter.apply(relation, properties[:context_params])
  end
  relation
end
has_two_dimensions?() click to toggle source
# File lib/reports_kit/reports/series.rb, line 102
def has_two_dimensions?
  dimensions.length == 2
end
key() click to toggle source
# File lib/reports_kit/reports/series.rb, line 29
def key
  properties[:measure][:key].underscore
end
label() click to toggle source
# File lib/reports_kit/reports/series.rb, line 33
def label
  properties[:measure][:name].presence || key.pluralize.titleize
end
limit() click to toggle source
# File lib/reports_kit/reports/series.rb, line 37
def limit
  properties[:limit]
end
model_class() click to toggle source
# File lib/reports_kit/reports/series.rb, line 82
def model_class
  if context_record
    reflection = context_record.class.reflect_on_association(key.to_sym) ||
      context_record.class.reflect_on_association(key.pluralize.to_sym)
    return reflection.klass if reflection
  end
  key.camelize.constantize
end
relation_name() click to toggle source
# File lib/reports_kit/reports/series.rb, line 45
def relation_name
  key.tableize
end