(improvement)(chat) Do not modify the values in the like expression and optimize some of the jsqlparser code. (#1584)

This commit is contained in:
lexluo09
2024-08-19 16:58:19 +08:00
committed by GitHub
parent ba55ecb31e
commit bd2eaef3f6
9 changed files with 100 additions and 328 deletions

View File

@@ -1,9 +1,5 @@
package com.tencent.supersonic.common.jsqlparser; package com.tencent.supersonic.common.jsqlparser;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.Expression;
@@ -20,6 +16,11 @@ import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Column;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Set;
@Slf4j @Slf4j
public class FiledFilterReplaceVisitor extends ExpressionVisitorAdapter { public class FiledFilterReplaceVisitor extends ExpressionVisitorAdapter {
@@ -76,37 +77,39 @@ public class FiledFilterReplaceVisitor extends ExpressionVisitorAdapter {
public List<Expression> parserFilter(ComparisonOperator comparisonOperator, String condExpr) { public List<Expression> parserFilter(ComparisonOperator comparisonOperator, String condExpr) {
List<Expression> result = new ArrayList<>(); List<Expression> result = new ArrayList<>();
String toString = comparisonOperator.toString(); String comparisonOperatorStr = comparisonOperator.toString();
Expression leftExpression = comparisonOperator.getLeftExpression(); Expression leftExpression = comparisonOperator.getLeftExpression();
if (!(leftExpression instanceof Function)) { if (!(leftExpression instanceof Function)) {
return result; return result;
} }
Function leftExpressionFunction = (Function) leftExpression;
if (leftExpressionFunction.toString().contains(JsqlConstants.DATE_FUNCTION)) { Function leftFunction = (Function) leftExpression;
if (leftFunction.toString().contains(JsqlConstants.DATE_FUNCTION)) {
return result; return result;
} }
//List<Expression> leftExpressions = leftExpressionFunction.getParameters().getExpressions(); ExpressionList<?> leftFunctionParams = leftFunction.getParameters();
ExpressionList<?> leftExpressions = leftExpressionFunction.getParameters(); if (CollectionUtils.isEmpty(leftFunctionParams)) {
if (CollectionUtils.isEmpty(leftExpressions)) {
return result; return result;
} }
Column field = (Column) leftExpressions.get(0);
Column field = (Column) leftFunctionParams.get(0);
String columnName = field.getColumnName(); String columnName = field.getColumnName();
if (!fieldNames.contains(columnName)) { if (!fieldNames.contains(columnName)) {
return null; return null;
} }
try { try {
ComparisonOperator expression = (ComparisonOperator) CCJSqlParserUtil.parseCondExpression(condExpr); ComparisonOperator parsedExpression = (ComparisonOperator) CCJSqlParserUtil.parseCondExpression(condExpr);
comparisonOperator.setLeftExpression(expression.getLeftExpression()); comparisonOperator.setLeftExpression(parsedExpression.getLeftExpression());
comparisonOperator.setRightExpression(expression.getRightExpression()); comparisonOperator.setRightExpression(parsedExpression.getRightExpression());
comparisonOperator.setASTNode(expression.getASTNode()); comparisonOperator.setASTNode(parsedExpression.getASTNode());
result.add(CCJSqlParserUtil.parseCondExpression(toString)); result.add(CCJSqlParserUtil.parseCondExpression(comparisonOperatorStr));
return result; return result;
} catch (JSQLParserException e) { } catch (JSQLParserException e) {
log.error("JSQLParserException", e); log.error("JSQLParserException", e);
} }
return null; return null;
} }
} }

View File

@@ -1,8 +1,5 @@
package com.tencent.supersonic.common.jsqlparser; package com.tencent.supersonic.common.jsqlparser;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import net.sf.jsqlparser.expression.BinaryExpression; import net.sf.jsqlparser.expression.BinaryExpression;
import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter; import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
@@ -12,9 +9,11 @@ import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Column;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
public class FiledNameReplaceVisitor extends ExpressionVisitorAdapter { import java.util.Map;
import java.util.Objects;
import java.util.Set;
public static final String PREFIX = "%"; public class FiledNameReplaceVisitor extends ExpressionVisitorAdapter {
private Map<String, Set<String>> fieldValueToFieldNames; private Map<String, Set<String>> fieldValueToFieldNames;
public FiledNameReplaceVisitor(Map<String, Set<String>> fieldValueToFieldNames) { public FiledNameReplaceVisitor(Map<String, Set<String>> fieldValueToFieldNames) {
@@ -34,40 +33,20 @@ public class FiledNameReplaceVisitor extends ExpressionVisitorAdapter {
private void replaceFieldNameByFieldValue(BinaryExpression expr) { private void replaceFieldNameByFieldValue(BinaryExpression expr) {
Expression leftExpression = expr.getLeftExpression(); Expression leftExpression = expr.getLeftExpression();
Expression rightExpression = expr.getRightExpression(); Expression rightExpression = expr.getRightExpression();
if (!(rightExpression instanceof StringValue)) {
if (!(rightExpression instanceof StringValue) || !(leftExpression instanceof Column)
|| CollectionUtils.isEmpty(fieldValueToFieldNames)
|| Objects.isNull(rightExpression) || Objects.isNull(leftExpression)) {
return; return;
} }
if (!(leftExpression instanceof Column)) {
return; Column leftColumn = (Column) leftExpression;
}
if (CollectionUtils.isEmpty(fieldValueToFieldNames)) {
return;
}
if (Objects.isNull(rightExpression) || Objects.isNull(leftExpression)) {
return;
}
Column leftColumnName = (Column) leftExpression;
StringValue rightStringValue = (StringValue) rightExpression; StringValue rightStringValue = (StringValue) rightExpression;
if (expr instanceof LikeExpression) {
String value = getValue(rightStringValue.getValue());
rightStringValue.setValue(value);
}
Set<String> fieldNames = fieldValueToFieldNames.get(rightStringValue.getValue()); Set<String> fieldNames = fieldValueToFieldNames.get(rightStringValue.getValue());
if (!CollectionUtils.isEmpty(fieldNames) && !fieldNames.contains(leftColumnName.getColumnName())) { if (!CollectionUtils.isEmpty(fieldNames) && !fieldNames.contains(leftColumn.getColumnName())) {
leftColumnName.setColumnName(fieldNames.stream().findFirst().get()); leftColumn.setColumnName(fieldNames.stream().findFirst().get());
} }
} }
private String getValue(String value) {
if (value.startsWith(PREFIX)) {
value = value.substring(1);
}
if (value.endsWith(PREFIX)) {
value = value.substring(0, value.length() - 1);
}
return value;
}
} }

View File

@@ -1,94 +0,0 @@
package com.tencent.supersonic.common.jsqlparser;
import java.util.List;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
import net.sf.jsqlparser.expression.operators.relational.InExpression;
import net.sf.jsqlparser.expression.operators.relational.MinorThan;
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
import net.sf.jsqlparser.schema.Column;
import org.apache.commons.lang3.StringUtils;
public class FilterRemoveVisitor extends ExpressionVisitorAdapter {
private List<String> filedNames;
public FilterRemoveVisitor(List<String> filedNames) {
this.filedNames = filedNames;
}
private boolean isRemove(Expression leftExpression) {
if (!(leftExpression instanceof Column)) {
return false;
}
Column leftColumnName = (Column) leftExpression;
String columnName = leftColumnName.getColumnName();
if (StringUtils.isEmpty(columnName)) {
return false;
}
if (!filedNames.contains(columnName)) {
return false;
}
return true;
}
@Override
public void visit(EqualsTo expr) {
if (!isRemove(expr.getLeftExpression())) {
return;
}
expr.setRightExpression(new LongValue(1L));
expr.setLeftExpression(new LongValue(1L));
}
@Override
public void visit(MinorThan expr) {
if (!isRemove(expr.getLeftExpression())) {
return;
}
expr.setRightExpression(new LongValue(1L));
expr.setLeftExpression(new LongValue(0L));
}
@Override
public void visit(MinorThanEquals expr) {
if (!isRemove(expr.getLeftExpression())) {
return;
}
expr.setRightExpression(new LongValue(1L));
expr.setLeftExpression(new LongValue(1L));
}
@Override
public void visit(GreaterThan expr) {
if (!isRemove(expr.getLeftExpression())) {
return;
}
expr.setRightExpression(new LongValue(0L));
expr.setLeftExpression(new LongValue(1L));
}
@Override
public void visit(GreaterThanEquals expr) {
if (!isRemove(expr.getLeftExpression())) {
return;
}
expr.setRightExpression(new LongValue(1L));
expr.setLeftExpression(new LongValue(1L));
}
@Override
public void visit(InExpression expr) {
if (!isRemove(expr.getLeftExpression())) {
return;
}
expr.setNot(false);
expr.setRightExpression(new LongValue(1L));
expr.setLeftExpression(new LongValue(1L));
}
}

View File

@@ -1,24 +1,21 @@
package com.tencent.supersonic.common.jsqlparser; package com.tencent.supersonic.common.jsqlparser;
import java.util.Map;
import java.util.Objects;
import java.util.function.UnaryOperator;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter; import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
import net.sf.jsqlparser.expression.Function; import net.sf.jsqlparser.expression.Function;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList; import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.util.Map;
import java.util.Objects;
import java.util.function.UnaryOperator;
@Slf4j @Slf4j
public class FunctionNameReplaceVisitor extends ExpressionVisitorAdapter { public class FunctionNameReplaceVisitor extends ExpressionVisitorAdapter {
private Map<String, String> functionMap; private Map<String, String> functionMap;
private Map<String, UnaryOperator> functionCallMap; private Map<String, UnaryOperator> functionCallMap;
public FunctionNameReplaceVisitor(Map<String, String> functionMap) {
this.functionMap = functionMap;
}
public FunctionNameReplaceVisitor(Map<String, String> functionMap, Map<String, UnaryOperator> functionCallMap) { public FunctionNameReplaceVisitor(Map<String, String> functionMap, Map<String, UnaryOperator> functionCallMap) {
this.functionMap = functionMap; this.functionMap = functionMap;
this.functionCallMap = functionCallMap; this.functionCallMap = functionCallMap;

View File

@@ -1,123 +0,0 @@
package com.tencent.supersonic.common.jsqlparser;
import com.tencent.supersonic.common.util.StringUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
import net.sf.jsqlparser.expression.Function;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.operators.relational.ComparisonOperator;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
import net.sf.jsqlparser.expression.operators.relational.MinorThan;
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Column;
import org.apache.commons.collections.CollectionUtils;
@Slf4j
public class FunctionReplaceVisitor extends ExpressionVisitorAdapter {
private List<Expression> waitingForAdds = new ArrayList<>();
@Override
public void visit(MinorThan expr) {
List<Expression> expressions = reparseDate(expr, ">");
if (Objects.nonNull(expressions)) {
waitingForAdds.addAll(expressions);
}
}
@Override
public void visit(EqualsTo expr) {
List<Expression> expressions = reparseDate(expr, ">=");
if (Objects.nonNull(expressions)) {
waitingForAdds.addAll(expressions);
}
}
@Override
public void visit(MinorThanEquals expr) {
List<Expression> expressions = reparseDate(expr, ">=");
if (Objects.nonNull(expressions)) {
waitingForAdds.addAll(expressions);
}
}
@Override
public void visit(GreaterThan expr) {
List<Expression> expressions = reparseDate(expr, "<");
if (Objects.nonNull(expressions)) {
waitingForAdds.addAll(expressions);
}
}
@Override
public void visit(GreaterThanEquals expr) {
List<Expression> expressions = reparseDate(expr, "<=");
if (Objects.nonNull(expressions)) {
waitingForAdds.addAll(expressions);
}
}
public List<Expression> getWaitingForAdds() {
return waitingForAdds;
}
public List<Expression> reparseDate(ComparisonOperator comparisonOperator, String startDateOperator) {
List<Expression> result = new ArrayList<>();
Expression leftExpression = comparisonOperator.getLeftExpression();
if (!(leftExpression instanceof Function)) {
return result;
}
Function leftExpressionFunction = (Function) leftExpression;
if (!leftExpressionFunction.toString().contains(JsqlConstants.DATE_FUNCTION)) {
return result;
}
//List<Expression> leftExpressions = leftExpressionFunction.getParameters().getExpressions();
ExpressionList<?> leftExpressions = leftExpressionFunction.getParameters();
if (CollectionUtils.isEmpty(leftExpressions) || leftExpressions.size() < 3) {
return result;
}
Column field = (Column) leftExpressions.get(1);
String columnName = field.getColumnName();
try {
String startDateValue = DateFunctionHelper.getStartDateStr(comparisonOperator, leftExpressions);
String endDateValue = DateFunctionHelper.getEndDateValue(leftExpressions);
String endDateOperator = comparisonOperator.getStringExpression();
String condExpr =
columnName + StringUtil.getSpaceWrap(DateFunctionHelper.getEndDateOperator(comparisonOperator))
+ StringUtil.getCommaWrap(endDateValue);
ComparisonOperator expression = (ComparisonOperator) CCJSqlParserUtil.parseCondExpression(condExpr);
String startDataCondExpr =
columnName + StringUtil.getSpaceWrap(startDateOperator) + StringUtil.getCommaWrap(startDateValue);
if (JsqlConstants.EQUAL.equalsIgnoreCase(endDateOperator)) {
result.add(CCJSqlParserUtil.parseCondExpression(condExpr));
expression = (ComparisonOperator) CCJSqlParserUtil.parseCondExpression(JsqlConstants.EQUAL_CONSTANT);
}
if (startDateOperator.equals("<=") || startDateOperator.equals("<")) {
comparisonOperator.setLeftExpression(new Column("1"));
comparisonOperator.setRightExpression(new LongValue(1));
comparisonOperator.setASTNode(null);
} else {
comparisonOperator.setLeftExpression(expression.getLeftExpression());
comparisonOperator.setRightExpression(expression.getRightExpression());
comparisonOperator.setASTNode(expression.getASTNode());
}
result.add(CCJSqlParserUtil.parseCondExpression(startDataCondExpr));
return result;
} catch (JSQLParserException e) {
log.error("JSQLParserException", e);
}
return null;
}
}

View File

@@ -1,9 +1,5 @@
package com.tencent.supersonic.common.jsqlparser; package com.tencent.supersonic.common.jsqlparser;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.UnaryOperator;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.Function; import net.sf.jsqlparser.expression.Function;
@@ -12,16 +8,17 @@ import net.sf.jsqlparser.statement.select.GroupByElement;
import net.sf.jsqlparser.statement.select.GroupByVisitor; import net.sf.jsqlparser.statement.select.GroupByVisitor;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.UnaryOperator;
@Slf4j @Slf4j
public class GroupByFunctionReplaceVisitor implements GroupByVisitor { public class GroupByFunctionReplaceVisitor implements GroupByVisitor {
private Map<String, String> functionMap; private Map<String, String> functionMap;
private Map<String, UnaryOperator> functionCallMap; private Map<String, UnaryOperator> functionCallMap;
public GroupByFunctionReplaceVisitor(Map<String, String> functionMap) {
this.functionMap = functionMap;
}
public GroupByFunctionReplaceVisitor(Map<String, String> functionMap, Map<String, UnaryOperator> functionCallMap) { public GroupByFunctionReplaceVisitor(Map<String, String> functionMap, Map<String, UnaryOperator> functionCallMap) {
this.functionMap = functionMap; this.functionMap = functionMap;
this.functionCallMap = functionCallMap; this.functionCallMap = functionCallMap;
@@ -31,22 +28,22 @@ public class GroupByFunctionReplaceVisitor implements GroupByVisitor {
groupByElement.getGroupByExpressionList(); groupByElement.getGroupByExpressionList();
ExpressionList groupByExpressionList = groupByElement.getGroupByExpressionList(); ExpressionList groupByExpressionList = groupByElement.getGroupByExpressionList();
List<Expression> groupByExpressions = groupByExpressionList.getExpressions(); List<Expression> groupByExpressions = groupByExpressionList.getExpressions();
for (Expression expression : groupByExpressions) {
for (int i = 0; i < groupByExpressions.size(); i++) { if (!(expression instanceof Function)) {
Expression expression = groupByExpressions.get(i); continue;
if (expression instanceof Function) { }
Function function = (Function) expression; Function function = (Function) expression;
String functionName = function.getName().toLowerCase(); String functionName = function.getName().toLowerCase();
String replaceName = functionMap.get(functionName); String replaceName = functionMap.get(functionName);
if (StringUtils.isNotBlank(replaceName)) { if (StringUtils.isBlank(replaceName)) {
function.setName(replaceName); continue;
if (Objects.nonNull(functionCallMap) && functionCallMap.containsKey(functionName)) { }
Object ret = functionCallMap.get(functionName).apply(function.getParameters()); function.setName(replaceName);
if (Objects.nonNull(ret) && ret instanceof ExpressionList) { if (Objects.nonNull(functionCallMap) && functionCallMap.containsKey(functionName)) {
ExpressionList expressionList = (ExpressionList) ret; Object ret = functionCallMap.get(functionName).apply(function.getParameters());
function.setParameters(expressionList); if (Objects.nonNull(ret) && ret instanceof ExpressionList) {
} ExpressionList expressionList = (ExpressionList) ret;
} function.setParameters(expressionList);
} }
} }
} }

View File

@@ -1,8 +1,5 @@
package com.tencent.supersonic.common.jsqlparser; package com.tencent.supersonic.common.jsqlparser;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.Expression;
@@ -14,6 +11,10 @@ import net.sf.jsqlparser.statement.select.GroupByElement;
import net.sf.jsqlparser.statement.select.GroupByVisitor; import net.sf.jsqlparser.statement.select.GroupByVisitor;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@Slf4j @Slf4j
public class GroupByReplaceVisitor implements GroupByVisitor { public class GroupByReplaceVisitor implements GroupByVisitor {
@@ -27,38 +28,51 @@ public class GroupByReplaceVisitor implements GroupByVisitor {
} }
public void visit(GroupByElement groupByElement) { public void visit(GroupByElement groupByElement) {
groupByElement.getGroupByExpressionList();
ExpressionList groupByExpressionList = groupByElement.getGroupByExpressionList(); ExpressionList groupByExpressionList = groupByElement.getGroupByExpressionList();
List<Expression> groupByExpressions = groupByExpressionList.getExpressions(); List<Expression> groupByExpressions = groupByExpressionList.getExpressions();
for (int i = 0; i < groupByExpressions.size(); i++) { for (int i = 0; i < groupByExpressions.size(); i++) {
Expression expression = groupByExpressions.get(i); Expression expression = groupByExpressions.get(i);
String columnName = expression.toString(); String columnName = getColumnName(expression);
if (expression instanceof Function && Objects.nonNull(
((Function) expression).getParameters().getExpressions().get(0))) { String replaceColumn = parseVisitorHelper.getReplaceValue(columnName, fieldNameMap, exactReplace);
columnName = ((Function) expression).getParameters().getExpressions().get(0).toString();
}
String replaceColumn = parseVisitorHelper.getReplaceValue(columnName, fieldNameMap,
exactReplace);
if (StringUtils.isNotEmpty(replaceColumn)) { if (StringUtils.isNotEmpty(replaceColumn)) {
if (expression instanceof Column) { replaceExpression(groupByExpressions, i, expression, replaceColumn);
groupByExpressions.set(i, new Column(replaceColumn)); }
} }
if (expression instanceof Function) { }
try {
Expression element = CCJSqlParserUtil.parseExpression(replaceColumn); private String getColumnName(Expression expression) {
ExpressionList<Expression> expressionList = new ExpressionList<Expression>(); if (expression instanceof Function) {
expressionList.add(element); Function function = (Function) expression;
if (((Function) expression).getParameters().size() > 1) { if (Objects.nonNull(function.getParameters().getExpressions().get(0))) {
((Function) expression).getParameters().stream().skip(1).forEach(e -> { return function.getParameters().getExpressions().get(0).toString();
expressionList.add((Function) e); }
}); }
} return expression.toString();
((Function) expression).setParameters(expressionList); }
} catch (JSQLParserException e) {
log.error("e", e); private void replaceExpression(List<Expression> groupByExpressions,
} int index,
Expression expression,
String replaceColumn) {
if (expression instanceof Column) {
groupByExpressions.set(index, new Column(replaceColumn));
} 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);
} }
} }
} }

View File

@@ -71,7 +71,6 @@ public class QueryExpressionReplaceVisitor extends ExpressionVisitorAdapter {
} }
} }
} }
//selectExpressionItem.getExpression().accept(this);
} }
public static Expression replace(Expression expression, Map<String, String> fieldExprMap) { public static Expression replace(Expression expression, Map<String, String> fieldExprMap) {

View File

@@ -153,7 +153,7 @@ class SqlReplaceHelperTest {
Assert.assertEquals( Assert.assertEquals(
"SELECT 歌曲名 FROM 歌曲库 WHERE datediff('day', 发布日期, '2023-08-09') <= 1 " "SELECT 歌曲名 FROM 歌曲库 WHERE datediff('day', 发布日期, '2023-08-09') <= 1 "
+ "AND 歌名 LIKE '邓紫棋' AND 数据日期 = '2023-08-09' AND 歌曲发布时 = " + "AND 歌名 LIKE '%邓紫棋%' AND 数据日期 = '2023-08-09' AND 歌曲发布时 = "
+ "'2023-08-01' ORDER BY 播放量 DESC LIMIT 11", replaceSql); + "'2023-08-01' ORDER BY 播放量 DESC LIMIT 11", replaceSql);
Set<String> fieldNames = new HashSet<>(); Set<String> fieldNames = new HashSet<>();