Skip to content

Commit

Permalink
Update calculate monkey-patch (#1090)
Browse files Browse the repository at this point in the history
  • Loading branch information
aidanharan authored Sep 19, 2023
1 parent 8d9b02a commit b0dbf8f
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,43 @@ module ConnectionAdapters
module SQLServer
module CoreExt
module Calculations
# Same as original except we don't perform PostgreSQL hack that removes ordering.
def calculate(operation, column_name)
return super unless klass.connection.adapter_name == "SQLServer"
if klass.connection.sqlserver?
_calculate(operation, column_name)
else
super
end
end

private

# Same as original `calculate` method except we don't perform PostgreSQL hack that removes ordering.
def _calculate(operation, column_name)
operation = operation.to_s.downcase

if @none
case operation
when "count", "sum"
result = group_values.any? ? Hash.new : 0
return @async ? Promise::Complete.new(result) : result
when "average", "minimum", "maximum"
result = group_values.any? ? Hash.new : nil
return @async ? Promise::Complete.new(result) : result
end
end

if has_include?(column_name)
relation = apply_join_dependency

if operation.to_s.downcase == "count"
if operation == "count"
unless distinct_value || distinct_select?(column_name || select_for_count)
relation.distinct!
relation.select_values = [klass.primary_key || table[Arel.star]]
relation.select_values = [ klass.primary_key || table[Arel.star] ]
end
# PostgreSQL: ORDER BY expressions must appear in SELECT list when using DISTINCT
# Start of monkey-patch
# relation.order_values = [] if group_values.empty?
# End of monkey-patch
end

relation.calculate(operation, column_name)
Expand All @@ -28,8 +53,6 @@ def calculate(operation, column_name)
end
end

private

def build_count_subquery(relation, column_name, distinct)
return super unless klass.connection.adapter_name == "SQLServer"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,26 @@ module CoreExt
module FinderMethods
private

# Same as original except we order by values in distinct select if present.
def construct_relation_for_exists(conditions)
return super unless klass.connection.adapter_name == "SQLServer"
if klass.connection.sqlserver?
_construct_relation_for_exists(conditions)
else
super
end
end

# Same as original except we order by values in distinct select if present.
def _construct_relation_for_exists(conditions)
conditions = sanitize_forbidden_attributes(conditions)

if distinct_value && offset_value
# Start of monkey-patch
if select_values.present?
relation = order(*select_values).limit!(1)
else
relation = except(:order).limit!(1)
end
# End of monkey-patch
else
relation = except(:select, :distinct, :order)._select!(::ActiveRecord::FinderMethods::ONE_AS_ONE).limit!(1)
end
Expand Down

0 comments on commit b0dbf8f

Please sign in to comment.