class Differential::Calculator::Group
A Report
has 0 or more Group
objects and a Group
has 0 or more Item
objects. Report
-> Group
-> Item
A Group
is, as the name implies, a grouping of items. It is up to the consumer application to define how to group (i.e. group based on this attribute's value or group based on these two attributes' values.)
Attributes
id[R]
Public Class Methods
new(id)
click to toggle source
# File lib/differential/calculator/group.rb, line 22 def initialize(id) raise ArgumentError, 'id is required' unless id @id = id.is_a?(::Differential::Parser::Id) ? id : ::Differential::Parser::Id.new(id) end
Public Instance Methods
add(record, side)
click to toggle source
# File lib/differential/calculator/group.rb, line 36 def add(record, side) raise ArgumentError, 'record is required' unless record raise ArgumentError, 'side is required' unless side raise ArgumentError, "mismatch: #{record.group_id} != #{id}" if id != record.group_id totals.add(record.value, side) upsert_item(record, side) self end
data_peek(field, side = nil)
click to toggle source
# File lib/differential/calculator/group.rb, line 48 def data_peek(field, side = nil) first_item&.data_peek(field, side) end
items()
click to toggle source
# File lib/differential/calculator/group.rb, line 32 def items items_by_id.values end
sorted_items()
click to toggle source
# File lib/differential/calculator/group.rb, line 28 def sorted_items items.sort_by { |item| item.id.value } end
Private Instance Methods
first_item()
click to toggle source
# File lib/differential/calculator/group.rb, line 54 def first_item # first() will return an array: [key, value], but we just want the value. @items_by_id.first&.last end
items_by_id()
click to toggle source
# File lib/differential/calculator/group.rb, line 71 def items_by_id @items_by_id ||= {} end
upsert_item(record, side)
click to toggle source
# File lib/differential/calculator/group.rb, line 59 def upsert_item(record, side) item_id_key = record.id.value item_id = record.id # Create a new item if one does not exist items_by_id[item_id_key] = Item.new(item_id) unless items_by_id.key?(item_id_key) items_by_id[item_id_key].add(record, side) nil end