diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldAndValueAcquireVisitor.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldAndValueAcquireVisitor.java index ac55db8f3..d6b04e63a 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldAndValueAcquireVisitor.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/FieldAndValueAcquireVisitor.java @@ -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 result = new ArrayList<>(); + if (rightItemsList instanceof ExpressionList) { + ExpressionList rightExpressionList = (ExpressionList) rightItemsList; + List expressions = rightExpressionList.getExpressions(); + if (CollectionUtils.isNotEmpty(expressions)) { + for (Expression expression : expressions) { + result.add(expression.toString()); + } + } + } + filterExpression.setFieldValue(result); filterExpressions.add(filterExpression); } diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserRemoveHelper.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserRemoveHelper.java index a33776bd0..7eda5f260 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserRemoveHelper.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserRemoveHelper.java @@ -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 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); diff --git a/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelperTest.java b/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelperTest.java index cef8b95d0..1ce424e69 100644 --- a/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelperTest.java +++ b/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelperTest.java @@ -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); }