mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-13 21:17:08 +00:00
[improvement][chat] Optimize the logic for field replacement and fix the replacement of 'GROUP BY' functions (#1807)
This commit is contained in:
@@ -1,19 +1,15 @@
|
||||
package com.tencent.supersonic.common.jsqlparser;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.sf.jsqlparser.JSQLParserException;
|
||||
import net.sf.jsqlparser.expression.Expression;
|
||||
import net.sf.jsqlparser.expression.Function;
|
||||
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
|
||||
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
|
||||
import net.sf.jsqlparser.schema.Column;
|
||||
import net.sf.jsqlparser.statement.select.GroupByElement;
|
||||
import net.sf.jsqlparser.statement.select.GroupByVisitor;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
@Slf4j
|
||||
public class GroupByReplaceVisitor implements GroupByVisitor {
|
||||
@@ -33,45 +29,15 @@ public class GroupByReplaceVisitor implements GroupByVisitor {
|
||||
|
||||
for (int i = 0; i < groupByExpressions.size(); i++) {
|
||||
Expression expression = groupByExpressions.get(i);
|
||||
String columnName = getColumnName(expression);
|
||||
|
||||
String replaceColumn =
|
||||
parseVisitorHelper.getReplaceValue(columnName, fieldNameMap, exactReplace);
|
||||
if (StringUtils.isNotEmpty(replaceColumn)) {
|
||||
replaceExpression(groupByExpressions, i, expression, replaceColumn);
|
||||
}
|
||||
replaceExpression(expression);
|
||||
}
|
||||
}
|
||||
|
||||
private String getColumnName(Expression expression) {
|
||||
if (expression instanceof Function) {
|
||||
Function function = (Function) expression;
|
||||
if (Objects.nonNull(function.getParameters().getExpressions().get(0))) {
|
||||
return function.getParameters().getExpressions().get(0).toString();
|
||||
}
|
||||
}
|
||||
return expression.toString();
|
||||
}
|
||||
|
||||
private void replaceExpression(List<Expression> groupByExpressions, int index,
|
||||
Expression expression, String replaceColumn) {
|
||||
private void replaceExpression(Expression expression) {
|
||||
if (expression instanceof Column) {
|
||||
groupByExpressions.set(index, new Column(replaceColumn));
|
||||
parseVisitorHelper.replaceColumn((Column) expression, fieldNameMap, exactReplace);
|
||||
} else if (expression instanceof Function) {
|
||||
try {
|
||||
Expression newExpression = CCJSqlParserUtil.parseExpression(replaceColumn);
|
||||
ExpressionList<Expression> newExpressionList = new ExpressionList<>();
|
||||
newExpressionList.add(newExpression);
|
||||
|
||||
Function function = (Function) expression;
|
||||
if (function.getParameters().size() > 1) {
|
||||
function.getParameters().stream().skip(1)
|
||||
.forEach(e -> newExpressionList.add((Function) e));
|
||||
}
|
||||
function.setParameters(newExpressionList);
|
||||
} catch (JSQLParserException e) {
|
||||
log.error("Error parsing expression: {}", replaceColumn, e);
|
||||
}
|
||||
parseVisitorHelper.replaceFunction((Function) expression, fieldNameMap, exactReplace);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@ package com.tencent.supersonic.common.jsqlparser;
|
||||
|
||||
import net.sf.jsqlparser.expression.Expression;
|
||||
import net.sf.jsqlparser.expression.Function;
|
||||
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
|
||||
import net.sf.jsqlparser.schema.Column;
|
||||
import net.sf.jsqlparser.statement.select.OrderByElement;
|
||||
import net.sf.jsqlparser.statement.select.OrderByVisitorAdapter;
|
||||
@@ -27,15 +26,9 @@ public class OrderByReplaceVisitor extends OrderByVisitorAdapter {
|
||||
parseVisitorHelper.replaceColumn((Column) expression, fieldNameMap, exactReplace);
|
||||
}
|
||||
if (expression instanceof Function) {
|
||||
Function function = (Function) expression;
|
||||
// List<Expression> expressions = function.getParameters().getExpressions();
|
||||
ExpressionList<?> expressions = function.getParameters();
|
||||
for (Expression column : expressions) {
|
||||
if (column instanceof Column) {
|
||||
parseVisitorHelper.replaceColumn((Column) column, fieldNameMap, exactReplace);
|
||||
}
|
||||
}
|
||||
parseVisitorHelper.replaceFunction((Function) expression, fieldNameMap, exactReplace);
|
||||
}
|
||||
super.visit(orderBy);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,6 +2,9 @@ package com.tencent.supersonic.common.jsqlparser;
|
||||
|
||||
import com.tencent.supersonic.common.util.StringUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.sf.jsqlparser.expression.Expression;
|
||||
import net.sf.jsqlparser.expression.Function;
|
||||
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
|
||||
import net.sf.jsqlparser.schema.Column;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
@@ -13,6 +16,17 @@ import java.util.stream.Collectors;
|
||||
@Slf4j
|
||||
public class ParseVisitorHelper {
|
||||
|
||||
public void replaceFunction(Function expression, Map<String, String> fieldNameMap,
|
||||
boolean exactReplace) {
|
||||
Function function = expression;
|
||||
ExpressionList<?> expressions = function.getParameters();
|
||||
for (Expression column : expressions) {
|
||||
if (column instanceof Column) {
|
||||
replaceColumn((Column) column, fieldNameMap, exactReplace);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void replaceColumn(Column column, Map<String, String> fieldNameMap,
|
||||
boolean exactReplace) {
|
||||
String columnName = StringUtil.replaceBackticks(column.getColumnName());
|
||||
|
||||
Reference in New Issue
Block a user