From 48fb01f6bc6f578e73559a41c70d5f5d2e3ccee0 Mon Sep 17 00:00:00 2001 From: Scott Date: Wed, 24 Jan 2024 09:48:21 +0800 Subject: [PATCH] (chat)(fix):not add group by if already has distinct (#685) --- .../chat/core/corrector/GroupByCorrector.java | 6 ++++++ .../util/jsqlparser/SqlParserSelectHelper.java | 13 +++++++++++++ 2 files changed, 19 insertions(+) diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/core/corrector/GroupByCorrector.java b/chat/core/src/main/java/com/tencent/supersonic/chat/core/corrector/GroupByCorrector.java index f232d1838..ca20d2cff 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/core/corrector/GroupByCorrector.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/core/corrector/GroupByCorrector.java @@ -34,6 +34,12 @@ public class GroupByCorrector extends BaseSemanticCorrector { SqlInfo sqlInfo = semanticParseInfo.getSqlInfo(); String correctS2SQL = sqlInfo.getCorrectS2SQL(); SemanticSchema semanticSchema = queryContext.getSemanticSchema(); + // check if has distinct + boolean hasDistinct = SqlParserSelectHelper.hasDistinct(correctS2SQL); + if (hasDistinct) { + log.info("not add group by ,exist distinct in correctS2SQL:{}", correctS2SQL); + return; + } //add alias field name Set dimensions = semanticSchema.getDimensions(modelIds).stream() .flatMap( diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java index 4a053fe6f..e5af76ebc 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java @@ -26,6 +26,7 @@ import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.select.Distinct; import net.sf.jsqlparser.statement.select.GroupByElement; import net.sf.jsqlparser.statement.select.OrderByElement; import net.sf.jsqlparser.statement.select.PlainSelect; @@ -384,6 +385,18 @@ public class SqlParserSelectHelper { return false; } + public static boolean hasDistinct(String sql) { + Select selectStatement = getSelect(sql); + SelectBody selectBody = selectStatement.getSelectBody(); + + if (!(selectBody instanceof PlainSelect)) { + return false; + } + PlainSelect plainSelect = (PlainSelect) selectBody; + Distinct distinct = plainSelect.getDistinct(); + return Objects.nonNull(distinct); + } + public static boolean isLogicExpression(Expression whereExpression) { return whereExpression instanceof AndExpression || (whereExpression instanceof OrExpression || (whereExpression instanceof XorExpression));