mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-10 11:07:06 +00:00
(improvement)(chat) support InExpression in DimensionFilter and fix removeWhereExpression error (#266)
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package com.tencent.supersonic.common.util.jsqlparser;
|
||||
|
||||
import com.tencent.supersonic.common.util.DatePeriodEnum;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
@@ -12,14 +13,16 @@ import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
|
||||
import net.sf.jsqlparser.expression.Function;
|
||||
import net.sf.jsqlparser.expression.LongValue;
|
||||
import net.sf.jsqlparser.expression.StringValue;
|
||||
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
|
||||
import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
|
||||
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
|
||||
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
|
||||
import net.sf.jsqlparser.expression.operators.relational.MinorThan;
|
||||
import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
|
||||
import net.sf.jsqlparser.expression.operators.relational.InExpression;
|
||||
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.InExpression;
|
||||
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
|
||||
import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
|
||||
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.collections.CollectionUtils;
|
||||
|
||||
@@ -49,9 +52,25 @@ public class FieldAndValueAcquireVisitor extends ExpressionVisitorAdapter {
|
||||
|
||||
public void visit(InExpression expr) {
|
||||
FilterExpression filterExpression = new FilterExpression();
|
||||
filterExpression.setFieldName(((Column) expr.getLeftExpression()).getColumnName());
|
||||
Expression leftExpression = expr.getLeftExpression();
|
||||
if (!(leftExpression instanceof Column)) {
|
||||
return;
|
||||
}
|
||||
filterExpression.setFieldName(((Column) leftExpression).getColumnName());
|
||||
filterExpression.setOperator(JsqlConstants.IN);
|
||||
filterExpression.setFieldValue(expr.getRightItemsList());
|
||||
ItemsList rightItemsList = expr.getRightItemsList();
|
||||
filterExpression.setFieldValue(rightItemsList);
|
||||
List<Object> result = new ArrayList<>();
|
||||
if (rightItemsList instanceof ExpressionList) {
|
||||
ExpressionList rightExpressionList = (ExpressionList) rightItemsList;
|
||||
List<Expression> expressions = rightExpressionList.getExpressions();
|
||||
if (CollectionUtils.isNotEmpty(expressions)) {
|
||||
for (Expression expression : expressions) {
|
||||
result.add(expression.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
filterExpression.setFieldValue(result);
|
||||
filterExpressions.add(filterExpression);
|
||||
}
|
||||
|
||||
|
||||
@@ -4,16 +4,16 @@ import java.util.List;
|
||||
import java.util.Set;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.sf.jsqlparser.JSQLParserException;
|
||||
import net.sf.jsqlparser.expression.BinaryExpression;
|
||||
import net.sf.jsqlparser.expression.Expression;
|
||||
import net.sf.jsqlparser.expression.Parenthesis;
|
||||
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
|
||||
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
|
||||
import net.sf.jsqlparser.expression.operators.relational.ComparisonOperator;
|
||||
import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
|
||||
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
|
||||
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
|
||||
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
|
||||
import net.sf.jsqlparser.expression.operators.relational.MinorThan;
|
||||
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.parser.CCJSqlParserUtil;
|
||||
import net.sf.jsqlparser.statement.select.PlainSelect;
|
||||
import net.sf.jsqlparser.statement.select.Select;
|
||||
@@ -51,9 +51,9 @@ public class SqlParserRemoveHelper {
|
||||
|
||||
private static void removeWhereExpression(Expression whereExpression, Set<String> removeFieldNames) {
|
||||
if (SqlParserSelectHelper.isLogicExpression(whereExpression)) {
|
||||
AndExpression andExpression = (AndExpression) whereExpression;
|
||||
Expression leftExpression = andExpression.getLeftExpression();
|
||||
Expression rightExpression = andExpression.getRightExpression();
|
||||
BinaryExpression binaryExpression = (BinaryExpression) whereExpression;
|
||||
Expression leftExpression = binaryExpression.getLeftExpression();
|
||||
Expression rightExpression = binaryExpression.getRightExpression();
|
||||
|
||||
removeWhereExpression(leftExpression, removeFieldNames);
|
||||
removeWhereExpression(rightExpression, removeFieldNames);
|
||||
|
||||
@@ -84,6 +84,30 @@ class SqlParserSelectHelperTest {
|
||||
+ "group by department having sum(pv) > 2000 ORDER BY pv DESC LIMIT 1");
|
||||
|
||||
System.out.println(filterExpression);
|
||||
|
||||
filterExpression = SqlParserSelectHelper.getFilterExpression(
|
||||
"SELECT department, pv FROM s2 WHERE "
|
||||
+ "(user_id like '%alice%' AND publish_date > 10000) and song_name in "
|
||||
+ "('七里香','晴天') and sys_imp_date = '2023-08-08' "
|
||||
+ "group by department having sum(pv) > 2000 ORDER BY pv DESC LIMIT 1");
|
||||
|
||||
System.out.println(filterExpression);
|
||||
|
||||
filterExpression = SqlParserSelectHelper.getFilterExpression(
|
||||
"SELECT department, pv FROM s2 WHERE "
|
||||
+ "(user_id like '%alice%' AND publish_date > 10000) and song_name in (1,2) "
|
||||
+ "and sys_imp_date = '2023-08-08' "
|
||||
+ "group by department having sum(pv) > 2000 ORDER BY pv DESC LIMIT 1");
|
||||
|
||||
System.out.println(filterExpression);
|
||||
|
||||
filterExpression = SqlParserSelectHelper.getFilterExpression(
|
||||
"SELECT department, pv FROM s2 WHERE "
|
||||
+ "(user_id like '%alice%' AND publish_date > 10000) and 1 in (1) "
|
||||
+ "and sys_imp_date = '2023-08-08' "
|
||||
+ "group by department having sum(pv) > 2000 ORDER BY pv DESC LIMIT 1");
|
||||
|
||||
System.out.println(filterExpression);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user