Flowdock
execute_simple_calculation(operation, column_name, distinct) private

No documentation

This method has no description. You can help the Ruby on Rails community by adding new notes.

Hide source
# File activerecord/lib/active_record/relation/calculations.rb, line 453
      def execute_simple_calculation(operation, column_name, distinct) # :nodoc:
        if operation == "count" && (column_name == :all && distinct || has_limit_or_offset?)
          # 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 = 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?
          ActiveRecord::Result.empty
        else
          skip_query_cache_if_necessary do
            @klass.connection.select_all(query_builder, "#{@klass.name} #{operation.capitalize}", async: @async)
          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
Register or log in to add new notes.