class Repor::Dimensions::BaseDimension

Attributes

name[R]
opts[R]
report[R]

Public Class Methods

new(name, report, opts={}) click to toggle source
# File lib/repor/dimensions/base_dimension.rb, line 6
def initialize(name, report, opts={})
  @name = name
  @report = report
  @opts = opts
  validate_params!
end

Public Instance Methods

expression() click to toggle source
# File lib/repor/dimensions/base_dimension.rb, line 13
def expression
  opts.fetch(:expression, "#{report.table_name}.#{name}")
end
extract_sql_value(row) click to toggle source

Given a single (hashified) row of the SQL result, return the Ruby object representing this dimension’s value

# File lib/repor/dimensions/base_dimension.rb, line 40
def extract_sql_value(row)
  sanitize_sql_value(row[sql_value_name])
end
filter(relation) click to toggle source

Filter the relation based on any constraints in the params

# File lib/repor/dimensions/base_dimension.rb, line 23
def filter(relation)
  raise NotImplementedError
end
filter_values() click to toggle source
# File lib/repor/dimensions/base_dimension.rb, line 44
def filter_values
  array_param(:only).uniq
end
filtering?() click to toggle source

Return whether the report should filter by this dimension

# File lib/repor/dimensions/base_dimension.rb, line 49
def filtering?
  filter_values.present?
end
group(relation) click to toggle source

Group the relation by the expression – ensure this is ordered, too.

# File lib/repor/dimensions/base_dimension.rb, line 28
def group(relation)
  raise NotImplementedError
end
group_values() click to toggle source

Return an ordered array of all values that should appear in ‘Report#data`

# File lib/repor/dimensions/base_dimension.rb, line 34
def group_values
  raise NotImplementedError
end
grouping?() click to toggle source
# File lib/repor/dimensions/base_dimension.rb, line 53
def grouping?
  report.groupers.include?(self)
end
null_order() click to toggle source
# File lib/repor/dimensions/base_dimension.rb, line 79
def null_order
  return unless Repor.database_type == :postgres
  nulls_last?? 'NULLS LAST' : 'NULLS FIRST'
end
nulls_last?() click to toggle source
# File lib/repor/dimensions/base_dimension.rb, line 73
def nulls_last?
  value = dimension_or_root_param(:nulls_last)
  value = !value if sort_desc?
  value
end
order(relation) click to toggle source
# File lib/repor/dimensions/base_dimension.rb, line 61
def order(relation)
  relation.order("#{order_expression} #{sort_order} #{null_order}")
end
order_expression() click to toggle source
# File lib/repor/dimensions/base_dimension.rb, line 57
def order_expression
  sql_value_name
end
params() click to toggle source
# File lib/repor/dimensions/base_dimension.rb, line 84
def params
  report.params.fetch(:dimensions, {})[name].presence || {}
end
relate(relation) click to toggle source

Do any joins/selects necessary to filter or group the relation.

# File lib/repor/dimensions/base_dimension.rb, line 18
def relate(relation)
  opts.fetch(:relation, ->(r) { r }).call(relation)
end
sort_desc?() click to toggle source
# File lib/repor/dimensions/base_dimension.rb, line 65
def sort_desc?
  dimension_or_root_param(:sort_desc)
end
sort_order() click to toggle source
# File lib/repor/dimensions/base_dimension.rb, line 69
def sort_order
  sort_desc?? 'DESC' : 'ASC'
end

Private Instance Methods

array_param(key) click to toggle source
# File lib/repor/dimensions/base_dimension.rb, line 110
def array_param(key)
  return [] unless params.key?(key)
  return [nil] if params[key].nil?
  Array.wrap(params[key])
end
dimension_or_root_param(key) click to toggle source
# File lib/repor/dimensions/base_dimension.rb, line 106
def dimension_or_root_param(key)
  params.fetch(key, report.params[key])
end
invalid_param!(param_key, message) click to toggle source
# File lib/repor/dimensions/base_dimension.rb, line 93
def invalid_param!(param_key, message)
  raise InvalidParamsError, "Invalid value for params[:dimensions]" \
    "[:#{name}][:#{param_key}]: #{message}"
end
sanitize_sql_value(value) click to toggle source
# File lib/repor/dimensions/base_dimension.rb, line 102
def sanitize_sql_value(value)
  value
end
sql_value_name() click to toggle source
# File lib/repor/dimensions/base_dimension.rb, line 98
def sql_value_name
  "_repor_dimension_#{name}"
end
validate_params!() click to toggle source
# File lib/repor/dimensions/base_dimension.rb, line 90
def validate_params!
end