class MatchReduce::Aggregator

An aggregator is a group of patterns with a reducer that you wish to report on.

Attributes

group_keys[R]
name[R]
patterns[R]
reducer[R]
resolver[R]

Public Class Methods

new(name:, group_keys: [], patterns: [], reducer: nil) click to toggle source
# File lib/match_reduce/aggregator.rb, line 20
def initialize(name:, group_keys: [], patterns: [], reducer: nil)
  raise ArgumentError, 'name is required' if name.to_s.empty?

  @name       = name
  @group_keys = Array(group_keys)
  @patterns   = stringed_keys(ensure_not_empty(array(patterns)))
  @reducer    = reducer

  freeze
end

Public Instance Methods

grouped?() click to toggle source
# File lib/match_reduce/aggregator.rb, line 39
def grouped?
  !group_keys.empty?
end
keys() click to toggle source
# File lib/match_reduce/aggregator.rb, line 31
def keys
  patterns.flat_map(&:keys)
end
reduce(memo, record, resolver) click to toggle source
# File lib/match_reduce/aggregator.rb, line 35
def reduce(memo, record, resolver)
  reducer ? reducer.call(memo, record, resolver) : memo
end

Private Instance Methods

array(val) click to toggle source
# File lib/match_reduce/aggregator.rb, line 53
def array(val)
  val.is_a?(Hash) ? [val] : Array(val)
end
ensure_not_empty(val) click to toggle source
# File lib/match_reduce/aggregator.rb, line 57
def ensure_not_empty(val)
  val.empty? ? [{}] : val
end
stringed_keys(hashes) click to toggle source
# File lib/match_reduce/aggregator.rb, line 47
def stringed_keys(hashes)
  hashes.map do |hash|
    hash.map { |k, v| [k.to_s, v] }.to_h
  end
end