class Activecube::Query::Slice
Attributes
dimension[R]
parent[R]
selectors[R]
Public Class Methods
new(cube, key, definition, parent = nil, selectors = [])
click to toggle source
Calls superclass method
Activecube::Query::Item::new
# File lib/activecube/query/slice.rb, line 5 def initialize cube, key, definition, parent = nil, selectors = [] super cube, key, definition @dimension = parent ? parent.dimension : definition @parent = parent @selectors = selectors if parent raise "Unexpected class #{definition.class.name}" unless definition.kind_of?(Activecube::Field) field_methods! if definition.class < Activecube::Field end end
Public Instance Methods
[](arg)
click to toggle source
# File lib/activecube/query/slice.rb, line 23 def [] arg key = arg.to_sym child = if definition.kind_of?(Activecube::Dimension) && definition.class.fields && (fdef = definition.class.fields[key]) Activecube::Field.build key, fdef elsif definition.kind_of?(Activecube::Field) && (hash = definition.definition).kind_of?(Hash) Activecube::Field.build key, hash[key] end raise Activecube::InputArgumentError, "Field #{key} is not defined for #{definition}" unless child if child.kind_of?(Class) && child <= Activecube::Field child = child.new key elsif !child.kind_of?(Activecube::Field) child = Activecube::Field.new(key, child) end Slice.new cube, key, child, self end
alias!(new_key)
click to toggle source
# File lib/activecube/query/slice.rb, line 45 def alias! new_key self.class.new cube, new_key, definition, parent, selectors end
append_query(model, cube_query, table, query)
click to toggle source
# File lib/activecube/query/slice.rb, line 61 def append_query model, cube_query, table, query query = append_with!(model, cube_query, table, query) attr_alias = "`#{key.to_s}`" expr = (parent || definition.respond_to?(:expression)) ? Arel.sql(definition.expression( model, table, self, cube_query) ) : table[dimension.class.column_name] query = query.project(expr.as(attr_alias)) if dimension.class.identity expr = dimension.class.identity_expression group_by_columns.each do |column| node = if column==dimension.class.identity && expr Arel.sql(expr).as(column) else table[column] end unless query.projections.include?(node) query = query.project(node) end query = query.group( expr ? column : table[column]) end else query = query.group(attr_alias) end if cube_query.orderings.empty? query = query.order(attr_alias) end selectors.each do |selector| selector.append_query model, cube_query, table, query end query end
field_methods!()
click to toggle source
# File lib/activecube/query/slice.rb, line 107 def field_methods! excluded = [:expression] + self.class.instance_methods(false) definition.class.instance_methods(false).each do |name| unless excluded.include?(name) define_singleton_method name do |*args| definition.send name, *args self end end end end
group_by_columns()
click to toggle source
# File lib/activecube/query/slice.rb, line 53 def group_by_columns if dimension.class.identity ([dimension.class.identity] + dimension.class.column_names).uniq else [key] end end
required_column_names()
click to toggle source
# File lib/activecube/query/slice.rb, line 19 def required_column_names ((dimension.class.column_names || []) + selectors.map(&:required_column_names) ).flatten.uniq end
to_s()
click to toggle source
# File lib/activecube/query/slice.rb, line 103 def to_s parent ? "Dimension #{dimension}[#{super}]" : "Dimension #{super}" end
when(*args)
click to toggle source
# File lib/activecube/query/slice.rb, line 49 def when *args append *args, @selectors, Selector, cube.selectors end