class Repor::Dimensions::BinDimension::BinTable

Public Class Methods

new(values) click to toggle source
Calls superclass method
# File lib/repor/dimensions/bin_dimension/bin_table.rb, line 5
def initialize(values)
  super(values.compact)
end

Public Instance Methods

any_contain(expr) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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() click to toggle source
# File lib/repor/dimensions/bin_dimension/bin_table.rb, line 37
def rows
  map(&:row_sql)
end