mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-17 16:02:14 +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);
|
getWhereFields(plainSelect, result);
|
||||||
|
|
||||||
|
getHavingFields(plainSelect, result);
|
||||||
|
|
||||||
return new ArrayList<>(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) {
|
public static List<String> getOrderByFields(String sql) {
|
||||||
PlainSelect plainSelect = getPlainSelect(sql);
|
PlainSelect plainSelect = getPlainSelect(sql);
|
||||||
if (Objects.isNull(plainSelect)) {
|
if (Objects.isNull(plainSelect)) {
|
||||||
|
|||||||
@@ -94,6 +94,11 @@ public class SqlParserUpdateHelper {
|
|||||||
if (Objects.nonNull(groupByElement)) {
|
if (Objects.nonNull(groupByElement)) {
|
||||||
groupByElement.accept(new GroupByReplaceVisitor(fieldToBizName, exactReplace));
|
groupByElement.accept(new GroupByReplaceVisitor(fieldToBizName, exactReplace));
|
||||||
}
|
}
|
||||||
|
//5. replace having fields
|
||||||
|
Expression having = plainSelect.getHaving();
|
||||||
|
if (Objects.nonNull(having)) {
|
||||||
|
having.accept(visitor);
|
||||||
|
}
|
||||||
return selectStatement.toString();
|
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 ");
|
+ "sys_imp_date >= '2023-08-04' GROUP BY user_name ORDER BY sum(pv) DESC LIMIT 10 ");
|
||||||
|
|
||||||
Assert.assertEquals(allFields.size(), 3);
|
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' "
|
+ "AND sys_imp_date >= '2023-03-03' "
|
||||||
+ "GROUP BY MONTH(sys_imp_date) ORDER BY sum(pv) DESC LIMIT 1", replaceSql);
|
+ "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(发行日期) "
|
replaceSql = "select YEAR(发行日期), count(歌曲名) from 歌曲库 where YEAR(发行日期) "
|
||||||
+ "in (2022, 2023) and 数据日期 = '2023-08-14' group by YEAR(发行日期)";
|
+ "in (2022, 2023) and 数据日期 = '2023-08-14' group by YEAR(发行日期)";
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user