class Goldmine::Pivot

Attributes

miner[R]
name[R]
proc[R]

Public Class Methods

new(name, miner, block) click to toggle source
# File lib/goldmine/pivot.rb, line 11
def initialize(name, miner, block)
  @miner = miner
  @name = name
  @proc = block
  miner.pivots << self
end

Public Instance Methods

pivot(name, &block) click to toggle source
# File lib/goldmine/pivot.rb, line 18
def pivot(name, &block)
  self.class.new(name, miner, block)
end
result() click to toggle source
# File lib/goldmine/pivot.rb, line 22
def result
  PivotResult.new(self).tap do |pivot_result|
    miner.each do |item|
      key_data = miner.pivots.each_with_object(key: [], keys: []) do |pivot, memo|
        value = pivot.proc.call(item)
        if value.is_a?(Array)
          if value.empty?
            memo[:key] << key_for(pivot.name, nil)
          else
            value.each { |v| memo[:keys] << key_for(pivot.name, v) }
          end
        else
          memo[:key] << key_for(pivot.name, value)
        end
      end
      (pivot_result[key_data[:key]] ||= []) << item unless key_data[:key].empty?
      key_data[:keys].each do |key|
        (pivot_result[key] ||= []) << item
      end
    end
  end
end

Private Instance Methods

key_for(name, value) click to toggle source
# File lib/goldmine/pivot.rb, line 47
def key_for(name, value)
  Array.new(2).tap do |key|
    key[0] = name
    key[1] = value
  end
end