From 2bc29d64a41ad7f30bfde6ad00d08e94ba7eea76 Mon Sep 17 00:00:00 2001 From: mainmain <57514971+mainmainer@users.noreply.github.com> Date: Mon, 4 Dec 2023 10:41:41 +0800 Subject: [PATCH] (improvement)(chat) rewrite datediff logic and perfect sql style (#461) --- .../chat/processor/MetricCheckProcessor.java | 2 +- .../common/util/jsqlparser/JsqlConstants.java | 25 +++++- .../common/util/jsqlparser/SqlEditEnum.java | 6 ++ .../util/jsqlparser/SqlParserAddHelper.java | 3 +- .../jsqlparser/SqlParserRemoveHelper.java | 78 +++++++++-------- .../jsqlparser/SqlParserReplaceHelper.java | 85 +++++++++++-------- .../jsqlparser/SqlParserRemoveHelperTest.java | 8 +- .../SqlParserReplaceHelperTest.java | 53 ++++++------ 8 files changed, 154 insertions(+), 106 deletions(-) create mode 100644 common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlEditEnum.java diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/processor/MetricCheckProcessor.java b/chat/core/src/main/java/com/tencent/supersonic/chat/processor/MetricCheckProcessor.java index 0e335655c..958ff57de 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/processor/MetricCheckProcessor.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/processor/MetricCheckProcessor.java @@ -215,7 +215,7 @@ public class MetricCheckProcessor implements ParseResultProcessor { sql = SqlParserRemoveHelper.removeSelect(sql, metricToRemove); sql = SqlParserRemoveHelper.removeSelect(sql, dimensionByToRemove); sql = SqlParserRemoveHelper.removeGroupBy(sql, dimensionByToRemove); - sql = SqlParserRemoveHelper.removeNumberCondition(sql); + sql = SqlParserRemoveHelper.removeNumberFilter(sql); return sql; } diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/JsqlConstants.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/JsqlConstants.java index 8592785ab..0934dbbe9 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/JsqlConstants.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/JsqlConstants.java @@ -2,6 +2,12 @@ package com.tencent.supersonic.common.util.jsqlparser; import lombok.extern.slf4j.Slf4j; +import java.util.AbstractMap; +import java.util.Map; +import java.util.stream.Stream; + +import static java.util.stream.Collectors.toMap; + @Slf4j public class JsqlConstants { @@ -9,14 +15,31 @@ public class JsqlConstants { public static final double HALF_YEAR = 0.5d; public static final int SIX_MONTH = 6; public static final String EQUAL = "="; + public static final String MINOR_THAN = "<"; + public static final String MINOR_THAN_EQUALS = "<="; + public static final String GREATER_THAN = ">"; + public static final String GREATER_THAN_EQUALS = ">="; public static final String MINOR_THAN_CONSTANT = " 1 < 2 "; public static final String MINOR_THAN_EQUALS_CONSTANT = " 1 <= 1 "; public static final String GREATER_THAN_CONSTANT = " 2 > 1 "; public static final String GREATER_THAN_EQUALS_CONSTANT = " 1 >= 1 "; public static final String EQUAL_CONSTANT = " 1 = 1 "; - public static final String IN_CONSTANT = " 1 in (1) "; public static final String LIKE_CONSTANT = "1 like 1"; public static final String IN = "IN"; + public static final Map rightMap = Stream.of( + new AbstractMap.SimpleEntry<>("<=", "<="), + new AbstractMap.SimpleEntry<>("<", "<"), + new AbstractMap.SimpleEntry<>(">=", "<="), + new AbstractMap.SimpleEntry<>(">", "<"), + new AbstractMap.SimpleEntry<>("=", "<=")) + .collect(toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue)); + public static final Map leftMap = Stream.of( + new AbstractMap.SimpleEntry<>("<=", ">="), + new AbstractMap.SimpleEntry<>("<", ">"), + new AbstractMap.SimpleEntry<>(">=", "<="), + new AbstractMap.SimpleEntry<>(">", "<"), + new AbstractMap.SimpleEntry<>("=", ">=")) + .collect(toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue)); } diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlEditEnum.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlEditEnum.java new file mode 100644 index 000000000..1fab1113e --- /dev/null +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlEditEnum.java @@ -0,0 +1,6 @@ +package com.tencent.supersonic.common.util.jsqlparser; + +public enum SqlEditEnum { + NUMBER_FILTER, + DATEDIFF +} diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserAddHelper.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserAddHelper.java index 75ca0351e..ea3f667c8 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserAddHelper.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserAddHelper.java @@ -342,8 +342,7 @@ public class SqlParserAddHelper { } } } - sql = SqlParserRemoveHelper.removeNumberCondition(selectStatement.toString()); - return sql; + return SqlParserRemoveHelper.removeNumberFilter(selectStatement.toString()); } public static String addHaving(String sql, List expressionList) { 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 1e063a566..413b45cd5 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 @@ -10,6 +10,7 @@ import net.sf.jsqlparser.expression.operators.conditional.AndExpression; import net.sf.jsqlparser.expression.operators.conditional.OrExpression; import net.sf.jsqlparser.expression.operators.relational.ComparisonOperator; import net.sf.jsqlparser.expression.operators.relational.EqualsTo; +import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo; import net.sf.jsqlparser.expression.operators.relational.ExpressionList; import net.sf.jsqlparser.expression.operators.relational.GreaterThan; import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals; @@ -17,7 +18,6 @@ import net.sf.jsqlparser.expression.operators.relational.InExpression; 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.expression.operators.relational.NotEqualsTo; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.statement.select.GroupByElement; @@ -30,8 +30,8 @@ import net.sf.jsqlparser.statement.select.SelectVisitorAdapter; import org.springframework.util.CollectionUtils; import java.util.List; -import java.util.Objects; import java.util.Set; +import java.util.Objects; /** * Sql Parser remove Helper @@ -73,8 +73,7 @@ public class SqlParserRemoveHelper { removeWhereCondition(plainSelect.getWhere(), removeFieldNames); } }); - sql = removeNumberCondition(selectStatement.toString()); - return sql; + return removeNumberFilter(selectStatement.toString()); } private static void removeWhereCondition(Expression whereExpression, Set removeFieldNames) { @@ -84,7 +83,7 @@ public class SqlParserRemoveHelper { removeWhereExpression(whereExpression, removeFieldNames); } - public static String removeNumberCondition(String sql) { + public static String removeNumberFilter(String sql) { Select selectStatement = SqlParserSelectHelper.getSelect(sql); if (selectStatement == null) { return sql; @@ -96,10 +95,12 @@ public class SqlParserRemoveHelper { } Expression where = ((PlainSelect) selectBody).getWhere(); Expression having = ((PlainSelect) selectBody).getHaving(); - where = filteredWhereExpression(where); - having = filteredWhereExpression(having); - ((PlainSelect) selectBody).setWhere(where); - ((PlainSelect) selectBody).setHaving(having); + try { + ((PlainSelect) selectBody).setWhere(filteredExpression(where, SqlEditEnum.NUMBER_FILTER)); + ((PlainSelect) selectBody).setHaving(filteredExpression(having, SqlEditEnum.NUMBER_FILTER)); + } catch (Exception e) { + log.info("replaceFunction has an exception:{}", e.toString()); + } return selectStatement.toString(); } @@ -203,8 +204,7 @@ public class SqlParserRemoveHelper { removeWhereCondition(plainSelect.getHaving(), removeFieldNames); } }); - sql = removeNumberCondition(selectStatement.toString()); - return sql; + return removeNumberFilter(selectStatement.toString()); } public static String removeWhere(String sql, List fields) { @@ -252,12 +252,12 @@ public class SqlParserRemoveHelper { return selectStatement.toString(); } - private static Expression filteredWhereExpression(Expression where) { + public static Expression filteredExpression(Expression where, SqlEditEnum sqlEditEnum) throws Exception { if (Objects.isNull(where)) { return null; } if (where instanceof Parenthesis) { - Expression expression = filteredWhereExpression(((Parenthesis) where).getExpression()); + Expression expression = filteredExpression(((Parenthesis) where).getExpression(), sqlEditEnum); if (expression != null) { try { Expression parseExpression = CCJSqlParserUtil.parseExpression("(" + expression + ")"); @@ -270,19 +270,20 @@ public class SqlParserRemoveHelper { } } else if (where instanceof AndExpression) { AndExpression andExpression = (AndExpression) where; - return filteredNumberExpression(andExpression); + return filteredLogicExpression(andExpression, sqlEditEnum); } else if (where instanceof OrExpression) { OrExpression orExpression = (OrExpression) where; - return filteredNumberExpression(orExpression); + return filteredLogicExpression(orExpression, sqlEditEnum); } else { - return replaceComparisonOperatorFunction(where); + return dealComparisonOperatorFilter(where, sqlEditEnum); } return where; } - private static Expression filteredNumberExpression(T binaryExpression) { - Expression leftExpression = filteredWhereExpression(binaryExpression.getLeftExpression()); - Expression rightExpression = filteredWhereExpression(binaryExpression.getRightExpression()); + private static Expression filteredLogicExpression( + T binaryExpression, SqlEditEnum sqlEditEnum) throws Exception { + Expression leftExpression = filteredExpression(binaryExpression.getLeftExpression(), sqlEditEnum); + Expression rightExpression = filteredExpression(binaryExpression.getRightExpression(), sqlEditEnum); if (leftExpression != null && rightExpression != null) { binaryExpression.setLeftExpression(leftExpression); binaryExpression.setRightExpression(rightExpression); @@ -296,40 +297,43 @@ public class SqlParserRemoveHelper { } } - private static Expression replaceComparisonOperatorFunction(Expression expression) { + private static Expression dealComparisonOperatorFilter(Expression expression, SqlEditEnum sqlEditEnum) { if (Objects.isNull(expression)) { return null; } - if (expression instanceof GreaterThanEquals) { - return removeSingleFilter((GreaterThanEquals) expression); - } else if (expression instanceof GreaterThan) { - return removeSingleFilter((GreaterThan) expression); - } else if (expression instanceof MinorThan) { - return removeSingleFilter((MinorThan) expression); - } else if (expression instanceof MinorThanEquals) { - return removeSingleFilter((MinorThanEquals) expression); - } else if (expression instanceof EqualsTo) { - return removeSingleFilter((EqualsTo) expression); - } else if (expression instanceof NotEqualsTo) { - return removeSingleFilter((NotEqualsTo) expression); + if (expression instanceof GreaterThanEquals || expression instanceof GreaterThan + || expression instanceof MinorThan || expression instanceof MinorThanEquals + || expression instanceof EqualsTo || expression instanceof NotEqualsTo) { + return removeSingleFilter((ComparisonOperator) expression, sqlEditEnum); } else if (expression instanceof InExpression) { InExpression inExpression = (InExpression) expression; Expression leftExpression = inExpression.getLeftExpression(); - return distinguishNumberCondition(leftExpression, expression); + return recursionBase(leftExpression, expression, sqlEditEnum); } else if (expression instanceof LikeExpression) { LikeExpression likeExpression = (LikeExpression) expression; Expression leftExpression = likeExpression.getLeftExpression(); - return distinguishNumberCondition(leftExpression, expression); + return recursionBase(leftExpression, expression, sqlEditEnum); } return expression; } - private static Expression removeSingleFilter(T comparisonExpression) { + private static Expression removeSingleFilter( + ComparisonOperator comparisonExpression, SqlEditEnum sqlEditEnum) { Expression leftExpression = comparisonExpression.getLeftExpression(); - return distinguishNumberCondition(leftExpression, comparisonExpression); + return recursionBase(leftExpression, comparisonExpression, sqlEditEnum); } - public static Expression distinguishNumberCondition(Expression leftExpression, Expression expression) { + private static Expression recursionBase(Expression leftExpression, Expression expression, SqlEditEnum sqlEditEnum) { + if (sqlEditEnum.equals(SqlEditEnum.NUMBER_FILTER)) { + return distinguishNumberFilter(leftExpression, expression); + } + if (sqlEditEnum.equals(SqlEditEnum.DATEDIFF)) { + return SqlParserReplaceHelper.distinguishDateDiffFilter(leftExpression, expression); + } + return expression; + } + + private static Expression distinguishNumberFilter(Expression leftExpression, Expression expression) { if (leftExpression instanceof LongValue) { return null; } else { diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserReplaceHelper.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserReplaceHelper.java index 285183c92..ec5ac9a69 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserReplaceHelper.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserReplaceHelper.java @@ -6,7 +6,9 @@ import java.util.Objects; import java.util.Set; import java.util.ArrayList; +import com.tencent.supersonic.common.util.StringUtil; import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.Alias; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.Function; @@ -19,6 +21,7 @@ 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.NotEqualsTo; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.statement.select.GroupByElement; import net.sf.jsqlparser.statement.select.Join; @@ -267,29 +270,17 @@ public class SqlParserReplaceHelper { if (!(selectBody instanceof PlainSelect)) { return sql; } - List plainSelectList = new ArrayList<>(); - plainSelectList.add((PlainSelect) selectBody); - List plainSelects = SqlParserSelectHelper.getPlainSelects(plainSelectList); - for (PlainSelect plainSelect : plainSelects) { - replaceFunction(plainSelect); + Expression where = ((PlainSelect) selectBody).getWhere(); + try { + Expression expression = SqlParserRemoveHelper.filteredExpression(where, SqlEditEnum.DATEDIFF); + ((PlainSelect) selectBody).setWhere(expression); + } catch (Exception e) { + log.info("replaceFunction has an exception:{}", e.toString()); } + return selectStatement.toString(); } - private static void replaceFunction(PlainSelect selectBody) { - PlainSelect plainSelect = selectBody; - - //1. replace where dataDiff function - Expression where = plainSelect.getWhere(); - FunctionReplaceVisitor visitor = new FunctionReplaceVisitor(); - if (Objects.nonNull(where)) { - where.accept(visitor); - } - //2. add Waiting Expression - List waitingForAdds = visitor.getWaitingForAdds(); - addWaitingExpression(plainSelect, where, waitingForAdds); - } - private static void replaceHavingFunction(Map functionMap, Expression having) { if (Objects.nonNull(having)) { if (having instanceof AndExpression) { @@ -351,21 +342,6 @@ public class SqlParserReplaceHelper { } } - private static void addWaitingExpression(PlainSelect plainSelect, Expression where, - List waitingForAdds) { - if (CollectionUtils.isEmpty(waitingForAdds)) { - return; - } - for (Expression expression : waitingForAdds) { - if (where == null) { - plainSelect.setWhere(expression); - } else { - where = new AndExpression(where, expression); - } - } - plainSelect.setWhere(where); - } - public static String replaceTable(String sql, String tableName) { if (StringUtils.isEmpty(tableName)) { return sql; @@ -448,5 +424,46 @@ public class SqlParserReplaceHelper { } return selectStatement.toString(); } + + public static Expression distinguishDateDiffFilter(Expression leftExpression, Expression expression) { + if (leftExpression instanceof Function) { + Function function = (Function) leftExpression; + if (function.getName().equals(JsqlConstants.DATE_FUNCTION)) { + ComparisonOperator comparisonOperator = (ComparisonOperator) expression; + List leftExpressions = function.getParameters().getExpressions(); + Column field = (Column) function.getParameters().getExpressions().get(1); + String columnName = field.getColumnName(); + try { + String startDateValue = DateFunctionHelper.getStartDateStr(comparisonOperator, leftExpressions); + String endDateValue = DateFunctionHelper.getEndDateValue(leftExpressions); + String dateOperator = comparisonOperator.getStringExpression(); + String endDateOperator = JsqlConstants.rightMap.get(dateOperator); + String startDateOperator = JsqlConstants.leftMap.get(dateOperator); + + String endDateCondExpr = columnName + endDateOperator + StringUtil.getCommaWrap(endDateValue); + ComparisonOperator rightExpression = (ComparisonOperator) + CCJSqlParserUtil.parseCondExpression(endDateCondExpr); + + String startDateCondExpr = columnName + StringUtil.getSpaceWrap(startDateOperator) + + StringUtil.getCommaWrap(startDateValue); + ComparisonOperator newLeftExpression = (ComparisonOperator) + CCJSqlParserUtil.parseCondExpression(startDateCondExpr); + + AndExpression andExpression = new AndExpression(newLeftExpression, rightExpression); + if (JsqlConstants.GREATER_THAN.equals(dateOperator) + || JsqlConstants.GREATER_THAN_EQUALS.equals(dateOperator)) { + return newLeftExpression; + } else { + return CCJSqlParserUtil.parseCondExpression("(" + andExpression.toString() + ")"); + } + } catch (JSQLParserException e) { + log.error("JSQLParserException", e); + } + } + return expression; + } else { + return expression; + } + } } diff --git a/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserRemoveHelperTest.java b/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserRemoveHelperTest.java index 0ef454a20..60da626e3 100644 --- a/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserRemoveHelperTest.java +++ b/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserRemoveHelperTest.java @@ -14,7 +14,7 @@ class SqlParserRemoveHelperTest { void removeWhereHavingCondition() { String sql = "select 歌曲名 from 歌曲库 where sum(粉丝数) > 20000 and 2>1 and " + "sum(播放量) > 20000 and 1=1 HAVING sum(播放量) > 20000 and 3>1"; - sql = SqlParserRemoveHelper.removeNumberCondition(sql); + sql = SqlParserRemoveHelper.removeNumberFilter(sql); System.out.println(sql); Assert.assertEquals( "SELECT 歌曲名 FROM 歌曲库 WHERE sum(粉丝数) > 20000 AND sum(播放量) > 20000 HAVING sum(播放量) > 20000", @@ -22,7 +22,7 @@ class SqlParserRemoveHelperTest { sql = "SELECT 歌曲,sum(播放量) FROM 歌曲库\n" + "WHERE (歌手名 = '张三' AND 2 > 1) AND 数据日期 = '2023-11-07'\n" + "GROUP BY 歌曲名 HAVING sum(播放量) > 100000"; - sql = SqlParserRemoveHelper.removeNumberCondition(sql); + sql = SqlParserRemoveHelper.removeNumberFilter(sql); System.out.println(sql); Assert.assertEquals( "SELECT 歌曲, sum(播放量) FROM 歌曲库 WHERE (歌手名 = '张三') " @@ -31,7 +31,7 @@ class SqlParserRemoveHelperTest { sql = "SELECT 歌曲名,sum(播放量) FROM 歌曲库 WHERE (1 = 1 AND 1 = 1 AND 2 > 1 )" + "AND 1 = 1 AND 歌曲类型 IN ('类型一', '类型二') AND 歌手名 IN ('林俊杰', '周杰伦')" + "AND 数据日期 = '2023-11-07' GROUP BY 歌曲名 HAVING 2 > 1 AND SUM(播放量) >= 1000"; - sql = SqlParserRemoveHelper.removeNumberCondition(sql); + sql = SqlParserRemoveHelper.removeNumberFilter(sql); System.out.println(sql); Assert.assertEquals( "SELECT 歌曲名, sum(播放量) FROM 歌曲库 WHERE 歌曲类型 IN ('类型一', '类型二') " @@ -41,7 +41,7 @@ class SqlParserRemoveHelperTest { sql = "SELECT 品牌名称,法人 FROM 互联网企业 WHERE (2 > 1 AND 1 = 1) AND 数据日期 = '2023-10-31'" + "GROUP BY 品牌名称, 法人 HAVING 2 > 1 AND sum(注册资本) > 100000000 AND sum(营收占比) = 0.5 and 1 = 1"; - sql = SqlParserRemoveHelper.removeNumberCondition(sql); + sql = SqlParserRemoveHelper.removeNumberFilter(sql); System.out.println(sql); Assert.assertEquals( "SELECT 品牌名称, 法人 FROM 互联网企业 WHERE 数据日期 = '2023-10-31' GROUP BY " diff --git a/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserReplaceHelperTest.java b/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserReplaceHelperTest.java index 4bef9ed35..e5064a0c9 100644 --- a/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserReplaceHelperTest.java +++ b/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserReplaceHelperTest.java @@ -182,18 +182,16 @@ class SqlParserReplaceHelperTest { replaceSql = SqlParserReplaceHelper.replaceFields(replaceSql, fieldToBizName); replaceSql = SqlParserReplaceHelper.replaceFunction(replaceSql); - Assert.assertEquals( - "SELECT song_name FROM 歌曲库 WHERE publish_date <= '2023-08-09' " - + "AND singer_name = '邓紫棋' AND sys_imp_date = '2023-08-09' AND " - + "song_publis_date = '2023-08-01' AND publish_date >= '2023-08-08' " - + "ORDER BY play_count DESC LIMIT 11", replaceSql); + "SELECT song_name FROM 歌曲库 WHERE (publish_date >= '2023-08-08' AND publish_date <= '2023-08-09')" + + " AND singer_name = '邓紫棋' AND sys_imp_date = '2023-08-09' AND song_publis_date = '2023-08-01'" + + " ORDER BY play_count DESC LIMIT 11", replaceSql); replaceSql = "select 品牌名称 from 互联网企业 where datediff('year', 品牌成立时间, '2023-11-04') > 17 and 注册资本 = 50000000"; replaceSql = SqlParserReplaceHelper.replaceFunction(replaceSql); - replaceSql = SqlParserRemoveHelper.removeNumberCondition(replaceSql); + replaceSql = SqlParserRemoveHelper.removeNumberFilter(replaceSql); Assert.assertEquals( - "SELECT 品牌名称 FROM 互联网企业 WHERE 注册资本 = 50000000 AND 品牌成立时间 < '2006-11-04'", replaceSql); + "SELECT 品牌名称 FROM 互联网企业 WHERE 品牌成立时间 < '2006-11-04' AND 注册资本 = 50000000", replaceSql); replaceSql = "select MONTH(数据日期), sum(访问次数) from 内容库产品 " + "where datediff('year', 数据日期, '2023-09-03') <= 0.5 " @@ -203,9 +201,9 @@ class SqlParserReplaceHelperTest { replaceSql = SqlParserReplaceHelper.replaceFunction(replaceSql); Assert.assertEquals( - "SELECT MONTH(sys_imp_date), sum(pv) FROM 内容库产品 WHERE sys_imp_date <= '2023-09-03' " - + "AND sys_imp_date >= '2023-03-03' " - + "GROUP BY MONTH(sys_imp_date) ORDER BY sum(pv) DESC LIMIT 1", replaceSql); + "SELECT MONTH(sys_imp_date), sum(pv) FROM 内容库产品 WHERE (sys_imp_date >= '2023-03-03' " + + "AND sys_imp_date <= '2023-09-03')" + + " GROUP BY MONTH(sys_imp_date) ORDER BY sum(pv) DESC LIMIT 1", replaceSql); replaceSql = "select MONTH(数据日期), sum(访问次数) from 内容库产品 " + "where datediff('year', 数据日期, '2023-09-03') <= 0.5 " @@ -215,8 +213,8 @@ class SqlParserReplaceHelperTest { replaceSql = SqlParserReplaceHelper.replaceFunction(replaceSql); Assert.assertEquals( - "SELECT MONTH(sys_imp_date), sum(pv) FROM 内容库产品 WHERE sys_imp_date <= '2023-09-03' " - + "AND sys_imp_date >= '2023-03-03' GROUP BY MONTH(sys_imp_date) HAVING sum(pv) > 1000", + "SELECT MONTH(sys_imp_date), sum(pv) FROM 内容库产品 WHERE (sys_imp_date >= '2023-03-03' AND" + + " sys_imp_date <= '2023-09-03') GROUP BY MONTH(sys_imp_date) HAVING sum(pv) > 1000", replaceSql); replaceSql = "select YEAR(发行日期), count(歌曲名) from 歌曲库 where YEAR(发行日期) " @@ -251,9 +249,10 @@ class SqlParserReplaceHelperTest { replaceSql = SqlParserReplaceHelper.replaceFunction(replaceSql); Assert.assertEquals( - "SELECT song_name FROM 歌曲库 WHERE publish_date <= '2023-08-11' " - + "AND play_count > 1000000 AND sys_imp_date <= '2023-08-11' AND " - + "publish_date >= '2022-08-11' AND sys_imp_date >= '2023-07-12'", replaceSql); + "SELECT song_name FROM 歌曲库 WHERE (publish_date >= '2022-08-11' " + + "AND publish_date <= '2023-08-11') AND play_count > 1000000 AND " + + "(sys_imp_date >= '2023-07-12' AND sys_imp_date <= '2023-08-11')", + replaceSql); replaceSql = SqlParserReplaceHelper.replaceFields( "select 歌曲名 from 歌曲库 where datediff('day', 发布日期, '2023-08-09') <= 1 " @@ -262,9 +261,9 @@ class SqlParserReplaceHelperTest { replaceSql = SqlParserReplaceHelper.replaceFunction(replaceSql); Assert.assertEquals( - "SELECT song_name FROM 歌曲库 WHERE publish_date <= '2023-08-09' " - + "AND singer_name = '邓紫棋' AND sys_imp_date = '2023-08-09' " - + "AND publish_date >= '2023-08-08' ORDER BY play_count DESC LIMIT 11", replaceSql); + "SELECT song_name FROM 歌曲库 WHERE (publish_date >= '2023-08-08' AND publish_date <= '2023-08-09')" + + " AND singer_name = '邓紫棋' AND sys_imp_date = '2023-08-09' ORDER BY play_count DESC LIMIT 11", + replaceSql); replaceSql = SqlParserReplaceHelper.replaceFields( "select 歌曲名 from 歌曲库 where datediff('year', 发布日期, '2023-08-09') = 0 " @@ -272,9 +271,9 @@ class SqlParserReplaceHelperTest { replaceSql = SqlParserReplaceHelper.replaceFunction(replaceSql); Assert.assertEquals( - "SELECT song_name FROM 歌曲库 WHERE 1 = 1 AND singer_name = '邓紫棋'" - + " AND sys_imp_date = '2023-08-09' AND publish_date <= '2023-08-09' " - + "AND publish_date >= '2023-01-01' ORDER BY play_count DESC LIMIT 11", replaceSql); + "SELECT song_name FROM 歌曲库 WHERE (publish_date >= '2023-01-01' AND publish_date <= '2023-08-09')" + + " AND singer_name = '邓紫棋' AND sys_imp_date = '2023-08-09' ORDER BY play_count DESC LIMIT 11", + replaceSql); replaceSql = SqlParserReplaceHelper.replaceFields( "select 歌曲名 from 歌曲库 where datediff('year', 发布日期, '2023-08-09') <= 0.5 " @@ -282,18 +281,18 @@ class SqlParserReplaceHelperTest { replaceSql = SqlParserReplaceHelper.replaceFunction(replaceSql); Assert.assertEquals( - "SELECT song_name FROM 歌曲库 WHERE publish_date <= '2023-08-09' " - + "AND singer_name = '邓紫棋' AND sys_imp_date = '2023-08-09' " - + "AND publish_date >= '2023-02-09' ORDER BY play_count DESC LIMIT 11", replaceSql); + "SELECT song_name FROM 歌曲库 WHERE (publish_date >= '2023-02-09' AND publish_date <= '2023-08-09')" + + " AND singer_name = '邓紫棋' AND sys_imp_date = '2023-08-09' ORDER BY play_count DESC LIMIT 11", + replaceSql); replaceSql = SqlParserReplaceHelper.replaceFields( "select 歌曲名 from 歌曲库 where datediff('year', 发布日期, '2023-08-09') >= 0.5 " + "and 歌手名 = '邓紫棋' and 数据日期 = '2023-08-09' order by 播放量 desc limit 11", fieldToBizName); replaceSql = SqlParserReplaceHelper.replaceFunction(replaceSql); - replaceSql = SqlParserRemoveHelper.removeNumberCondition(replaceSql); + replaceSql = SqlParserRemoveHelper.removeNumberFilter(replaceSql); Assert.assertEquals( - "SELECT song_name FROM 歌曲库 WHERE singer_name = '邓紫棋' " - + "AND sys_imp_date = '2023-08-09' AND publish_date <= '2023-02-09'" + "SELECT song_name FROM 歌曲库 WHERE publish_date <= '2023-02-09' AND" + + " singer_name = '邓紫棋' AND sys_imp_date = '2023-08-09'" + " ORDER BY play_count DESC LIMIT 11", replaceSql); replaceSql = SqlParserReplaceHelper.replaceFields(