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) {