Class: Repor::Dimensions::BinDimension::BinTable

Inherits:
Array
  • Object
show all
Defined in:
lib/repor/dimensions/bin_dimension/bin_table.rb

Instance Method Summary collapse

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

#rowsObject



37
38
39
# File 'lib/repor/dimensions/bin_dimension/bin_table.rb', line 37

def rows
  map(&:row_sql)
end