(improvement)(chat) dsl parser and corrector support having function (#94)

This commit is contained in:
lexluo09
2023-09-15 15:38:33 +08:00
committed by GitHub
parent 45ed5648c4
commit 3701ade05f
4 changed files with 34 additions and 0 deletions

View File

@@ -117,9 +117,19 @@ public class SqlParserSelectHelper {
getWhereFields(plainSelect, result);
getHavingFields(plainSelect, result);
return new ArrayList<>(result);
}
private static void getHavingFields(PlainSelect plainSelect, Set<String> result) {
Expression having = plainSelect.getHaving();
if (Objects.nonNull(having)) {
having.accept(new FieldAcquireVisitor(result));
}
}
public static List<String> getOrderByFields(String sql) {
PlainSelect plainSelect = getPlainSelect(sql);
if (Objects.isNull(plainSelect)) {

View File

@@ -94,6 +94,11 @@ public class SqlParserUpdateHelper {
if (Objects.nonNull(groupByElement)) {
groupByElement.accept(new GroupByReplaceVisitor(fieldToBizName, exactReplace));
}
//5. replace having fields
Expression having = plainSelect.getHaving();
if (Objects.nonNull(having)) {
having.accept(visitor);
}
return selectStatement.toString();
}

View File

@@ -104,6 +104,13 @@ class SqlParserSelectHelperTest {
+ "sys_imp_date >= '2023-08-04' GROUP BY user_name ORDER BY sum(pv) DESC LIMIT 10 ");
Assert.assertEquals(allFields.size(), 3);
allFields = SqlParserSelectHelper.getAllFields(
"SELECT user_name FROM 超音数 WHERE sys_imp_date <= '2023-09-03' AND "
+ "sys_imp_date >= '2023-08-04' GROUP BY user_name HAVING sum(pv) > 1000");
Assert.assertEquals(allFields.size(), 3);
}

View File

@@ -44,6 +44,18 @@ class SqlParserUpdateHelperTest {
+ "AND sys_imp_date >= '2023-03-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 "
+ "group by MONTH(数据日期) HAVING sum(访问次数) > 1000";
replaceSql = SqlParserUpdateHelper.replaceFields(replaceSql, fieldToBizName);
replaceSql = SqlParserUpdateHelper.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",
replaceSql);
replaceSql = "select YEAR(发行日期), count(歌曲名) from 歌曲库 where YEAR(发行日期) "
+ "in (2022, 2023) and 数据日期 = '2023-08-14' group by YEAR(发行日期)";