mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-11 12:07:42 +00:00
[improvement] add dimensionValue alias for sql execute (#296)
This commit is contained in:
@@ -1,7 +1,11 @@
|
||||
package com.tencent.supersonic.common.util.jsqlparser;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
import com.tencent.supersonic.common.util.JsonUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.sf.jsqlparser.expression.DoubleValue;
|
||||
import net.sf.jsqlparser.expression.Expression;
|
||||
@@ -15,6 +19,8 @@ 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.expression.operators.relational.InExpression;
|
||||
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
|
||||
import net.sf.jsqlparser.schema.Column;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
@@ -52,6 +58,28 @@ public class FieldlValueReplaceVisitor extends ExpressionVisitorAdapter {
|
||||
replaceComparisonExpression(expr);
|
||||
}
|
||||
|
||||
public void visit(InExpression inExpression) {
|
||||
Column column = (Column) inExpression.getLeftExpression();
|
||||
Map<String, String> valueMap = filedNameToValueMap.get(column.getColumnName());
|
||||
ExpressionList rightItemsList = (ExpressionList) inExpression.getRightItemsList();
|
||||
List<Expression> expressions = rightItemsList.getExpressions();
|
||||
List<String> values = new ArrayList<>();
|
||||
expressions.stream().forEach(o -> {
|
||||
if (o instanceof StringValue) {
|
||||
values.add(((StringValue) o).getValue());
|
||||
}
|
||||
});
|
||||
String value = valueMap.get(JsonUtil.toString(values));
|
||||
List<String> valueList = JsonUtil.toList(value, String.class);
|
||||
List<Expression> newExpressions = new ArrayList<>();
|
||||
valueList.stream().forEach(o -> {
|
||||
StringValue stringValue = new StringValue(o);
|
||||
newExpressions.add(stringValue);
|
||||
});
|
||||
rightItemsList.setExpressions(newExpressions);
|
||||
inExpression.setRightItemsList(rightItemsList);
|
||||
}
|
||||
|
||||
public <T extends Expression> void replaceComparisonExpression(T expression) {
|
||||
Expression leftExpression = ((ComparisonOperator) expression).getLeftExpression();
|
||||
Expression rightExpression = ((ComparisonOperator) expression).getRightExpression();
|
||||
|
||||
@@ -16,6 +16,7 @@ public class JsqlConstants {
|
||||
public static final String EQUAL_CONSTANT = " 1 = 1 ";
|
||||
|
||||
public static final String IN_CONSTANT = " 1 in (1) ";
|
||||
public static final String LIKE_CONSTANT = "'a' like 'a'";
|
||||
public static final String IN = "IN";
|
||||
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ 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.expression.operators.relational.LikeExpression;
|
||||
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
|
||||
import net.sf.jsqlparser.statement.select.PlainSelect;
|
||||
import net.sf.jsqlparser.statement.select.Select;
|
||||
@@ -118,6 +119,22 @@ public class SqlParserRemoveHelper {
|
||||
log.error("JSQLParserException", e);
|
||||
}
|
||||
}
|
||||
if (expression instanceof LikeExpression) {
|
||||
LikeExpression likeExpression = (LikeExpression) expression;
|
||||
String columnName = SqlParserSelectHelper.getColumnName(likeExpression.getLeftExpression(),
|
||||
likeExpression.getRightExpression());
|
||||
if (!removeFieldNames.contains(columnName)) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
LikeExpression constantExpression = (LikeExpression) CCJSqlParserUtil.parseCondExpression(
|
||||
JsqlConstants.LIKE_CONSTANT);
|
||||
likeExpression.setLeftExpression(constantExpression.getLeftExpression());
|
||||
likeExpression.setRightExpression(constantExpression.getRightExpression());
|
||||
} catch (JSQLParserException e) {
|
||||
log.error("JSQLParserException", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static String removeHavingCondition(String sql, Set<String> removeFieldNames) {
|
||||
|
||||
Reference in New Issue
Block a user