Class: Repor::Dimensions::BaseDimension
- Inherits:
-
Object
- Object
- Repor::Dimensions::BaseDimension
- Defined in:
- lib/repor/dimensions/base_dimension.rb
Direct Known Subclasses
Instance Attribute Summary collapse
-
#name ⇒ Object
readonly
Returns the value of attribute name.
-
#opts ⇒ Object
readonly
Returns the value of attribute opts.
-
#report ⇒ Object
readonly
Returns the value of attribute report.
Instance Method Summary collapse
- #expression ⇒ Object
-
#extract_sql_value(row) ⇒ Object
Given a single (hashified) row of the SQL result, return the Ruby object representing this dimension’s value.
-
#filter(relation) ⇒ Object
Filter the relation based on any constraints in the params.
- #filter_values ⇒ Object
-
#filtering? ⇒ Boolean
Return whether the report should filter by this dimension.
-
#group(relation) ⇒ Object
Group the relation by the expression – ensure this is ordered, too.
-
#group_values ⇒ Object
Return an ordered array of all values that should appear in ‘Report#data`.
- #grouping? ⇒ Boolean
-
#initialize(name, report, opts = {}) ⇒ BaseDimension
constructor
A new instance of BaseDimension.
- #null_order ⇒ Object
- #nulls_last? ⇒ Boolean
- #order(relation) ⇒ Object
- #order_expression ⇒ Object
- #params ⇒ Object
-
#relate(relation) ⇒ Object
Do any joins/selects necessary to filter or group the relation.
- #sort_desc? ⇒ Boolean
- #sort_order ⇒ Object
Constructor Details
#initialize(name, report, opts = {}) ⇒ BaseDimension
Returns a new instance of BaseDimension.
6 7 8 9 10 11 |
# File 'lib/repor/dimensions/base_dimension.rb', line 6 def initialize(name, report, opts={}) @name = name @report = report @opts = opts validate_params! end |
Instance Attribute Details
#name ⇒ Object (readonly)
Returns the value of attribute name.
4 5 6 |
# File 'lib/repor/dimensions/base_dimension.rb', line 4 def name @name end |
#opts ⇒ Object (readonly)
Returns the value of attribute opts.
4 5 6 |
# File 'lib/repor/dimensions/base_dimension.rb', line 4 def opts @opts end |
#report ⇒ Object (readonly)
Returns the value of attribute report.
4 5 6 |
# File 'lib/repor/dimensions/base_dimension.rb', line 4 def report @report end |
Instance Method Details
#expression ⇒ Object
13 14 15 |
# File 'lib/repor/dimensions/base_dimension.rb', line 13 def expression opts.fetch(:expression, "#{report.table_name}.#{name}") end |
#extract_sql_value(row) ⇒ Object
Given a single (hashified) row of the SQL result, return the Ruby object representing this dimension’s value
40 41 42 |
# File 'lib/repor/dimensions/base_dimension.rb', line 40 def extract_sql_value(row) sanitize_sql_value(row[sql_value_name]) end |
#filter(relation) ⇒ Object
Filter the relation based on any constraints in the params
23 24 25 |
# File 'lib/repor/dimensions/base_dimension.rb', line 23 def filter(relation) raise NotImplementedError end |
#filter_values ⇒ Object
44 45 46 |
# File 'lib/repor/dimensions/base_dimension.rb', line 44 def filter_values array_param(:only).uniq end |
#filtering? ⇒ Boolean
Return whether the report should filter by this dimension
49 50 51 |
# File 'lib/repor/dimensions/base_dimension.rb', line 49 def filtering? filter_values.present? end |
#group(relation) ⇒ Object
Group the relation by the expression – ensure this is ordered, too.
28 29 30 |
# File 'lib/repor/dimensions/base_dimension.rb', line 28 def group(relation) raise NotImplementedError end |
#group_values ⇒ Object
Return an ordered array of all values that should appear in ‘Report#data`
34 35 36 |
# File 'lib/repor/dimensions/base_dimension.rb', line 34 def group_values raise NotImplementedError end |
#grouping? ⇒ Boolean
53 54 55 |
# File 'lib/repor/dimensions/base_dimension.rb', line 53 def grouping? report.groupers.include?(self) end |
#null_order ⇒ Object
79 80 81 82 |
# 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? ⇒ Boolean
73 74 75 76 77 |
# 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) ⇒ Object
61 62 63 |
# File 'lib/repor/dimensions/base_dimension.rb', line 61 def order(relation) relation.order("#{order_expression} #{sort_order} #{null_order}") end |
#order_expression ⇒ Object
57 58 59 |
# File 'lib/repor/dimensions/base_dimension.rb', line 57 def order_expression sql_value_name end |
#params ⇒ Object
84 85 86 |
# File 'lib/repor/dimensions/base_dimension.rb', line 84 def params report.params.fetch(:dimensions, {})[name].presence || {} end |
#relate(relation) ⇒ Object
Do any joins/selects necessary to filter or group the relation.
18 19 20 |
# File 'lib/repor/dimensions/base_dimension.rb', line 18 def relate(relation) opts.fetch(:relation, ->(r) { r }).call(relation) end |
#sort_desc? ⇒ Boolean
65 66 67 |
# File 'lib/repor/dimensions/base_dimension.rb', line 65 def sort_desc? dimension_or_root_param(:sort_desc) end |
#sort_order ⇒ Object
69 70 71 |
# File 'lib/repor/dimensions/base_dimension.rb', line 69 def sort_order sort_desc?? 'DESC' : 'ASC' end |