class ActiveReporter::Dimension::Bin::Table

Public Class Methods

new(values) click to toggle source
Calls superclass method
# File lib/active_reporter/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/active_reporter/dimension/bin/table.rb, line 37
def any_contain(expr)
  map { |bin| bin.contains_sql(expr) }.join(' OR ')
end
filter(relation, expr) click to toggle source
# File lib/active_reporter/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/active_reporter/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/active_reporter/dimension/bin/table.rb, line 33
def rows
  map(&:row_sql)
end