class MDQuery::Model::DatasetModel

Attributes

dimension_models[R]
measure_models[R]
source[R]

Public Class Methods

new(attrs) click to toggle source
# File lib/mdquery/model.rb, line 180
def initialize(attrs)
  MDQuery::Util.assign_attributes(self, attrs, [:source, :dimension_models, :measure_models])
  validate
end

Public Instance Methods

all_dimension_segment_models() click to toggle source

a list of lists of dimension-segments

# File lib/mdquery/model.rb, line 202
def all_dimension_segment_models
  dimension_models.map(&:segment_models)
end
collect() click to toggle source

run the queries and put the results in a Dataset

# File lib/mdquery/model.rb, line 265
def collect
  MDQuery::Dataset::Dataset.new(self, do_queries)
end
construct_query(scope, region_segment_models, measure_models) click to toggle source

construct a query for a region

# File lib/mdquery/model.rb, line 223
def construct_query(scope, region_segment_models, measure_models)
  narrowed_scope = region_segment_models.reduce(scope){|scope, ds| ds.do_narrow(scope)}

  dimension_select_strings = region_segment_models.map(&:select_string)

  measure_select_strings = measure_models.map{|m| m.select_string(region_segment_models)}

  select_string = (dimension_select_strings + measure_select_strings).join(",")

  group_string = (1..region_segment_models.length).to_a.join(",")

  narrowed_scope.select(select_string).group(group_string)
end
do_queries() click to toggle source

run the queries defined by the DatasetModel

# File lib/mdquery/model.rb, line 252
def do_queries
  data = []

  with_regions do |region_segment_models|
    q = construct_query(source, region_segment_models, measure_models)
    points = extract(q.all, region_segment_models, measure_models)
    data += points
  end

  data
end
extract(rows, region_segment_models, measure_models) click to toggle source

extract data points from a list of ActiveRecord models

# File lib/mdquery/model.rb, line 238
def extract(rows, region_segment_models, measure_models)
  rows.map do |row|
    dimension_values = region_segment_models.map do |ds|
      {ds.dimension_model.key => ds.do_cast(row.send(ds.dimension_model.key))}
    end
    measure_values = measure_models.map do |m|
      {m.key => m.do_cast(row.send(m.key))}
    end

    (dimension_values + measure_values).reduce(&:merge)
  end
end
inspect() click to toggle source
# File lib/mdquery/model.rb, line 191
def inspect
  "#<DatasetDefinition: dimension_models=#{dimension_models.inspect}, measure_models=#{measure_models.inspect}>"
end
region_segment_model_indexes() click to toggle source

a list of tuples of dimension-segment indexes, each tuple specifying one segment for each dimension. it is the cross-join of the dimension-segment indexes

# File lib/mdquery/model.rb, line 197
def region_segment_model_indexes
  dimension_models.reduce(nil){|indexes, dimension_model| dimension_model.index_list(indexes)}
end
region_segment_models(indexes) click to toggle source

given a list of dimension-segment indexes, one for each dimension, retrieve a list of dimension-segments, one for each dimension, specifying a region

# File lib/mdquery/model.rb, line 209
def region_segment_models(indexes)
  ds = all_dimension_segment_models
  d_i = (0...indexes.length).zip(indexes)
  d_i.map{|d,i| ds[d][i]}
end
validate() click to toggle source
# File lib/mdquery/model.rb, line 185
def validate
  raise "no source!" if !source
  raise "no dimension_models!" if !dimension_models || dimension_models.empty?
  raise "no measure_models!" if !measure_models || measure_models.empty?
end
with_regions(&proc) click to toggle source

call a block with a list of dimension-segments, one for each dimension

# File lib/mdquery/model.rb, line 216
def with_regions(&proc)
  region_segment_model_indexes.each do |indexes|
    proc.call(region_segment_models(indexes))
  end
end