You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hu...@apache.org on 2022/12/06 01:42:05 UTC

[iotdb] 05/07: remove some time-consuming operation

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

hui pushed a commit to branch lmh/OptSingleGroupby
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 63e1a212d526e5cd83a4ebc0846c79fe81df2c75
Author: Minghui Liu <li...@foxmail.com>
AuthorDate: Mon Dec 5 22:50:22 2022 +0800

    remove some time-consuming operation
---
 .../iotdb/db/mpp/common/header/DatasetHeader.java  | 74 ++++++++++++----------
 .../db/mpp/plan/analyze/ConcatPathRewriter.java    | 24 +++----
 .../mpp/plan/analyze/ExpressionTypeAnalyzer.java   |  7 --
 .../apache/iotdb/db/utils/TypeInferenceUtils.java  | 14 ++--
 4 files changed, 58 insertions(+), 61 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeader.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeader.java
index 23768dd4c3..4e9a58b262 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeader.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeader.java
@@ -19,8 +19,6 @@
 
 package org.apache.iotdb.db.mpp.common.header;
 
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-
 import com.google.common.primitives.Bytes;
 
 import java.util.ArrayList;
@@ -29,7 +27,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.stream.Collectors;
 
 /** The header of query result dataset. */
 public class DatasetHeader {
@@ -45,15 +42,18 @@ public class DatasetHeader {
   // map from output column to output tsBlock index
   private Map<String, Integer> columnToTsBlockIndexMap;
 
+  // cached field for create response
+  private List<String> respColumns;
+  private List<String> respDataTypeList;
+  private List<Byte> respAliasColumns;
+  private Map<String, Integer> columnNameIndexMap;
+  private Integer outputValueColumnCount;
+
   public DatasetHeader(List<ColumnHeader> columnHeaders, boolean isIgnoreTimestamp) {
     this.columnHeaders = columnHeaders;
     this.isIgnoreTimestamp = isIgnoreTimestamp;
   }
 
-  public List<ColumnHeader> getColumnHeaders() {
-    return columnHeaders;
-  }
-
   public boolean isIgnoreTimestamp() {
     return isIgnoreTimestamp;
   }
@@ -66,34 +66,36 @@ public class DatasetHeader {
   }
 
   public List<String> getRespColumns() {
-    return columnHeaders.stream()
-        .map(ColumnHeader::getColumnNameWithAlias)
-        .collect(Collectors.toList());
-  }
-
-  public List<String> getColumnNameWithoutAlias() {
-    return columnHeaders.stream().map(ColumnHeader::getColumnName).collect(Collectors.toList());
+    if (respColumns == null) {
+      respColumns = new ArrayList<>();
+      for (ColumnHeader columnHeader : columnHeaders) {
+        respColumns.add(columnHeader.getColumnNameWithAlias());
+      }
+    }
+    return respColumns;
   }
 
   public List<String> getRespDataTypeList() {
-    return columnHeaders.stream()
-        .map(ColumnHeader::getColumnType)
-        .map(Objects::toString)
-        .collect(Collectors.toList());
-  }
-
-  public List<TSDataType> getRespDataTypes() {
-    return columnHeaders.stream().map(ColumnHeader::getColumnType).collect(Collectors.toList());
+    if (respDataTypeList == null) {
+      respDataTypeList = new ArrayList<>();
+      for (ColumnHeader columnHeader : columnHeaders) {
+        respDataTypeList.add(columnHeader.getColumnType().toString());
+      }
+    }
+    return respDataTypeList;
   }
 
   public List<Byte> getRespAliasColumns() {
-    BitSet aliasMap = new BitSet();
-    for (int i = 0; i < columnHeaders.size(); ++i) {
-      if (columnHeaders.get(i).hasAlias()) {
-        aliasMap.set(i);
+    if (respAliasColumns == null) {
+      BitSet aliasMap = new BitSet();
+      for (int i = 0; i < columnHeaders.size(); ++i) {
+        if (columnHeaders.get(i).hasAlias()) {
+          aliasMap.set(i);
+        }
       }
+      respAliasColumns = new ArrayList<>(Bytes.asList(aliasMap.toByteArray()));
     }
-    return new ArrayList<>(Bytes.asList(aliasMap.toByteArray()));
+    return respAliasColumns;
   }
 
   public Map<String, Integer> getColumnNameIndexMap() {
@@ -101,17 +103,23 @@ public class DatasetHeader {
       return columnToTsBlockIndexMap;
     }
 
-    Map<String, Integer> columnNameIndexMap = new HashMap<>();
-    for (ColumnHeader columnHeader : columnHeaders) {
-      columnNameIndexMap.put(
-          columnHeader.getColumnNameWithAlias(),
-          columnToTsBlockIndexMap.get(columnHeader.getColumnName()));
+    if (columnNameIndexMap == null) {
+      columnNameIndexMap = new HashMap<>();
+      for (ColumnHeader columnHeader : columnHeaders) {
+        columnNameIndexMap.put(
+            columnHeader.getColumnNameWithAlias(),
+            columnToTsBlockIndexMap.get(columnHeader.getColumnName()));
+      }
     }
     return columnNameIndexMap;
   }
 
   public int getOutputValueColumnCount() {
-    return (int) columnHeaders.stream().map(ColumnHeader::getColumnName).distinct().count();
+    if (outputValueColumnCount == null) {
+      outputValueColumnCount =
+          (int) columnHeaders.stream().map(ColumnHeader::getColumnName).distinct().count();
+    }
+    return outputValueColumnCount;
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ConcatPathRewriter.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ConcatPathRewriter.java
index 71273d5c12..5db7080d53 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ConcatPathRewriter.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ConcatPathRewriter.java
@@ -30,7 +30,6 @@ import org.apache.iotdb.db.mpp.plan.statement.crud.QueryStatement;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * This rewriter:
@@ -53,12 +52,10 @@ public class ConcatPathRewriter {
     List<PartialPath> prefixPaths = queryStatement.getFromComponent().getPrefixPaths();
 
     if (queryStatement.isAlignByDevice()) {
-      queryStatement.getSelectComponent().getResultColumns().stream()
-          .map(ResultColumn::getExpression)
-          .forEach(
-              expression ->
-                  ExpressionAnalyzer.constructPatternTreeFromExpression(
-                      expression, prefixPaths, patternTree));
+      for (ResultColumn resultColumn : queryStatement.getSelectComponent().getResultColumns()) {
+        ExpressionAnalyzer.constructPatternTreeFromExpression(
+            resultColumn.getExpression(), prefixPaths, patternTree);
+      }
     } else {
       // concat SELECT with FROM
       List<ResultColumn> resultColumns =
@@ -101,13 +98,12 @@ public class ConcatPathRewriter {
             String.format(
                 "alias '%s' can only be matched with one time series", resultColumn.getAlias()));
       }
-      resultColumns.addAll(
-          resultExpressions.stream()
-              .map(
-                  expression ->
-                      new ResultColumn(
-                          expression, resultColumn.getAlias(), resultColumn.getColumnType()))
-              .collect(Collectors.toList()));
+
+      for (Expression resultExpression : resultExpressions) {
+        resultColumns.add(
+            new ResultColumn(
+                resultExpression, resultColumn.getAlias(), resultColumn.getColumnType()));
+      }
     }
     return resultColumns;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionTypeAnalyzer.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionTypeAnalyzer.java
index 83f61afd46..145b8e92b5 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionTypeAnalyzer.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionTypeAnalyzer.java
@@ -48,8 +48,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
-import static com.google.common.base.Preconditions.checkArgument;
-
 public class ExpressionTypeAnalyzer {
 
   private final Map<NodeRef<Expression>, TSDataType> expressionTypes = new LinkedHashMap<>();
@@ -252,11 +250,6 @@ public class ExpressionTypeAnalyzer {
       }
 
       if (functionExpression.isBuiltInAggregationFunctionExpression()) {
-        checkArgument(
-            inputExpressions.size() == 1,
-            String.format(
-                "Builtin aggregation function only accepts 1 input expression. Actual %d input expressions.",
-                inputExpressions.size()));
         return setExpressionType(
             functionExpression,
             TypeInferenceUtils.getAggrDataType(
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/TypeInferenceUtils.java b/server/src/main/java/org/apache/iotdb/db/utils/TypeInferenceUtils.java
index 3485e62eaa..477c26575f 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/TypeInferenceUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/TypeInferenceUtils.java
@@ -29,19 +29,19 @@ import org.apache.commons.lang3.StringUtils;
 
 public class TypeInferenceUtils {
 
-  private static TSDataType booleanStringInferType =
+  private static final TSDataType booleanStringInferType =
       IoTDBDescriptor.getInstance().getConfig().getBooleanStringInferType();
 
-  private static TSDataType integerStringInferType =
+  private static final TSDataType integerStringInferType =
       IoTDBDescriptor.getInstance().getConfig().getIntegerStringInferType();
 
-  private static TSDataType longStringInferType =
+  private static final TSDataType longStringInferType =
       IoTDBDescriptor.getInstance().getConfig().getLongStringInferType();
 
-  private static TSDataType floatingStringInferType =
+  private static final TSDataType floatingStringInferType =
       IoTDBDescriptor.getInstance().getConfig().getFloatingStringInferType();
 
-  private static TSDataType nanStringInferType =
+  private static final TSDataType nanStringInferType =
       IoTDBDescriptor.getInstance().getConfig().getNanStringInferType();
 
   private TypeInferenceUtils() {}
@@ -119,7 +119,7 @@ public class TypeInferenceUtils {
           "Aggregate functions [AVG, SUM, EXTREME, MIN_VALUE, MAX_VALUE] only support numeric data types [INT32, INT64, FLOAT, DOUBLE]");
     }
 
-    switch (aggrFuncName.toLowerCase()) {
+    switch (aggrFuncName) {
       case SQLConstant.MIN_TIME:
       case SQLConstant.MAX_TIME:
       case SQLConstant.COUNT:
@@ -140,7 +140,7 @@ public class TypeInferenceUtils {
 
   private static boolean verifyIsAggregationDataTypeMatched(
       String aggrFuncName, TSDataType dataType) {
-    switch (aggrFuncName.toLowerCase()) {
+    switch (aggrFuncName) {
       case SQLConstant.AVG:
       case SQLConstant.SUM:
       case SQLConstant.EXTREME: