Class: OlapReport::Cube::Adapters::PostgreSQLAdapter

Inherits:
AbstractAdapter show all
Defined in:
lib/olap_report/cube/adapters/postgre_sql_adapter.rb

Instance Attribute Summary

Attributes inherited from AbstractAdapter

#connection

Instance Method Summary collapse

Methods inherited from AbstractAdapter

#initialize, #method_missing, #update_aggregated_table

Constructor Details

This class inherits a constructor from OlapReport::Cube::Adapters::AbstractAdapter

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class OlapReport::Cube::Adapters::AbstractAdapter

Instance Method Details

#column_name(field, type) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/olap_report/cube/adapters/postgre_sql_adapter.rb', line 29

def column_name(field, type)
  case type
  when :minute
    "date_trunc('minute', #{field})"
  when :hour
    "date_trunc('hour', #{field})"
  when :day
    "date_trunc('day', #{field})"
  when :week
    "date_trunc('week', #{field})"
  when :month
    "date_trunc('month', #{field})"
  when :year
    "date_trunc('year', #{field})"
  end
end

#create_aggregated_table(table) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/olap_report/cube/adapters/postgre_sql_adapter.rb', line 3

def create_aggregated_table(table)
  super

  keys_condition = table.levels.map{|l| "#{l.name} = NEW.#{l.name}"}.join(' AND ')
  measures_sql = table.build_update_statements_for_measures

  connection.execute <<-SQL
    CREATE OR REPLACE FUNCTION #{table.table_name}_update_measures() RETURNS TRIGGER AS $$
    BEGIN
      IF (EXISTS(SELECT 1 FROM #{table.table_name} WHERE #{keys_condition})) THEN
        UPDATE #{table.table_name}
        SET #{measures_sql.join(', ')}
        WHERE #{keys_condition};
        RETURN NULL;
      ELSE
        RETURN NEW;
      END IF;
    END;
    $$ LANGUAGE plpgsql;

    CREATE TRIGGER update_measures
      BEFORE INSERT ON #{table.table_name}
      FOR EACH ROW EXECUTE PROCEDURE #{table.table_name}_update_measures();
  SQL
end

#measure_update_sql(measure, measures = []) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/olap_report/cube/adapters/postgre_sql_adapter.rb', line 46

def measure_update_sql(measure, measures=[])
  case measure.function
  when :avg
    base_measure = measures.find{|v| [:sum, :count].include?(v.function)}
    if base_measure
      case base_measure.function
      when :sum
        "#{measure.name} = (#{base_measure.name} + NEW.#{base_measure.name}) / (#{base_measure.name} / #{measure.name} + NEW.#{base_measure.name} / NEW.#{measure.name})"
      when :count
        "#{measure.name} = (#{measure.name} * #{base_measure.name} + NEW.#{measure.name} * NEW.#{base_measure.name}) / (#{base_measure.name} + NEW.#{base_measure.name})"
      end
    else
      return false
    end
  else
    '%s = %s + NEW.%s' % ([measure.name] * 3)
  end
end