Class: Activecube::Query::CubeQuery

Inherits:
Object
  • Object
show all
Includes:
ChainAppender
Defined in:
lib/activecube/query/cube_query.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(cube, slices = [], measures = [], selectors = [], options = []) ⇒ CubeQuery

Returns a new instance of CubeQuery.



18
19
20
21
22
23
24
# File 'lib/activecube/query/cube_query.rb', line 18

def initialize cube, slices = [], measures = [], selectors = [], options = []
  @cube = cube
  @slices = slices
  @measures = measures
  @selectors = selectors
  @options = options
end

Instance Attribute Details

#cubeObject (readonly)

Returns the value of attribute cube.



17
18
19
# File 'lib/activecube/query/cube_query.rb', line 17

def cube
  @cube
end

#measuresObject (readonly)

Returns the value of attribute measures.



17
18
19
# File 'lib/activecube/query/cube_query.rb', line 17

def measures
  @measures
end

#optionsObject (readonly)

Returns the value of attribute options.



17
18
19
# File 'lib/activecube/query/cube_query.rb', line 17

def options
  @options
end

#selectorsObject (readonly)

Returns the value of attribute selectors.



17
18
19
# File 'lib/activecube/query/cube_query.rb', line 17

def selectors
  @selectors
end

#slicesObject (readonly)

Returns the value of attribute slices.



17
18
19
# File 'lib/activecube/query/cube_query.rb', line 17

def slices
  @slices
end

Instance Method Details

#asc(*args) ⇒ Object



45
46
47
48
49
50
# File 'lib/activecube/query/cube_query.rb', line 45

def asc *args
  args.each{|arg|
    options << Ordering.new( arg, :asc)
  }
  self
end

#column_names(measures = self.measures) ⇒ Object



83
84
85
# File 'lib/activecube/query/cube_query.rb', line 83

def column_names measures = self.measures
  (measures + slices + selectors).map(&:required_column_names).flatten.uniq
end

#desc(*args) ⇒ Object



38
39
40
41
42
43
# File 'lib/activecube/query/cube_query.rb', line 38

def desc *args
  args.each{|arg|
    options << Ordering.new(arg, :desc)
  }
  self
end

#join_fieldsObject



121
122
123
# File 'lib/activecube/query/cube_query.rb', line 121

def join_fields
  slices.map{|s| s.dimension_class.identity || s.key }.uniq
end

#measure(*args) ⇒ Object



30
31
32
# File 'lib/activecube/query/cube_query.rb', line 30

def measure *args
  append *args, @measures, Measure, cube.metrics
end

#orderingsObject



125
126
127
# File 'lib/activecube/query/cube_query.rb', line 125

def orderings
  options.select{|s| s.kind_of? Ordering}
end

#queryObject



69
70
71
72
73
# File 'lib/activecube/query/cube_query.rb', line 69

def query
  composer = Activecube::Processor::Composer.new(self)
  sql = composer.build_query.to_sql
  composer.connection.exec_query(sql)
end

#reduced(other_measures) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/activecube/query/cube_query.rb', line 91

def reduced other_measures

  common_selectors = []
  other_measures.each_with_index do |m,i|
    if i==0
      common_selectors += m.selectors
    else
      common_selectors &= m.selectors
    end
  end

  if common_selectors.empty?
    reduced_measures = other_measures
    reduced_selectors = self.selectors
  else
    reduced_measures = other_measures.collect{|m|
      Measure.new m.cube, m.key, m.definition, (m.selectors - common_selectors), m.modifications
    }
    reduced_selectors = self.selectors + common_selectors
  end

  unless reduced_measures.detect{|rm| rm.selectors.empty? }
    reduced_selectors += [OrSelector.new(reduced_measures.map(&:selectors).flatten.uniq)]
  end

  return self if (reduced_measures == self.measures) && (reduced_selectors == self.selectors)

  CubeQuery.new cube, slices, reduced_measures, reduced_selectors
end

#selector_column_names(measures = self.measures) ⇒ Object



87
88
89
# File 'lib/activecube/query/cube_query.rb', line 87

def selector_column_names measures = self.measures
  (measures.map(&:selectors) + selectors).flatten.map(&:required_column_names).flatten.uniq
end

#skip(*args) ⇒ Object Also known as: offset



52
53
54
55
56
57
# File 'lib/activecube/query/cube_query.rb', line 52

def skip *args
  args.each{|arg|
    options << Limit.new( arg, :skip)
  }
  self
end

#slice(*args) ⇒ Object



26
27
28
# File 'lib/activecube/query/cube_query.rb', line 26

def slice *args
  append *args, @slices, Slice, cube.dimensions
end

#take(*args) ⇒ Object Also known as: limit



59
60
61
62
63
64
# File 'lib/activecube/query/cube_query.rb', line 59

def take *args
  args.each{|arg|
    options << Limit.new( arg, :take)
  }
  self
end

#to_queryObject



75
76
77
# File 'lib/activecube/query/cube_query.rb', line 75

def to_query
  Activecube::Processor::Composer.new(self).build_query
end

#to_sqlObject



79
80
81
# File 'lib/activecube/query/cube_query.rb', line 79

def to_sql
  to_query.to_sql
end

#when(*args) ⇒ Object



34
35
36
# File 'lib/activecube/query/cube_query.rb', line 34

def when *args
  append *args, @selectors, Selector, cube.selectors
end