You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2021/05/18 03:20:28 UTC

[iotdb] branch iotdb-1022-v2 updated (7771a59 -> c8164b8)

This is an automated email from the ASF dual-hosted git repository.

rong pushed a change to branch iotdb-1022-v2
in repository https://gitbox.apache.org/repos/asf/iotdb.git.


    from 7771a59  fix udf tests
     new 4a1724e  fix some as tests
     new c8164b8  fix aggregation * query tests

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../iotdb/db/qp/logical/crud/SelectOperator.java   | 14 +++++---
 .../iotdb/db/qp/physical/crud/QueryPlan.java       |  2 +-
 .../apache/iotdb/db/qp/physical/crud/UDTFPlan.java |  7 ----
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    |  9 +++---
 .../qp/strategy/optimizer/ConcatPathOptimizer.java |  2 +-
 .../apache/iotdb/db/qp/utils/WildcardsRemover.java | 21 ++++++++++--
 .../iotdb/db/query/executor/LastQueryExecutor.java | 12 ++-----
 .../iotdb/db/query/expression/ResultColumn.java    | 11 ++++++-
 .../query/expression/unary/TimeSeriesOperand.java  |  4 ++-
 .../org/apache/iotdb/db/service/TSServiceImpl.java | 37 +++++-----------------
 .../db/integration/IoTDBQueryMemoryControlIT.java  |  2 +-
 11 files changed, 60 insertions(+), 61 deletions(-)

[iotdb] 01/02: fix some as tests

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rong pushed a commit to branch iotdb-1022-v2
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 4a1724e63f398df7eb2c5a438aa11d55bf813aeb
Author: SteveYurongSu <st...@outlook.com>
AuthorDate: Mon May 17 23:04:13 2021 +0800

    fix some as tests
---
 .../iotdb/db/qp/physical/crud/QueryPlan.java       |  2 +-
 .../apache/iotdb/db/qp/physical/crud/UDTFPlan.java |  7 ----
 .../qp/strategy/optimizer/ConcatPathOptimizer.java |  2 +-
 .../iotdb/db/query/executor/LastQueryExecutor.java | 12 ++-----
 .../iotdb/db/query/expression/ResultColumn.java    | 11 ++++++-
 .../query/expression/unary/TimeSeriesOperand.java  |  4 ++-
 .../org/apache/iotdb/db/service/TSServiceImpl.java | 37 +++++-----------------
 7 files changed, 26 insertions(+), 49 deletions(-)

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 e2db5a2..6bd6ce4 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
@@ -138,7 +138,7 @@ public abstract class QueryPlan extends PhysicalPlan {
 
   public String getColumnForDisplay(String columnForReader, int pathIndex)
       throws IllegalPathException {
-    return columnForReader;
+    return resultColumns.get(pathIndex).getResultColumnName();
   }
 
   public boolean isEnableRedirect() {
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 390bded..bd2cc94 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
@@ -187,13 +187,6 @@ public class UDTFPlan extends RawDataQueryPlan implements UDFPlan {
   }
 
   @Override
-  public String getColumnForDisplay(String columnForReader, int pathIndex) {
-    return !(resultColumns.get(pathIndex).getExpression() instanceof TimeSeriesOperand)
-        ? getExecutorByOriginalOutputColumnIndex(pathIndex).getExpression().toString()
-        : columnForReader;
-  }
-
-  @Override
   public boolean isRawQuery() {
     return false;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java b/server/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
index 42784e1..cc6a81c 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
@@ -83,7 +83,7 @@ public class ConcatPathOptimizer implements ILogicalOptimizer {
     return true;
   }
 
-  private void concatSelect(QueryOperator queryOperator) {
+  private void concatSelect(QueryOperator queryOperator) throws LogicalOptimizeException {
     if (queryOperator.isAlignByDevice() && !queryOperator.isLastQuery()) {
       return;
     }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java b/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java
index d6a3169..4100964 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java
@@ -101,16 +101,10 @@ public class LastQueryExecutor {
       if (lastPairList.get(i).right != null && lastPairList.get(i).right.getValue() != null) {
         TimeValuePair lastTimeValuePair = lastPairList.get(i).right;
         RowRecord resultRecord = new RowRecord(lastTimeValuePair.getTimestamp());
+
         Field pathField = new Field(TSDataType.TEXT);
-        if (selectedSeries.get(i).isTsAliasExists()) {
-          pathField.setBinaryV(new Binary(selectedSeries.get(i).getTsAlias()));
-        } else {
-          if (selectedSeries.get(i).isMeasurementAliasExists()) {
-            pathField.setBinaryV(new Binary(selectedSeries.get(i).getFullPathWithAlias()));
-          } else {
-            pathField.setBinaryV(new Binary(selectedSeries.get(i).getFullPath()));
-          }
-        }
+        pathField.setBinaryV(
+            new Binary(lastQueryPlan.getResultColumns().get(i).getResultColumnName()));
         resultRecord.addField(pathField);
 
         Field valueField = new Field(TSDataType.TEXT);
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/ResultColumn.java b/server/src/main/java/org/apache/iotdb/db/query/expression/ResultColumn.java
index 93c2d27..52b99c4 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/ResultColumn.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/ResultColumn.java
@@ -43,9 +43,14 @@ public class ResultColumn {
     alias = null;
   }
 
-  public void concat(List<PartialPath> prefixPaths, List<ResultColumn> resultColumns) {
+  public void concat(List<PartialPath> prefixPaths, List<ResultColumn> resultColumns)
+      throws LogicalOptimizeException {
     List<Expression> resultExpressions = new ArrayList<>();
     expression.concat(prefixPaths, resultExpressions);
+    if (hasAlias() && 1 < resultExpressions.size()) {
+      throw new LogicalOptimizeException(
+          String.format("alias '%s' can only be matched with one time series", alias));
+    }
     for (Expression resultExpression : resultExpressions) {
       resultColumns.add(new ResultColumn(resultExpression, alias));
     }
@@ -70,6 +75,10 @@ public class ResultColumn {
     return expression;
   }
 
+  public boolean hasAlias() {
+    return alias != null;
+  }
+
   public String getAlias() {
     return alias;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
index 3886abc..fd01123 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
@@ -81,6 +81,8 @@ public class TimeSeriesOperand extends Expression {
 
   @Override
   public String toString() {
-    return path.toString();
+    return path.isTsAliasExists()
+        ? path.getTsAlias()
+        : path.isMeasurementAliasExists() ? path.getFullPathWithAlias() : path.getFullPath();
   }
 }
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 2e7b8c9..74704ac 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
@@ -83,7 +83,7 @@ import org.apache.iotdb.db.query.dataset.DirectAlignByTimeDataSet;
 import org.apache.iotdb.db.query.dataset.DirectNonAlignDataSet;
 import org.apache.iotdb.db.query.dataset.UDTFDataSet;
 import org.apache.iotdb.db.query.expression.ResultColumn;
-import org.apache.iotdb.db.query.expression.unary.FunctionExpression;
+import org.apache.iotdb.db.query.expression.unary.TimeSeriesOperand;
 import org.apache.iotdb.db.tools.watermark.GroupedLSBWatermarkEncoder;
 import org.apache.iotdb.db.tools.watermark.WatermarkEncoder;
 import org.apache.iotdb.db.utils.QueryDataSetUtils;
@@ -990,7 +990,6 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
   }
 
   // wide means not align by device
-  @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning
   private void getWideQueryHeaders(
       QueryPlan plan, List<String> respColumns, List<String> columnTypes)
       throws TException, MetadataException {
@@ -1000,16 +999,9 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
     switch (plan.getOperatorType()) {
       case QUERY:
       case FILL:
-        for (PartialPath path : paths) {
-          String column;
-          if (path.isTsAliasExists()) {
-            column = path.getTsAlias();
-          } else {
-            column =
-                path.isMeasurementAliasExists() ? path.getFullPathWithAlias() : path.getFullPath();
-          }
-          respColumns.add(column);
-          seriesTypes.add(getSeriesTypeByPath(path));
+        for (int i = 0; i < resultColumns.size(); ++i) {
+          respColumns.add(resultColumns.get(i).getResultColumnName());
+          seriesTypes.add(getSeriesTypeByPath(paths.get(i)));
         }
         break;
       case AGGREGATION:
@@ -1021,18 +1013,8 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
             aggregations.add(aggregations.get(0));
           }
         }
-        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()
-                    ? aggregations.get(i) + "(" + paths.get(i).getFullPathWithAlias() + ")"
-                    : aggregations.get(i) + "(" + paths.get(i).getFullPath() + ")";
-          }
-          respColumns.add(column);
+        for (ResultColumn resultColumn : resultColumns) {
+          respColumns.add(resultColumn.getResultColumnName());
         }
         seriesTypes = getSeriesTypesByPaths(paths, aggregations);
         break;
@@ -1040,12 +1022,9 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
         seriesTypes = new ArrayList<>();
         UDTFPlan udtfPlan = (UDTFPlan) plan;
         for (int i = 0; i < paths.size(); i++) {
-          respColumns.add(
-              !(resultColumns.get(i).getExpression() instanceof FunctionExpression)
-                  ? paths.get(i).getFullPath()
-                  : udtfPlan.getExecutorByOriginalOutputColumnIndex(i).getExpression().toString());
+          respColumns.add(resultColumns.get(i).getResultColumnName());
           seriesTypes.add(
-              !(resultColumns.get(i).getExpression() instanceof FunctionExpression)
+              resultColumns.get(i).getExpression() instanceof TimeSeriesOperand
                   ? udtfPlan.getDataTypes().get(i)
                   : udtfPlan
                       .getExecutorByOriginalOutputColumnIndex(i)

[iotdb] 02/02: fix aggregation * query tests

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rong pushed a commit to branch iotdb-1022-v2
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit c8164b884541526bd18909fe8debc37f8af0906d
Author: SteveYurongSu <st...@outlook.com>
AuthorDate: Tue May 18 11:19:14 2021 +0800

    fix aggregation * query tests
---
 .../iotdb/db/qp/logical/crud/SelectOperator.java    | 14 ++++++++++----
 .../iotdb/db/qp/strategy/PhysicalGenerator.java     |  9 +++++----
 .../apache/iotdb/db/qp/utils/WildcardsRemover.java  | 21 ++++++++++++++++++---
 .../db/integration/IoTDBQueryMemoryControlIT.java   |  2 +-
 4 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SelectOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SelectOperator.java
index 14d2c24..7030161 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SelectOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SelectOperator.java
@@ -96,10 +96,16 @@ public final class SelectOperator extends Operator {
       pathsCache = new ArrayList<>();
       for (ResultColumn resultColumn : resultColumns) {
         Expression expression = resultColumn.getExpression();
-        pathsCache.add(
-            expression instanceof TimeSeriesOperand
-                ? ((TimeSeriesOperand) expression).getPath()
-                : null);
+        if (expression instanceof TimeSeriesOperand) {
+          pathsCache.add(((TimeSeriesOperand) expression).getPath());
+        } else if (expression instanceof FunctionExpression
+            && expression.isAggregationFunctionExpression()) {
+          pathsCache.add(
+              ((TimeSeriesOperand) ((FunctionExpression) expression).getExpressions().get(0))
+                  .getPath());
+        } else {
+          pathsCache.add(null);
+        }
       }
     }
     return pathsCache;
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 9ea5d3a..6b3e691 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
@@ -462,7 +462,7 @@ public class PhysicalGenerator {
 
     @Override
     public QueryPlan transform(QueryOperator queryOperator) throws QueryProcessException {
-      QueryPlan queryPlan;
+      AggregationPlan queryPlan;
       if (queryOperator.hasTimeSeriesGeneratingFunction()) {
         throw new QueryProcessException(
             "User-defined and built-in hybrid aggregation is not supported.");
@@ -474,8 +474,9 @@ public class PhysicalGenerator {
       } else {
         queryPlan = new AggregationPlan();
       }
-      ((AggregationPlan) queryPlan)
-          .setAggregations(queryOperator.getSelectOperator().getAggregationFunctions());
+
+      queryPlan.setPaths(queryOperator.getSelectOperator().getPaths());
+      queryPlan.setAggregations(queryOperator.getSelectOperator().getAggregationFunctions());
 
       if (queryOperator.isGroupByTime()) {
         GroupByTimePlan groupByTimePlan = (GroupByTimePlan) queryPlan;
@@ -500,7 +501,7 @@ public class PhysicalGenerator {
           }
         }
       } else if (queryOperator.isGroupByLevel()) {
-        ((AggregationPlan) queryPlan).setLevel(queryOperator.getLevel());
+        queryPlan.setLevel(queryOperator.getLevel());
         try {
           if (!verifyAllAggregationDataTypesEqual(queryOperator)) {
             throw new QueryProcessException("Aggregate among unmatched data types");
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/utils/WildcardsRemover.java b/server/src/main/java/org/apache/iotdb/db/qp/utils/WildcardsRemover.java
index 41696af..580b3e4 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/utils/WildcardsRemover.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/utils/WildcardsRemover.java
@@ -65,6 +65,15 @@ public class WildcardsRemover {
     consumed = 0;
   }
 
+  public WildcardsRemover(ConcatPathOptimizer concatPathOptimizer) {
+    this.concatPathOptimizer = concatPathOptimizer;
+
+    maxDeduplicatedPathNum = Integer.MAX_VALUE - 1;
+    soffset = 0;
+    limit = maxDeduplicatedPathNum + 1;
+    consumed = 0;
+  }
+
   public List<PartialPath> removeWildcardFrom(PartialPath path) throws LogicalOptimizeException {
     try {
       Pair<List<PartialPath>, Integer> pair =
@@ -108,7 +117,8 @@ public class WildcardsRemover {
     boolean atLeastOneSeriesNotExisted = false;
     for (Expression originExpression : expressions) {
       List<Expression> actualExpressions = new ArrayList<>();
-      originExpression.removeWildcards(this, actualExpressions);
+      originExpression.removeWildcards(
+          new WildcardsRemover(concatPathOptimizer), actualExpressions);
       if (actualExpressions.isEmpty()) {
         atLeastOneSeriesNotExisted = true;
         break;
@@ -122,16 +132,21 @@ public class WildcardsRemover {
     List<List<Expression>> actualExpressions = new ArrayList<>();
     ConcatPathOptimizer.cartesianProduct(
         extendedExpressions, actualExpressions, 0, new ArrayList<>());
-    for (@SuppressWarnings("squid:S1481") List<Expression> ignored : actualExpressions) {
+
+    List<List<Expression>> splitExpressions = new ArrayList<>();
+    for (List<Expression> actualExpression : actualExpressions) {
       if (offset != 0) {
         --offset;
+        continue;
       } else if (limit != 0) {
         --limit;
       } else {
         break;
       }
+      splitExpressions.add(actualExpression);
     }
-    return actualExpressions;
+    consumed += actualExpressions.size();
+    return splitExpressions;
   }
 
   /** @return should break the loop or not */
diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBQueryMemoryControlIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBQueryMemoryControlIT.java
index 05e3f14..6d863e8 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBQueryMemoryControlIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBQueryMemoryControlIT.java
@@ -170,7 +170,7 @@ public class IoTDBQueryMemoryControlIT {
 
       statement.execute(
           "select count(wf01.*), avg(wf02.*), sum(wf03.*) from root.ln slimit 5 soffset 7");
-      resultSetMetaData = statement.getResultSet().getMetaData();
+      ResultSetMetaData resultSetMetaData = statement.getResultSet().getMetaData();
       assertEquals(5, resultSetMetaData.getColumnCount());
       for (int i = 1; i < 3 + 1; ++i) {
         assertTrue(resultSetMetaData.getColumnName(i).contains("root.ln.wf02.wt0"));