Permalink
Browse files

GH-139: some aggregations lacked DISTINCT emission

  • Loading branch information...
1 parent e032dab commit efdda5030a460e8af58ef0f7f4cd5ce8d7f1b541 @sunaku sunaku committed Sep 21, 2012
Showing with 43 additions and 4 deletions.
  1. +4 −4 lib/arel/visitors/to_sql.rb
  2. +39 −0 test/visitors/test_to_sql.rb
@@ -283,22 +283,22 @@ def visit_Arel_Nodes_Count o
end
def visit_Arel_Nodes_Sum o
- "SUM(#{o.expressions.map { |x|
+ "SUM(#{o.distinct ? 'DISTINCT ' : ''}#{o.expressions.map { |x|
visit x }.join(', ')})#{o.alias ? " AS #{visit o.alias}" : ''}"
end
def visit_Arel_Nodes_Max o
- "MAX(#{o.expressions.map { |x|
+ "MAX(#{o.distinct ? 'DISTINCT ' : ''}#{o.expressions.map { |x|
visit x }.join(', ')})#{o.alias ? " AS #{visit o.alias}" : ''}"
end
def visit_Arel_Nodes_Min o
- "MIN(#{o.expressions.map { |x|
+ "MIN(#{o.distinct ? 'DISTINCT ' : ''}#{o.expressions.map { |x|
visit x }.join(', ')})#{o.alias ? " AS #{visit o.alias}" : ''}"
end
def visit_Arel_Nodes_Avg o
- "AVG(#{o.expressions.map { |x|
+ "AVG(#{o.distinct ? 'DISTINCT ' : ''}#{o.expressions.map { |x|
visit x }.join(', ')})#{o.alias ? " AS #{visit o.alias}" : ''}"
end
@@ -48,6 +48,45 @@ def dispatch
sql.must_be_like %{ omg(*) = 2 }
end
+ it 'should visit built-in functions' do
+ function = Nodes::Count.new([Arel.star])
+ assert_equal 'COUNT(*)', @visitor.accept(function)
+
+ function = Nodes::Sum.new([Arel.star])
+ assert_equal 'SUM(*)', @visitor.accept(function)
+
+ function = Nodes::Max.new([Arel.star])
+ assert_equal 'MAX(*)', @visitor.accept(function)
+
+ function = Nodes::Min.new([Arel.star])
+ assert_equal 'MIN(*)', @visitor.accept(function)
+
+ function = Nodes::Avg.new([Arel.star])
+ assert_equal 'AVG(*)', @visitor.accept(function)
+ end
+
+ it 'should visit built-in functions operating on distinct values' do
+ function = Nodes::Count.new([Arel.star])
+ function.distinct = true
+ assert_equal 'COUNT(DISTINCT *)', @visitor.accept(function)
+
+ function = Nodes::Sum.new([Arel.star])
+ function.distinct = true
+ assert_equal 'SUM(DISTINCT *)', @visitor.accept(function)
+
+ function = Nodes::Max.new([Arel.star])
+ function.distinct = true
+ assert_equal 'MAX(DISTINCT *)', @visitor.accept(function)
+
+ function = Nodes::Min.new([Arel.star])
+ function.distinct = true
+ assert_equal 'MIN(DISTINCT *)', @visitor.accept(function)
+
+ function = Nodes::Avg.new([Arel.star])
+ function.distinct = true
+ assert_equal 'AVG(DISTINCT *)', @visitor.accept(function)
+ end
+
it 'works with lists' do
function = Nodes::NamedFunction.new('omg', [Arel.star, Arel.star])
assert_equal 'omg(*, *)', @visitor.accept(function)

0 comments on commit efdda50

Please sign in to comment.