method
execute_simple_calculation
v8.1.1 -
Show latest stable
- Class:
ActiveRecord::Calculations
execute_simple_calculation(operation, column_name, distinct)private
No documentation available.
# File activerecord/lib/active_record/relation/calculations.rb, line 483
def execute_simple_calculation(operation, column_name, distinct) # :nodoc:
if build_count_subquery?(operation, column_name, distinct)
# Shortcut when limit is zero.
return 0 if limit_value == 0
relation = self
query_builder = build_count_subquery(spawn, column_name, distinct)
else
# PostgreSQL doesn't like ORDER BY when there are no GROUP BY
relation = unscope(:order).distinct!(false)
column = relation.aggregate_column(column_name)
select_value = operation_over_aggregate_column(column, operation, distinct)
select_value.distinct = true if operation == "sum" && distinct
relation.select_values = [select_value]
query_builder = relation.arel
end
query_result = if relation.where_clause.contradiction?
if @async
FutureResult.wrap(ActiveRecord::Result.empty)
else
ActiveRecord::Result.empty
end
else
skip_query_cache_if_necessary do
model.with_connection do |c|
c.select_all(query_builder, "#{model.name} #{operation.capitalize}", async: @async)
end
end
end
query_result.then do |result|
if operation != "count"
type = column.try(:type_caster) ||
lookup_cast_type_from_join_dependencies(column_name.to_s) || Type.default_value
type = type.subtype if Enum::EnumType === type
end
type_cast_calculated_value(result.cast_values.first, operation, type)
end
end