You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by xi...@apache.org on 2021/03/17 13:18:18 UTC
[iotdb] branch master updated: Optimize the code structure of
deduplicate() - PART2 (#2863)
This is an automated email from the ASF dual-hosted git repository.
xiangweiwei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new adc61e2 Optimize the code structure of deduplicate() - PART2 (#2863)
adc61e2 is described below
commit adc61e2a3fe0da986d0da4574655c47f3b9e2589
Author: Xiangwei Wei <34...@users.noreply.github.com>
AuthorDate: Wed Mar 17 21:17:59 2021 +0800
Optimize the code structure of deduplicate() - PART2 (#2863)
---
.../iotdb/db/qp/physical/crud/AggregationPlan.java | 25 +++++++++++
.../iotdb/db/qp/physical/crud/FillQueryPlan.java | 1 +
.../iotdb/db/qp/physical/crud/QueryPlan.java | 15 +++++++
.../apache/iotdb/db/qp/physical/crud/UDTFPlan.java | 8 ++++
.../iotdb/db/qp/strategy/PhysicalGenerator.java | 51 ++++------------------
.../org/apache/iotdb/db/service/TSServiceImpl.java | 2 +-
6 files changed, 58 insertions(+), 44 deletions(-)
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 b91b6db..a9bd3e1 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 class AggregationPlan extends RawDataQueryPlan {
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 5bb95dd..c072c9f 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 class FillQueryPlan extends RawDataQueryPlan {
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 5dd756a..bcd5b05 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 abstract class QueryPlan extends PhysicalPlan {
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 080d060..5192bbc 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 class UDTFPlan extends RawDataQueryPlan implements UDFPlan {
public void setPathNameToReaderIndex(Map<String, Integer> 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 c99f5dc..47f781e 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.auth.AuthException;
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.StopTriggerPlan;
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 @@ public class PhysicalGenerator {
}
@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<PartialPath> paths = queryPlan.getPaths();
List<TSDataType> dataTypes = getSeriesTypes(paths);
@@ -843,12 +840,7 @@ public class PhysicalGenerator {
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 @@ public class PhysicalGenerator {
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 @@ public class PhysicalGenerator {
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 @@ public class PhysicalGenerator {
// 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 8ff4bad..031b2bc 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 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
/**
* get fetchSize and deduplicatedPathNum that are used for memory estimation
*
- * @return Pair<fetchSize, deduplicatedPathNum>
+ * @return Pair - fetchSize, deduplicatedPathNum
*/
private Pair<Integer, Integer> getMemoryParametersFromPhysicalPlan(
PhysicalPlan plan, int fetchSizeBefore) {