mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-15 06:27:21 +00:00
(improvement)(chat) dsl corrector support add agg metric in having (#95)
This commit is contained in:
@@ -6,8 +6,10 @@ import com.tencent.supersonic.common.util.jsqlparser.SqlParserUpdateHelper;
|
||||
import com.tencent.supersonic.semantic.api.model.enums.TimeDimensionEnum;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.sf.jsqlparser.expression.Expression;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
@Slf4j
|
||||
@@ -17,6 +19,12 @@ public class SelectFieldAppendCorrector extends BaseSemanticCorrector {
|
||||
public void correct(SemanticCorrectInfo semanticCorrectInfo) {
|
||||
String preSql = semanticCorrectInfo.getSql();
|
||||
if (SqlParserSelectHelper.hasAggregateFunction(preSql)) {
|
||||
Expression havingExpression = SqlParserSelectHelper.getHavingExpression(preSql);
|
||||
if (Objects.nonNull(havingExpression)) {
|
||||
String replaceSql = SqlParserUpdateHelper.addFunctionToSelect(preSql, havingExpression);
|
||||
semanticCorrectInfo.setPreSql(preSql);
|
||||
semanticCorrectInfo.setSql(replaceSql);
|
||||
}
|
||||
return;
|
||||
}
|
||||
Set<String> selectFields = new HashSet<>(SqlParserSelectHelper.getSelectFields(preSql));
|
||||
|
||||
@@ -22,5 +22,25 @@ class SelectFieldAppendCorrectorTest {
|
||||
+ "AND sys_imp_date = '2023-08-09' AND 歌曲发布时 = '2023-08-01'"
|
||||
+ " ORDER BY 播放量 DESC LIMIT 11", semanticCorrectInfo.getSql());
|
||||
|
||||
semanticCorrectInfo.setSql("select 用户名 from 内容库产品 where datediff('day', 数据日期, '2023-09-14') <= 30"
|
||||
+ " group by 用户名 having sum(访问次数) > 2000");
|
||||
|
||||
corrector.correct(semanticCorrectInfo);
|
||||
|
||||
Assert.assertEquals(
|
||||
"SELECT 用户名, sum(访问次数) FROM 内容库产品 WHERE "
|
||||
+ "datediff('day', 数据日期, '2023-09-14') <= 30 "
|
||||
+ "GROUP BY 用户名 HAVING sum(访问次数) > 2000", semanticCorrectInfo.getSql());
|
||||
|
||||
semanticCorrectInfo.setSql("SELECT 用户名, sum(访问次数) FROM 内容库产品 WHERE "
|
||||
+ "datediff('day', 数据日期, '2023-09-14') <= 30 "
|
||||
+ "GROUP BY 用户名 HAVING sum(访问次数) > 2000");
|
||||
|
||||
corrector.correct(semanticCorrectInfo);
|
||||
|
||||
Assert.assertEquals(
|
||||
"SELECT 用户名, sum(访问次数) FROM 内容库产品 WHERE "
|
||||
+ "datediff('day', 数据日期, '2023-09-14') <= 30 "
|
||||
+ "GROUP BY 用户名 HAVING sum(访问次数) > 2000", semanticCorrectInfo.getSql());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user