(fix)(headless)Metric filters do not take effect in struct query.
Some checks are pending
supersonic CentOS CI / build (21) (push) Waiting to run
supersonic mac CI / build (21) (push) Waiting to run
supersonic ubuntu CI / build (21) (push) Waiting to run
supersonic windows CI / build (21) (push) Waiting to run

This commit is contained in:
jerryjzhang
2025-03-13 18:53:13 +08:00
parent 4c94f2b816
commit 12f6cfa42d

View File

@@ -170,6 +170,9 @@ public class QueryStructReq extends SemanticQueryReq {
// 5. Set the limit clause // 5. Set the limit clause
plainSelect.setLimit(buildLimit(queryStructReq)); plainSelect.setLimit(buildLimit(queryStructReq));
// 6. Set having clause
plainSelect.setHaving(buildHavingClause(queryStructReq));
select.setSelect(plainSelect); select.setSelect(plainSelect);
// 6. Set where clause // 6. Set where clause
@@ -239,7 +242,8 @@ public class QueryStructReq extends SemanticQueryReq {
private GroupByElement buildGroupByElement(QueryStructReq queryStructReq) { private GroupByElement buildGroupByElement(QueryStructReq queryStructReq) {
List<String> groups = queryStructReq.getGroups(); List<String> groups = queryStructReq.getGroups();
if (!CollectionUtils.isEmpty(groups) && !queryStructReq.getAggregators().isEmpty()) { if ((!CollectionUtils.isEmpty(groups) && !queryStructReq.getAggregators().isEmpty())
|| !queryStructReq.getMetricFilters().isEmpty()) {
GroupByElement groupByElement = new GroupByElement(); GroupByElement groupByElement = new GroupByElement();
for (String group : groups) { for (String group : groups) {
groupByElement.addGroupByExpression(new Column(group)); groupByElement.addGroupByExpression(new Column(group));
@@ -289,4 +293,23 @@ public class QueryStructReq extends SemanticQueryReq {
} }
return Constants.TABLE_PREFIX + StringUtils.join(modelIds, "_"); return Constants.TABLE_PREFIX + StringUtils.join(modelIds, "_");
} }
public Expression buildHavingClause(QueryStructReq queryStructReq) {
if (queryStructReq.getMetricFilters().isEmpty()) {
return null;
}
List<Filter> 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;
}
} }