diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/BaseSemanticCorrector.java b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/BaseSemanticCorrector.java index ace7f3d6c..6dddeb2c2 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/BaseSemanticCorrector.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/BaseSemanticCorrector.java @@ -62,9 +62,9 @@ public abstract class BaseSemanticCorrector implements SemanticCorrector { String sql = semanticCorrectInfo.getSql(); Long modelId = semanticCorrectInfo.getParseInfo().getModel().getModel(); - SemanticSchema semanticSchema = ContextUtils.getBean(SchemaService.class).getSemanticSchema(); + List metrics = getMetricElements(modelId); - Map metricToAggregate = semanticSchema.getMetrics(modelId).stream() + Map metricToAggregate = metrics.stream() .map(schemaElement -> { if (Objects.isNull(schemaElement.getDefaultAgg())) { schemaElement.setDefaultAgg(AggregateTypeEnum.SUM.name()); @@ -79,4 +79,14 @@ public abstract class BaseSemanticCorrector implements SemanticCorrector { String aggregateSql = SqlParserUpdateHelper.addAggregateToField(sql, metricToAggregate); semanticCorrectInfo.setSql(aggregateSql); } + + protected List getMetricElements(Long modelId) { + SemanticSchema semanticSchema = ContextUtils.getBean(SchemaService.class).getSemanticSchema(); + return semanticSchema.getMetrics(modelId); + } + + protected List getDimensionElements(Long modelId) { + SemanticSchema semanticSchema = ContextUtils.getBean(SchemaService.class).getSemanticSchema(); + return semanticSchema.getDimensions(modelId); + } } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/GlobalAfterCorrector.java b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/GlobalAfterCorrector.java index ea5d5a01e..5d73483b6 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/GlobalAfterCorrector.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/GlobalAfterCorrector.java @@ -14,7 +14,6 @@ public class GlobalAfterCorrector extends BaseSemanticCorrector { public void correct(SemanticCorrectInfo semanticCorrectInfo) { super.correct(semanticCorrectInfo); - addAggregateToMetric(semanticCorrectInfo); String sql = semanticCorrectInfo.getSql(); if (!SqlParserSelectHelper.hasAggregateFunction(sql)) { return; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/GlobalBeforeCorrector.java b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/GlobalBeforeCorrector.java index 57d46c720..d185dc16e 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/GlobalBeforeCorrector.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/GlobalBeforeCorrector.java @@ -28,8 +28,6 @@ public class GlobalBeforeCorrector extends BaseSemanticCorrector { updateFieldNameByLinkingValue(semanticCorrectInfo); correctFieldName(semanticCorrectInfo); - - addAggregateToMetric(semanticCorrectInfo); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/GroupByCorrector.java b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/GroupByCorrector.java index 5fe69d5f0..12e4be4d5 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/GroupByCorrector.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/corrector/GroupByCorrector.java @@ -20,18 +20,32 @@ public class GroupByCorrector extends BaseSemanticCorrector { public void correct(SemanticCorrectInfo semanticCorrectInfo) { super.correct(semanticCorrectInfo); + Long modelId = semanticCorrectInfo.getParseInfo().getModel().getModel(); + // if select not exit metric not add aggregate + List selectFields = SqlParserSelectHelper.getSelectFields(semanticCorrectInfo.getSql()); + + Set metrics = getMetricElements(modelId).stream() + .map(schemaElement -> schemaElement.getName()) + .collect(Collectors.toSet()); + + if (!CollectionUtils.isEmpty(selectFields) + && !CollectionUtils.isEmpty(metrics) + && selectFields.stream().anyMatch(s -> metrics.contains(s))) { + return; + } //add aggregate to all metric - String sql = semanticCorrectInfo.getSql(); - Long modelId = semanticCorrectInfo.getParseInfo().getModel().getModel(); + addAggregateToMetric(semanticCorrectInfo); + //add dimension group by + String sql = semanticCorrectInfo.getSql(); SemanticSchema semanticSchema = ContextUtils.getBean(SchemaService.class).getSemanticSchema(); Set dimensions = semanticSchema.getDimensions(modelId).stream() .filter(schemaElement -> !DateUtils.DATE_FIELD.equals(schemaElement.getBizName())) .map(schemaElement -> schemaElement.getName()).collect(Collectors.toSet()); - List selectFields = SqlParserSelectHelper.getSelectFields(sql); + selectFields = SqlParserSelectHelper.getSelectFields(sql); if (CollectionUtils.isEmpty(selectFields) || CollectionUtils.isEmpty(dimensions)) { return; diff --git a/launchers/chat/src/main/resources/META-INF/spring.factories b/launchers/chat/src/main/resources/META-INF/spring.factories index 7e88d99d8..dba424313 100644 --- a/launchers/chat/src/main/resources/META-INF/spring.factories +++ b/launchers/chat/src/main/resources/META-INF/spring.factories @@ -34,6 +34,6 @@ com.tencent.supersonic.chat.api.component.SemanticCorrector=\ com.tencent.supersonic.chat.corrector.GlobalBeforeCorrector, \ com.tencent.supersonic.chat.corrector.SelectCorrector, \ com.tencent.supersonic.chat.corrector.WhereCorrector, \ - com.tencent.supersonic.chat.corrector.HavingCorrector, \ com.tencent.supersonic.chat.corrector.GroupByCorrector, \ + com.tencent.supersonic.chat.corrector.HavingCorrector, \ com.tencent.supersonic.chat.corrector.GlobalAfterCorrector \ No newline at end of file diff --git a/launchers/standalone/src/main/resources/META-INF/spring.factories b/launchers/standalone/src/main/resources/META-INF/spring.factories index f5f325a47..c9f1ddf99 100644 --- a/launchers/standalone/src/main/resources/META-INF/spring.factories +++ b/launchers/standalone/src/main/resources/META-INF/spring.factories @@ -34,6 +34,6 @@ com.tencent.supersonic.chat.api.component.SemanticCorrector=\ com.tencent.supersonic.chat.corrector.GlobalBeforeCorrector, \ com.tencent.supersonic.chat.corrector.SelectCorrector, \ com.tencent.supersonic.chat.corrector.WhereCorrector, \ - com.tencent.supersonic.chat.corrector.HavingCorrector, \ com.tencent.supersonic.chat.corrector.GroupByCorrector, \ + com.tencent.supersonic.chat.corrector.HavingCorrector, \ com.tencent.supersonic.chat.corrector.GlobalAfterCorrector \ No newline at end of file