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/09/07 10:37:22 UTC
[iotdb] 06/07: re-analyze expression in OperatorTreeGenerator
This is an automated email from the ASF dual-hosted git repository.
hui pushed a commit to branch lmh/TypeProviderOpt
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 7d888bf409d1214faee1edd9808f1564ae007b90
Author: Minghui Liu <li...@foxmail.com>
AuthorDate: Wed Sep 7 16:40:33 2022 +0800
re-analyze expression in OperatorTreeGenerator
---
.../mpp/plan/analyze/ExpressionTypeAnalyzer.java | 8 +++
.../iotdb/db/mpp/plan/expression/Expression.java | 5 +-
.../plan/expression/binary/BinaryExpression.java | 8 ++-
.../db/mpp/plan/expression/leaf/LeafOperand.java | 5 +-
.../plan/expression/multi/FunctionExpression.java | 7 ++-
.../plan/expression/ternary/TernaryExpression.java | 11 ++--
.../mpp/plan/expression/unary/UnaryExpression.java | 7 ++-
.../visitor/ColumnTransformerVisitor.java | 69 ++++++++--------------
.../db/mpp/plan/planner/OperatorTreeGenerator.java | 27 ++++++---
9 files changed, 78 insertions(+), 69 deletions(-)
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 98d193dccc..bc642769da 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
@@ -61,6 +61,14 @@ public class ExpressionTypeAnalyzer {
updateAnalysis(analysis, analyzer);
}
+ public static void analyzeExpression(
+ Map<NodeRef<Expression>, TSDataType> types, Expression expression) {
+ ExpressionTypeAnalyzer analyzer = new ExpressionTypeAnalyzer();
+ analyzer.analyze(expression);
+
+ types.putAll(analyzer.getExpressionTypes());
+ }
+
private static void updateAnalysis(Analysis analysis, ExpressionTypeAnalyzer analyzer) {
analysis.addTypes(analyzer.getExpressionTypes());
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/Expression.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/Expression.java
index 0e00a37555..3847412f71 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/Expression.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/Expression.java
@@ -21,7 +21,7 @@ package org.apache.iotdb.db.mpp.plan.expression;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
-import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
+import org.apache.iotdb.db.mpp.common.NodeRef;
import org.apache.iotdb.db.mpp.plan.expression.binary.AdditionExpression;
import org.apache.iotdb.db.mpp.plan.expression.binary.DivisionExpression;
import org.apache.iotdb.db.mpp.plan.expression.binary.EqualToExpression;
@@ -52,6 +52,7 @@ import org.apache.iotdb.db.mpp.plan.statement.StatementNode;
import org.apache.iotdb.db.mpp.transformation.dag.memory.LayerMemoryAssigner;
import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFExecutor;
import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
import java.io.DataOutputStream;
@@ -99,7 +100,7 @@ public abstract class Expression extends StatementNode {
return false;
}
- public abstract boolean isMappable(TypeProvider typeProvider);
+ public abstract boolean isMappable(Map<NodeRef<Expression>, TSDataType> expressionTypes);
/////////////////////////////////////////////////////////////////////////////////////////////////
// isConstantOperand
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/BinaryExpression.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/BinaryExpression.java
index 5a0732dbb3..58722f7da5 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/BinaryExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/BinaryExpression.java
@@ -21,13 +21,14 @@ package org.apache.iotdb.db.mpp.plan.expression.binary;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
-import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
+import org.apache.iotdb.db.mpp.common.NodeRef;
import org.apache.iotdb.db.mpp.plan.expression.Expression;
import org.apache.iotdb.db.mpp.plan.expression.visitor.ExpressionVisitor;
import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.InputLocation;
import org.apache.iotdb.db.mpp.transformation.dag.memory.LayerMemoryAssigner;
import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFExecutor;
import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import java.io.DataOutputStream;
import java.io.IOException;
@@ -217,8 +218,9 @@ public abstract class BinaryExpression extends Expression {
}
@Override
- public boolean isMappable(TypeProvider typeProvider) {
- return leftExpression.isMappable(typeProvider) && rightExpression.isMappable(typeProvider);
+ public boolean isMappable(Map<NodeRef<Expression>, TSDataType> expressionTypes) {
+ return leftExpression.isMappable(expressionTypes)
+ && rightExpression.isMappable(expressionTypes);
}
@Override
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/LeafOperand.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/LeafOperand.java
index ab36096756..c614c9fb9e 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/LeafOperand.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/LeafOperand.java
@@ -19,9 +19,10 @@
package org.apache.iotdb.db.mpp.plan.expression.leaf;
-import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
+import org.apache.iotdb.db.mpp.common.NodeRef;
import org.apache.iotdb.db.mpp.plan.expression.Expression;
import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFExecutor;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import java.time.ZoneId;
import java.util.Collections;
@@ -42,7 +43,7 @@ public abstract class LeafOperand extends Expression {
}
@Override
- public boolean isMappable(TypeProvider typeProvider) {
+ public boolean isMappable(Map<NodeRef<Expression>, TSDataType> expressionTypes) {
return true;
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/multi/FunctionExpression.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/multi/FunctionExpression.java
index 197fa1b41e..a40e6fe106 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/multi/FunctionExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/multi/FunctionExpression.java
@@ -23,7 +23,7 @@ import org.apache.iotdb.commons.conf.IoTDBConstant;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.udf.builtin.BuiltinAggregationFunction;
import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
-import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
+import org.apache.iotdb.db.mpp.common.NodeRef;
import org.apache.iotdb.db.mpp.plan.expression.Expression;
import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
import org.apache.iotdb.db.mpp.plan.expression.leaf.TimeSeriesOperand;
@@ -34,6 +34,7 @@ import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFExecutor;
import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFInformationInferrer;
import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
import org.apache.iotdb.db.qp.strategy.optimizer.ConcatPathOptimizer;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
import org.apache.iotdb.udf.api.customizer.strategy.AccessStrategy;
@@ -269,7 +270,7 @@ public class FunctionExpression extends Expression {
}
@Override
- public boolean isMappable(TypeProvider typeProvider) {
+ public boolean isMappable(Map<NodeRef<Expression>, TSDataType> expressionTypes) {
if (isBuiltInAggregationFunctionExpression) {
return true;
}
@@ -277,7 +278,7 @@ public class FunctionExpression extends Expression {
.getAccessStrategy(
expressions.stream().map(Expression::toString).collect(Collectors.toList()),
expressions.stream()
- .map(f -> typeProvider.getType(f.toString()))
+ .map(f -> expressionTypes.get(NodeRef.of(f)))
.collect(Collectors.toList()),
functionAttributes)
.getAccessStrategyType()
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/ternary/TernaryExpression.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/ternary/TernaryExpression.java
index 80725eab5f..b37ad2520c 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/ternary/TernaryExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/ternary/TernaryExpression.java
@@ -23,13 +23,14 @@ package org.apache.iotdb.db.mpp.plan.expression.ternary;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
-import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
+import org.apache.iotdb.db.mpp.common.NodeRef;
import org.apache.iotdb.db.mpp.plan.expression.Expression;
import org.apache.iotdb.db.mpp.plan.expression.visitor.ExpressionVisitor;
import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.InputLocation;
import org.apache.iotdb.db.mpp.transformation.dag.memory.LayerMemoryAssigner;
import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFExecutor;
import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import java.io.DataOutputStream;
import java.io.IOException;
@@ -158,10 +159,10 @@ public abstract class TernaryExpression extends Expression {
}
@Override
- public boolean isMappable(TypeProvider typeProvider) {
- return firstExpression.isMappable(typeProvider)
- && secondExpression.isMappable(typeProvider)
- && thirdExpression.isMappable(typeProvider);
+ public boolean isMappable(Map<NodeRef<Expression>, TSDataType> expressionTypes) {
+ return firstExpression.isMappable(expressionTypes)
+ && secondExpression.isMappable(expressionTypes)
+ && thirdExpression.isMappable(expressionTypes);
}
@Override
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/UnaryExpression.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/UnaryExpression.java
index e53fd40d0a..f006a32350 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/UnaryExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/UnaryExpression.java
@@ -21,7 +21,7 @@ package org.apache.iotdb.db.mpp.plan.expression.unary;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
-import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
+import org.apache.iotdb.db.mpp.common.NodeRef;
import org.apache.iotdb.db.mpp.plan.expression.Expression;
import org.apache.iotdb.db.mpp.plan.expression.visitor.ExpressionVisitor;
import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.InputLocation;
@@ -29,6 +29,7 @@ import org.apache.iotdb.db.mpp.transformation.dag.memory.LayerMemoryAssigner;
import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFExecutor;
import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
import org.apache.iotdb.db.qp.utils.WildcardsRemover;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import java.io.DataOutputStream;
import java.io.IOException;
@@ -113,8 +114,8 @@ public abstract class UnaryExpression extends Expression {
}
@Override
- public boolean isMappable(TypeProvider typeProvider) {
- return expression.isMappable(typeProvider);
+ public boolean isMappable(Map<NodeRef<Expression>, TSDataType> expressionTypes) {
+ return expression.isMappable(expressionTypes);
}
@Override
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/ColumnTransformerVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/ColumnTransformerVisitor.java
index 313082a8df..148e4009e7 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/ColumnTransformerVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/ColumnTransformerVisitor.java
@@ -19,7 +19,7 @@
package org.apache.iotdb.db.mpp.plan.expression.visitor;
-import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
+import org.apache.iotdb.db.mpp.common.NodeRef;
import org.apache.iotdb.db.mpp.plan.expression.Expression;
import org.apache.iotdb.db.mpp.plan.expression.binary.BinaryExpression;
import org.apache.iotdb.db.mpp.plan.expression.leaf.ConstantOperand;
@@ -89,15 +89,13 @@ public class ColumnTransformerVisitor
if (context.hasSeen.containsKey(unaryExpression)) {
IdentityColumnTransformer identity =
new IdentityColumnTransformer(
- TypeFactory.getType(
- context.typeProvider.getType(unaryExpression.getExpressionString())),
+ TypeFactory.getType(context.getType(unaryExpression)),
context.originSize + context.commonTransformerList.size());
ColumnTransformer columnTransformer = context.hasSeen.get(unaryExpression);
columnTransformer.addReferenceCount();
context.commonTransformerList.add(columnTransformer);
context.leafList.add(identity);
- context.inputDataTypes.add(
- context.typeProvider.getType(unaryExpression.getExpressionString()));
+ context.inputDataTypes.add(context.getType(unaryExpression));
context.cache.put(unaryExpression, identity);
} else {
ColumnTransformer childColumnTransformer =
@@ -107,8 +105,7 @@ public class ColumnTransformerVisitor
getConcreteUnaryColumnTransformer(
unaryExpression,
childColumnTransformer,
- TypeFactory.getType(
- context.typeProvider.getType(unaryExpression.getExpressionString()))));
+ TypeFactory.getType(context.getType(unaryExpression))));
}
}
ColumnTransformer res = context.cache.get(unaryExpression);
@@ -123,15 +120,13 @@ public class ColumnTransformerVisitor
if (context.hasSeen.containsKey(binaryExpression)) {
IdentityColumnTransformer identity =
new IdentityColumnTransformer(
- TypeFactory.getType(
- context.typeProvider.getType(binaryExpression.getExpressionString())),
+ TypeFactory.getType(context.getType(binaryExpression)),
context.originSize + context.commonTransformerList.size());
ColumnTransformer columnTransformer = context.hasSeen.get(binaryExpression);
columnTransformer.addReferenceCount();
context.commonTransformerList.add(columnTransformer);
context.leafList.add(identity);
- context.inputDataTypes.add(
- context.typeProvider.getType(binaryExpression.getExpressionString()));
+ context.inputDataTypes.add(context.getType(binaryExpression));
context.cache.put(binaryExpression, identity);
} else {
ColumnTransformer leftColumnTransformer =
@@ -144,8 +139,7 @@ public class ColumnTransformerVisitor
binaryExpression,
leftColumnTransformer,
rightColumnTransformer,
- TypeFactory.getType(
- context.typeProvider.getType(binaryExpression.getExpressionString()))));
+ TypeFactory.getType(context.getType(binaryExpression))));
}
}
@@ -161,15 +155,13 @@ public class ColumnTransformerVisitor
if (context.hasSeen.containsKey(ternaryExpression)) {
IdentityColumnTransformer identity =
new IdentityColumnTransformer(
- TypeFactory.getType(
- context.typeProvider.getType(ternaryExpression.getExpressionString())),
+ TypeFactory.getType(context.getType(ternaryExpression)),
context.originSize + context.commonTransformerList.size());
ColumnTransformer columnTransformer = context.hasSeen.get(ternaryExpression);
columnTransformer.addReferenceCount();
context.commonTransformerList.add(columnTransformer);
context.leafList.add(identity);
- context.inputDataTypes.add(
- context.typeProvider.getType(ternaryExpression.getExpressionString()));
+ context.inputDataTypes.add(context.getType(ternaryExpression));
context.cache.put(ternaryExpression, identity);
} else {
ColumnTransformer firstColumnTransformer =
@@ -185,8 +177,7 @@ public class ColumnTransformerVisitor
firstColumnTransformer,
secondColumnTransformer,
thirdColumnTransformer,
- TypeFactory.getType(
- context.typeProvider.getType(ternaryExpression.getExpressionString()))));
+ TypeFactory.getType(context.getType(ternaryExpression))));
}
}
@@ -203,22 +194,19 @@ public class ColumnTransformerVisitor
if (context.hasSeen.containsKey(functionExpression)) {
IdentityColumnTransformer identity =
new IdentityColumnTransformer(
- TypeFactory.getType(
- context.typeProvider.getType(functionExpression.getExpressionString())),
+ TypeFactory.getType(context.getType(functionExpression)),
context.originSize + context.commonTransformerList.size());
ColumnTransformer columnTransformer = context.hasSeen.get(functionExpression);
columnTransformer.addReferenceCount();
context.commonTransformerList.add(columnTransformer);
- context.inputDataTypes.add(
- context.typeProvider.getType(functionExpression.getExpressionString()));
+ context.inputDataTypes.add(context.getType(functionExpression));
context.leafList.add(identity);
context.cache.put(functionExpression, identity);
} else {
if (functionExpression.isBuiltInAggregationFunctionExpression()) {
IdentityColumnTransformer identity =
new IdentityColumnTransformer(
- TypeFactory.getType(
- context.typeProvider.getType(functionExpression.getExpressionString())),
+ TypeFactory.getType(context.getType(functionExpression)),
context
.inputLocations
.get(functionExpression.getExpressionString())
@@ -233,9 +221,7 @@ public class ColumnTransformerVisitor
.toArray(ColumnTransformer[]::new);
TSDataType[] inputTransformerDataTypes =
- expressions.stream()
- .map(expression -> expression.inferTypes(context.typeProvider))
- .toArray(TSDataType[]::new);
+ expressions.stream().map(context::getType).toArray(TSDataType[]::new);
UDTFExecutor executor =
context.udtfContext.getExecutorByFunctionExpression(functionExpression);
@@ -246,16 +232,13 @@ public class ColumnTransformerVisitor
0,
0,
expressions.stream().map(Expression::toString).collect(Collectors.toList()),
- expressions.stream()
- .map(f -> context.typeProvider.getType(f.toString()))
- .collect(Collectors.toList()),
+ expressions.stream().map(context::getType).collect(Collectors.toList()),
functionExpression.getFunctionAttributes());
context.cache.put(
functionExpression,
new MappableUDFColumnTransformer(
- TypeFactory.getType(
- context.typeProvider.getType(functionExpression.getExpressionString())),
+ TypeFactory.getType(context.getType(functionExpression)),
inputColumnTransformers,
inputTransformerDataTypes,
context.udtfContext.getExecutorByFunctionExpression(functionExpression)));
@@ -275,9 +258,7 @@ public class ColumnTransformerVisitor
timestampOperand,
e -> {
TimeColumnTransformer timeColumnTransformer =
- new TimeColumnTransformer(
- TypeFactory.getType(
- context.typeProvider.getType(timestampOperand.getExpressionString())));
+ new TimeColumnTransformer(TypeFactory.getType(context.getType(timestampOperand)));
context.leafList.add(timeColumnTransformer);
return timeColumnTransformer;
});
@@ -294,8 +275,7 @@ public class ColumnTransformerVisitor
e -> {
IdentityColumnTransformer identity =
new IdentityColumnTransformer(
- TypeFactory.getType(
- context.typeProvider.getType(timeSeriesOperand.getExpressionString())),
+ TypeFactory.getType(context.getType(timeSeriesOperand)),
context
.inputLocations
.get(timeSeriesOperand.getExpressionString())
@@ -317,8 +297,7 @@ public class ColumnTransformerVisitor
e -> {
ConstantColumnTransformer columnTransformer =
new ConstantColumnTransformer(
- TypeFactory.getType(
- context.typeProvider.getType(constantOperand.getExpressionString())),
+ TypeFactory.getType(context.getType(constantOperand)),
TransformUtils.transformConstantOperandToColumn(constantOperand));
context.leafList.add(columnTransformer);
return columnTransformer;
@@ -433,7 +412,7 @@ public class ColumnTransformerVisitor
UDTFContext udtfContext;
// TypeProvider of expression
- TypeProvider typeProvider;
+ Map<NodeRef<Expression>, TSDataType> expressionTypes;
// LeafColumnTransformer for LeafOperand
List<LeafColumnTransformer> leafList;
@@ -456,7 +435,7 @@ public class ColumnTransformerVisitor
public ColumnTransformerVisitorContext(
UDTFContext udtfContext,
- TypeProvider typeProvider,
+ Map<NodeRef<Expression>, TSDataType> expressionTypes,
List<LeafColumnTransformer> leafList,
Map<String, List<InputLocation>> inputLocations,
Map<Expression, ColumnTransformer> cache,
@@ -465,7 +444,7 @@ public class ColumnTransformerVisitor
List<TSDataType> inputDataTypes,
int originSize) {
this.udtfContext = udtfContext;
- this.typeProvider = typeProvider;
+ this.expressionTypes = expressionTypes;
this.leafList = leafList;
this.inputLocations = inputLocations;
this.cache = cache;
@@ -474,5 +453,9 @@ public class ColumnTransformerVisitor
this.inputDataTypes = inputDataTypes;
this.originSize = originSize;
}
+
+ public TSDataType getType(Expression expression) {
+ return expressionTypes.get(NodeRef.of(expression));
+ }
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/OperatorTreeGenerator.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/OperatorTreeGenerator.java
index 06dd05b6fa..8aaa3b8dd5 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/OperatorTreeGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/OperatorTreeGenerator.java
@@ -29,6 +29,7 @@ import org.apache.iotdb.db.mpp.aggregation.Aggregator;
import org.apache.iotdb.db.mpp.aggregation.slidingwindow.SlidingWindowAggregatorFactory;
import org.apache.iotdb.db.mpp.aggregation.timerangeiterator.ITimeRangeIterator;
import org.apache.iotdb.db.mpp.common.FragmentInstanceId;
+import org.apache.iotdb.db.mpp.common.NodeRef;
import org.apache.iotdb.db.mpp.execution.driver.SchemaDriverContext;
import org.apache.iotdb.db.mpp.execution.exchange.ISinkHandle;
import org.apache.iotdb.db.mpp.execution.exchange.ISourceHandle;
@@ -104,6 +105,7 @@ import org.apache.iotdb.db.mpp.execution.operator.source.AlignedSeriesScanOperat
import org.apache.iotdb.db.mpp.execution.operator.source.ExchangeOperator;
import org.apache.iotdb.db.mpp.execution.operator.source.SeriesAggregationScanOperator;
import org.apache.iotdb.db.mpp.execution.operator.source.SeriesScanOperator;
+import org.apache.iotdb.db.mpp.plan.analyze.ExpressionTypeAnalyzer;
import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
import org.apache.iotdb.db.mpp.plan.expression.Expression;
import org.apache.iotdb.db.mpp.plan.expression.leaf.TimeSeriesOperand;
@@ -821,13 +823,17 @@ public class OperatorTreeGenerator extends PlanVisitor<Operator, LocalExecutionP
final List<TSDataType> inputDataTypes = getInputColumnTypes(node, context.getTypeProvider());
final Map<String, List<InputLocation>> inputLocations = makeLayout(node);
final Expression[] projectExpressions = node.getOutputExpressions();
- final TypeProvider typeProvider = context.getTypeProvider();
+ final Map<NodeRef<Expression>, TSDataType> expressionTypes = new HashMap<>();
+
+ for (Expression projectExpression : projectExpressions) {
+ ExpressionTypeAnalyzer.analyzeExpression(expressionTypes, projectExpression);
+ }
context.getTimeSliceAllocator().recordExecutionWeight(operatorContext, 1);
boolean hasNonMappableUDF = false;
for (Expression expression : projectExpressions) {
- if (!expression.isMappable(typeProvider)) {
+ if (!expression.isMappable(expressionTypes)) {
hasNonMappableUDF = true;
break;
}
@@ -849,7 +855,7 @@ public class OperatorTreeGenerator extends PlanVisitor<Operator, LocalExecutionP
ColumnTransformerVisitor.ColumnTransformerVisitorContext projectColumnTransformerContext =
new ColumnTransformerVisitor.ColumnTransformerVisitorContext(
projectContext,
- typeProvider,
+ expressionTypes,
projectLeafColumnTransformerList,
inputLocations,
projectExpressionColumnTransformerMap,
@@ -895,10 +901,11 @@ public class OperatorTreeGenerator extends PlanVisitor<Operator, LocalExecutionP
@Override
public Operator visitFilter(FilterNode node, LocalExecutionPlanContext context) {
final Expression filterExpression = node.getPredicate();
- final TypeProvider typeProvider = context.getTypeProvider();
+ final Map<NodeRef<Expression>, TSDataType> expressionTypes = new HashMap<>();
+ ExpressionTypeAnalyzer.analyzeExpression(expressionTypes, filterExpression);
// check whether predicate contains Non-Mappable UDF
- if (!filterExpression.isMappable(typeProvider)) {
+ if (!filterExpression.isMappable(expressionTypes)) {
throw new UnsupportedOperationException("Filter can not contain Non-Mappable UDF");
}
@@ -916,9 +923,13 @@ public class OperatorTreeGenerator extends PlanVisitor<Operator, LocalExecutionP
FilterAndProjectOperator.class.getSimpleName());
context.getTimeSliceAllocator().recordExecutionWeight(operatorContext, 1);
+ for (Expression projectExpression : projectExpressions) {
+ ExpressionTypeAnalyzer.analyzeExpression(expressionTypes, projectExpression);
+ }
+
boolean hasNonMappableUDF = false;
for (Expression expression : projectExpressions) {
- if (!expression.isMappable(typeProvider)) {
+ if (!expression.isMappable(expressionTypes)) {
hasNonMappableUDF = true;
break;
}
@@ -945,7 +956,7 @@ public class OperatorTreeGenerator extends PlanVisitor<Operator, LocalExecutionP
ColumnTransformerVisitor.ColumnTransformerVisitorContext filterColumnTransformerContext =
new ColumnTransformerVisitor.ColumnTransformerVisitorContext(
filterContext,
- typeProvider,
+ expressionTypes,
filterLeafColumnTransformerList,
inputLocations,
filterExpressionColumnTransformerMap,
@@ -970,7 +981,7 @@ public class OperatorTreeGenerator extends PlanVisitor<Operator, LocalExecutionP
ColumnTransformerVisitor.ColumnTransformerVisitorContext projectColumnTransformerContext =
new ColumnTransformerVisitor.ColumnTransformerVisitorContext(
projectContext,
- typeProvider,
+ expressionTypes,
projectLeafColumnTransformerList,
inputLocations,
projectExpressionColumnTransformerMap,