diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/calcite/sql/render/SourceRender.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/calcite/sql/render/SourceRender.java index b2646c33e..46b7df1e6 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/calcite/sql/render/SourceRender.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/calcite/sql/render/SourceRender.java @@ -36,6 +36,7 @@ import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.validate.SqlValidatorScope; +import org.apache.calcite.util.Litmus; import org.springframework.util.CollectionUtils; /** @@ -91,6 +92,9 @@ public class SourceRender extends Renderer { scope); } + output.setMeasure(deduplicateNode(output.getMeasure())); + dataSet.setMeasure(deduplicateNode(dataSet.getMeasure())); + SqlNode tableNode = DataSourceNode.buildExtend(datasource, extendFields, scope); dataSet.setTable(tableNode); output.setTable(SemanticNode.buildAs( @@ -99,6 +103,25 @@ public class SourceRender extends Renderer { return output; } + private static List deduplicateNode(List listNode) { //List去重 + List uniqueElements = new ArrayList<>(); + for (SqlNode element : listNode) { + if (!containsElement(uniqueElements, element)) { + uniqueElements.add(element); + } + } + return uniqueElements; + } + + private static boolean containsElement(List list, SqlNode element) { //检查List中是否含有某element + for (SqlNode i : list) { + if (i.equalsDeep(element, Litmus.IGNORE)) { + return true; + } + } + return false; + } + private static void buildDimension(String alias, String dimension, DataSource datasource, SemanticSchema schema, boolean nonAgg, Map extendFields, TableView dataSet, TableView output, SqlValidatorScope scope)