class ReportsKits::Reports::DimensionWithSeries

Constants

ADAPTER_NAMES_CLASSES
DEFAULT_GRANULARITY
VALID_GRANULARITIES

Attributes

configuration[RW]
dimension[RW]
series[RW]

Public Class Methods

new(dimension:, series:) click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 18
def initialize(dimension:, series:)
  self.dimension = dimension
  self.series = series
  self.configuration = InferrableConfiguration.new(self, :dimensions)
  missing_group_setting = settings && !settings.key?(:group)
  raise ArgumentError.new("Dimension settings for dimension '#{key}' of #{model_class} must include :group") if missing_group_setting
end

Public Instance Methods

adapter() click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 118
def adapter
  @adapter ||= begin
    adapter_name = model_class.connection_config[:adapter]
    adapter = ADAPTER_NAMES_CLASSES[adapter_name]
    raise ArgumentError.new("Unsupported adapter: #{adapter_name}") unless adapter
    adapter
  end
end
column_expression() click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 127
def column_expression
  "#{model_class.table_name}.#{key}"
end
datetime_filters() click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 109
def datetime_filters
  return [] unless series.filters.present?
  series.filters.map(&:filter_type).select { |filter_type| filter_type.is_a?(FilterTypes::Datetime) }
end
day_expression() click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 131
def day_expression
  adapter.truncate_to_day(column_expression)
end
dimension_instances_limit() click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 86
def dimension_instances_limit
  if configured_by_time?
    properties[:limit]
  else
    properties[:limit] || ReportsKits.configuration.default_dimension_limit
  end
end
first_key() click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 94
def first_key
  return unless configured_by_time? && datetime_filters.present?
  datetime_filters.map(&:start_at).compact.sort.first
end
granularity() click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 26
def granularity
  @granularity ||= begin
    return unless configured_by_time?
    granularity = properties[:granularity] || DEFAULT_GRANULARITY
    raise ArgumentError.new("Invalid granularity: #{granularity}") unless VALID_GRANULARITIES.include?(granularity)
    granularity
  end
end
group_expression() click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 49
def group_expression
  if configured_by_model?
    settings_from_model[:group]
  elsif configured_by_association?
    inferred_settings_from_association[:column]
  elsif configured_by_column? && configured_by_time?
    case granularity
    when 'day' then day_expression
    when 'month' then month_expression
    else week_expression
    end
  elsif configured_by_column?
    column_expression
  else
    raise ArgumentError.new('Invalid group_expression')
  end
end
inferred_dimension_settings() click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 43
def inferred_dimension_settings
  {
    group: group_expression
  }
end
inferred_settings() click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 39
def inferred_settings
  configuration.inferred_settings.merge(inferred_dimension_settings)
end
inferred_settings_from_association() click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 67
def inferred_settings_from_association
  through_reflection = reflection.through_reflection
  if through_reflection
    {
      joins: through_reflection.name,
      column: "#{through_reflection.table_name}.#{reflection.source_reflection.foreign_key}"
    }
  else
    {
      column: "#{model_class.table_name}.#{reflection.foreign_key}"
    }
  end
end
joins() click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 81
def joins
  return settings_from_model[:joins] if configured_by_model?
  inferred_settings_from_association[:joins] if configured_by_association?
end
key_to_label(key) click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 104
def key_to_label(key)
  return unless settings[:key_to_label]
  settings[:key_to_label].call(key)
end
last_key() click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 99
def last_key
  return unless configured_by_time? && datetime_filters.present?
  datetime_filters.map(&:end_at).compact.sort.last
end
month_expression() click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 139
def month_expression
  adapter.truncate_to_month(column_expression)
end
settings() click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 35
def settings
  inferred_settings.merge(settings_from_model)
end
should_be_sorted_by_count?() click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 114
def should_be_sorted_by_count?
  !configured_by_time?
end
week_expression() click to toggle source
# File lib/reports_kits/reports/dimension_with_series.rb, line 135
def week_expression
  adapter.truncate_to_week(column_expression)
end