Module: ObjectTable::Stacker::ClassMethods

Defined in:
lib/object_table/stacker.rb

Instance Method Summary collapse

Instance Method Details

#_process_stackable_grid(grid, keys) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/object_table/stacker.rb', line 42

def _process_stackable_grid(grid, keys)
  case grid
  when ObjectTable::TableMethods
    grid = grid.columns
  when ObjectTable::BasicGrid
    grid._ensure_uniform_columns!
  end

  raise "Don't know how to join a #{grid.class}" unless grid.is_a?(ObjectTable::BasicGrid)
  return if grid.empty?
  raise 'Mismatch in column names' unless !keys or ( (keys - grid.keys).empty? and (grid.keys - keys).empty? )
  return grid
end

#_stack_segments(segments) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/object_table/stacker.rb', line 27

def _stack_segments(segments)
  if segments.all?{|seg| seg.is_a? Array}
    column = NArray.to_na(segments.flatten(1))

  elsif segments.all?{|seg| seg.is_a? NArray} and segments.map{|seg| seg.shape}.uniq.length == 1
    column = NArray.to_na(segments)
    column = column.reshape(*column.shape[0...-2], column.shape[-2] * column.shape[-1])

  else
    segments.map!{|seg| NArray.to_na seg}
    column = ObjectTable::Column.stack(*segments)

  end
end

#stack(*grids) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/object_table/stacker.rb', line 9

def stack(*grids)
  keys = nil

  grids = grids.map do |grid|
    grid = _process_stackable_grid(grid, keys)
    keys ||= grid.keys if grid
    grid
  end.compact
  return self.new if grids.empty?

  result = keys.map do |k|
    segments = grids.map{|grid| grid[k]}
    [k, _stack_segments(segments)]
  end

  self.new(ObjectTable::BasicGrid[result])
end