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: