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 = [], model_tables = nil) ⇒ CubeQuery

Returns a new instance of CubeQuery.



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/activecube/query/cube_query.rb', line 19

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

  @tables = model_tables || cube.models.map{|m|
    m < Activecube::View ? m.new : Activecube::Processor::Table.new(m)
  }

  cube.options && cube.options.each do |option|
    define_singleton_method option.to_s.underscore do |*args|
      @options << Option.new(option, *args)
      self
    end
  end

end

Instance Attribute Details

#cubeObject (readonly)

Returns the value of attribute cube.



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

def cube
  @cube
end

#measuresObject (readonly)

Returns the value of attribute measures.



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

def measures
  @measures
end

#optionsObject (readonly)

Returns the value of attribute options.



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

def options
  @options
end

#selectorsObject (readonly)

Returns the value of attribute selectors.



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

def selectors
  @selectors
end

#slicesObject (readonly)

Returns the value of attribute slices.



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

def slices
  @slices
end

#sqlObject (readonly)

Returns the value of attribute sql.



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

def sql
  @sql
end

#tablesObject (readonly)

Returns the value of attribute tables.



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

def tables
  @tables
end

Instance Method Details

#asc(*args) ⇒ Object



62
63
64
65
66
67
68
# File 'lib/activecube/query/cube_query.rb', line 62

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

#column_names(measures = self.measures) ⇒ Object



106
107
108
# File 'lib/activecube/query/cube_query.rb', line 106

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

#column_names_required(measures = self.measures) ⇒ Object



110
111
112
# File 'lib/activecube/query/cube_query.rb', line 110

def column_names_required measures = self.measures
  (measures + slices + selectors.select{|s| !s.kind_of?(Selector::CombineSelector)}).map(&:required_column_names).flatten.uniq
end

#desc(*args) ⇒ Object



54
55
56
57
58
59
60
# File 'lib/activecube/query/cube_query.rb', line 54

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

#join_fieldsObject



148
149
150
# File 'lib/activecube/query/cube_query.rb', line 148

def join_fields
  slices.map(&:group_by_columns).flatten.uniq
end

#limit(*args) ⇒ Object



78
79
80
81
82
83
84
# File 'lib/activecube/query/cube_query.rb', line 78

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

#limit_by(*args) ⇒ Object



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

def limit_by *args
  clear_sql
  options << LimitBy.new(args)
  self
end

#measure(*args) ⇒ Object



44
45
46
47
# File 'lib/activecube/query/cube_query.rb', line 44

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

#offset(*args) ⇒ Object



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

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

#orderingsObject



152
153
154
# File 'lib/activecube/query/cube_query.rb', line 152

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

#queryObject



93
94
95
96
# File 'lib/activecube/query/cube_query.rb', line 93

def query
  sql = to_query.to_sql
  @composed.connection.exec_query(sql)
end

#reduced(other_measures, other_options) ⇒ Object



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/activecube/query/cube_query.rb', line 118

def reduced other_measures, other_options

  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 += [Selector.or(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, other_options, tables
end

#selector_column_names(measures = self.measures) ⇒ Object



114
115
116
# File 'lib/activecube/query/cube_query.rb', line 114

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

#slice(*args) ⇒ Object



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

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

#to_queryObject



98
99
100
# File 'lib/activecube/query/cube_query.rb', line 98

def to_query
  @composed.try(:query) || (@composed = Activecube::Processor::Composer.new(self)).build_query
end

#to_sqlObject



102
103
104
# File 'lib/activecube/query/cube_query.rb', line 102

def to_sql
  to_query.to_sql
end

#when(*args) ⇒ Object



49
50
51
52
# File 'lib/activecube/query/cube_query.rb', line 49

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