class Proforma::Modeling::DataTable

A table that understands how to be compiled against a data source.

Attributes

aggregators[W]
columns[W]
empty_message[W]
property[RW]

Public Class Methods

new( aggregators: [], columns: [], empty_message: '', property: nil ) click to toggle source
# File lib/proforma/modeling/data_table.rb, line 26
def initialize(
  aggregators: [],
  columns: [],
  empty_message: '',
  property: nil
)
  @aggregators    = Aggregator.array(aggregators)
  @columns        = Column.array(columns)
  @empty_message  = empty_message
  @property       = property
end

Public Instance Methods

aggregators() click to toggle source
# File lib/proforma/modeling/data_table.rb, line 42
def aggregators
  Array(@aggregators)
end
columns() click to toggle source
# File lib/proforma/modeling/data_table.rb, line 46
def columns
  Array(@columns)
end
compile(data, evaluator) click to toggle source
# File lib/proforma/modeling/data_table.rb, line 50
def compile(data, evaluator)
  records = array(evaluator.value(data, property))

  return Text.new(value: empty_message) if show_empty_message?(records)

  meta_data = make_aggregator_meta_data(records, evaluator)

  Table.new(
    body: make_body(records, evaluator),
    footer: make_footer(meta_data, evaluator),
    header: make_header({}, evaluator)
  )
end
empty_message() click to toggle source
# File lib/proforma/modeling/data_table.rb, line 38
def empty_message
  @empty_message.to_s
end

Private Instance Methods

header?() click to toggle source
# File lib/proforma/modeling/data_table.rb, line 74
def header?
  columns.select(&:header?).any?
end
make(visible, row_compile_method, data, evaluator) click to toggle source
# File lib/proforma/modeling/data_table.rb, line 90
def make(visible, row_compile_method, data, evaluator)
  return Table::Section.new unless visible

  rows = [
    make_row(row_compile_method, data, evaluator)
  ]

  Table::Section.new(rows: rows)
end
make_aggregator_meta_data(records, evaluator) click to toggle source
# File lib/proforma/modeling/data_table.rb, line 66
def make_aggregator_meta_data(records, evaluator)
  Compiling::Aggregation.new(aggregators, evaluator).add(records).to_h
end
make_body(records, evaluator) click to toggle source
# File lib/proforma/modeling/data_table.rb, line 100
def make_body(records, evaluator)
  rows = records.map do |record|
    make_row(:compile_body_cell, record, evaluator)
  end

  Table::Section.new(rows: rows)
end
make_header(data, evaluator) click to toggle source
# File lib/proforma/modeling/data_table.rb, line 86
def make_header(data, evaluator)
  make(header?, :compile_header_cell, data, evaluator)
end
make_row(method, record, evaluator) click to toggle source
# File lib/proforma/modeling/data_table.rb, line 108
def make_row(method, record, evaluator)
  cells = columns.map do |column|
    column.send(method, record, evaluator)
  end

  Table::Row.new(cells: cells)
end
show_empty_message?(records) click to toggle source
# File lib/proforma/modeling/data_table.rb, line 78
def show_empty_message?(records)
  records.empty? && !empty_message.empty?
end