summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwangwei <[email protected]>2023-02-01 18:08:16 +0800
committerwangwei <[email protected]>2023-02-01 18:08:16 +0800
commit8327f50512f0d2fa9ed47f1196c02478d427d60b (patch)
tree3e2790ab34e0990b7eabb9c74aabbc25fd273b7b
parentc5c5295ee6fb7875388511cdc2350351aebecded (diff)
fix(topN 优化): 完善TopN优化规则,避免错误的优化count_distinct363br-363
-rw-r--r--src/main/java/com/mesalab/common/utils/sqlparser/TopSQLVisitor.java12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/main/java/com/mesalab/common/utils/sqlparser/TopSQLVisitor.java b/src/main/java/com/mesalab/common/utils/sqlparser/TopSQLVisitor.java
index de475683..659607f9 100644
--- a/src/main/java/com/mesalab/common/utils/sqlparser/TopSQLVisitor.java
+++ b/src/main/java/com/mesalab/common/utils/sqlparser/TopSQLVisitor.java
@@ -36,7 +36,7 @@ public class TopSQLVisitor implements OrderByVisitor, GroupByVisitor, SelectItem
private List<String> orderByList;
private List<String> selectItemExprList;
private List<String> selectItemAliasList;
- private List<String> functionList;
+ private List<Function> functionList;
private SelectBody innerSelectBody = null;
private SelectBody originalSelectBody = null;
@@ -171,12 +171,14 @@ public class TopSQLVisitor implements OrderByVisitor, GroupByVisitor, SelectItem
}
List unsupportedFunctionList = functionList.stream().filter(o ->
- StringUtil.isBlank(SQLFunctionUtil.getDistributedGroupByFunction(o))).collect(Collectors.toList());
+ StringUtil.isBlank(SQLFunctionUtil.getDistributedGroupByFunction(o.getName().toLowerCase(Locale.ROOT)))).collect(Collectors.toList());
if(unsupportedFunctionList.size() > 0) {
return false;
}
-
- List unsupportedGroupByList = groupByList.stream().filter(o ->
+ if (functionList.stream().anyMatch(o -> (o.isDistinct()) || o.isUnique())) {
+ return false;
+ }
+ List unsupportedGroupByList = groupByList.stream().filter(o ->
!selectItemExprList.contains(o) && !selectItemAliasList.contains(o) ).collect(Collectors.toList());
if(unsupportedGroupByList.size() > 0) {
return false;
@@ -215,7 +217,7 @@ public class TopSQLVisitor implements OrderByVisitor, GroupByVisitor, SelectItem
Expression expression = selectExpressionItem.getExpression();
this.selectItemExprList.add(expression.toString());
if (expression instanceof Function) {
- functionList.add(((Function) expression).getName().toLowerCase(Locale.ROOT));
+ functionList.add(((Function) expression));
}
if (StrUtil.isEmptyIfStr(selectExpressionItem.getAlias())) {
if (expression instanceof Column) {