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

jackietien pushed a commit to branch ty/ChangeTsFileVersion
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/ty/ChangeTsFileVersion by this 
push:
     new 175a4793d6b Fix IoTDBAlignByDeviceWithTemplateIT bug in 1C3D
175a4793d6b is described below

commit 175a4793d6b2544fd19d86cf74633a9f363d779c
Author: JackieTien97 <[email protected]>
AuthorDate: Tue Aug 6 20:58:24 2024 +0800

    Fix IoTDBAlignByDeviceWithTemplateIT bug in 1C3D
---
 .../plan/analyze/ExpressionTypeAnalyzer.java       | 93 ++++++++++++++--------
 .../plan/planner/OperatorTreeGenerator.java        | 39 ++++++---
 2 files changed, 92 insertions(+), 40 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionTypeAnalyzer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionTypeAnalyzer.java
index 69db828f991..a470e11ee61 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionTypeAnalyzer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionTypeAnalyzer.java
@@ -54,6 +54,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 public class ExpressionTypeAnalyzer {
@@ -66,8 +67,10 @@ public class ExpressionTypeAnalyzer {
     if (!analysis.getExpressionTypes().containsKey(NodeRef.of(expression))) {
       ExpressionTypeAnalyzer analyzer = new ExpressionTypeAnalyzer();
 
-      Map<String, IMeasurementSchema> context =
-          analysis.allDevicesInOneTemplate() ? 
analysis.getDeviceTemplate().getSchemaMap() : null;
+      Function<String, TSDataType> context =
+          analysis.allDevicesInOneTemplate()
+              ? new 
TemplateTypeProvider(analysis.getDeviceTemplate().getSchemaMap())
+              : null;
       analyzer.analyze(expression, context);
 
       addExpressionTypes(analysis, analyzer);
@@ -75,11 +78,39 @@ public class ExpressionTypeAnalyzer {
     return analysis.getType(expression);
   }
 
+  public static class TemplateTypeProvider implements Function<String, 
TSDataType> {
+    private final Map<String, IMeasurementSchema> schemaMap;
+
+    public TemplateTypeProvider(Map<String, IMeasurementSchema> schemaMap) {
+      this.schemaMap = schemaMap;
+    }
+
+    @Override
+    public TSDataType apply(String s) {
+      IMeasurementSchema measurementSchema = schemaMap.get(s);
+      return measurementSchema == null ? null : measurementSchema.getType();
+    }
+  }
+
+  public static class TypeProviderWrapper implements Function<String, 
TSDataType> {
+    private final Map<String, TSDataType> typeMap;
+
+    public TypeProviderWrapper(Map<String, TSDataType> typeMap) {
+      this.typeMap = typeMap;
+    }
+
+    @Override
+    public TSDataType apply(String s) {
+      return typeMap.get(s);
+    }
+  }
+
   public static TSDataType analyzeExpressionForTemplatedQuery(
       Analysis analysis, Expression expression) {
     if (!analysis.getExpressionTypes().containsKey(NodeRef.of(expression))) {
       ExpressionTypeAnalyzer analyzer = new ExpressionTypeAnalyzer();
-      analyzer.analyze(expression, 
analysis.getDeviceTemplate().getSchemaMap());
+      analyzer.analyze(
+          expression, new 
TemplateTypeProvider(analysis.getDeviceTemplate().getSchemaMap()));
 
       addExpressionTypes(analysis, analyzer);
     }
@@ -94,13 +125,12 @@ public class ExpressionTypeAnalyzer {
     types.putAll(analyzer.getExpressionTypes());
   }
 
-  public static void analyzeExpressionUsingTemplatedInfo(
+  public static void analyzeExpression(
       Map<NodeRef<Expression>, TSDataType> types,
       Expression expression,
-      TemplatedInfo templatedInfo) {
+      Function<String, TSDataType> schemaMap) {
     ExpressionTypeAnalyzer analyzer = new ExpressionTypeAnalyzer();
 
-    Map<String, IMeasurementSchema> schemaMap = templatedInfo.getSchemaMap();
     analyzer.analyze(expression, schemaMap);
 
     types.putAll(analyzer.getExpressionTypes());
@@ -110,7 +140,7 @@ public class ExpressionTypeAnalyzer {
     analysis.addTypes(analyzer.getExpressionTypes());
   }
 
-  public TSDataType analyze(Expression expression, Map<String, 
IMeasurementSchema> context) {
+  public TSDataType analyze(Expression expression, Function<String, 
TSDataType> context) {
     Visitor visitor = new Visitor();
     return visitor.process(expression, context);
   }
@@ -119,10 +149,10 @@ public class ExpressionTypeAnalyzer {
     return expressionTypes;
   }
 
-  private class Visitor extends ExpressionVisitor<TSDataType, Map<String, 
IMeasurementSchema>> {
+  private class Visitor extends ExpressionVisitor<TSDataType, Function<String, 
TSDataType>> {
 
     @Override
-    public TSDataType process(Expression expression, Map<String, 
IMeasurementSchema> context) {
+    public TSDataType process(Expression expression, Function<String, 
TSDataType> context) {
       // don't double process a expression
       TSDataType dataType = expressionTypes.get(NodeRef.of(expression));
       if (dataType != null) {
@@ -132,29 +162,28 @@ public class ExpressionTypeAnalyzer {
     }
 
     @Override
-    public TSDataType visitExpression(
-        Expression expression, Map<String, IMeasurementSchema> context) {
+    public TSDataType visitExpression(Expression expression, Function<String, 
TSDataType> context) {
       throw new UnsupportedOperationException(
           "Unsupported expression type: " + expression.getClass().getName());
     }
 
     @Override
     public TSDataType visitInExpression(
-        InExpression inExpression, Map<String, IMeasurementSchema> context) {
+        InExpression inExpression, Function<String, TSDataType> context) {
       process(inExpression.getExpression(), context);
       return setExpressionType(inExpression, TSDataType.BOOLEAN);
     }
 
     @Override
     public TSDataType visitIsNullExpression(
-        IsNullExpression isNullExpression, Map<String, IMeasurementSchema> 
context) {
+        IsNullExpression isNullExpression, Function<String, TSDataType> 
context) {
       process(isNullExpression.getExpression(), context);
       return setExpressionType(isNullExpression, TSDataType.BOOLEAN);
     }
 
     @Override
     public TSDataType visitLikeExpression(
-        LikeExpression likeExpression, Map<String, IMeasurementSchema> 
context) {
+        LikeExpression likeExpression, Function<String, TSDataType> context) {
       checkInputExpressionDataType(
           likeExpression.getExpression().getExpressionString(),
           process(likeExpression.getExpression(), context),
@@ -165,7 +194,7 @@ public class ExpressionTypeAnalyzer {
 
     @Override
     public TSDataType visitRegularExpression(
-        RegularExpression regularExpression, Map<String, IMeasurementSchema> 
context) {
+        RegularExpression regularExpression, Function<String, TSDataType> 
context) {
       checkInputExpressionDataType(
           regularExpression.getExpression().getExpressionString(),
           process(regularExpression.getExpression(), context),
@@ -176,7 +205,7 @@ public class ExpressionTypeAnalyzer {
 
     @Override
     public TSDataType visitLogicNotExpression(
-        LogicNotExpression logicNotExpression, Map<String, IMeasurementSchema> 
context) {
+        LogicNotExpression logicNotExpression, Function<String, TSDataType> 
context) {
       checkInputExpressionDataType(
           logicNotExpression.getExpression().getExpressionString(),
           process(logicNotExpression.getExpression(), context),
@@ -186,7 +215,7 @@ public class ExpressionTypeAnalyzer {
 
     @Override
     public TSDataType visitNegationExpression(
-        NegationExpression negationExpression, Map<String, IMeasurementSchema> 
context) {
+        NegationExpression negationExpression, Function<String, TSDataType> 
context) {
       TSDataType inputExpressionType = 
process(negationExpression.getExpression(), context);
       checkInputExpressionDataType(
           negationExpression.getExpression().getExpressionString(),
@@ -201,7 +230,7 @@ public class ExpressionTypeAnalyzer {
     @Override
     public TSDataType visitArithmeticBinaryExpression(
         ArithmeticBinaryExpression arithmeticBinaryExpression,
-        Map<String, IMeasurementSchema> context) {
+        Function<String, TSDataType> context) {
       checkInputExpressionDataType(
           arithmeticBinaryExpression.getLeftExpression().getExpressionString(),
           process(arithmeticBinaryExpression.getLeftExpression(), context),
@@ -221,7 +250,7 @@ public class ExpressionTypeAnalyzer {
 
     @Override
     public TSDataType visitLogicBinaryExpression(
-        LogicBinaryExpression logicBinaryExpression, Map<String, 
IMeasurementSchema> context) {
+        LogicBinaryExpression logicBinaryExpression, Function<String, 
TSDataType> context) {
       checkInputExpressionDataType(
           logicBinaryExpression.getLeftExpression().getExpressionString(),
           process(logicBinaryExpression.getLeftExpression(), context),
@@ -235,7 +264,7 @@ public class ExpressionTypeAnalyzer {
 
     @Override
     public TSDataType visitCompareBinaryExpression(
-        CompareBinaryExpression compareBinaryExpression, Map<String, 
IMeasurementSchema> context) {
+        CompareBinaryExpression compareBinaryExpression, Function<String, 
TSDataType> context) {
       final TSDataType leftExpressionDataType =
           process(compareBinaryExpression.getLeftExpression(), context);
       final TSDataType rightExpressionDataType =
@@ -305,7 +334,7 @@ public class ExpressionTypeAnalyzer {
 
     @Override
     public TSDataType visitBetweenExpression(
-        BetweenExpression betweenExpression, Map<String, IMeasurementSchema> 
context) {
+        BetweenExpression betweenExpression, Function<String, TSDataType> 
context) {
       process(betweenExpression.getFirstExpression(), context);
       process(betweenExpression.getSecondExpression(), context);
       process(betweenExpression.getThirdExpression(), context);
@@ -314,7 +343,7 @@ public class ExpressionTypeAnalyzer {
 
     @Override
     public TSDataType visitFunctionExpression(
-        FunctionExpression functionExpression, Map<String, IMeasurementSchema> 
context) {
+        FunctionExpression functionExpression, Function<String, TSDataType> 
context) {
       List<Expression> inputExpressions = functionExpression.getExpressions();
       for (Expression expression : inputExpressions) {
         process(expression, context);
@@ -363,16 +392,18 @@ public class ExpressionTypeAnalyzer {
 
     @Override
     public TSDataType visitTimeStampOperand(
-        TimestampOperand timestampOperand, Map<String, IMeasurementSchema> 
context) {
+        TimestampOperand timestampOperand, Function<String, TSDataType> 
context) {
       return setExpressionType(timestampOperand, TSDataType.INT64);
     }
 
     @Override
     public TSDataType visitTimeSeriesOperand(
-        TimeSeriesOperand timeSeriesOperand, Map<String, IMeasurementSchema> 
context) {
-      if (context != null && 
(context.containsKey(timeSeriesOperand.getOutputSymbol()))) {
-        return setExpressionType(
-            timeSeriesOperand, 
context.get(timeSeriesOperand.getOutputSymbol()).getType());
+        TimeSeriesOperand timeSeriesOperand, Function<String, TSDataType> 
context) {
+      if (context != null) {
+        TSDataType type = context.apply(timeSeriesOperand.getOutputSymbol());
+        if (type != null) {
+          return setExpressionType(timeSeriesOperand, type);
+        }
       }
 
       return setExpressionType(timeSeriesOperand, timeSeriesOperand.getType());
@@ -380,19 +411,19 @@ public class ExpressionTypeAnalyzer {
 
     @Override
     public TSDataType visitConstantOperand(
-        ConstantOperand constantOperand, Map<String, IMeasurementSchema> 
context) {
+        ConstantOperand constantOperand, Function<String, TSDataType> context) 
{
       return setExpressionType(constantOperand, constantOperand.getDataType());
     }
 
     @Override
     public TSDataType visitNullOperand(
-        NullOperand nullOperand, Map<String, IMeasurementSchema> context) {
+        NullOperand nullOperand, Function<String, TSDataType> context) {
       return null;
     }
 
     @Override
     public TSDataType visitCaseWhenThenExpression(
-        CaseWhenThenExpression caseWhenThenExpression, Map<String, 
IMeasurementSchema> context) {
+        CaseWhenThenExpression caseWhenThenExpression, Function<String, 
TSDataType> context) {
       Set<TSDataType> typeSet = new HashSet<>();
       for (WhenThenExpression whenThenExpression :
           caseWhenThenExpression.getWhenThenExpressions()) {
@@ -424,7 +455,7 @@ public class ExpressionTypeAnalyzer {
 
     @Override
     public TSDataType visitWhenThenExpression(
-        WhenThenExpression whenThenExpression, Map<String, IMeasurementSchema> 
context) {
+        WhenThenExpression whenThenExpression, Function<String, TSDataType> 
context) {
       TSDataType whenType = process(whenThenExpression.getWhen(), context);
       if (!whenType.equals(TSDataType.BOOLEAN)) {
         throw new SemanticException(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
index ef55a417350..01ee500fe3e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
@@ -1496,10 +1496,17 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
 
     for (Expression projectExpression : projectExpressions) {
       if (context.isBuildPlanUseTemplate()) {
-        ExpressionTypeAnalyzer.analyzeExpressionUsingTemplatedInfo(
-            expressionTypes, projectExpression, context.getTemplatedInfo());
+        ExpressionTypeAnalyzer.analyzeExpression(
+            expressionTypes,
+            projectExpression,
+            new ExpressionTypeAnalyzer.TemplateTypeProvider(
+                context.getTemplatedInfo().getSchemaMap()));
       } else {
-        ExpressionTypeAnalyzer.analyzeExpression(expressionTypes, 
projectExpression);
+        ExpressionTypeAnalyzer.analyzeExpression(
+            expressionTypes,
+            projectExpression,
+            new ExpressionTypeAnalyzer.TypeProviderWrapper(
+                context.getTypeProvider().getTreeModelTypeMap()));
       }
     }
 
@@ -1618,10 +1625,17 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
       LocalExecutionPlanContext context) {
     final Map<NodeRef<Expression>, TSDataType> expressionTypes = new 
HashMap<>();
     if (context.isBuildPlanUseTemplate()) {
-      ExpressionTypeAnalyzer.analyzeExpressionUsingTemplatedInfo(
-          expressionTypes, predicate, 
context.getTypeProvider().getTemplatedInfo());
+      ExpressionTypeAnalyzer.analyzeExpression(
+          expressionTypes,
+          predicate,
+          new ExpressionTypeAnalyzer.TemplateTypeProvider(
+              context.getTypeProvider().getTemplatedInfo().getSchemaMap()));
     } else {
-      ExpressionTypeAnalyzer.analyzeExpression(expressionTypes, predicate);
+      ExpressionTypeAnalyzer.analyzeExpression(
+          expressionTypes,
+          predicate,
+          new ExpressionTypeAnalyzer.TypeProviderWrapper(
+              context.getTypeProvider().getTreeModelTypeMap()));
     }
 
     // check whether predicate contains Non-Mappable UDF
@@ -1633,10 +1647,17 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
 
     for (Expression projectExpression : projectExpressions) {
       if (context.isBuildPlanUseTemplate()) {
-        ExpressionTypeAnalyzer.analyzeExpressionUsingTemplatedInfo(
-            expressionTypes, projectExpression, 
context.getTypeProvider().getTemplatedInfo());
+        ExpressionTypeAnalyzer.analyzeExpression(
+            expressionTypes,
+            projectExpression,
+            new ExpressionTypeAnalyzer.TemplateTypeProvider(
+                context.getTypeProvider().getTemplatedInfo().getSchemaMap()));
       } else {
-        ExpressionTypeAnalyzer.analyzeExpression(expressionTypes, 
projectExpression);
+        ExpressionTypeAnalyzer.analyzeExpression(
+            expressionTypes,
+            projectExpression,
+            new ExpressionTypeAnalyzer.TypeProviderWrapper(
+                context.getTypeProvider().getTreeModelTypeMap()));
       }
     }
 

Reply via email to