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