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 f224ff16849 Try fix MeasurementPath Problem
f224ff16849 is described below

commit f224ff16849dc09b92a724ee0539365bc18395a3
Author: JackieTien97 <[email protected]>
AuthorDate: Tue Aug 6 18:56:23 2024 +0800

    Try fix MeasurementPath Problem
---
 .../iotdb/confignode/manager/ConfigManager.java    | 49 ++++++++++------------
 .../impl/schema/SetTemplateProcedure.java          |  5 +--
 .../queryengine/plan/analyze/AnalyzeVisitor.java   |  3 +-
 .../plan/analyze/ExpressionTypeAnalyzer.java       |  2 +-
 .../queryengine/plan/analyze/ExpressionUtils.java  |  8 ++++
 .../plan/analyze/TemplatedAggregationAnalyze.java  |  7 +++-
 .../queryengine/plan/analyze/TemplatedAnalyze.java |  7 +++-
 .../db/queryengine/plan/analyze/TemplatedInfo.java |  4 +-
 .../plan/expression/leaf/TimeSeriesOperand.java    | 14 +++++--
 .../BindTypeForTimeSeriesOperandVisitor.java       |  5 ++-
 .../visitor/ExpressionNormalizeVisitor.java        |  2 +-
 .../visitor/GetMeasurementExpressionVisitor.java   | 22 +++++-----
 .../visitor/RemoveRootPrefixVisitor.java           |  2 +-
 .../visitor/ReplaceLogicalViewVisitor.java         | 17 ++++----
 .../visitor/ReplaceSubTreeWithViewVisitor.java     |  3 +-
 .../plan/planner/LogicalPlanBuilder.java           |  5 ++-
 .../org/apache/iotdb/db/utils/SchemaUtils.java     |  5 +--
 .../apache/iotdb/db/utils/TypeInferenceUtils.java  |  4 +-
 .../org/apache/iotdb/db/utils/SchemaUtilsTest.java | 10 ++---
 19 files changed, 96 insertions(+), 78 deletions(-)

diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
index 4a7a6144b5d..086e61cee6a 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
@@ -39,9 +39,9 @@ import org.apache.iotdb.commons.cluster.NodeType;
 import org.apache.iotdb.commons.conf.CommonConfig;
 import org.apache.iotdb.commons.conf.CommonDescriptor;
 import org.apache.iotdb.commons.conf.ConfigurationFileUtils;
+import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.exception.MetadataException;
-import org.apache.iotdb.commons.path.MeasurementPath;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.path.PathPatternTree;
 import org.apache.iotdb.commons.path.PathPatternUtil;
@@ -682,30 +682,27 @@ public class ConfigManager implements IManager {
   }
 
   private List<TSeriesPartitionSlot> calculateRelatedSlot(PartialPath path, 
PartialPath database) {
-    //    // The path contains `**`
-    //    if 
(path.getFullPath().contains(IoTDBConstant.MULTI_LEVEL_PATH_WILDCARD)) {
-    //      return new ArrayList<>();
-    //    }
-    //    // with database = root.sg, path = root.*.d1
-    //    // convert path = root.sg.d1
-    //    List<PartialPath> innerPathList = path.alterPrefixPath(database);
-    //    if (innerPathList.isEmpty()) {
-    //      return new ArrayList<>();
-    //    }
-    //    PartialPath innerPath = innerPathList.get(0);
-    //    // root.sg1.*.d1
-    //    // root.sg1.a1.*
-    //    // The innerPath contains `*` and the only `*` is not in last level
-    //    if 
(innerPath.toString().contains(IoTDBConstant.ONE_LEVEL_PATH_WILDCARD)) {
-    //      return new ArrayList<>();
-    //    }
-    //    return Collections.singletonList(
-    //        
getPartitionManager().getSeriesPartitionSlot(innerPath.getIDeviceID()));
-
-    // the previous code has an issue, it cannot be known that whether "path" 
is a full path,
-    // so it is meaningless to call getIDeviceID()
-    // TODO: how to determine and filter
-    return Collections.emptyList();
+    // The path contains `**`
+    if (path.getFullPath().contains(IoTDBConstant.MULTI_LEVEL_PATH_WILDCARD)) {
+      return new ArrayList<>();
+    }
+    // with database = root.sg, path = root.*.d1
+    // convert path = root.sg.d1
+    List<PartialPath> innerPathList = path.alterPrefixPath(database);
+    if (innerPathList.isEmpty()) {
+      return new ArrayList<>();
+    }
+    String[] devicePath =
+        Arrays.copyOf(innerPathList.get(0).getNodes(), 
innerPathList.get(0).getNodeLength() - 1);
+    // root.sg1.*.d1
+    for (String node : devicePath) {
+      if (node.equals(IoTDBConstant.ONE_LEVEL_PATH_WILDCARD)) {
+        return Collections.emptyList();
+      }
+    }
+    return Collections.singletonList(
+        getPartitionManager()
+            
.getSeriesPartitionSlot(IDeviceID.Factory.DEFAULT_FACTORY.create(devicePath)));
   }
 
   @Override
@@ -720,7 +717,7 @@ public class ConfigManager implements IManager {
 
     // Build GetSchemaPartitionPlan
     Map<String, Set<TSeriesPartitionSlot>> partitionSlotsMap = new HashMap<>();
-    List<MeasurementPath> relatedPaths = patternTree.getAllPathPatterns(true);
+    List<PartialPath> relatedPaths = patternTree.getAllPathPatterns();
     List<String> allDatabases = getClusterSchemaManager().getDatabaseNames();
     List<PartialPath> allDatabasePaths = new ArrayList<>();
     for (String database : allDatabases) {
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SetTemplateProcedure.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SetTemplateProcedure.java
index cbfb234dadd..1e69d8339d9 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SetTemplateProcedure.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SetTemplateProcedure.java
@@ -260,14 +260,13 @@ public class SetTemplateProcedure
   private void validateTimeSeriesExistence(ConfigNodeProcedureEnv env) {
     PathPatternTree patternTree = new PathPatternTree();
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-    DataOutputStream dataOutputStream = new 
DataOutputStream(byteArrayOutputStream);
     PartialPath path = null;
     try {
       path = new PartialPath(templateSetPath);
       patternTree.appendPathPattern(path);
       
patternTree.appendPathPattern(path.concatAsMeasurementPath(MULTI_LEVEL_PATH_WILDCARD));
-      patternTree.serialize(dataOutputStream);
-    } catch (IllegalPathException | IOException ignored) {
+      patternTree.constructTree();
+    } catch (IllegalPathException ignored) {
     }
     ByteBuffer patternTreeBytes = 
ByteBuffer.wrap(byteArrayOutputStream.toByteArray());
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
index 2f1eda9dc47..6a9f2b0c159 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
@@ -1083,8 +1083,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
           .add(rawExpression);
 
       Map<String, String> tagMap =
-          ((MeasurementPath)
-                  ((TimeSeriesOperand) 
measurementExpression.getExpressions().get(0)).getPath())
+          ((MeasurementPath) ((TimeSeriesOperand) 
rawExpression.getExpressions().get(0)).getPath())
               .getTagMap();
       List<String> tagValues = new ArrayList<>();
       for (String tagKey : tagKeys) {
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 f5dbad88a82..69db828f991 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
@@ -375,7 +375,7 @@ public class ExpressionTypeAnalyzer {
             timeSeriesOperand, 
context.get(timeSeriesOperand.getOutputSymbol()).getType());
       }
 
-      return setExpressionType(timeSeriesOperand, 
timeSeriesOperand.getPath().getSeriesType());
+      return setExpressionType(timeSeriesOperand, timeSeriesOperand.getType());
     }
 
     @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionUtils.java
index fc9d3a0aa51..a9ad3fad40b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionUtils.java
@@ -52,6 +52,8 @@ import 
org.apache.iotdb.db.queryengine.plan.expression.unary.NegationExpression;
 import org.apache.iotdb.db.queryengine.plan.expression.unary.RegularExpression;
 import org.apache.iotdb.db.queryengine.plan.expression.unary.UnaryExpression;
 
+import org.apache.tsfile.enums.TSDataType;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -82,6 +84,12 @@ public class ExpressionUtils {
     return cloneCommonFields(rawExpression, resultExpression);
   }
 
+  public static Expression reconstructTimeSeriesOperand(
+      TimeSeriesOperand rawExpression, PartialPath actualPath, TSDataType 
dataType) {
+    Expression resultExpression = new TimeSeriesOperand(actualPath, dataType);
+    return cloneCommonFields(rawExpression, resultExpression);
+  }
+
   public static List<Expression> reconstructFunctionExpressionsWithMemoryCheck(
       final FunctionExpression expression,
       final List<List<Expression>> childExpressionsList,
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAggregationAnalyze.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAggregationAnalyze.java
index 79f8ba0a8c1..ba4bdf4255c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAggregationAnalyze.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAggregationAnalyze.java
@@ -41,6 +41,7 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import static 
org.apache.iotdb.db.queryengine.common.header.ColumnHeaderConstant.ENDTIME;
@@ -167,13 +168,15 @@ public class TemplatedAggregationAnalyze {
             && 
"*".equalsIgnoreCase(selectExpression.getExpressions().get(0).getOutputSymbol()))
 {
           subExpressions = new ArrayList<>();
           FunctionExpression functionExpression = (FunctionExpression) 
selectExpression;
-          for (String measurement : template.getSchemaMap().keySet()) {
+          for (Map.Entry<String, IMeasurementSchema> entry : 
template.getSchemaMap().entrySet()) {
             FunctionExpression subFunctionExpression =
                 new FunctionExpression(
                     functionExpression.getFunctionName(),
                     functionExpression.getFunctionAttributes(),
                     Collections.singletonList(
-                        new TimeSeriesOperand(new PartialPath(new String[] 
{measurement}))));
+                        new TimeSeriesOperand(
+                            new PartialPath(new String[] {entry.getKey()}),
+                            entry.getValue().getType())));
             
subFunctionExpression.setFunctionType(functionExpression.getFunctionType());
             subExpressions.add(subFunctionExpression);
           }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
index 9622d2a6e16..d3bf070d2be 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
@@ -130,7 +130,8 @@ public class TemplatedAnalyze {
           } else if (paginationController.hasCurLimit()) {
             String measurementName = entry.getKey();
             TimeSeriesOperand measurementPath =
-                new TimeSeriesOperand(new PartialPath(new String[] 
{measurementName}));
+                new TimeSeriesOperand(
+                    new PartialPath(new String[] {measurementName}), 
entry.getValue().getType());
             // reserve memory for this expression
             context.reserveMemoryForFrontEnd(measurementPath.ramBytesUsed());
             outputExpressions.add(new Pair<>(measurementPath, null));
@@ -151,7 +152,9 @@ public class TemplatedAnalyze {
             paginationController.consumeOffset();
           } else if (paginationController.hasCurLimit()) {
             TimeSeriesOperand measurementPath =
-                new TimeSeriesOperand(new PartialPath(new String[] 
{measurementName}));
+                new TimeSeriesOperand(
+                    new PartialPath(new String[] {measurementName}),
+                    template.getSchemaMap().get(measurementName).getType());
             // reserve memory for this expression
             context.reserveMemoryForFrontEnd(measurementPath.ramBytesUsed());
             outputExpressions.add(new Pair<>(measurementPath, 
resultColumn.getAlias()));
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedInfo.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedInfo.java
index 919efa8970c..5a4beb851ee 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedInfo.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedInfo.java
@@ -19,7 +19,6 @@
 
 package org.apache.iotdb.db.queryengine.plan.analyze;
 
-import org.apache.iotdb.commons.path.MeasurementPath;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.queryengine.plan.expression.Expression;
 import org.apache.iotdb.db.queryengine.plan.expression.leaf.TimeSeriesOperand;
@@ -199,8 +198,7 @@ public class TemplatedInfo {
     for (int i = 0; i < measurementList.size(); i++) {
       projectExpressions[i] =
           new TimeSeriesOperand(
-              new MeasurementPath(
-                  new PartialPath(new String[] {measurementList.get(i)}), 
schemaList.get(i)));
+              new PartialPath(new String[] {measurementList.get(i)}), 
schemaList.get(i).getType());
     }
     return projectExpressions;
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/leaf/TimeSeriesOperand.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/leaf/TimeSeriesOperand.java
index f063605dfa4..96e7b9db097 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/leaf/TimeSeriesOperand.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/leaf/TimeSeriesOperand.java
@@ -43,25 +43,33 @@ public class TimeSeriesOperand extends LeafOperand {
 
   private PartialPath path;
 
+  // if path is MeasurementPath or AlignedPath, this type is null
+  private transient TSDataType type;
+
   public TimeSeriesOperand(PartialPath path) {
     this.path = path;
   }
 
+  public TimeSeriesOperand(PartialPath path, TSDataType dataType) {
+    this.path = path;
+    this.type = dataType;
+  }
+
   public TimeSeriesOperand(ByteBuffer byteBuffer) {
     path = (PartialPath) PathDeserializeUtil.deserialize(byteBuffer);
   }
 
   public static TimeSeriesOperand constructColumnHeaderExpression(
       String columnName, TSDataType dataType) {
-    return new TimeSeriesOperand(new PartialPath(columnName, false));
+    return new TimeSeriesOperand(new PartialPath(columnName, false), dataType);
   }
 
   public PartialPath getPath() {
     return path;
   }
 
-  public void setPath(PartialPath path) {
-    this.path = path;
+  public TSDataType getType() {
+    return type != null ? type : path.getSeriesType();
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/BindTypeForTimeSeriesOperandVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/BindTypeForTimeSeriesOperandVisitor.java
index 4aecb34e0bb..662e4b8f54d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/BindTypeForTimeSeriesOperandVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/BindTypeForTimeSeriesOperandVisitor.java
@@ -20,7 +20,7 @@
 package org.apache.iotdb.db.queryengine.plan.expression.visitor;
 
 import org.apache.iotdb.commons.exception.IllegalPathException;
-import org.apache.iotdb.commons.path.MeasurementPath;
+import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.exception.sql.SemanticException;
 import org.apache.iotdb.db.queryengine.common.header.ColumnHeader;
 import org.apache.iotdb.db.queryengine.plan.expression.Expression;
@@ -44,7 +44,8 @@ public class BindTypeForTimeSeriesOperandVisitor extends 
ReconstructVisitor<List
         try {
           return reconstructTimeSeriesOperand(
               predicate,
-              new MeasurementPath(columnHeader.getColumnName(), 
columnHeader.getColumnType()));
+              new PartialPath(columnHeader.getColumnName()),
+              columnHeader.getColumnType());
         } catch (IllegalPathException e) {
           throw new SemanticException(e);
         }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ExpressionNormalizeVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ExpressionNormalizeVisitor.java
index 642b3a3b617..59868395c39 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ExpressionNormalizeVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ExpressionNormalizeVisitor.java
@@ -61,7 +61,7 @@ public class ExpressionNormalizeVisitor extends 
ReconstructVisitor<Void> {
     if (newPath.isMeasurementAliasExists()) {
       ((MeasurementPath) newPath).removeMeasurementAlias();
     }
-    TimeSeriesOperand newOperand = new TimeSeriesOperand(newPath);
+    TimeSeriesOperand newOperand = new TimeSeriesOperand(newPath, 
timeSeriesOperand.getType());
     if (timeSeriesOperand.isViewExpression()) {
       newOperand.setViewPath(timeSeriesOperand.getViewPath());
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/GetMeasurementExpressionVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/GetMeasurementExpressionVisitor.java
index 53361f522d7..0395c3bc047 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/GetMeasurementExpressionVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/GetMeasurementExpressionVisitor.java
@@ -42,15 +42,17 @@ public class GetMeasurementExpressionVisitor extends 
ReconstructVisitor<Analysis
 
   @Override
   public Expression visitTimeSeriesOperand(TimeSeriesOperand 
timeSeriesOperand, Analysis analysis) {
-    MeasurementPath rawPath = (MeasurementPath) timeSeriesOperand.getPath();
-    String measurementName =
-        rawPath.isMeasurementAliasExists()
-            ? rawPath.getMeasurementAlias()
-            : rawPath.getMeasurement();
-    MeasurementPath measurementPath =
-        new MeasurementPath(
-            new PartialPath(measurementName, false), 
rawPath.getMeasurementSchema());
-    measurementPath.setTagMap(rawPath.getTagMap());
-    return new TimeSeriesOperand(measurementPath);
+    if (timeSeriesOperand.getPath() instanceof MeasurementPath) {
+      MeasurementPath rawPath = (MeasurementPath) timeSeriesOperand.getPath();
+      String measurementName =
+          rawPath.isMeasurementAliasExists()
+              ? rawPath.getMeasurementAlias()
+              : rawPath.getMeasurement();
+      return new TimeSeriesOperand(
+          new PartialPath(measurementName, false), 
rawPath.getMeasurementSchema().getType());
+    } else {
+      return new TimeSeriesOperand(
+          new PartialPath(timeSeriesOperand.getPath().getNodes()), 
timeSeriesOperand.getType());
+    }
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/RemoveRootPrefixVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/RemoveRootPrefixVisitor.java
index ada5d3c89ca..57b2b65a529 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/RemoveRootPrefixVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/RemoveRootPrefixVisitor.java
@@ -40,6 +40,6 @@ public class RemoveRootPrefixVisitor extends 
ReconstructVisitor<Void> {
     String[] newPartialNodes = new String[newPartialNodesLength];
     System.arraycopy(rawPartialNodes, 1, newPartialNodes, 0, 
newPartialNodesLength);
 
-    return new TimeSeriesOperand(new PartialPath(newPartialNodes));
+    return new TimeSeriesOperand(new PartialPath(newPartialNodes), 
timeSeriesOperand.getType());
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ReplaceLogicalViewVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ReplaceLogicalViewVisitor.java
index 23a00a0ff4f..39fe3c637c9 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ReplaceLogicalViewVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ReplaceLogicalViewVisitor.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.queryengine.plan.expression.visitor;
 
+import org.apache.iotdb.commons.path.MeasurementPath;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.schema.view.LogicalViewSchema;
 import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
@@ -173,13 +174,15 @@ public class ReplaceLogicalViewVisitor extends 
ExpressionVisitor<Expression, Lis
       TimeSeriesOperand timeSeriesOperand, List<PartialPath> context) {
     PartialPath path = timeSeriesOperand.getPath();
     try {
-      IMeasurementSchema measurementSchema = path.getMeasurementSchema();
-      if (measurementSchema.isLogicalView()) {
-        ViewExpression viewExpression = ((LogicalViewSchema) 
measurementSchema).getExpression();
-        Expression result = this.transform(viewExpression);
-        // record paths in this viewExpression
-        context.addAll(this.collectSourcePaths(viewExpression));
-        return result;
+      if (path instanceof MeasurementPath) {
+        IMeasurementSchema measurementSchema = path.getMeasurementSchema();
+        if (measurementSchema.isLogicalView()) {
+          ViewExpression viewExpression = ((LogicalViewSchema) 
measurementSchema).getExpression();
+          Expression result = this.transform(viewExpression);
+          // record paths in this viewExpression
+          context.addAll(this.collectSourcePaths(viewExpression));
+          return result;
+        }
       }
     } catch (Exception e) {
       throw new RuntimeException(e);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ReplaceSubTreeWithViewVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ReplaceSubTreeWithViewVisitor.java
index 7d20546722b..49702ff5528 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ReplaceSubTreeWithViewVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ReplaceSubTreeWithViewVisitor.java
@@ -19,7 +19,6 @@
 
 package org.apache.iotdb.db.queryengine.plan.expression.visitor;
 
-import org.apache.iotdb.commons.path.MeasurementPath;
 import org.apache.iotdb.db.queryengine.plan.analyze.Analysis;
 import org.apache.iotdb.db.queryengine.plan.expression.Expression;
 import org.apache.iotdb.db.queryengine.plan.expression.leaf.TimeSeriesOperand;
@@ -32,7 +31,7 @@ public class ReplaceSubTreeWithViewVisitor extends 
ReconstructVisitor<Analysis>
   public Expression process(Expression expression, Analysis analysis) {
     if (expression.isViewExpression()) {
       TSDataType dataType = analysis.getType(expression);
-      return new TimeSeriesOperand(new 
MeasurementPath(expression.getViewPath(), dataType));
+      return new TimeSeriesOperand(expression.getViewPath(), dataType);
     }
     return expression.accept(this, analysis);
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
index 8871329765a..7064441962f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
@@ -464,7 +464,10 @@ public class LogicalPlanBuilder {
         for (String partialAggregationName : partialAggregationsNames) {
           typeProvider.setTreeModelType(
               String.format("%s(%s)", partialAggregationName, 
path.getFullPath()),
-              SchemaUtils.getSeriesTypeByPath(path, partialAggregationName));
+              SchemaUtils.getSeriesTypeByPath(
+                  ((TimeSeriesOperand) 
aggregationDescriptor.getOutputExpressions().get(0))
+                      .getType(),
+                  partialAggregationName));
         }
       }
     } else {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/SchemaUtils.java 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/SchemaUtils.java
index 52946580a60..74d753da9d5 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/SchemaUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/SchemaUtils.java
@@ -20,7 +20,6 @@ package org.apache.iotdb.db.utils;
 
 import org.apache.iotdb.common.rpc.thrift.TAggregationType;
 import org.apache.iotdb.commons.exception.MetadataException;
-import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
 import org.apache.iotdb.db.utils.constant.SqlConstant;
 
@@ -105,12 +104,12 @@ public class SchemaUtils {
     return measurementDataType;
   }
 
-  public static TSDataType getSeriesTypeByPath(PartialPath path, String 
aggregation) {
+  public static TSDataType getSeriesTypeByPath(TSDataType seriesType, String 
aggregation) {
     TSDataType dataType = getBuiltinAggregationTypeByFuncName(aggregation);
     if (dataType != null) {
       return dataType;
     } else {
-      return path.getSeriesType();
+      return seriesType;
     }
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/TypeInferenceUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/TypeInferenceUtils.java
index 8167a603844..78eac5f6776 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/TypeInferenceUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/TypeInferenceUtils.java
@@ -19,7 +19,6 @@
 
 package org.apache.iotdb.db.utils;
 
-import org.apache.iotdb.commons.path.MeasurementPath;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.sql.SemanticException;
@@ -267,8 +266,7 @@ public class TypeInferenceUtils {
                     ExpressionUtils.reconstructBinaryExpression(
                         keepExpression,
                         new TimeSeriesOperand(
-                            new MeasurementPath(
-                                ((TimeSeriesOperand) 
leftExpression).getPath(), TSDataType.INT64)),
+                            ((TimeSeriesOperand) leftExpression).getPath(), 
TSDataType.INT64),
                         rightExpression)));
             return;
           } else {
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/utils/SchemaUtilsTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/utils/SchemaUtilsTest.java
index 818117cb8bc..85a10c7aaf3 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/utils/SchemaUtilsTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/utils/SchemaUtilsTest.java
@@ -18,9 +18,7 @@
  */
 package org.apache.iotdb.db.utils;
 
-import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.exception.MetadataException;
-import org.apache.iotdb.commons.path.MeasurementPath;
 import org.apache.iotdb.db.utils.constant.SqlConstant;
 
 import org.apache.tsfile.enums.TSDataType;
@@ -58,12 +56,12 @@ public class SchemaUtilsTest {
   }
 
   @Test
-  public void getSeriesTypeByPath() throws IllegalPathException {
-    MeasurementPath measurementPath = new MeasurementPath("s1", 
TSDataType.INT64);
+  public void getSeriesTypeByPath() {
     Assert.assertEquals(
-        TSDataType.DOUBLE, SchemaUtils.getSeriesTypeByPath(measurementPath, 
SqlConstant.SUM));
+        TSDataType.DOUBLE, SchemaUtils.getSeriesTypeByPath(TSDataType.INT64, 
SqlConstant.SUM));
     Assert.assertEquals(
-        TSDataType.INT64, SchemaUtils.getSeriesTypeByPath(measurementPath, 
SqlConstant.LAST_VALUE));
+        TSDataType.INT64,
+        SchemaUtils.getSeriesTypeByPath(TSDataType.INT64, 
SqlConstant.LAST_VALUE));
   }
 
   @Test

Reply via email to