Module: OlapReport::Cube::QueryMethods

Defined in:
lib/olap_report/cube/query_methods.rb

Instance Method Summary collapse

Instance Method Details

#drilldown(options) ⇒ Object

Fetches details for specified levels/dimensions

Parameters:

  • options (Hash)
    • projection options

    :dimensions - dimensions to query in :measures - measures to calculate for specified dimensions

    Fact.drilldown(user: :category) # drill 1 level down (group_id)
    Fact.drilldown(user: {category: :user_id}) # drill down to specified level (user_id)
    


25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/olap_report/cube/query_methods.rb', line 25

def drilldown(options)
  dimensions, measures = options.values_at(:dimensions, :measures).map{|v| Array(v)}

  joins, dims = {}, {}
  dimensions.each do |k,v|
    dim = dimension(k)

    case v
    when Hash
      raise ArgumentError, "Level for '#{k}' dimension is invalid" if v.size != 1
      lvl, details_lvl = *v.first
      dims[k]          = details_lvl
      joins.merge! dim[lvl].joins
    when Symbol
      dims[k] = dim.prev_level(v).name
      joins.merge! dim[v].joins
    end
  end

  Fact.joins(joins).slice(dimensions: dims, measures: measures, skip_aggregated: true)
end

#rollup(options) ⇒ Object



47
48
49
# File 'lib/olap_report/cube/query_methods.rb', line 47

def rollup(options)
  raise "Not implemented yet"
end

#slice(options) ⇒ Object

Fetches result(slice) for specified options (dimensions & measures)

Parameters:

  • options (Hash)
    • projection options

    :dimensions - dimensions to query in :measures - measures to calculate for specified dimensions



8
9
10
11
12
13
14
15
16
# File 'lib/olap_report/cube/query_methods.rb', line 8

def slice(options)
  a_table = aggregation(options[:dimensions])

  if !options[:skip_aggregated] && a_table
    a_table.slice(options[:measures])
  else
    build_relation(*options.values_at(:dimensions, :measures))
  end
end