From fbc537ef1d2b316d0b847da15663767808724814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Tue, 26 Jan 2016 11:40:51 +0800 Subject: [PATCH] PagerUtils support count(distinct) --- .../java/com/alibaba/druid/sql/PagerUtils.java | 17 ++++++++++++++--- .../bvt/sql/PagerUtilsTest_Count_MySql_0.java | 7 +++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/PagerUtils.java b/src/main/java/com/alibaba/druid/sql/PagerUtils.java index becce579fd..8598ec1240 100644 --- a/src/main/java/com/alibaba/druid/sql/PagerUtils.java +++ b/src/main/java/com/alibaba/druid/sql/PagerUtils.java @@ -20,8 +20,10 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.SQLOver; +import com.alibaba.druid.sql.ast.SQLSetQuantifier; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; +import com.alibaba.druid.sql.ast.expr.SQLAggregateOption; import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; @@ -334,9 +336,18 @@ public class PagerUtils { if (queryBlock.getGroupBy() != null && queryBlock.getGroupBy().getItems().size() > 0) { return createCountUseSubQuery(select, dbType); } - - queryBlock.getSelectList().clear(); - queryBlock.getSelectList().add(countItem); + + int option = queryBlock.getDistionOption(); + if (option == SQLSetQuantifier.DISTINCT && queryBlock.getSelectList().size() == 1) { + SQLSelectItem firstItem = queryBlock.getSelectList().get(0); + SQLAggregateExpr exp = new SQLAggregateExpr("COUNT", SQLAggregateOption.DISTINCT); + exp.getArguments().add(firstItem.getExpr()); + firstItem.setExpr(exp); + queryBlock.setDistionOption(0); + } else { + queryBlock.getSelectList().clear(); + queryBlock.getSelectList().add(countItem); + } return SQLUtils.toSQLString(select, dbType); } else if (query instanceof SQLUnionQuery) { return createCountUseSubQuery(select, dbType); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_MySql_0.java b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_MySql_0.java index 8a2c901796..754f3cb9e8 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_MySql_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_MySql_0.java @@ -29,6 +29,13 @@ public class PagerUtilsTest_Count_MySql_0 extends TestCase { Assert.assertEquals("SELECT COUNT(*)\n" + // "FROM t", result); } + + public void test_mysql_3() throws Exception { + String sql = "select distinct id from t order by id"; + String result = PagerUtils.count(sql, JdbcConstants.MYSQL); + Assert.assertEquals("SELECT COUNT(DISTINCT id)\n" + // + "FROM t", result); + } public void test_mysql_group_0() throws Exception { String sql = "select type, count(*) from t group by type";