diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/utils/SqlGenerateUtils.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/utils/SqlGenerateUtils.java index eb734f1c4..3bf97a5c3 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/utils/SqlGenerateUtils.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/utils/SqlGenerateUtils.java @@ -274,11 +274,17 @@ public class SqlGenerateUtils { return modelBizName + UNDERLINE + executorConfig.getInternalMetricNameSuffix(); } - public String generateDerivedMetric(final List metricResps, - final Set allFields, final Map allMeasures, - final List dimensionResps, final String expression, - final MetricDefineType metricDefineType, AggOption aggOption, Set visitedMetric, - Set measures, Set dimensions) { + public String generateDerivedMetric( + final List metricResps, + final Set allFields, + final Map allMeasures, + final List dimensionResps, + final String expression, + final MetricDefineType metricDefineType, + AggOption aggOption, + Map visitedMetric, + Set measures, + Set dimensions) { Set fields = SqlSelectHelper.getColumnFromExpr(expression); if (!CollectionUtils.isEmpty(fields)) { Map replace = new HashMap<>(); @@ -288,15 +294,24 @@ public class SqlGenerateUtils { Optional metricItem = metricResps.stream() .filter(m -> m.getBizName().equalsIgnoreCase(field)).findFirst(); if (metricItem.isPresent()) { - if (visitedMetric.contains(field)) { + if (visitedMetric.keySet().contains(field)) { + replace.put(field, visitedMetric.get(field)); break; } - replace.put(field, - generateDerivedMetric(metricResps, allFields, allMeasures, - dimensionResps, getExpr(metricItem.get()), - metricItem.get().getMetricDefineType(), aggOption, - visitedMetric, measures, dimensions)); - visitedMetric.add(field); + replace.put( + field, + generateDerivedMetric( + metricResps, + allFields, + allMeasures, + dimensionResps, + getExpr(metricItem.get()), + metricItem.get().getMetricDefineType(), + aggOption, + visitedMetric, + measures, + dimensions)); + visitedMetric.put(field, replace.get(field)); } break; case MEASURE: diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/QueryReqConverter.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/QueryReqConverter.java index 7bdbc1fb2..faea0945a 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/QueryReqConverter.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/QueryReqConverter.java @@ -317,7 +317,7 @@ public class QueryReqConverter { }); Set deriveDimension = new HashSet<>(); Set deriveMetric = new HashSet<>(); - Set visitedMetric = new HashSet<>(); + Map visitedMetric = new HashMap<>(); if (!CollectionUtils.isEmpty(metricResps)) { for (MetricResp metricResp : metricResps) { if (metrics.contains(metricResp.getBizName())) {