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,

Reply via email to