mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-14 22:25:19 +00:00
(improvement)(chat) dsl parser and corrector support having function (#94)
This commit is contained in:
@@ -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)) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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(发行日期)";
|
||||
|
||||
|
||||
Reference in New Issue
Block a user