Class: Repor::Dimensions::BinDimension::BinTable
- Inherits:
-
Array
- Object
- Array
- Repor::Dimensions::BinDimension::BinTable
- Defined in:
- lib/repor/dimensions/bin_dimension/bin_table.rb
Instance Method Summary collapse
- #any_contain(expr) ⇒ Object
- #filter(relation, expr) ⇒ Object
- #group(relation, expr, value_name) ⇒ Object
-
#initialize(values) ⇒ BinTable
constructor
A new instance of BinTable.
- #rows ⇒ Object
Constructor Details
#initialize(values) ⇒ BinTable
Returns a new instance of BinTable.
5 6 7 |
# File 'lib/repor/dimensions/bin_dimension/bin_table.rb', line 5 def initialize(values) super(values.compact) end |
Instance Method Details
#any_contain(expr) ⇒ Object
41 42 43 |
# File 'lib/repor/dimensions/bin_dimension/bin_table.rb', line 41 def any_contain(expr) map { |bin| bin.contains_sql(expr) }.join(' OR ') end |
#filter(relation, expr) ⇒ Object
9 10 11 |
# File 'lib/repor/dimensions/bin_dimension/bin_table.rb', line 9 def filter(relation, expr) relation.where(any_contain(expr)) end |
#group(relation, expr, value_name) ⇒ Object
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/repor/dimensions/bin_dimension/bin_table.rb', line 13 def group(relation, expr, value_name) name = "#{value_name}_bin_table" bin_join = <<-SQL INNER JOIN ( #{rows.join(" UNION\n ")} ) AS #{name} ON ( CASE WHEN #{name}.min IS NULL AND #{name}.max IS NULL THEN (#{expr} IS NULL) WHEN #{name}.min IS NULL THEN (#{expr} < #{name}.max) WHEN #{name}.max IS NULL THEN (#{expr} >= #{name}.min) ELSE ((#{expr} >= #{name}.min) AND (#{expr} < #{name}.max)) END ) SQL selection = "#{name}.bin_text AS #{value_name}" relation. joins(bin_join). select(selection). group(value_name) end |
#rows ⇒ Object
37 38 39 |
# File 'lib/repor/dimensions/bin_dimension/bin_table.rb', line 37 def rows map(&:row_sql) end |