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