Class: OlapReport::Cube::Adapters::PostgreSQLAdapter
- Inherits:
-
AbstractAdapter
- Object
- AbstractAdapter
- OlapReport::Cube::Adapters::PostgreSQLAdapter
- Defined in:
- lib/olap_report/cube/adapters/postgre_sql_adapter.rb
Instance Attribute Summary
Attributes inherited from AbstractAdapter
Instance Method Summary collapse
- #column_name(field, type) ⇒ Object
- #create_aggregated_table(table) ⇒ Object
- #measure_update_sql(measure, measures = []) ⇒ Object
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 |