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 <[email protected]> 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,
