Module: AbacusCount::Calculations
- Defined in:
- lib/abacus_count/calculations.rb
Instance Method Summary collapse
- #build_subquery(relation, aliaz) ⇒ Object
- #execute_grouped_calculation(operation, column_name, distinct) ⇒ Object
- #execute_simple_calculation(operation, column_name, distinct) ⇒ Object
- #execute_subquery_calculation(operation, column_name, distinct) ⇒ Object
Instance Method Details
#build_subquery(relation, aliaz) ⇒ Object
29 30 31 32 33 |
# File 'lib/abacus_count/calculations.rb', line 29 def build_subquery(relation, aliaz) # Since arel 2.1.1 it will look like # relation.arel.as(subquery_alias) Arel::Nodes::As.new(Arel::Nodes::Grouping.new(relation.arel.ast), Arel::Nodes::SqlLiteral.new(aliaz)) end |
#execute_grouped_calculation(operation, column_name, distinct) ⇒ Object
7 8 9 |
# File 'lib/abacus_count/calculations.rb', line 7 def execute_grouped_calculation(operation, column_name, distinct) execute_subquery_calculation(operation, column_name, distinct) end |
#execute_simple_calculation(operation, column_name, distinct) ⇒ Object
3 4 5 |
# File 'lib/abacus_count/calculations.rb', line 3 def execute_simple_calculation(operation, column_name, distinct) execute_subquery_calculation(operation, column_name, distinct) end |
#execute_subquery_calculation(operation, column_name, distinct) ⇒ Object
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/abacus_count/calculations.rb', line 11 def execute_subquery_calculation(operation, column_name, distinct) relation = reorder(nil) column_alias = Arel.sql("#{operation}_column") subquery_alias = Arel.sql("subquery_for_#{operation}") aliased_column = aggregate_column(column_name == :all ? 1 : column_name).as(column_alias) relation.select_values += [aliased_column] subquery = build_subquery(relation, subquery_alias) sm = Arel::SelectManager.new relation.engine select_value = operation_over_aggregate_column(column_alias, operation, distinct) query_builder = sm.project(select_value).from(subquery) type_cast_calculated_value(@klass.connection.select_value(query_builder.to_sql), column_for(column_name), operation) end |