diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/AggregationPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/AggregationPlan.java index b91b6db91c767..a9bd3e1ff5978 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/AggregationPlan.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/AggregationPlan.java @@ -103,10 +103,35 @@ public Map getAggPathByLevel() throws QueryProcessExcep return levelAggPaths; } + @Override public void setAlignByTime(boolean align) throws QueryProcessException { if (!align) { throw new QueryProcessException( getOperatorType().name() + " doesn't support disable align clause."); } } + + @Override + public String getColumnForReaderFromPath(PartialPath path, int pathIndex) { + String columnForReader = super.getColumnForReaderFromPath(path, pathIndex); + if (!path.isTsAliasExists()) { + columnForReader = this.getAggregations().get(pathIndex) + "(" + columnForReader + ")"; + } + return columnForReader; + } + + @Override + public String getColumnForDisplay(String columnForReader, int pathIndex) + throws IllegalPathException { + String columnForDisplay = columnForReader; + if (level >= 0) { + PartialPath path = paths.get(pathIndex); + String aggregatePath = + path.isMeasurementAliasExists() + ? FilePathUtils.generatePartialPathByLevel(path.getFullPathWithAlias(), level) + : FilePathUtils.generatePartialPathByLevel(path.toString(), level); + columnForDisplay = aggregations.get(pathIndex) + "(" + aggregatePath + ")"; + } + return columnForDisplay; + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/FillQueryPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/FillQueryPlan.java index 5bb95ddc05168..c072c9f314c86 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/FillQueryPlan.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/FillQueryPlan.java @@ -51,6 +51,7 @@ public void setFillType(Map fillType) { this.fillType = fillType; } + @Override public void setAlignByTime(boolean align) throws QueryProcessException { if (!align) { throw new QueryProcessException( diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java index 5dd756ad07afd..bcd5b054b99cb 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java @@ -18,6 +18,7 @@ */ package org.apache.iotdb.db.qp.physical.crud; +import org.apache.iotdb.db.exception.metadata.IllegalPathException; import org.apache.iotdb.db.exception.query.QueryProcessException; import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.qp.logical.Operator; @@ -111,4 +112,18 @@ public boolean isAscending() { public void setAscending(boolean ascending) { this.ascending = ascending; } + + public String getColumnForReaderFromPath(PartialPath path, int pathIndex) { + String columnForReader = path.isTsAliasExists() ? path.getTsAlias() : null; + if (columnForReader == null) { + columnForReader = + path.isMeasurementAliasExists() ? path.getFullPathWithAlias() : path.toString(); + } + return columnForReader; + } + + public String getColumnForDisplay(String columnForReader, int pathIndex) + throws IllegalPathException { + return columnForReader; + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/UDTFPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/UDTFPlan.java index 080d060541250..5192bbcc94e32 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/UDTFPlan.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/UDTFPlan.java @@ -130,4 +130,12 @@ public void addRawQueryOutputColumn(String rawQueryOutputColumn) { public void setPathNameToReaderIndex(Map pathNameToReaderIndex) { this.pathNameToReaderIndex = pathNameToReaderIndex; } + + @Override + public String getColumnForDisplay(String columnForReader, int pathIndex) { + if (paths.get(pathIndex) == null) { + return this.getExecutorByOriginalOutputColumnIndex(pathIndex).getContext().getColumnName(); + } + return columnForReader; + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java index c99f5dc400e6e..47f781e85526b 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java @@ -22,7 +22,6 @@ import org.apache.iotdb.db.exception.metadata.MetadataException; import org.apache.iotdb.db.exception.query.LogicalOperatorException; import org.apache.iotdb.db.exception.query.LogicalOptimizeException; -import org.apache.iotdb.db.exception.query.PathNumOverLimitException; import org.apache.iotdb.db.exception.query.QueryProcessException; import org.apache.iotdb.db.exception.runtime.SQLParserException; import org.apache.iotdb.db.metadata.PartialPath; @@ -125,7 +124,6 @@ import org.apache.iotdb.db.qp.physical.sys.TracingPlan; import org.apache.iotdb.db.query.udf.core.context.UDFContext; import org.apache.iotdb.db.service.IoTDB; -import org.apache.iotdb.db.utils.FilePathUtils; import org.apache.iotdb.db.utils.SchemaUtils; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; import org.apache.iotdb.tsfile.read.expression.IExpression; @@ -825,8 +823,7 @@ private void concatFilterPath( } @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning - private void deduplicate(QueryPlan queryPlan) - throws MetadataException, PathNumOverLimitException { + private void deduplicate(QueryPlan queryPlan) throws MetadataException { // generate dataType first List paths = queryPlan.getPaths(); List dataTypes = getSeriesTypes(paths); @@ -843,12 +840,7 @@ private void deduplicate(QueryPlan queryPlan) if (queryPlan instanceof LastQueryPlan) { for (int i = 0; i < paths.size(); i++) { PartialPath path = paths.get(i); - String column; - if (path.isTsAliasExists()) { - column = path.getTsAlias(); - } else { - column = path.isMeasurementAliasExists() ? path.getFullPathWithAlias() : path.toString(); - } + String column = queryPlan.getColumnForReaderFromPath(path, i); if (!columnForReaderSet.contains(column)) { TSDataType seriesType = dataTypes.get(i); rawDataQueryPlan.addDeduplicatedPaths(path); @@ -881,18 +873,7 @@ private void deduplicate(QueryPlan queryPlan) PartialPath originalPath = indexedPath.left; Integer originalIndex = indexedPath.right; - String columnForReader = originalPath.isTsAliasExists() ? originalPath.getTsAlias() : null; - if (columnForReader == null) { - columnForReader = - originalPath.isMeasurementAliasExists() - ? originalPath.getFullPathWithAlias() - : originalPath.toString(); - if (queryPlan instanceof AggregationPlan) { - columnForReader = - queryPlan.getAggregations().get(originalIndex) + "(" + columnForReader + ")"; - } - } - + String columnForReader = queryPlan.getColumnForReaderFromPath(originalPath, originalIndex); boolean isUdf = queryPlan instanceof UDTFPlan && paths.get(originalIndex) == null; if (!columnForReaderSet.contains(columnForReader)) { @@ -907,23 +888,8 @@ private void deduplicate(QueryPlan queryPlan) columnForReaderSet.add(columnForReader); } - String columnForDisplay = - isUdf - ? ((UDTFPlan) queryPlan) - .getExecutorByOriginalOutputColumnIndex(originalIndex) - .getContext() - .getColumnName() - : columnForReader; - if (queryPlan instanceof AggregationPlan && ((AggregationPlan) queryPlan).getLevel() >= 0) { - String aggregatePath = - originalPath.isMeasurementAliasExists() - ? FilePathUtils.generatePartialPathByLevel( - originalPath.getFullPathWithAlias(), ((AggregationPlan) queryPlan).getLevel()) - : FilePathUtils.generatePartialPathByLevel( - originalPath.toString(), ((AggregationPlan) queryPlan).getLevel()); - columnForDisplay = - queryPlan.getAggregations().get(originalIndex) + "(" + aggregatePath + ")"; - } + String columnForDisplay = queryPlan.getColumnForDisplay(columnForReader, originalIndex); + if (!columnForDisplaySet.contains(columnForDisplay)) { queryPlan.addPathToIndex(columnForDisplay, queryPlan.getPathToIndex().size()); if (queryPlan instanceof UDTFPlan) { @@ -948,10 +914,9 @@ private List slimitTrimColumn(List columnList, int seriesLimit, // check parameter range if (seriesOffset >= size) { - throw new QueryProcessException( - String.format( - "The value of SOFFSET (%d) is equal to or exceeds the number of sequences (%d) that can actually be returned.", - seriesOffset, size)); + String errorMessage = + "The value of SOFFSET (%d) is equal to or exceeds the number of sequences (%d) that can actually be returned."; + throw new QueryProcessException(String.format(errorMessage, seriesOffset, size)); } int endPosition = seriesOffset + seriesLimit; if (endPosition > size) { diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java index 8ff4bad98ab12..031b2bc3fadc1 100644 --- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java +++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java @@ -709,7 +709,7 @@ private TSExecuteStatementResp internalExecuteQueryStatement( /** * get fetchSize and deduplicatedPathNum that are used for memory estimation * - * @return Pair + * @return Pair - fetchSize, deduplicatedPathNum */ private Pair getMemoryParametersFromPhysicalPlan( PhysicalPlan plan, int fetchSizeBefore) {