Class: MDQuery::Dataset::Dimension

Inherits:
Object
  • Object
show all
Defined in:
lib/mdquery/dataset.rb

Overview

describes a Dimension consisting of one or more segments

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(model, dataset) ⇒ Dimension

Returns a new instance of Dimension.



113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/mdquery/dataset.rb', line 113

def initialize(model, dataset)
  @dataset = dataset
  @key = model.key
  @label = model.label

  @segments = model.segment_models.map{|sm| DimensionSegment.new(sm, self) }
  @segment_index = @segments.reduce({}){|si, s| si[s.key] = s ; si}

  @values = segments.map(&:values).reduce(&:+)
  @dimension_value_index = segments.map(&:dimension_values).reduce(&:+).reduce({}){|dvi,dv| dvi[dv.value] = dv ; dvi}

  validate
end

Instance Attribute Details

#datasetObject (readonly)

Dataset this Dimension belongs to



96
97
98
# File 'lib/mdquery/dataset.rb', line 96

def dataset
  @dataset
end

#keyObject (readonly)

key for this Dimension



99
100
101
# File 'lib/mdquery/dataset.rb', line 99

def key
  @key
end

#labelObject (readonly)

Optional label of the Dimension



102
103
104
# File 'lib/mdquery/dataset.rb', line 102

def label
  @label
end

#segmentsObject (readonly)

ordered list of one or more DimensionSegments



105
106
107
# File 'lib/mdquery/dataset.rb', line 105

def segments
  @segments
end

#valuesObject (readonly)

an ordered list of values for the dimension. May be static or extracted from the data source, depending on DimensionSegment definitions. It is the concatentation of the values from each DimensionSegment in the Dimension



111
112
113
# File 'lib/mdquery/dataset.rb', line 111

def values
  @values
end

Instance Method Details

#[](key) ⇒ Object

lookup a segment by key



143
144
145
# File 'lib/mdquery/dataset.rb', line 143

def [](key)
  segment(key)
end

#dimension_value_for(value) ⇒ Object

the DimensionValue describing value or nil



175
176
177
# File 'lib/mdquery/dataset.rb', line 175

def dimension_value_for(value)
  @dimension_value_index[value]
end

#dimension_valuesObject



170
171
172
# File 'lib/mdquery/dataset.rb', line 170

def dimension_values
  segments.map(&:dimension_values).reduce(&:+)
end

#dimension_values_for_segments(segment_keys) ⇒ Object

return an ordered list of DimensionValues for 0 or more segments.

  • segment_keys a list of segment keys. if empty, methods return all DimensionValues

for all segments, otherwise returns the concatenation of DimensionValues for each identified segment



162
163
164
165
166
167
168
# File 'lib/mdquery/dataset.rb', line 162

def dimension_values_for_segments(segment_keys)
  if segment_keys && !segment_keys.empty?
    segment_keys.map{|sk| segment(sk)}.map(&:dimension_values).reduce(&:+)
  else
    dimension_values
  end
end

#inspectObject



133
134
135
# File 'lib/mdquery/dataset.rb', line 133

def inspect
  "#<Dimension: key=#{key.inspect}, label=#{label.inspect}, segments=#{segments.inspect}>"
end

#label_for(value) ⇒ Object

the label for the value or nil



180
181
182
# File 'lib/mdquery/dataset.rb', line 180

def label_for(value)
  (dv = dimension_value_for(value)) && dv.label
end

#segment(key) ⇒ Object

lookup a segment by key



138
139
140
# File 'lib/mdquery/dataset.rb', line 138

def segment(key)
  @segment_index[key]
end

#validateObject



127
128
129
130
131
# File 'lib/mdquery/dataset.rb', line 127

def validate
  raise "no dataset!" if !dataset
  raise "no key!" if !key
  raise "no segments!" if !segments || segments.empty?
end

#values_for_segments(segment_keys) ⇒ Object

return an ordered list of values for 0 or more segments.

  • segment_keys a list of segment keys. if empty, methods returns values,

otherwise returns the concatentation of values for each identified segment



150
151
152
153
154
155
156
# File 'lib/mdquery/dataset.rb', line 150

def values_for_segments(segment_keys)
  if segment_keys && !segment_keys.empty?
    segment_keys.map{|sk| segment(sk)}.map(&:values).reduce(&:+)
  else
    values
  end
end