[improvement] add dimensionValue alias for sql execute (#296)

This commit is contained in:
mainmain
2023-10-26 21:13:43 +08:00
committed by GitHub
parent c92184d89f
commit 80cce47f58
5 changed files with 132 additions and 34 deletions

View File

@@ -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();

View File

@@ -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";
}

View File

@@ -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) {