class Rorschart::MultipleSeries

Attributes

raw_series[RW]
rorschart_series[RW]
to_sql[RW]

Public Class Methods

new(raw_series) click to toggle source
# File lib/rorschart/data/multiple_series.rb, line 6
def initialize(raw_series)
  @to_sql = raw_series.map { |serie| serie.to_sql rescue nil }.delete_if { |serie| serie.nil? }
  @raw_series = raw_series
  @rorschart_series = raw_series.collect { |serie|
    RorschartData.new(serie)
  }
end

Public Instance Methods

cols() click to toggle source
# File lib/rorschart/data/multiple_series.rb, line 14
def cols
  cols_with_dup = @rorschart_series.inject([]) { |cols, series| 
    cols + (series.cols || [])
  }
   
  cols_with_dup.uniq
end
rows() click to toggle source
# File lib/rorschart/data/multiple_series.rb, line 22
def rows
  # create union of all series first columns, to represent all abscisse values available
  union_x = union_of_first_columns()

  # Preparation: store all series rows in a hash indexed by first column
  series_indexed = []
  @rorschart_series.each { |serie|
    series_indexed << index_series_by_first_col(serie) if !serie.cols.nil?
  }

  # The Merge:
  # For abscisse value, grab for each serie the corresponding row - or nil
  union_series = []
  asc = true
  union_x.each { |x|
    row = [x]
    series_indexed.each { |serie_hash|
      row << serie_hash[x]
      asc = asc && ascending?(serie_hash)
    }
    union_series << row.flatten
  }

  if !asc
    union_series = union_series.reverse
  end

  # Return union of all series
  union_series
end

Private Instance Methods

ascending?(hsh) click to toggle source
# File lib/rorschart/data/multiple_series.rb, line 73
def ascending? hsh
  hsh.keys == hsh.keys.sort
end
index_series_by_first_col(serie) click to toggle source
# File lib/rorschart/data/multiple_series.rb, line 63
def index_series_by_first_col(serie)

  serie_hash = {}
  serie.rows.each { |row|
    serie_hash[row[0]] = row.drop(1)
  }

  serie_hash
end
union_of_first_columns() click to toggle source
# File lib/rorschart/data/multiple_series.rb, line 55
def union_of_first_columns
  (
    @rorschart_series.inject([]) { |union, serie|
      union + serie.rows
    }
  ).collect{|r| r[0]}.uniq.sort
end