class MDQuery::Dataset::Dataset

a Dataset is defined over a number of Dimensions with a number of Measures.

Attributes

data[R]

a list of points. each point is a Hash with a value for each Dimension and a value for each Measure. keys are as given in the Dimension and Measure objects

dimensions[R]

a Hash of Dimensions keyed by their keys

indexed_data[R]

index of points from data, where key is a Hash of all Dimension {key=>value} pairs, and value is all Measure {key=>value} pairs

measures[R]

a Hash of Measures keyed by their keys

model[R]

the Model describing how the Dataset is to be assembled

Public Class Methods

new(model, data) click to toggle source
# File lib/mdquery/dataset.rb, line 233
def initialize(model, data)
  @model = model
  @data = data

  @measures = model.measure_models.map{|mm| Measure.new(mm, self) }.reduce({}){|mi,m| mi[m.key] = m ; mi}
  @dimensions = model.dimension_models.map{|dm| Dimension.new(dm, self) }.reduce({}){|di,d| di[d.key] = d ; di}

  validate
  index
end

Public Instance Methods

datapoint(dimension_values, measure) click to toggle source

retrieve a datapoint given a hash of {dimension_key=>dimension_values}

# File lib/mdquery/dataset.rb, line 256
def datapoint(dimension_values, measure)
  d = @indexed_data[dimension_values]
  d[measure] if d
end
inspect() click to toggle source
# File lib/mdquery/dataset.rb, line 251
def inspect
  "#<Dataset: dimensions=#{dimensions.inspect}, measures=#{measures.inspect}, data=#{data.inspect}>"
end
validate() click to toggle source
# File lib/mdquery/dataset.rb, line 244
def validate
  raise "no model!" if !model
  raise "no data!" if !data
  raise "no dimensions!" if !dimensions || dimensions.empty?
  raise "no measures!" if !measures || measures.empty?
end

Private Instance Methods

index() click to toggle source
# File lib/mdquery/dataset.rb, line 274
def index
  @indexed_data = {}
  data.each do |point|
    @indexed_data[index_key(point)] = index_data(point)
  end
  @indexed_data
end
index_data(point) click to toggle source
# File lib/mdquery/dataset.rb, line 267
def index_data(point)
  pc = point.clone
  dks = dimensions.keys
  pc.delete_if{|k,v| dks.include?(k)}
  pc
end
index_key(point) click to toggle source
# File lib/mdquery/dataset.rb, line 263
def index_key(point)
  Hash[dimensions.keys.map{|k| [k, point[k]]}]
end