mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-14 13:47:09 +00:00
[improvement](chat) rule and llm supports replace metric (#408)
This commit is contained in:
@@ -35,11 +35,7 @@ public class DateFunctionHelper {
|
||||
}
|
||||
|
||||
public static String getEndDateOperator(ComparisonOperator comparisonOperator) {
|
||||
String operator = comparisonOperator.getStringExpression();
|
||||
if (JsqlConstants.EQUAL.equalsIgnoreCase(operator)) {
|
||||
operator = "<=";
|
||||
}
|
||||
return operator;
|
||||
return "<=";
|
||||
}
|
||||
|
||||
public static String getEndDateValue(List<Expression> leftExpressions) {
|
||||
@@ -53,4 +49,4 @@ public class DateFunctionHelper {
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ 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.GreaterThan;
|
||||
@@ -97,19 +98,19 @@ public class FunctionReplaceVisitor extends ExpressionVisitorAdapter {
|
||||
|
||||
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);
|
||||
}
|
||||
comparisonOperator.setLeftExpression(null);
|
||||
comparisonOperator.setRightExpression(null);
|
||||
comparisonOperator.setASTNode(null);
|
||||
|
||||
comparisonOperator.setLeftExpression(expression.getLeftExpression());
|
||||
comparisonOperator.setRightExpression(expression.getRightExpression());
|
||||
comparisonOperator.setASTNode(expression.getASTNode());
|
||||
|
||||
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) {
|
||||
@@ -119,4 +120,4 @@ public class FunctionReplaceVisitor extends ExpressionVisitorAdapter {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +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 LIKE_CONSTANT = "1 like 1";
|
||||
public static final String IN = "IN";
|
||||
|
||||
}
|
||||
|
||||
@@ -27,6 +27,8 @@ import net.sf.jsqlparser.statement.select.SelectBody;
|
||||
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
|
||||
import net.sf.jsqlparser.statement.select.SelectItem;
|
||||
import net.sf.jsqlparser.statement.select.SelectVisitorAdapter;
|
||||
import net.sf.jsqlparser.statement.select.SelectItem;
|
||||
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.List;
|
||||
@@ -39,6 +41,29 @@ import java.util.Set;
|
||||
@Slf4j
|
||||
public class SqlParserRemoveHelper {
|
||||
|
||||
public static String removeSelect(String sql, List<String> filteredMetrics) {
|
||||
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
|
||||
SelectBody selectBody = selectStatement.getSelectBody();
|
||||
|
||||
if (!(selectBody instanceof PlainSelect)) {
|
||||
return sql;
|
||||
}
|
||||
List<SelectItem> selectItemList = ((PlainSelect) selectBody).getSelectItems();
|
||||
selectItemList.removeIf(o -> {
|
||||
Expression expression = ((SelectExpressionItem) o).getExpression();
|
||||
if (expression instanceof Column) {
|
||||
Column column = (Column) expression;
|
||||
String columnName = column.getColumnName();
|
||||
if (filteredMetrics.contains(columnName)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
((PlainSelect) selectBody).setSelectItems(selectItemList);
|
||||
return selectStatement.toString();
|
||||
}
|
||||
|
||||
public static String removeWhereCondition(String sql, Set<String> removeFieldNames) {
|
||||
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
|
||||
SelectBody selectBody = selectStatement.getSelectBody();
|
||||
@@ -310,16 +335,28 @@ public class SqlParserRemoveHelper {
|
||||
return removeSingleFilter((EqualsTo) expression);
|
||||
} else if (expression instanceof NotEqualsTo) {
|
||||
return removeSingleFilter((NotEqualsTo) expression);
|
||||
} else if (expression instanceof InExpression) {
|
||||
InExpression inExpression = (InExpression) expression;
|
||||
Expression leftExpression = inExpression.getLeftExpression();
|
||||
return distinguishNumberCondition(leftExpression, expression);
|
||||
} else if (expression instanceof LikeExpression) {
|
||||
LikeExpression likeExpression = (LikeExpression) expression;
|
||||
Expression leftExpression = likeExpression.getLeftExpression();
|
||||
return distinguishNumberCondition(leftExpression, expression);
|
||||
}
|
||||
return expression;
|
||||
}
|
||||
|
||||
private static <T extends ComparisonOperator> Expression removeSingleFilter(T comparisonExpression) {
|
||||
Expression leftExpression = comparisonExpression.getLeftExpression();
|
||||
return distinguishNumberCondition(leftExpression, comparisonExpression);
|
||||
}
|
||||
|
||||
public static Expression distinguishNumberCondition(Expression leftExpression, Expression expression) {
|
||||
if (leftExpression instanceof LongValue) {
|
||||
return null;
|
||||
} else {
|
||||
return comparisonExpression;
|
||||
return expression;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user