Class: Activecube::Query::Slice
- Defined in:
- lib/activecube/query/slice.rb
Instance Attribute Summary collapse
- 
  
    
      #dimension  ⇒ Object 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    Returns the value of attribute dimension. 
- 
  
    
      #parent  ⇒ Object 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    Returns the value of attribute parent. 
- 
  
    
      #selectors  ⇒ Object 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    Returns the value of attribute selectors. 
Attributes inherited from Item
Instance Method Summary collapse
- #[](arg) ⇒ Object
- #alias!(new_key) ⇒ Object
- #append_query(model, cube_query, table, query) ⇒ Object
- #field_methods! ⇒ Object
- #group_by_columns ⇒ Object
- 
  
    
      #initialize(cube, key, definition, parent = nil, selectors = [])  ⇒ Slice 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    A new instance of Slice. 
- #required_column_names ⇒ Object
- #to_s ⇒ Object
- #when(*args) ⇒ Object
Methods inherited from Item
Constructor Details
#initialize(cube, key, definition, parent = nil, selectors = []) ⇒ Slice
Returns a new instance of Slice.
| 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 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 | 
Instance Attribute Details
#dimension ⇒ Object (readonly)
Returns the value of attribute dimension.
| 4 5 6 | # File 'lib/activecube/query/slice.rb', line 4 def dimension @dimension end | 
#parent ⇒ Object (readonly)
Returns the value of attribute parent.
| 4 5 6 | # File 'lib/activecube/query/slice.rb', line 4 def parent @parent end | 
#selectors ⇒ Object (readonly)
Returns the value of attribute selectors.
| 4 5 6 | # File 'lib/activecube/query/slice.rb', line 4 def selectors @selectors end | 
Instance Method Details
#[](arg) ⇒ Object
| 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | # 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) ⇒ Object
| 45 46 47 | # 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) ⇒ Object
| 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | # 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! ⇒ Object
| 107 108 109 110 111 112 113 114 115 116 117 | # 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 ⇒ Object
| 53 54 55 56 57 58 59 | # 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 ⇒ Object
| 19 20 21 | # 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 ⇒ Object
| 103 104 105 | # File 'lib/activecube/query/slice.rb', line 103 def to_s parent ? "Dimension #{dimension}[#{super}]" : "Dimension #{super}" end | 
#when(*args) ⇒ Object
| 49 50 51 | # File 'lib/activecube/query/slice.rb', line 49 def when *args append *args, @selectors, Selector, cube.selectors end |