Class: Goldmine::HashMiner

Inherits:
SimpleDelegator
  • Object
show all
Defined in:
lib/goldmine/hash_miner.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(hash = {}) ⇒ HashMiner

Returns a new instance of HashMiner.



6
7
8
# File 'lib/goldmine/hash_miner.rb', line 6

def initialize(hash={})
  super hash
end

Instance Attribute Details

#goldmineObject

Returns the value of attribute goldmine.



10
11
12
# File 'lib/goldmine/hash_miner.rb', line 10

def goldmine
  @goldmine
end

Instance Method Details

#assign_mined(name, key, value) ⇒ Object

Assigns a key/value pair to the Hash.

Parameters:

  • name (String)

    The name of a pivot (can be null).

  • key (Object)

    The key to use.

  • value (Object)

    The value to assign

Returns:

  • (Object)

    The result of the assignment.



57
58
59
60
61
# File 'lib/goldmine/hash_miner.rb', line 57

def assign_mined(name, key, value)
  goldmine_key = goldmine_key(name, key)
  self[goldmine_key] ||= []
  self[goldmine_key] << value
end

#goldmine_key(name, key) ⇒ Object

Creates a key for a pivot-name/key combo.

Parameters:

  • name (String)

    The name of a pivot (can be null).

  • key (Object)

    The key to use.

Returns:

  • (Object)

    The constructed key.



67
68
69
70
# File 'lib/goldmine/hash_miner.rb', line 67

def goldmine_key(name, key)
  goldmine_key = { name => key } if name
  goldmine_key ||= key
end

#pivot(name = nil) {|Object| ... } ⇒ Hash

Note:

This method should not be called directly. Call Array#pivot instead.

Further pivots the Hash into mined data. This method is what enables the pivot method chaining.

Examples:

Chained pivot

list = [1,2,3,4,5,6,7,8,9]
data = list.pivot { |i| i < 5 }.pivot { |i| i % 2 == 0 }

# resulting data
{
  [true, false]  => [1, 3],
  [true, true]   => [2, 4],
  [false, false] => [5, 7, 9],
  [false, true]  => [6, 8]
}

Parameters:

  • name (String) (defaults to: nil)

    The named of the pivot.

Yields:

  • (Object)

    Yields once for each item in the Array

Returns:

  • (Hash)

    The pivoted Hash of data.



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/goldmine/hash_miner.rb', line 32

def pivot(name=nil, &block)
  return self unless goldmine

  reduce(HashMiner.new) do |memo, item|
    key = item.first
    value = Goldmine.miner(item.last)
    value.pivot(name, &block).each do |k, v|
      if key.is_a? Hash
        k = { block.to_s => k } unless k.is_a?(Hash)
        new_key = key.merge(k)
      else
        new_key = [key, k].flatten
      end
      memo[new_key] = v
    end
    memo.goldmine = true
    memo
  end
end