From 3701ade05f24443e5ea168bfcb547a9cfd0f7af7 Mon Sep 17 00:00:00 2001 From: lexluo09 <39718951+lexluo09@users.noreply.github.com> Date: Fri, 15 Sep 2023 15:38:33 +0800 Subject: [PATCH] (improvement)(chat) dsl parser and corrector support having function (#94) --- .../util/jsqlparser/SqlParserSelectHelper.java | 10 ++++++++++ .../util/jsqlparser/SqlParserUpdateHelper.java | 5 +++++ .../util/jsqlparser/SqlParserSelectHelperTest.java | 7 +++++++ .../util/jsqlparser/SqlParserUpdateHelperTest.java | 12 ++++++++++++ 4 files changed, 34 insertions(+) diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java index 1c0ba174f..7ac7d2ea2 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserSelectHelper.java @@ -117,9 +117,19 @@ public class SqlParserSelectHelper { getWhereFields(plainSelect, result); + getHavingFields(plainSelect, result); + return new ArrayList<>(result); } + private static void getHavingFields(PlainSelect plainSelect, Set result) { + Expression having = plainSelect.getHaving(); + if (Objects.nonNull(having)) { + having.accept(new FieldAcquireVisitor(result)); + } + + } + public static List getOrderByFields(String sql) { PlainSelect plainSelect = getPlainSelect(sql); if (Objects.isNull(plainSelect)) { diff --git a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserUpdateHelper.java b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserUpdateHelper.java index 5011182e2..16fc5ac8c 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserUpdateHelper.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserUpdateHelper.java @@ -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(); } 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 b5d84c1a7..fcb702f9b 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 @@ -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); + } diff --git a/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserUpdateHelperTest.java b/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserUpdateHelperTest.java index c49e8ea3e..0482eceed 100644 --- a/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserUpdateHelperTest.java +++ b/common/src/test/java/com/tencent/supersonic/common/util/jsqlparser/SqlParserUpdateHelperTest.java @@ -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(发行日期)";