From 12f6cfa42d1e17ada376204bd32758b68099c8c7 Mon Sep 17 00:00:00 2001 From: jerryjzhang Date: Thu, 13 Mar 2025 18:53:13 +0800 Subject: [PATCH] (fix)(headless)Metric filters do not take effect in struct query. --- .../api/pojo/request/QueryStructReq.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryStructReq.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryStructReq.java index 55b3bbbf3..5a6c3816e 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryStructReq.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryStructReq.java @@ -170,6 +170,9 @@ public class QueryStructReq extends SemanticQueryReq { // 5. Set the limit clause plainSelect.setLimit(buildLimit(queryStructReq)); + // 6. Set having clause + plainSelect.setHaving(buildHavingClause(queryStructReq)); + select.setSelect(plainSelect); // 6. Set where clause @@ -239,7 +242,8 @@ public class QueryStructReq extends SemanticQueryReq { private GroupByElement buildGroupByElement(QueryStructReq queryStructReq) { List groups = queryStructReq.getGroups(); - if (!CollectionUtils.isEmpty(groups) && !queryStructReq.getAggregators().isEmpty()) { + if ((!CollectionUtils.isEmpty(groups) && !queryStructReq.getAggregators().isEmpty()) + || !queryStructReq.getMetricFilters().isEmpty()) { GroupByElement groupByElement = new GroupByElement(); for (String group : groups) { groupByElement.addGroupByExpression(new Column(group)); @@ -289,4 +293,23 @@ public class QueryStructReq extends SemanticQueryReq { } return Constants.TABLE_PREFIX + StringUtils.join(modelIds, "_"); } + + public Expression buildHavingClause(QueryStructReq queryStructReq) { + if (queryStructReq.getMetricFilters().isEmpty()) { + return null; + } + + List filters = queryStructReq.getMetricFilters(); + SqlFilterUtils sqlFilterUtils = ContextUtils.getBean(SqlFilterUtils.class); + String havingClause = sqlFilterUtils.getWhereClause(filters, false); + if (StringUtils.isNotBlank(havingClause)) { + try { + return CCJSqlParserUtil.parseCondExpression(havingClause); + } catch (JSQLParserException e) { + log.error("Failed to parse having clause", e); + } + } + return null; + } + }