Module: CompositePrimaryKeys::ActiveRecord::Calculations
- Included in:
- CompositeRelation
- Defined in:
- lib/composite_primary_keys/relation/calculations.rb
Instance Method Summary collapse
- #aggregate_column(column_name) ⇒ Object
- #build_count_subquery(relation, column_name, distinct) ⇒ Object
-
#execute_simple_calculation(operation, column_name, distinct) ⇒ Object
:nodoc:.
Instance Method Details
#aggregate_column(column_name) ⇒ Object
4 5 6 7 8 9 10 11 12 13 14 15 |
# File 'lib/composite_primary_keys/relation/calculations.rb', line 4 def aggregate_column(column_name) # CPK if column_name.kind_of?(Array) column_name.map do |column| Arel::Attribute.new(@klass.unscoped.table, column) end elsif @klass.column_names.include?(column_name.to_s) Arel::Attribute.new(@klass.unscoped.table, column_name) else Arel.sql(column_name == :all ? "*" : column_name.to_s) end end |
#build_count_subquery(relation, column_name, distinct) ⇒ Object
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/composite_primary_keys/relation/calculations.rb', line 57 def build_count_subquery(relation, column_name, distinct) relation.select_values = [ if column_name == :all distinct ? table[Arel.star] : Arel.sql(::ActiveRecord::FinderMethods::ONE_AS_ONE) # CPK elsif column_name.is_a?(Array) relation.select_values = column_name.map do |column| Arel::Attribute.new(@klass.unscoped.table, column) end else column_alias = Arel.sql("count_column") aggregate_column(column_name).as(column_alias) end ] subquery = relation.arel.as(Arel.sql("subquery_for_count")) select_value = operation_over_aggregate_column(column_alias || Arel.star, "count", false) Arel::SelectManager.new(subquery).project(select_value) end |
#execute_simple_calculation(operation, column_name, distinct) ⇒ Object
:nodoc:
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/composite_primary_keys/relation/calculations.rb', line 17 def execute_simple_calculation(operation, column_name, distinct) #:nodoc: column_alias = column_name # CPK # if operation == "count" && has_limit_or_offset? # # Shortcut when limit is zero. # return 0 if limit_value == 0 # # query_builder = build_count_subquery(spawn, column_name, distinct) if operation == "count" relation = unscope(:order) query_builder = build_count_subquery(relation, column_name, distinct) else # PostgreSQL doesn't like ORDER BY when there are no GROUP BY relation = unscope(:order).distinct!(false) column = aggregate_column(column_name) select_value = operation_over_aggregate_column(column, operation, distinct) if operation == "sum" && distinct select_value.distinct = true end column_alias = select_value.alias column_alias ||= @klass.connection.column_name_for_operation(operation, select_value) relation.select_values = [select_value] query_builder = relation.arel end result = skip_query_cache_if_necessary { @klass.connection.select_all(query_builder, nil) } row = result.first value = row && row.values.first type = result.column_types.fetch(column_alias) do type_for(column_name) end type_cast_calculated_value(value, type, operation) end |