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