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

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


The following commit(s) were added to refs/heads/ty/TableModelGrammar by this 
push:
     new b6a2c79ddb0 Implement TODO in fe part of query engine for refactoring 
IDeviceId in PartitionFetcher
b6a2c79ddb0 is described below

commit b6a2c79ddb083efaeca4f6d6dc2211a5c59092e0
Author: Jackie Tien <[email protected]>
AuthorDate: Wed Jun 26 18:07:27 2024 +0800

    Implement TODO in fe part of query engine for refactoring IDeviceId in 
PartitionFetcher
---
 .../operator/process/DeviceViewOperator.java       |   9 +-
 .../db/queryengine/plan/analyze/Analysis.java      |  70 ++++-----
 .../queryengine/plan/analyze/AnalyzeVisitor.java   | 159 +++++++++++----------
 .../queryengine/plan/analyze/TemplatedAnalyze.java |   9 +-
 .../plan/optimization/AggregationPushDown.java     |  14 +-
 .../plan/planner/LogicalPlanBuilder.java           |  28 ++--
 .../plan/planner/LogicalPlanVisitor.java           |  21 +--
 .../plan/planner/OperatorTreeGenerator.java        |   2 +-
 .../plan/planner/TemplatedLogicalPlan.java         |  15 +-
 .../plan/planner/distribution/SourceRewriter.java  |  29 ++--
 .../planner/plan/node/process/DeviceViewNode.java  |  50 +++----
 .../plan/node/process/SingleDeviceViewNode.java    |  27 ++--
 .../execution/operator/DeviceViewOperatorTest.java |   8 +-
 .../execution/operator/MergeSortOperatorTest.java  |  12 +-
 .../execution/operator/OperatorMemoryTest.java     |  10 +-
 .../execution/operator/TopKOperatorTest.java       |  12 +-
 .../db/queryengine/plan/analyze/AnalyzeTest.java   |  56 ++++----
 .../plan/optimization/TestPlanBuilder.java         |  19 ++-
 .../plan/planner/PipelineBuilderTest.java          |   3 +-
 .../logical/DataQueryLogicalPlannerTest.java       |  43 ++++--
 .../plan/planner/node/PlanGraphPrinterTest.java    |   3 +-
 .../node/process/DeviceViewNodeSerdeTest.java      |   7 +-
 .../process/SingleDeviceViewNodeSerdeTest.java     |   3 +-
 .../apache/iotdb/commons/path/PathPatternTree.java |   4 +-
 .../org/apache/iotdb/commons/utils/PathUtils.java  |   4 +-
 25 files changed, 337 insertions(+), 280 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/DeviceViewOperator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/DeviceViewOperator.java
index a3e5ef242f7..cd0fdcb5a50 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/DeviceViewOperator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/DeviceViewOperator.java
@@ -29,6 +29,7 @@ import org.apache.tsfile.block.column.ColumnBuilder;
 import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.common.conf.TSFileDescriptor;
 import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.read.common.block.TsBlock;
 import org.apache.tsfile.read.common.block.column.BinaryColumnBuilder;
 import org.apache.tsfile.read.common.block.column.NullColumn;
@@ -57,7 +58,7 @@ public class DeviceViewOperator implements ProcessOperator {
       RamUsageEstimator.shallowSizeOfInstance(DeviceViewOperator.class);
   private final OperatorContext operatorContext;
   // The size devices and deviceOperators should be the same.
-  private final List<String> devices;
+  private final List<IDeviceID> devices;
   private final List<Operator> deviceOperators;
   // Used to fill columns and leave null columns which doesn't exist in some 
devices.
   // e.g. [s1,s2,s3] is query, but [s1, s3] exists in device1, then device1 -> 
[1, 3], s1 is 1 but
@@ -70,7 +71,7 @@ public class DeviceViewOperator implements ProcessOperator {
 
   public DeviceViewOperator(
       OperatorContext operatorContext,
-      List<String> devices,
+      List<IDeviceID> devices,
       List<Operator> deviceOperators,
       List<List<Integer>> deviceColumnIndex,
       List<TSDataType> dataTypes) {
@@ -84,7 +85,7 @@ public class DeviceViewOperator implements ProcessOperator {
   }
 
   private String getCurDeviceName() {
-    return devices.get(deviceIndex);
+    return devices.get(deviceIndex).toString();
   }
 
   private Operator getCurDeviceOperator() {
@@ -199,7 +200,7 @@ public class DeviceViewOperator implements ProcessOperator {
   public long ramBytesUsed() {
     return INSTANCE_SIZE
         + 
MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(operatorContext)
-        + devices.stream().mapToLong(RamUsageEstimator::sizeOf).sum()
+        + devices.stream().mapToLong(IDeviceID::ramBytesUsed).sum()
         + deviceOperators.stream()
             
.mapToLong(MemoryEstimationHelper::getEstimatedSizeOfAccountableObject)
             .sum();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
index beb5cf6989f..ecf99c7b383 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
@@ -149,39 +149,39 @@ public class Analysis implements IAnalysis {
   private List<PartialPath> deviceList;
 
   // map from device name to series/aggregation under this device
-  private Map<String, Set<Expression>> deviceToSourceExpressions;
+  private Map<IDeviceID, Set<Expression>> deviceToSourceExpressions;
 
   // input expressions of aggregations to be calculated
-  private Map<String, Set<Expression>> deviceToSourceTransformExpressions = 
new HashMap<>();
+  private Map<IDeviceID, Set<Expression>> deviceToSourceTransformExpressions = 
new HashMap<>();
 
   // map from device name to query filter under this device
-  private Map<String, Expression> deviceToWhereExpression;
+  private Map<IDeviceID, Expression> deviceToWhereExpression;
 
   // all aggregations that need to be calculated
-  private Map<String, Set<Expression>> deviceToAggregationExpressions = new 
HashMap<>();
+  private Map<IDeviceID, Set<Expression>> deviceToAggregationExpressions = new 
HashMap<>();
 
   // expression of output column to be calculated
-  private Map<String, Set<Expression>> deviceToSelectExpressions;
+  private Map<IDeviceID, Set<Expression>> deviceToSelectExpressions;
 
   // expression of group by that need to be calculated
-  private Map<String, Expression> deviceToGroupByExpression;
+  private Map<IDeviceID, Expression> deviceToGroupByExpression;
 
   // expression of order by that need to be calculated
-  private Map<String, Set<Expression>> deviceToOrderByExpressions;
+  private Map<IDeviceID, Set<Expression>> deviceToOrderByExpressions;
 
   // the sortItems used in order by push down of align by device
-  private Map<String, List<SortItem>> deviceToSortItems;
+  private Map<IDeviceID, List<SortItem>> deviceToSortItems;
 
   // e.g. [s1,s2,s3] is query, but [s1, s3] exists in device1, then device1 -> 
[1, 3], s1 is 1 but
   // not 0 because device is the first column
-  private Map<String, List<Integer>> deviceViewInputIndexesMap;
+  private Map<IDeviceID, List<Integer>> deviceViewInputIndexesMap;
 
   private Set<Expression> deviceViewOutputExpressions;
 
-  private Map<String, Set<Expression>> deviceToOutputExpressions = new 
HashMap<>();
+  private Map<IDeviceID, Set<Expression>> deviceToOutputExpressions = new 
HashMap<>();
 
   // map from output device name to queried devices
-  private Map<String, String> outputDeviceToQueriedDevicesMap;
+  private Map<IDeviceID, IDeviceID> outputDeviceToQueriedDevicesMap;
 
   // indicates whether DeviceView need special process when rewriteSource in 
DistributionPlan,
   // you can see SourceRewriter#visitDeviceView to get more information
@@ -536,11 +536,11 @@ public class Analysis implements IAnalysis {
     this.whereExpression = whereExpression;
   }
 
-  public Map<String, Expression> getDeviceToWhereExpression() {
+  public Map<IDeviceID, Expression> getDeviceToWhereExpression() {
     return deviceToWhereExpression;
   }
 
-  public void setDeviceToWhereExpression(Map<String, Expression> 
deviceToWhereExpression) {
+  public void setDeviceToWhereExpression(Map<IDeviceID, Expression> 
deviceToWhereExpression) {
     this.deviceToWhereExpression = deviceToWhereExpression;
   }
 
@@ -594,11 +594,12 @@ public class Analysis implements IAnalysis {
     this.failStatus = status;
   }
 
-  public void setDeviceViewInputIndexesMap(Map<String, List<Integer>> 
deviceViewInputIndexesMap) {
+  public void setDeviceViewInputIndexesMap(
+      Map<IDeviceID, List<Integer>> deviceViewInputIndexesMap) {
     this.deviceViewInputIndexesMap = deviceViewInputIndexesMap;
   }
 
-  public Map<String, List<Integer>> getDeviceViewInputIndexesMap() {
+  public Map<IDeviceID, List<Integer>> getDeviceViewInputIndexesMap() {
     return deviceViewInputIndexesMap;
   }
 
@@ -634,37 +635,39 @@ public class Analysis implements IAnalysis {
     this.selectExpressions = selectExpressions;
   }
 
-  public Map<String, Set<Expression>> getDeviceToSourceExpressions() {
+  public Map<IDeviceID, Set<Expression>> getDeviceToSourceExpressions() {
     return deviceToSourceExpressions;
   }
 
-  public void setDeviceToSourceExpressions(Map<String, Set<Expression>> 
deviceToSourceExpressions) {
+  public void setDeviceToSourceExpressions(
+      Map<IDeviceID, Set<Expression>> deviceToSourceExpressions) {
     this.deviceToSourceExpressions = deviceToSourceExpressions;
   }
 
-  public Map<String, Set<Expression>> getDeviceToSourceTransformExpressions() {
+  public Map<IDeviceID, Set<Expression>> 
getDeviceToSourceTransformExpressions() {
     return deviceToSourceTransformExpressions;
   }
 
   public void setDeviceToSourceTransformExpressions(
-      Map<String, Set<Expression>> deviceToSourceTransformExpressions) {
+      Map<IDeviceID, Set<Expression>> deviceToSourceTransformExpressions) {
     this.deviceToSourceTransformExpressions = 
deviceToSourceTransformExpressions;
   }
 
-  public Map<String, Set<Expression>> getDeviceToAggregationExpressions() {
+  public Map<IDeviceID, Set<Expression>> getDeviceToAggregationExpressions() {
     return deviceToAggregationExpressions;
   }
 
   public void setDeviceToAggregationExpressions(
-      Map<String, Set<Expression>> deviceToAggregationExpressions) {
+      Map<IDeviceID, Set<Expression>> deviceToAggregationExpressions) {
     this.deviceToAggregationExpressions = deviceToAggregationExpressions;
   }
 
-  public Map<String, Set<Expression>> getDeviceToSelectExpressions() {
+  public Map<IDeviceID, Set<Expression>> getDeviceToSelectExpressions() {
     return deviceToSelectExpressions;
   }
 
-  public void setDeviceToSelectExpressions(Map<String, Set<Expression>> 
deviceToSelectExpressions) {
+  public void setDeviceToSelectExpressions(
+      Map<IDeviceID, Set<Expression>> deviceToSelectExpressions) {
     this.deviceToSelectExpressions = deviceToSelectExpressions;
   }
 
@@ -676,11 +679,11 @@ public class Analysis implements IAnalysis {
     this.groupByExpression = groupByExpression;
   }
 
-  public Map<String, Expression> getDeviceToGroupByExpression() {
+  public Map<IDeviceID, Expression> getDeviceToGroupByExpression() {
     return deviceToGroupByExpression;
   }
 
-  public void setDeviceToGroupByExpression(Map<String, Expression> 
deviceToGroupByExpression) {
+  public void setDeviceToGroupByExpression(Map<IDeviceID, Expression> 
deviceToGroupByExpression) {
     this.deviceToGroupByExpression = deviceToGroupByExpression;
   }
 
@@ -822,12 +825,12 @@ public class Analysis implements IAnalysis {
     return orderByExpressions;
   }
 
-  public Map<String, Set<Expression>> getDeviceToOrderByExpressions() {
+  public Map<IDeviceID, Set<Expression>> getDeviceToOrderByExpressions() {
     return deviceToOrderByExpressions;
   }
 
   public void setDeviceToOrderByExpressions(
-      Map<String, Set<Expression>> deviceToOrderByExpressions) {
+      Map<IDeviceID, Set<Expression>> deviceToOrderByExpressions) {
     this.deviceToOrderByExpressions = deviceToOrderByExpressions;
   }
 
@@ -839,11 +842,11 @@ public class Analysis implements IAnalysis {
     return hasSortNode;
   }
 
-  public Map<String, List<SortItem>> getDeviceToSortItems() {
+  public Map<IDeviceID, List<SortItem>> getDeviceToSortItems() {
     return deviceToSortItems;
   }
 
-  public void setDeviceToSortItems(Map<String, List<SortItem>> 
deviceToSortItems) {
+  public void setDeviceToSortItems(Map<IDeviceID, List<SortItem>> 
deviceToSortItems) {
     this.deviceToSortItems = deviceToSortItems;
   }
 
@@ -892,20 +895,21 @@ public class Analysis implements IAnalysis {
     this.lastQueryNonWritableViewSourceExpressionMap = 
lastQueryNonWritableViewSourceExpressionMap;
   }
 
-  public Map<String, String> getOutputDeviceToQueriedDevicesMap() {
+  public Map<IDeviceID, IDeviceID> getOutputDeviceToQueriedDevicesMap() {
     return outputDeviceToQueriedDevicesMap;
   }
 
   public void setOutputDeviceToQueriedDevicesMap(
-      Map<String, String> outputDeviceToQueriedDevicesMap) {
+      Map<IDeviceID, IDeviceID> outputDeviceToQueriedDevicesMap) {
     this.outputDeviceToQueriedDevicesMap = outputDeviceToQueriedDevicesMap;
   }
 
-  public Map<String, Set<Expression>> getDeviceToOutputExpressions() {
+  public Map<IDeviceID, Set<Expression>> getDeviceToOutputExpressions() {
     return deviceToOutputExpressions;
   }
 
-  public void setDeviceToOutputExpressions(Map<String, Set<Expression>> 
deviceToOutputExpressions) {
+  public void setDeviceToOutputExpressions(
+      Map<IDeviceID, Set<Expression>> deviceToOutputExpressions) {
     this.deviceToOutputExpressions = deviceToOutputExpressions;
   }
 
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 b94d0d75e0a..bde673ae36a 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
@@ -155,7 +155,6 @@ import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.thrift.TException;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.file.metadata.IDeviceID;
-import org.apache.tsfile.file.metadata.IDeviceID.Factory;
 import org.apache.tsfile.read.common.TimeRange;
 import org.apache.tsfile.read.filter.basic.Filter;
 import org.apache.tsfile.utils.Pair;
@@ -733,7 +732,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       List<PartialPath> deviceList,
       MPPQueryContext queryContext) {
     List<Pair<Expression, String>> outputExpressions = new ArrayList<>();
-    Map<String, Set<Expression>> deviceToSelectExpressions = new HashMap<>();
+    Map<IDeviceID, Set<Expression>> deviceToSelectExpressions = new 
HashMap<>();
     ColumnPaginationController paginationController =
         new ColumnPaginationController(
             queryStatement.getSeriesLimit(), queryStatement.getSeriesOffset());
@@ -743,7 +742,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
 
       // select expression after removing wildcard
       // use LinkedHashMap for order-preserving
-      Map<Expression, Map<String, Expression>> 
measurementToDeviceSelectExpressions =
+      Map<Expression, Map<IDeviceID, Expression>> 
measurementToDeviceSelectExpressions =
           new LinkedHashMap<>();
       for (PartialPath device : deviceList) {
         List<Expression> selectExpressionsOfOneDevice =
@@ -754,15 +753,18 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
         }
 
         updateMeasurementToDeviceSelectExpressions(
-            analysis, measurementToDeviceSelectExpressions, device, 
selectExpressionsOfOneDevice);
+            analysis,
+            measurementToDeviceSelectExpressions,
+            device.getIDeviceIDAsFullDevice(),
+            selectExpressionsOfOneDevice);
       }
 
       checkAliasUniqueness(resultColumn.getAlias(), 
measurementToDeviceSelectExpressions);
 
-      for (Map.Entry<Expression, Map<String, Expression>> entry :
+      for (Map.Entry<Expression, Map<IDeviceID, Expression>> entry :
           measurementToDeviceSelectExpressions.entrySet()) {
         Expression measurementExpression = entry.getKey();
-        Map<String, Expression> deviceToSelectExpressionsOfOneMeasurement = 
entry.getValue();
+        Map<IDeviceID, Expression> deviceToSelectExpressionsOfOneMeasurement = 
entry.getValue();
 
         if (paginationController.hasCurOffset()) {
           paginationController.consumeOffset();
@@ -802,7 +804,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     // remove devices without measurements to compute
     Set<PartialPath> noMeasurementDevices = new HashSet<>();
     for (PartialPath device : deviceList) {
-      if (!deviceToSelectExpressions.containsKey(device.getFullPath())) {
+      if 
(!deviceToSelectExpressions.containsKey(device.getIDeviceIDAsFullDevice())) {
         noMeasurementDevices.add(device);
       }
     }
@@ -812,7 +814,8 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     // the where expression map also need remove this device
     if (analysis.getDeviceToWhereExpression() != null) {
       noMeasurementDevices.forEach(
-          devicePath -> 
analysis.getDeviceToWhereExpression().remove(devicePath.getFullPath()));
+          devicePath ->
+              
analysis.getDeviceToWhereExpression().remove(devicePath.getIDeviceIDAsFullDevice()));
     }
 
     Set<Expression> selectExpressions = new LinkedHashSet<>();
@@ -830,32 +833,32 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
 
   private void updateMeasurementToDeviceSelectExpressions(
       Analysis analysis,
-      Map<Expression, Map<String, Expression>> 
measurementToDeviceSelectExpressions,
-      PartialPath device,
+      Map<Expression, Map<IDeviceID, Expression>> 
measurementToDeviceSelectExpressions,
+      IDeviceID device,
       List<Expression> selectExpressionsOfOneDevice) {
     for (Expression expression : selectExpressionsOfOneDevice) {
       Expression measurementExpression =
           ExpressionAnalyzer.getMeasurementExpression(expression, analysis);
       measurementToDeviceSelectExpressions
           .computeIfAbsent(measurementExpression, key -> new LinkedHashMap<>())
-          .put(device.getFullPath(), 
ExpressionAnalyzer.toLowerCaseExpression(expression));
+          .put(device, ExpressionAnalyzer.toLowerCaseExpression(expression));
     }
   }
 
   private void updateDeviceToSelectExpressions(
       Analysis analysis,
-      Map<String, Set<Expression>> deviceToSelectExpressions,
-      Map<String, Expression> deviceToSelectExpressionsOfOneMeasurement) {
+      Map<IDeviceID, Set<Expression>> deviceToSelectExpressions,
+      Map<IDeviceID, Expression> deviceToSelectExpressionsOfOneMeasurement) {
 
-    for (Map.Entry<String, Expression> entry :
+    for (Map.Entry<IDeviceID, Expression> entry :
         deviceToSelectExpressionsOfOneMeasurement.entrySet()) {
-      String deviceName = entry.getKey();
+      IDeviceID deviceID = entry.getKey();
       Expression expression = entry.getValue();
 
       Expression lowerCaseExpression = toLowerCaseExpression(expression);
       analyzeExpressionType(analysis, lowerCaseExpression);
       deviceToSelectExpressions
-          .computeIfAbsent(deviceName, key -> new LinkedHashSet<>())
+          .computeIfAbsent(deviceID, key -> new LinkedHashSet<>())
           .add(lowerCaseExpression);
     }
   }
@@ -961,9 +964,9 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     }
 
     // two maps to be updated
-    Map<String, Set<Expression>> deviceToAggregationExpressions =
+    Map<IDeviceID, Set<Expression>> deviceToAggregationExpressions =
         analysis.getDeviceToAggregationExpressions();
-    Map<String, Set<Expression>> deviceToOutputExpressions =
+    Map<IDeviceID, Set<Expression>> deviceToOutputExpressions =
         analysis.getDeviceToOutputExpressions();
 
     Expression havingExpression = 
queryStatement.getHavingCondition().getPredicate();
@@ -992,10 +995,10 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
           
normalizedAggregationExpressions.add(normalizedAggregationExpression);
         }
         deviceToOutputExpressions
-            .computeIfAbsent(device.getFullPath(), key -> new 
LinkedHashSet<>())
+            .computeIfAbsent(device.getIDeviceIDAsFullDevice(), key -> new 
LinkedHashSet<>())
             .addAll(aggregationExpressions);
         deviceToAggregationExpressions
-            .computeIfAbsent(device.getFullPath(), key -> new 
LinkedHashSet<>())
+            .computeIfAbsent(device.getIDeviceID(), key -> new 
LinkedHashSet<>())
             .addAll(normalizedAggregationExpressions);
       }
     }
@@ -1123,16 +1126,16 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   }
 
   private void updateDeviceToAggregationAndOutputExpressions(
-      Analysis analysis, Map<String, Set<Expression>> deviceToExpressions) {
+      Analysis analysis, Map<IDeviceID, Set<Expression>> deviceToExpressions) {
     // two maps to be updated
-    Map<String, Set<Expression>> deviceToAggregationExpressions =
+    Map<IDeviceID, Set<Expression>> deviceToAggregationExpressions =
         analysis.getDeviceToAggregationExpressions();
-    Map<String, Set<Expression>> deviceToOutputExpressions =
+    Map<IDeviceID, Set<Expression>> deviceToOutputExpressions =
         analysis.getDeviceToOutputExpressions();
 
-    for (Map.Entry<String, Set<Expression>> deviceExpressionsEntry :
+    for (Map.Entry<IDeviceID, Set<Expression>> deviceExpressionsEntry :
         deviceToExpressions.entrySet()) {
-      String deviceName = deviceExpressionsEntry.getKey();
+      IDeviceID deviceID = deviceExpressionsEntry.getKey();
       Set<Expression> expressionSet = deviceExpressionsEntry.getValue();
 
       for (Expression expression : expressionSet) {
@@ -1142,10 +1145,10 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
           analyzeExpressionType(analysis, normalizedAggregationExpression);
 
           deviceToOutputExpressions
-              .computeIfAbsent(deviceName, key -> new LinkedHashSet<>())
+              .computeIfAbsent(deviceID, key -> new LinkedHashSet<>())
               .add(aggregationExpression);
           deviceToAggregationExpressions
-              .computeIfAbsent(deviceName, key -> new LinkedHashSet<>())
+              .computeIfAbsent(deviceID, key -> new LinkedHashSet<>())
               .add(normalizedAggregationExpression);
         }
       }
@@ -1189,18 +1192,19 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
 
   private void analyzeDeviceToSourceTransform(Analysis analysis, 
QueryStatement queryStatement) {
     if (queryStatement.isAggregationQuery()) {
-      Map<String, Set<Expression>> deviceToSourceTransformExpressions =
+      Map<IDeviceID, Set<Expression>> deviceToSourceTransformExpressions =
           analysis.getDeviceToSourceTransformExpressions();
-      Map<String, Set<Expression>> deviceToAggregationExpressions =
+      Map<IDeviceID, Set<Expression>> deviceToAggregationExpressions =
           analysis.getDeviceToAggregationExpressions();
 
-      for (Map.Entry<String, Set<Expression>> entry : 
deviceToAggregationExpressions.entrySet()) {
-        String deviceName = entry.getKey();
+      for (Map.Entry<IDeviceID, Set<Expression>> entry :
+          deviceToAggregationExpressions.entrySet()) {
+        IDeviceID deviceID = entry.getKey();
         Set<Expression> aggregationExpressions = entry.getValue();
 
         Set<Expression> sourceTransformExpressions =
             deviceToSourceTransformExpressions.computeIfAbsent(
-                deviceName, k -> new LinkedHashSet<>());
+                deviceID, k -> new LinkedHashSet<>());
 
         for (Expression expression : aggregationExpressions) {
           // if count_time aggregation exist, it can exist only one 
count_time(*)
@@ -1224,7 +1228,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
         }
 
         if (queryStatement.hasGroupByExpression()) {
-          
sourceTransformExpressions.add(analysis.getDeviceToGroupByExpression().get(deviceName));
+          
sourceTransformExpressions.add(analysis.getDeviceToGroupByExpression().get(deviceID));
         }
       }
     } else {
@@ -1238,16 +1242,16 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   }
 
   private void updateDeviceToSourceTransformAndOutputExpressions(
-      Analysis analysis, Map<String, Set<Expression>> deviceToExpressions) {
+      Analysis analysis, Map<IDeviceID, Set<Expression>> deviceToExpressions) {
     // two maps to be updated
-    Map<String, Set<Expression>> deviceToSourceTransformExpressions =
+    Map<IDeviceID, Set<Expression>> deviceToSourceTransformExpressions =
         analysis.getDeviceToSourceTransformExpressions();
-    Map<String, Set<Expression>> deviceToOutputExpressions =
+    Map<IDeviceID, Set<Expression>> deviceToOutputExpressions =
         analysis.getDeviceToOutputExpressions();
 
-    for (Map.Entry<String, Set<Expression>> deviceExpressionsEntry :
+    for (Map.Entry<IDeviceID, Set<Expression>> deviceExpressionsEntry :
         deviceToExpressions.entrySet()) {
-      String deviceName = deviceExpressionsEntry.getKey();
+      IDeviceID deviceID = deviceExpressionsEntry.getKey();
       Set<Expression> expressions = deviceExpressionsEntry.getValue();
 
       Set<Expression> normalizedExpressions = new LinkedHashSet<>();
@@ -1258,10 +1262,10 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
         normalizedExpressions.add(normalizedExpression);
       }
       deviceToOutputExpressions
-          .computeIfAbsent(deviceName, key -> new LinkedHashSet<>())
+          .computeIfAbsent(deviceID, key -> new LinkedHashSet<>())
           .addAll(expressions);
       deviceToSourceTransformExpressions
-          .computeIfAbsent(deviceName, key -> new LinkedHashSet<>())
+          .computeIfAbsent(deviceID, key -> new LinkedHashSet<>())
           .addAll(normalizedExpressions);
     }
   }
@@ -1313,12 +1317,13 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   }
 
   private void analyzeDeviceToSource(Analysis analysis, QueryStatement 
queryStatement) {
-    Map<String, Set<Expression>> deviceToSourceExpressions = new HashMap<>();
-    Map<String, Set<Expression>> deviceToSourceTransformExpressions =
+    Map<IDeviceID, Set<Expression>> deviceToSourceExpressions = new 
HashMap<>();
+    Map<IDeviceID, Set<Expression>> deviceToSourceTransformExpressions =
         analysis.getDeviceToSourceTransformExpressions();
 
-    for (Map.Entry<String, Set<Expression>> entry : 
deviceToSourceTransformExpressions.entrySet()) {
-      String deviceName = entry.getKey();
+    for (Map.Entry<IDeviceID, Set<Expression>> entry :
+        deviceToSourceTransformExpressions.entrySet()) {
+      IDeviceID deviceName = entry.getKey();
       Set<Expression> sourceTransformExpressions = entry.getValue();
 
       Set<Expression> sourceExpressions = new LinkedHashSet<>();
@@ -1329,10 +1334,10 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     }
 
     if (queryStatement.hasWhere()) {
-      Map<String, Expression> deviceToWhereExpression = 
analysis.getDeviceToWhereExpression();
-      for (Map.Entry<String, Expression> deviceWhereExpressionEntry :
+      Map<IDeviceID, Expression> deviceToWhereExpression = 
analysis.getDeviceToWhereExpression();
+      for (Map.Entry<IDeviceID, Expression> deviceWhereExpressionEntry :
           deviceToWhereExpression.entrySet()) {
-        String deviceName = deviceWhereExpressionEntry.getKey();
+        IDeviceID deviceName = deviceWhereExpressionEntry.getKey();
         Expression whereExpression = deviceWhereExpressionEntry.getValue();
         deviceToSourceExpressions
             .computeIfAbsent(deviceName, key -> new LinkedHashSet<>())
@@ -1340,16 +1345,14 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       }
     }
 
-    Map<String, String> outputDeviceToQueriedDevicesMap = new 
LinkedHashMap<>();
-    for (Map.Entry<String, Set<Expression>> entry : 
deviceToSourceExpressions.entrySet()) {
-      String deviceName = entry.getKey();
+    Map<IDeviceID, IDeviceID> outputDeviceToQueriedDevicesMap = new 
LinkedHashMap<>();
+    for (Map.Entry<IDeviceID, Set<Expression>> entry : 
deviceToSourceExpressions.entrySet()) {
+      IDeviceID deviceName = entry.getKey();
       Set<Expression> sourceExpressionsUnderDevice = entry.getValue();
-      Set<String> queriedDevices = new HashSet<>();
-      // TODO: Change outputDeviceToQueriedDevicesMap to Map<IDeviceID, 
IDeviceID> to remove
+      Set<IDeviceID> queriedDevices = new HashSet<>();
       // conversion
       for (Expression expression : sourceExpressionsUnderDevice) {
-        queriedDevices.add(
-            
ExpressionAnalyzer.getDeviceNameInSourceExpression(expression).toString());
+        
queriedDevices.add(ExpressionAnalyzer.getDeviceNameInSourceExpression(expression));
       }
       if (queriedDevices.size() > 1) {
         throw new SemanticException(
@@ -1391,7 +1394,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       return;
     }
 
-    Map<String, Expression> deviceToWhereExpression = new HashMap<>();
+    Map<IDeviceID, Expression> deviceToWhereExpression = new HashMap<>();
     Iterator<PartialPath> deviceIterator = deviceSet.iterator();
     boolean hasValueFilter = false;
     while (deviceIterator.hasNext()) {
@@ -1401,13 +1404,13 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       if (whereExpression.equals(ConstantOperand.FALSE)) {
         deviceIterator.remove();
       } else if (whereExpression.equals(ConstantOperand.TRUE)) {
-        deviceToWhereExpression.put(devicePath.getFullPath(), null);
+        deviceToWhereExpression.put(devicePath.getIDeviceIDAsFullDevice(), 
null);
       } else {
         TSDataType outputType = analyzeExpressionType(analysis, 
whereExpression);
         if (outputType != TSDataType.BOOLEAN) {
           throw new 
SemanticException(String.format(WHERE_WRONG_TYPE_ERROR_MSG, outputType));
         }
-        deviceToWhereExpression.put(devicePath.getFullPath(), whereExpression);
+        deviceToWhereExpression.put(devicePath.getIDeviceIDAsFullDevice(), 
whereExpression);
         hasValueFilter = true;
       }
     }
@@ -1523,10 +1526,10 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
             .map(Expression::getOutputSymbol)
             .collect(Collectors.toList());
 
-    Map<String, Set<String>> deviceToOutputColumnsMap = new LinkedHashMap<>();
-    Map<String, Set<Expression>> deviceToOutputExpressions =
+    Map<IDeviceID, Set<String>> deviceToOutputColumnsMap = new 
LinkedHashMap<>();
+    Map<IDeviceID, Set<Expression>> deviceToOutputExpressions =
         analysis.getDeviceToOutputExpressions();
-    for (Map.Entry<String, Set<Expression>> deviceOutputExpressionEntry :
+    for (Map.Entry<IDeviceID, Set<Expression>> deviceOutputExpressionEntry :
         deviceToOutputExpressions.entrySet()) {
       Set<Expression> outputExpressionsUnderDevice = 
deviceOutputExpressionEntry.getValue();
       checkDeviceViewInputUniqueness(outputExpressionsUnderDevice);
@@ -1541,10 +1544,10 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       deviceToOutputColumnsMap.put(deviceOutputExpressionEntry.getKey(), 
outputColumns);
     }
 
-    Map<String, List<Integer>> deviceViewInputIndexesMap = new HashMap<>();
-    for (Map.Entry<String, Set<String>> deviceOutputColumnsEntry :
+    Map<IDeviceID, List<Integer>> deviceViewInputIndexesMap = new HashMap<>();
+    for (Map.Entry<IDeviceID, Set<String>> deviceOutputColumnsEntry :
         deviceToOutputColumnsMap.entrySet()) {
-      String deviceName = deviceOutputColumnsEntry.getKey();
+      IDeviceID deviceID = deviceOutputColumnsEntry.getKey();
       List<String> outputsUnderDevice = new 
ArrayList<>(deviceOutputColumnsEntry.getValue());
 
       List<Integer> indexes = new ArrayList<>();
@@ -1554,7 +1557,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
             index >= 1, "output column '%s' is not stored in %s", output, 
deviceViewOutputColumns);
         indexes.add(index);
       }
-      deviceViewInputIndexesMap.put(deviceName, indexes);
+      deviceViewInputIndexesMap.put(deviceID, indexes);
     }
     analysis.setDeviceViewInputIndexesMap(deviceViewInputIndexesMap);
   }
@@ -1714,7 +1717,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     GroupByComponent groupByComponent = queryStatement.getGroupByComponent();
     WindowType windowType = groupByComponent.getWindowType();
 
-    Map<String, Expression> deviceToGroupByExpression = new LinkedHashMap<>();
+    Map<IDeviceID, Expression> deviceToGroupByExpression = new 
LinkedHashMap<>();
     if (queryStatement.hasGroupByExpression()) {
       Expression expression = groupByComponent.getControlColumnExpression();
       for (PartialPath device : deviceSet) {
@@ -1732,7 +1735,8 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
                   expression));
         }
         deviceToGroupByExpression.put(
-            device.getFullPath(), 
normalizeExpression(groupByExpressionsOfOneDevice.get(0)));
+            device.getIDeviceIDAsFullDevice(),
+            normalizeExpression(groupByExpressionsOfOneDevice.get(0)));
       }
     }
 
@@ -1784,8 +1788,8 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       return;
     }
 
-    Map<String, Set<Expression>> deviceToOrderByExpressions = new 
LinkedHashMap<>();
-    Map<String, List<SortItem>> deviceToSortItems = new LinkedHashMap<>();
+    Map<IDeviceID, Set<Expression>> deviceToOrderByExpressions = new 
LinkedHashMap<>();
+    Map<IDeviceID, List<SortItem>> deviceToSortItems = new LinkedHashMap<>();
     // build the device-view outputColumn for the sortNode above the 
deviceViewNode
     Set<Expression> deviceViewOrderByExpression = new LinkedHashSet<>();
     for (PartialPath device : deviceSet) {
@@ -1819,8 +1823,10 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
         orderByExpressionsForOneDevice.add(expressionForItem);
       }
       deviceToSortItems.put(
-          device.getFullPath(), 
queryStatement.getUpdatedSortItems(orderByExpressionsForOneDevice));
-      deviceToOrderByExpressions.put(device.getFullPath(), 
orderByExpressionsForOneDevice);
+          device.getIDeviceIDAsFullDevice(),
+          queryStatement.getUpdatedSortItems(orderByExpressionsForOneDevice));
+      deviceToOrderByExpressions.put(
+          device.getIDeviceIDAsFullDevice(), orderByExpressionsForOneDevice);
     }
 
     analysis.setOrderByExpressions(deviceViewOrderByExpression);
@@ -1990,12 +1996,8 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       MPPQueryContext context) {
     Set<IDeviceID> deviceSet = new HashSet<>();
     if (queryStatement.isAlignByDevice()) {
-      // TODO: change OutputDeviceToQueriedDevicesMap to Map<IDeviceID, 
IDeviceID> to remove
       // conversion
-      deviceSet =
-          analysis.getOutputDeviceToQueriedDevicesMap().values().stream()
-              .map(Factory.DEFAULT_FACTORY::create)
-              .collect(Collectors.toSet());
+      deviceSet = new 
HashSet<>(analysis.getOutputDeviceToQueriedDevicesMap().values());
     } else {
       for (Expression expression : analysis.getSourceExpressions()) {
         
deviceSet.add(ExpressionAnalyzer.getDeviceNameInSourceExpression(expression));
@@ -2298,7 +2300,8 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   }
 
   private void checkAliasUniqueness(
-      String alias, Map<Expression, Map<String, Expression>> 
measurementToDeviceSelectExpressions) {
+      String alias,
+      Map<Expression, Map<IDeviceID, Expression>> 
measurementToDeviceSelectExpressions) {
     if (alias != null && measurementToDeviceSelectExpressions.keySet().size() 
> 1) {
       throw new SemanticException(
           String.format("alias '%s' can only be matched with one time series", 
alias));
@@ -3301,7 +3304,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       return analysis;
     }
     if (!schemaNodeManagementPartition.getMatchedNode().isEmpty()
-        && 
schemaNodeManagementPartition.getSchemaPartition().getSchemaPartitionMap().size()
 == 0) {
+        && 
schemaNodeManagementPartition.getSchemaPartition().getSchemaPartitionMap().isEmpty())
 {
       analysis.setFinishQueryAfterAnalyze(true);
     }
     analysis.setMatchedNodes(schemaNodeManagementPartition.getMatchedNode());
@@ -3354,7 +3357,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       return analysis;
     }
     if (!schemaNodeManagementPartition.getMatchedNode().isEmpty()
-        && 
schemaNodeManagementPartition.getSchemaPartition().getSchemaPartitionMap().size()
 == 0) {
+        && 
schemaNodeManagementPartition.getSchemaPartition().getSchemaPartitionMap().isEmpty())
 {
       analysis.setFinishQueryAfterAnalyze(true);
     }
     analysis.setMatchedNodes(schemaNodeManagementPartition.getMatchedNode());
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 a64f54ae536..6014cd572f7 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
@@ -284,8 +284,8 @@ public class TemplatedAnalyze {
       return;
     }
 
-    Map<String, Set<Expression>> deviceToOrderByExpressions = new 
LinkedHashMap<>();
-    Map<String, List<SortItem>> deviceToSortItems = new LinkedHashMap<>();
+    Map<IDeviceID, Set<Expression>> deviceToOrderByExpressions = new 
LinkedHashMap<>();
+    Map<IDeviceID, List<SortItem>> deviceToSortItems = new LinkedHashMap<>();
     // build the device-view outputColumn for the sortNode above the 
deviceViewNode
     Set<Expression> deviceViewOrderByExpression = new LinkedHashSet<>();
     for (PartialPath device : deviceSet) {
@@ -319,8 +319,9 @@ public class TemplatedAnalyze {
         orderByExpressionsForOneDevice.add(expressionForItem);
       }
       deviceToSortItems.put(
-          device.getFullPath(), 
queryStatement.getUpdatedSortItems(orderByExpressionsForOneDevice));
-      deviceToOrderByExpressions.put(device.getFullPath(), 
orderByExpressionsForOneDevice);
+          device.getIDeviceIDAsFullDevice(),
+          queryStatement.getUpdatedSortItems(orderByExpressionsForOneDevice));
+      deviceToOrderByExpressions.put(device.getIDeviceID(), 
orderByExpressionsForOneDevice);
     }
 
     analysis.setOrderByExpressions(deviceViewOrderByExpression);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/AggregationPushDown.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/AggregationPushDown.java
index 00907e2f669..32f79e0134e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/AggregationPushDown.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/optimization/AggregationPushDown.java
@@ -62,6 +62,7 @@ import org.apache.iotdb.db.utils.SchemaUtils;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.Validate;
+import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.utils.Pair;
 import org.apache.tsfile.write.schema.IMeasurementSchema;
 
@@ -109,7 +110,7 @@ public class AggregationPushDown implements PlanOptimizer {
       }
 
       // check any of the devices
-      String device = analysis.getDeviceList().get(0).toString();
+      IDeviceID device = 
analysis.getDeviceList().get(0).getIDeviceIDAsFullDevice();
       return cannotUseStatistics(
           analysis.getDeviceToAggregationExpressions().get(device),
           analysis.getDeviceToSourceTransformExpressions().get(device));
@@ -227,7 +228,12 @@ public class AggregationPushDown implements PlanOptimizer {
     @Override
     public PlanNode visitSingleDeviceView(SingleDeviceViewNode node, 
RewriterContext context) {
       context.setCurDevice(node.getDevice());
-      context.setCurDevicePath(new PartialPath(node.getDevice().split(",")));
+      try {
+        context.setCurDevicePath(new PartialPath(node.getDevice()));
+      } catch (IllegalPathException e) {
+        throw new IllegalStateException(
+            "Should always legal here. Illegal Path is " + node.getDevice());
+      }
       PlanNode rewrittenChild = node.getChild().accept(this, context);
       node.setChild(rewrittenChild);
       return node;
@@ -639,7 +645,7 @@ public class AggregationPushDown implements PlanOptimizer {
     private final MPPQueryContext context;
     private final boolean isAlignByDevice;
 
-    private String curDevice;
+    private IDeviceID curDevice;
     private PartialPath curDevicePath;
 
     private long bytesToBeReleased = 0;
@@ -659,7 +665,7 @@ public class AggregationPushDown implements PlanOptimizer {
       return isAlignByDevice;
     }
 
-    public void setCurDevice(String curDevice) {
+    public void setCurDevice(IDeviceID curDevice) {
       this.curDevice = curDevice;
     }
 
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 23ea2f49f6f..8871329765a 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
@@ -486,9 +486,9 @@ public class LogicalPlanBuilder {
   }
 
   public LogicalPlanBuilder planDeviceView(
-      Map<String, PlanNode> deviceNameToSourceNodesMap,
+      Map<IDeviceID, PlanNode> deviceNameToSourceNodesMap,
       Set<Expression> deviceViewOutputExpressions,
-      Map<String, List<Integer>> deviceToMeasurementIndexesMap,
+      Map<IDeviceID, List<Integer>> deviceToMeasurementIndexesMap,
       Set<Expression> selectExpression,
       QueryStatement queryStatement,
       Analysis analysis) {
@@ -614,21 +614,21 @@ public class LogicalPlanBuilder {
 
   private void addSingleDeviceViewNodes(
       MultiChildProcessNode parent,
-      Map<String, PlanNode> deviceNameToSourceNodesMap,
+      Map<IDeviceID, PlanNode> deviceNameToSourceNodesMap,
       List<String> outputColumnNames,
-      Map<String, List<Integer>> deviceToMeasurementIndexesMap,
+      Map<IDeviceID, List<Integer>> deviceToMeasurementIndexesMap,
       long valueFilterLimit) {
-    for (Map.Entry<String, PlanNode> entry : 
deviceNameToSourceNodesMap.entrySet()) {
-      String deviceName = entry.getKey();
+    for (Map.Entry<IDeviceID, PlanNode> entry : 
deviceNameToSourceNodesMap.entrySet()) {
+      IDeviceID deviceID = entry.getKey();
       PlanNode subPlan = entry.getValue();
       SingleDeviceViewNode singleDeviceViewNode =
           new SingleDeviceViewNode(
               context.getQueryId().genPlanNodeId(),
               outputColumnNames,
-              deviceName,
+              deviceID,
               deviceToMeasurementIndexesMap == null
                   ? null
-                  : deviceToMeasurementIndexesMap.get(deviceName));
+                  : deviceToMeasurementIndexesMap.get(deviceID));
 
       // put LIMIT-NODE below of SingleDeviceViewNode if exists value filter
       if (valueFilterLimit > 0) {
@@ -646,8 +646,8 @@ public class LogicalPlanBuilder {
   private DeviceViewNode addDeviceViewNode(
       OrderByParameter orderByParameter,
       List<String> outputColumnNames,
-      Map<String, List<Integer>> deviceToMeasurementIndexesMap,
-      Map<String, PlanNode> deviceNameToSourceNodesMap,
+      Map<IDeviceID, List<Integer>> deviceToMeasurementIndexesMap,
+      Map<IDeviceID, PlanNode> deviceNameToSourceNodesMap,
       long valueFilterLimit) {
     DeviceViewNode deviceViewNode =
         new DeviceViewNode(
@@ -656,15 +656,15 @@ public class LogicalPlanBuilder {
             outputColumnNames,
             deviceToMeasurementIndexesMap);
 
-    for (Map.Entry<String, PlanNode> entry : 
deviceNameToSourceNodesMap.entrySet()) {
-      String deviceName = entry.getKey();
+    for (Map.Entry<IDeviceID, PlanNode> entry : 
deviceNameToSourceNodesMap.entrySet()) {
+      IDeviceID deviceID = entry.getKey();
       PlanNode subPlan = entry.getValue();
       if (valueFilterLimit > 0) {
         LimitNode limitNode =
             new LimitNode(context.getQueryId().genPlanNodeId(), subPlan, 
valueFilterLimit);
-        deviceViewNode.addChildDeviceNode(deviceName, limitNode);
+        deviceViewNode.addChildDeviceNode(deviceID, limitNode);
       } else {
-        deviceViewNode.addChildDeviceNode(deviceName, subPlan);
+        deviceViewNode.addChildDeviceNode(deviceID, subPlan);
       }
     }
     return deviceViewNode;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
index 68a3281dead..d4a46d08d44 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
@@ -89,6 +89,7 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.sys.ShowQueriesStatement;
 import org.apache.iotdb.db.schemaengine.template.Template;
 
 import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.utils.Pair;
 
 import java.util.ArrayList;
@@ -157,32 +158,32 @@ public class LogicalPlanVisitor extends 
StatementVisitor<PlanNode, MPPQueryConte
     }
 
     if (queryStatement.isAlignByDevice()) {
-      Map<String, PlanNode> deviceToSubPlanMap = new LinkedHashMap<>();
+      Map<IDeviceID, PlanNode> deviceToSubPlanMap = new LinkedHashMap<>();
       for (PartialPath device : analysis.getDeviceList()) {
-        String deviceName = device.getFullPath();
+        IDeviceID deviceID = device.getIDeviceIDAsFullDevice();
         LogicalPlanBuilder subPlanBuilder = new LogicalPlanBuilder(analysis, 
context);
         subPlanBuilder =
             subPlanBuilder.withNewRoot(
                 visitQueryBody(
                     queryStatement,
-                    analysis.getDeviceToSourceExpressions().get(deviceName),
-                    
analysis.getDeviceToSourceTransformExpressions().get(deviceName),
+                    analysis.getDeviceToSourceExpressions().get(deviceID),
+                    
analysis.getDeviceToSourceTransformExpressions().get(deviceID),
                     analysis.getDeviceToWhereExpression() != null
-                        ? analysis.getDeviceToWhereExpression().get(deviceName)
+                        ? analysis.getDeviceToWhereExpression().get(deviceID)
                         : null,
-                    
analysis.getDeviceToAggregationExpressions().get(deviceName),
+                    analysis.getDeviceToAggregationExpressions().get(deviceID),
                     analysis.getDeviceToGroupByExpression() != null
-                        ? 
analysis.getDeviceToGroupByExpression().get(deviceName)
+                        ? analysis.getDeviceToGroupByExpression().get(deviceID)
                         : null,
                     context));
         // order by device, expression, push down sortOperator
         if (queryStatement.needPushDownSort()) {
           subPlanBuilder =
               subPlanBuilder.planOrderBy(
-                  analysis.getDeviceToOrderByExpressions().get(deviceName),
-                  analysis.getDeviceToSortItems().get(deviceName));
+                  analysis.getDeviceToOrderByExpressions().get(deviceID),
+                  analysis.getDeviceToSortItems().get(deviceID));
         }
-        deviceToSubPlanMap.put(deviceName, subPlanBuilder.getRoot());
+        deviceToSubPlanMap.put(deviceID, subPlanBuilder.getRoot());
       }
 
       // convert to ALIGN BY DEVICE view
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 cd9cb23db33..71dc05861d4 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
@@ -1103,7 +1103,7 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
       throw new IllegalStateException("OutputColumTypes should not be 
null/empty");
     }
     return new SingleDeviceViewOperator(
-        operatorContext, node.getDevice(), child, deviceColumnIndex, 
outputColumnTypes);
+        operatorContext, node.getDevice().toString(), child, 
deviceColumnIndex, outputColumnTypes);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TemplatedLogicalPlan.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TemplatedLogicalPlan.java
index a0a5678c1aa..198e26e2f12 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TemplatedLogicalPlan.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TemplatedLogicalPlan.java
@@ -35,6 +35,7 @@ import org.apache.iotdb.db.utils.SchemaUtils;
 
 import org.apache.commons.lang3.Validate;
 import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.write.schema.IMeasurementSchema;
 
 import java.util.ArrayList;
@@ -254,9 +255,9 @@ public class TemplatedLogicalPlan {
     LogicalPlanBuilder planBuilder =
         new TemplatedLogicalPlanBuilder(analysis, context, measurementList, 
schemaList);
 
-    Map<String, PlanNode> deviceToSubPlanMap = new LinkedHashMap<>();
+    Map<IDeviceID, PlanNode> deviceToSubPlanMap = new LinkedHashMap<>();
     for (PartialPath devicePath : analysis.getDeviceList()) {
-      String deviceName = devicePath.getFullPath();
+      IDeviceID deviceID = devicePath.getIDeviceIDAsFullDevice();
       PlanNode rootNode = visitQueryBody(devicePath);
 
       LogicalPlanBuilder subPlanBuilder =
@@ -267,10 +268,10 @@ public class TemplatedLogicalPlan {
       if (queryStatement.needPushDownSort()) {
         subPlanBuilder =
             subPlanBuilder.planOrderBy(
-                analysis.getDeviceToOrderByExpressions().get(deviceName),
-                analysis.getDeviceToSortItems().get(deviceName));
+                analysis.getDeviceToOrderByExpressions().get(deviceID),
+                analysis.getDeviceToSortItems().get(deviceID));
       }
-      deviceToSubPlanMap.put(deviceName, subPlanBuilder.getRoot());
+      deviceToSubPlanMap.put(deviceID, subPlanBuilder.getRoot());
     }
 
     // convert to ALIGN BY DEVICE view
@@ -339,7 +340,7 @@ public class TemplatedLogicalPlan {
 
     LogicalPlanBuilder templatedPlanBuilder =
         new TemplatedLogicalPlanBuilder(analysis, context, measurementList, 
schemaList);
-    Map<String, PlanNode> deviceToSubPlanMap = new LinkedHashMap<>();
+    Map<IDeviceID, PlanNode> deviceToSubPlanMap = new LinkedHashMap<>();
     aggregationDescriptorList = 
getDeduplicatedDescriptors(aggregationDescriptorList);
 
     boolean needCheckAscending = queryStatement.isGroupByTime();
@@ -358,7 +359,7 @@ public class TemplatedLogicalPlan {
     
context.getTypeProvider().getTemplatedInfo().setDescendingDescriptorList(descendingDescriptors);
 
     for (PartialPath devicePath : analysis.getDeviceList()) {
-      String deviceName = devicePath.getFullPath();
+      IDeviceID deviceName = devicePath.getIDeviceID();
       PlanNode rootNode = visitDeviceAggregationBody(devicePath);
 
       LogicalPlanBuilder subPlanBuilder =
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java
index b0337db3022..f0e13456d5d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java
@@ -81,7 +81,7 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.component.SortItem;
 import org.apache.iotdb.db.utils.constant.SqlConstant;
 
 import org.apache.tsfile.enums.TSDataType;
-import org.apache.tsfile.file.metadata.IDeviceID.Factory;
+import org.apache.tsfile.file.metadata.IDeviceID;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -151,17 +151,13 @@ public class SourceRewriter extends 
BaseSourceRewriter<DistributionPlanContext>
       return Collections.singletonList(node);
     }
 
-    String device = node.getDevice();
-    // TODO: remove conversion for device and OutputDeviceToQueriedDevicesMap
+    IDeviceID device = node.getDevice();
     List<TRegionReplicaSet> regionReplicaSets =
         !analysis.useLogicalView()
-            ? new ArrayList<>(
-                analysis.getPartitionInfo(
-                    Factory.DEFAULT_FACTORY.create(device), 
context.getPartitionTimeFilter()))
+            ? new ArrayList<>(analysis.getPartitionInfo(device, 
context.getPartitionTimeFilter()))
             : new ArrayList<>(
                 analysis.getPartitionInfo(
-                    Factory.DEFAULT_FACTORY.create(
-                        
analysis.getOutputDeviceToQueriedDevicesMap().get(device)),
+                    analysis.getOutputDeviceToQueriedDevicesMap().get(device),
                     context.getPartitionTimeFilter()));
 
     List<PlanNode> singleDeviceViewList = new ArrayList<>();
@@ -200,19 +196,16 @@ public class SourceRewriter extends 
BaseSourceRewriter<DistributionPlanContext>
     boolean existDeviceCrossRegion = false;
 
     for (int i = 0; i < node.getDevices().size(); i++) {
-      String outputDevice = node.getDevices().get(i);
+      IDeviceID outputDevice = node.getDevices().get(i);
       PlanNode child = node.getChildren().get(i);
       List<TRegionReplicaSet> regionReplicaSets =
           analysis.useLogicalView()
               ? new ArrayList<>(
                   analysis.getPartitionInfo(
-                      Factory.DEFAULT_FACTORY.create(
-                          
analysis.getOutputDeviceToQueriedDevicesMap().get(outputDevice)),
+                      
analysis.getOutputDeviceToQueriedDevicesMap().get(outputDevice),
                       context.getPartitionTimeFilter()))
               : new ArrayList<>(
-                  analysis.getPartitionInfo(
-                      Factory.DEFAULT_FACTORY.create(outputDevice),
-                      context.getPartitionTimeFilter()));
+                  analysis.getPartitionInfo(outputDevice, 
context.getPartitionTimeFilter()));
       if (regionReplicaSets.size() > 1 && !existDeviceCrossRegion) {
         existDeviceCrossRegion = true;
         if (analysis.isDeviceViewSpecialProcess() && 
aggregationCannotUseMergeSort()) {
@@ -284,7 +277,7 @@ public class SourceRewriter extends 
BaseSourceRewriter<DistributionPlanContext>
                 : Collections.singletonList(newIdxSum++));
       }
 
-      for (String device : node.getDevices()) {
+      for (IDeviceID device : node.getDevices()) {
         List<Integer> oldMeasurementIdxList = 
node.getDeviceToMeasurementIndexesMap().get(device);
         List<Integer> newMeasurementIdxList = new ArrayList<>();
         oldMeasurementIdxList.forEach(
@@ -348,7 +341,7 @@ public class SourceRewriter extends 
BaseSourceRewriter<DistributionPlanContext>
       DeviceViewNode node,
       DistributionPlanContext context) {
     for (TRegionReplicaSet regionReplicaSet : relatedDataRegions) {
-      List<String> devices = new ArrayList<>();
+      List<IDeviceID> devices = new ArrayList<>();
       List<PlanNode> children = new ArrayList<>();
       for (DeviceViewSplit split : deviceViewSplits) {
         if (split.needDistributeTo(regionReplicaSet)) {
@@ -1774,12 +1767,12 @@ public class SourceRewriter extends 
BaseSourceRewriter<DistributionPlanContext>
   }
 
   private static class DeviceViewSplit {
-    protected String device;
+    protected IDeviceID device;
     protected PlanNode root;
     protected Set<TRegionReplicaSet> dataPartitions;
 
     protected DeviceViewSplit(
-        String device, PlanNode root, List<TRegionReplicaSet> dataPartitions) {
+        IDeviceID device, PlanNode root, List<TRegionReplicaSet> 
dataPartitions) {
       this.device = device;
       this.root = root;
       this.dataPartitions = new HashSet<>();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/process/DeviceViewNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/process/DeviceViewNode.java
index b6114e1f127..5f501b4c9ae 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/process/DeviceViewNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/process/DeviceViewNode.java
@@ -25,6 +25,7 @@ import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeType;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.OrderByParameter;
 
+import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.utils.ReadWriteIOUtils;
 
 import java.io.DataOutputStream;
@@ -51,20 +52,20 @@ public class DeviceViewNode extends MultiChildProcessNode {
   private final OrderByParameter mergeOrderParameter;
 
   // The size devices and children should be the same.
-  private final List<String> devices = new ArrayList<>();
+  private final List<IDeviceID> devices = new ArrayList<>();
 
   // Device column and measurement columns in result output
   private List<String> outputColumnNames;
 
   // e.g. [s1,s2,s3] is query, but [s1, s3] exists in device1, then device1 -> 
[1, 3], s1 is 1 but
   // not 0 because device is the first column
-  private final Map<String, List<Integer>> deviceToMeasurementIndexesMap;
+  private final Map<IDeviceID, List<Integer>> deviceToMeasurementIndexesMap;
 
   public DeviceViewNode(
       PlanNodeId id,
       OrderByParameter mergeOrderParameter,
       List<String> outputColumnNames,
-      Map<String, List<Integer>> deviceToMeasurementIndexesMap) {
+      Map<IDeviceID, List<Integer>> deviceToMeasurementIndexesMap) {
     super(id);
     this.mergeOrderParameter = mergeOrderParameter;
     this.outputColumnNames = outputColumnNames;
@@ -75,8 +76,8 @@ public class DeviceViewNode extends MultiChildProcessNode {
       PlanNodeId id,
       OrderByParameter mergeOrderParameter,
       List<String> outputColumnNames,
-      List<String> devices,
-      Map<String, List<Integer>> deviceToMeasurementIndexesMap) {
+      List<IDeviceID> devices,
+      Map<IDeviceID, List<Integer>> deviceToMeasurementIndexesMap) {
     super(id);
     this.mergeOrderParameter = mergeOrderParameter;
     this.outputColumnNames = outputColumnNames;
@@ -84,16 +85,16 @@ public class DeviceViewNode extends MultiChildProcessNode {
     this.deviceToMeasurementIndexesMap = deviceToMeasurementIndexesMap;
   }
 
-  public void addChildDeviceNode(String deviceName, PlanNode childNode) {
+  public void addChildDeviceNode(IDeviceID deviceName, PlanNode childNode) {
     this.devices.add(deviceName);
     this.children.add(childNode);
   }
 
-  public List<String> getDevices() {
+  public List<IDeviceID> getDevices() {
     return devices;
   }
 
-  public Map<String, List<Integer>> getDeviceToMeasurementIndexesMap() {
+  public Map<IDeviceID, List<Integer>> getDeviceToMeasurementIndexesMap() {
     return deviceToMeasurementIndexesMap;
   }
 
@@ -139,12 +140,12 @@ public class DeviceViewNode extends MultiChildProcessNode 
{
       ReadWriteIOUtils.write(column, byteBuffer);
     }
     ReadWriteIOUtils.write(devices.size(), byteBuffer);
-    for (String deviceName : devices) {
-      ReadWriteIOUtils.write(deviceName, byteBuffer);
+    for (IDeviceID deviceName : devices) {
+      deviceName.serialize(byteBuffer);
     }
     ReadWriteIOUtils.write(deviceToMeasurementIndexesMap.size(), byteBuffer);
-    for (Map.Entry<String, List<Integer>> entry : 
deviceToMeasurementIndexesMap.entrySet()) {
-      ReadWriteIOUtils.write(entry.getKey(), byteBuffer);
+    for (Map.Entry<IDeviceID, List<Integer>> entry : 
deviceToMeasurementIndexesMap.entrySet()) {
+      entry.getKey().serialize(byteBuffer);
       ReadWriteIOUtils.write(entry.getValue().size(), byteBuffer);
       for (Integer index : entry.getValue()) {
         ReadWriteIOUtils.write(index, byteBuffer);
@@ -161,12 +162,12 @@ public class DeviceViewNode extends MultiChildProcessNode 
{
       ReadWriteIOUtils.write(column, stream);
     }
     ReadWriteIOUtils.write(devices.size(), stream);
-    for (String deviceName : devices) {
-      ReadWriteIOUtils.write(deviceName, stream);
+    for (IDeviceID deviceName : devices) {
+      deviceName.serialize(stream);
     }
     ReadWriteIOUtils.write(deviceToMeasurementIndexesMap.size(), stream);
-    for (Map.Entry<String, List<Integer>> entry : 
deviceToMeasurementIndexesMap.entrySet()) {
-      ReadWriteIOUtils.write(entry.getKey(), stream);
+    for (Map.Entry<IDeviceID, List<Integer>> entry : 
deviceToMeasurementIndexesMap.entrySet()) {
+      entry.getKey().serialize(stream);
       ReadWriteIOUtils.write(entry.getValue().size(), stream);
       for (Integer index : entry.getValue()) {
         ReadWriteIOUtils.write(index, stream);
@@ -185,16 +186,17 @@ public class DeviceViewNode extends MultiChildProcessNode 
{
     }
 
     int devicesSize = ReadWriteIOUtils.readInt(byteBuffer);
-    List<String> devices = new ArrayList<>();
+    List<IDeviceID> devices = new ArrayList<>();
     while (devicesSize > 0) {
-      devices.add(ReadWriteIOUtils.readString(byteBuffer));
+      
devices.add(IDeviceID.Deserializer.DEFAULT_DESERIALIZER.deserializeFrom(byteBuffer));
       devicesSize--;
     }
 
     int mapSize = ReadWriteIOUtils.readInt(byteBuffer);
-    Map<String, List<Integer>> deviceToMeasurementIndexesMap = new 
HashMap<>(mapSize);
+    Map<IDeviceID, List<Integer>> deviceToMeasurementIndexesMap = new 
HashMap<>(mapSize);
     while (mapSize > 0) {
-      String deviceName = ReadWriteIOUtils.readString(byteBuffer);
+      IDeviceID deviceName =
+          
IDeviceID.Deserializer.DEFAULT_DESERIALIZER.deserializeFrom(byteBuffer);
       int listSize = ReadWriteIOUtils.readInt(byteBuffer);
       List<Integer> indexes = new ArrayList<>(listSize);
       while (listSize > 0) {
@@ -216,8 +218,8 @@ public class DeviceViewNode extends MultiChildProcessNode {
     id.serialize(stream);
     mergeOrderParameter.serializeAttributes(stream);
     ReadWriteIOUtils.write(devices.size(), stream);
-    for (String deviceName : devices) {
-      ReadWriteIOUtils.write(deviceName, stream);
+    for (IDeviceID deviceName : devices) {
+      deviceName.serialize(stream);
     }
 
     ReadWriteIOUtils.write(getChildren().size(), stream);
@@ -232,9 +234,9 @@ public class DeviceViewNode extends MultiChildProcessNode {
     OrderByParameter mergeOrderParameter = 
OrderByParameter.deserialize(byteBuffer);
 
     int devicesSize = ReadWriteIOUtils.readInt(byteBuffer);
-    List<String> devices = new ArrayList<>(devicesSize);
+    List<IDeviceID> devices = new ArrayList<>(devicesSize);
     while (devicesSize > 0) {
-      devices.add(ReadWriteIOUtils.readString(byteBuffer));
+      
devices.add(IDeviceID.Deserializer.DEFAULT_DESERIALIZER.deserializeFrom(byteBuffer));
       devicesSize--;
     }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/process/SingleDeviceViewNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/process/SingleDeviceViewNode.java
index 263223c5d5c..f43679f68bf 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/process/SingleDeviceViewNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/process/SingleDeviceViewNode.java
@@ -24,6 +24,7 @@ import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeType;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor;
 
+import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.utils.ReadWriteIOUtils;
 
 import java.io.DataOutputStream;
@@ -35,7 +36,7 @@ import java.util.Objects;
 
 public class SingleDeviceViewNode extends SingleChildProcessNode {
 
-  private final String device;
+  private final IDeviceID device;
 
   // To reduce memory cost, SingleDeviceViewNode doesn't serialize and 
deserialize
   // outputColumnNames.It just rebuilds using the infos from parent node.
@@ -48,7 +49,7 @@ public class SingleDeviceViewNode extends 
SingleChildProcessNode {
   public SingleDeviceViewNode(
       PlanNodeId id,
       List<String> outputColumnNames,
-      String device,
+      IDeviceID device,
       List<Integer> deviceToMeasurementIndexes) {
     super(id);
     this.device = device;
@@ -60,7 +61,7 @@ public class SingleDeviceViewNode extends 
SingleChildProcessNode {
       PlanNodeId id,
       boolean cacheOutputColumnNames,
       List<String> outputColumnNames,
-      String device,
+      IDeviceID device,
       List<Integer> deviceToMeasurementIndexes) {
     super(id);
     this.device = device;
@@ -93,7 +94,7 @@ public class SingleDeviceViewNode extends 
SingleChildProcessNode {
     this.cacheOutputColumnNames = cacheOutputColumnNames;
   }
 
-  public String getDevice() {
+  public IDeviceID getDevice() {
     return device;
   }
 
@@ -113,7 +114,7 @@ public class SingleDeviceViewNode extends 
SingleChildProcessNode {
   @Override
   protected void serializeAttributes(ByteBuffer byteBuffer) {
     PlanNodeType.SINGLE_DEVICE_VIEW.serialize(byteBuffer);
-    ReadWriteIOUtils.write(device, byteBuffer);
+    device.serialize(byteBuffer);
     ReadWriteIOUtils.write(cacheOutputColumnNames, byteBuffer);
     ReadWriteIOUtils.write(deviceToMeasurementIndexes.size(), byteBuffer);
     for (Integer index : deviceToMeasurementIndexes) {
@@ -130,7 +131,7 @@ public class SingleDeviceViewNode extends 
SingleChildProcessNode {
   @Override
   protected void serializeAttributes(DataOutputStream stream) throws 
IOException {
     PlanNodeType.SINGLE_DEVICE_VIEW.serialize(stream);
-    ReadWriteIOUtils.write(device, stream);
+    device.serialize(stream);
     ReadWriteIOUtils.write(cacheOutputColumnNames, stream);
     ReadWriteIOUtils.write(deviceToMeasurementIndexes.size(), stream);
     for (Integer index : deviceToMeasurementIndexes) {
@@ -145,7 +146,7 @@ public class SingleDeviceViewNode extends 
SingleChildProcessNode {
   }
 
   public static SingleDeviceViewNode deserialize(ByteBuffer byteBuffer) {
-    String device = ReadWriteIOUtils.readString(byteBuffer);
+    IDeviceID deviceID = 
IDeviceID.Deserializer.DEFAULT_DESERIALIZER.deserializeFrom(byteBuffer);
     boolean cacheOutputColumnNames = ReadWriteIOUtils.readBool(byteBuffer);
     int listSize = ReadWriteIOUtils.readInt(byteBuffer);
     List<Integer> deviceToMeasurementIndexes = new ArrayList<>(listSize);
@@ -165,7 +166,11 @@ public class SingleDeviceViewNode extends 
SingleChildProcessNode {
 
     PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer);
     return new SingleDeviceViewNode(
-        planNodeId, cacheOutputColumnNames, outputColumnNames, device, 
deviceToMeasurementIndexes);
+        planNodeId,
+        cacheOutputColumnNames,
+        outputColumnNames,
+        deviceID,
+        deviceToMeasurementIndexes);
   }
 
   @Override
@@ -173,7 +178,7 @@ public class SingleDeviceViewNode extends 
SingleChildProcessNode {
       throws IOException {
     PlanNodeType.SINGLE_DEVICE_VIEW.serialize(stream);
     id.serialize(stream);
-    ReadWriteIOUtils.write(device, stream);
+    device.serialize(stream);
     ReadWriteIOUtils.write(cacheOutputColumnNames, stream);
     ReadWriteIOUtils.write(getChildren().size(), stream);
     for (PlanNode planNode : getChildren()) {
@@ -184,14 +189,14 @@ public class SingleDeviceViewNode extends 
SingleChildProcessNode {
   public static SingleDeviceViewNode deserializeUseTemplate(
       ByteBuffer byteBuffer, TypeProvider typeProvider) {
     PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer);
-    String device = ReadWriteIOUtils.readString(byteBuffer);
+    IDeviceID deviceID = 
IDeviceID.Deserializer.DEFAULT_DESERIALIZER.deserializeFrom(byteBuffer);
     boolean cacheOutputColumnNames = ReadWriteIOUtils.readBool(byteBuffer);
 
     return new SingleDeviceViewNode(
         planNodeId,
         cacheOutputColumnNames,
         typeProvider.getTemplatedInfo().getDeviceViewOutputNames(),
-        device,
+        deviceID,
         typeProvider.getTemplatedInfo().getDeviceToMeasurementIndexes());
   }
 
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/DeviceViewOperatorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/DeviceViewOperatorTest.java
index 04c63bb4c92..007cdbb8dcd 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/DeviceViewOperatorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/DeviceViewOperatorTest.java
@@ -138,9 +138,11 @@ public class DeviceViewOperatorTest {
           .getOperatorContext()
           .setMaxRunTime(new Duration(500, TimeUnit.MILLISECONDS));
 
-      List<String> devices = new ArrayList<>();
-      devices.add(DEVICE_MERGE_OPERATOR_TEST_SG + ".device0");
-      devices.add(DEVICE_MERGE_OPERATOR_TEST_SG + ".device1");
+      List<IDeviceID> devices = new ArrayList<>();
+      devices.add(
+          
IDeviceID.Factory.DEFAULT_FACTORY.create(DEVICE_MERGE_OPERATOR_TEST_SG + 
".device0"));
+      devices.add(
+          
IDeviceID.Factory.DEFAULT_FACTORY.create(DEVICE_MERGE_OPERATOR_TEST_SG + 
".device1"));
       List<Operator> deviceOperators = new ArrayList<>();
       deviceOperators.add(seriesScanOperator1);
       deviceOperators.add(seriesScanOperator2);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/MergeSortOperatorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/MergeSortOperatorTest.java
index 3b742f6023d..99519e84b93 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/MergeSortOperatorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/MergeSortOperatorTest.java
@@ -105,9 +105,13 @@ public class MergeSortOperatorTest {
   private final List<TsFileResource> unSeqResources = new ArrayList<>();
 
   private static final String DEVICE0 = MERGE_SORT_OPERATOR_TEST_SG + 
".device0";
+  private static final IDeviceID DEVICE0_ID = 
IDeviceID.Factory.DEFAULT_FACTORY.create(DEVICE0);
   private static final String DEVICE1 = MERGE_SORT_OPERATOR_TEST_SG + 
".device1";
+  private static final IDeviceID DEVICE1_ID = 
IDeviceID.Factory.DEFAULT_FACTORY.create(DEVICE1);
   private static final String DEVICE2 = MERGE_SORT_OPERATOR_TEST_SG + 
".device2";
+  private static final IDeviceID DEVICE2_ID = 
IDeviceID.Factory.DEFAULT_FACTORY.create(DEVICE2);
   private static final String DEVICE3 = MERGE_SORT_OPERATOR_TEST_SG + 
".device3";
+  private static final IDeviceID DEVICE3_ID = 
IDeviceID.Factory.DEFAULT_FACTORY.create(DEVICE3);
 
   private int dataNodeId;
 
@@ -1276,8 +1280,8 @@ public class MergeSortOperatorTest {
         new DeviceViewOperator(
             driverContext.getOperatorContexts().get(10),
             deviceOrdering == Ordering.ASC
-                ? Arrays.asList(DEVICE0, DEVICE1)
-                : Arrays.asList(DEVICE1, DEVICE0),
+                ? Arrays.asList(DEVICE0_ID, DEVICE1_ID)
+                : Arrays.asList(DEVICE1_ID, DEVICE0_ID),
             deviceOrdering == Ordering.ASC
                 ? Arrays.asList(seriesScanOperator1, timeJoinOperator1)
                 : Arrays.asList(timeJoinOperator1, seriesScanOperator1),
@@ -1290,8 +1294,8 @@ public class MergeSortOperatorTest {
         new DeviceViewOperator(
             driverContext.getOperatorContexts().get(11),
             deviceOrdering == Ordering.ASC
-                ? Arrays.asList(DEVICE2, DEVICE3)
-                : Arrays.asList(DEVICE3, DEVICE2),
+                ? Arrays.asList(DEVICE2_ID, DEVICE3_ID)
+                : Arrays.asList(DEVICE3_ID, DEVICE2_ID),
             deviceOrdering == Ordering.ASC
                 ? Arrays.asList(timeJoinOperator2, timeJoinOperator3)
                 : Arrays.asList(timeJoinOperator3, timeJoinOperator2),
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
index 9145e98a7b9..4a7a271e64a 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
@@ -580,11 +580,11 @@ public class OperatorMemoryTest {
     List<TSDataType> dataTypeList = new ArrayList<>(2);
     dataTypeList.add(TSDataType.INT32);
     dataTypeList.add(TSDataType.INT32);
-    List<String> devices = new ArrayList<>(4);
-    devices.add("device1");
-    devices.add("device2");
-    devices.add("device3");
-    devices.add("device4");
+    List<IDeviceID> devices = new ArrayList<>(4);
+    devices.add(IDeviceID.Factory.DEFAULT_FACTORY.create("device1"));
+    devices.add(IDeviceID.Factory.DEFAULT_FACTORY.create("device2"));
+    devices.add(IDeviceID.Factory.DEFAULT_FACTORY.create("device3"));
+    devices.add(IDeviceID.Factory.DEFAULT_FACTORY.create("device4"));
     long expectedMaxReturnSize =
         2L * TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
     long expectedMaxPeekMemory = expectedMaxReturnSize;
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/TopKOperatorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/TopKOperatorTest.java
index cb71b11f3b8..f8a4f104d96 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/TopKOperatorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/TopKOperatorTest.java
@@ -100,9 +100,13 @@ public class TopKOperatorTest {
   private final List<TsFileResource> unSeqResources = new ArrayList<>();
 
   private static final String DEVICE0 = TOP_K_OPERATOR_TEST_SG + ".device0";
+  private static final IDeviceID DEVICE0_ID = 
IDeviceID.Factory.DEFAULT_FACTORY.create(DEVICE0);
   private static final String DEVICE1 = TOP_K_OPERATOR_TEST_SG + ".device1";
+  private static final IDeviceID DEVICE1_ID = 
IDeviceID.Factory.DEFAULT_FACTORY.create(DEVICE1);
   private static final String DEVICE2 = TOP_K_OPERATOR_TEST_SG + ".device2";
+  private static final IDeviceID DEVICE2_ID = 
IDeviceID.Factory.DEFAULT_FACTORY.create(DEVICE2);
   private static final String DEVICE3 = TOP_K_OPERATOR_TEST_SG + ".device3";
+  private static final IDeviceID DEVICE3_ID = 
IDeviceID.Factory.DEFAULT_FACTORY.create(DEVICE3);
 
   private int dataNodeId;
 
@@ -1061,8 +1065,8 @@ public class TopKOperatorTest {
         new DeviceViewOperator(
             driverContext.getOperatorContexts().get(10),
             deviceOrdering == Ordering.ASC
-                ? Arrays.asList(DEVICE0, DEVICE1)
-                : Arrays.asList(DEVICE1, DEVICE0),
+                ? Arrays.asList(DEVICE0_ID, DEVICE1_ID)
+                : Arrays.asList(DEVICE1_ID, DEVICE0_ID),
             deviceOrdering == Ordering.ASC
                 ? Arrays.asList(seriesScanOperator1, timeJoinOperator1)
                 : Arrays.asList(timeJoinOperator1, seriesScanOperator1),
@@ -1073,8 +1077,8 @@ public class TopKOperatorTest {
         new DeviceViewOperator(
             driverContext.getOperatorContexts().get(11),
             deviceOrdering == Ordering.ASC
-                ? Arrays.asList(DEVICE2, DEVICE3)
-                : Arrays.asList(DEVICE3, DEVICE2),
+                ? Arrays.asList(DEVICE2_ID, DEVICE3_ID)
+                : Arrays.asList(DEVICE3_ID, DEVICE2_ID),
             deviceOrdering == Ordering.ASC
                 ? Arrays.asList(timeJoinOperator2, timeJoinOperator3)
                 : Arrays.asList(timeJoinOperator3, timeJoinOperator2),
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeTest.java
index b9681477344..a1294ca13fc 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeTest.java
@@ -52,6 +52,7 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.crud.QueryStatement;
 import org.apache.ratis.thirdparty.com.google.common.collect.ImmutableMap;
 import org.apache.ratis.thirdparty.com.google.common.collect.Sets;
 import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.utils.Pair;
 import org.junit.Assert;
 import org.junit.Test;
@@ -78,6 +79,9 @@ import static org.junit.Assert.fail;
 
 public class AnalyzeTest {
 
+  private final IDeviceID DEVICE1 = 
IDeviceID.Factory.DEFAULT_FACTORY.create("root.sg.d1");
+  private final IDeviceID DEVICE2 = 
IDeviceID.Factory.DEFAULT_FACTORY.create("root.sg.d2");
+
   @Test
   public void testRawDataQuery() {
     String sql = "select s1, status, s1 + 1 as t from root.sg.d1 where time > 
100 and s2 > 10;";
@@ -294,14 +298,14 @@ public class AnalyzeTest {
                   new ConstantOperand(TSDataType.INT64, "1"))));
       expectedAnalysis.setDeviceToSelectExpressions(
           ImmutableMap.of(
-              "root.sg.d1",
+              DEVICE1,
               Sets.newHashSet(
                   new TimeSeriesOperand(new PartialPath("root.sg.d1.s1")),
                   new TimeSeriesOperand(new PartialPath("root.sg.d1.status")),
                   new AdditionExpression(
                       new TimeSeriesOperand(new PartialPath("root.sg.d1.s2")),
                       new ConstantOperand(TSDataType.INT64, "1"))),
-              "root.sg.d2",
+              DEVICE2,
               Sets.newHashSet(
                   new TimeSeriesOperand(new PartialPath("root.sg.d2.s1")),
                   new TimeSeriesOperand(new PartialPath("root.sg.d2.status")),
@@ -310,25 +314,25 @@ public class AnalyzeTest {
                       new ConstantOperand(TSDataType.INT64, "1")))));
       expectedAnalysis.setDeviceToWhereExpression(
           ImmutableMap.of(
-              "root.sg.d1",
+              DEVICE1,
               new GreaterThanExpression(
                   new TimeSeriesOperand(new PartialPath("root.sg.d1.s2")),
                   new ConstantOperand(TSDataType.INT64, "10")),
-              "root.sg.d2",
+              DEVICE2,
               new GreaterThanExpression(
                   new TimeSeriesOperand(new PartialPath("root.sg.d2.s2")),
                   new ConstantOperand(TSDataType.INT64, "10"))));
       expectedAnalysis.setDeviceToAggregationExpressions(ImmutableMap.of());
       expectedAnalysis.setDeviceToSourceTransformExpressions(
           ImmutableMap.of(
-              "root.sg.d1",
+              DEVICE1,
               Sets.newHashSet(
                   new TimeSeriesOperand(new PartialPath("root.sg.d1.s1")),
                   new TimeSeriesOperand(new PartialPath("root.sg.d1.s2")),
                   new AdditionExpression(
                       new TimeSeriesOperand(new PartialPath("root.sg.d1.s2")),
                       new ConstantOperand(TSDataType.INT64, "1"))),
-              "root.sg.d2",
+              DEVICE2,
               Sets.newHashSet(
                   new TimeSeriesOperand(new PartialPath("root.sg.d2.s1")),
                   new TimeSeriesOperand(new PartialPath("root.sg.d2.s2")),
@@ -337,17 +341,16 @@ public class AnalyzeTest {
                       new ConstantOperand(TSDataType.INT64, "1")))));
       expectedAnalysis.setDeviceToSourceExpressions(
           ImmutableMap.of(
-              "root.sg.d1",
+              DEVICE1,
               Sets.newHashSet(
                   new TimeSeriesOperand(new PartialPath("root.sg.d1.s1")),
                   new TimeSeriesOperand(new PartialPath("root.sg.d1.s2"))),
-              "root.sg.d2",
+              DEVICE2,
               Sets.newHashSet(
                   new TimeSeriesOperand(new PartialPath("root.sg.d2.s1")),
                   new TimeSeriesOperand(new PartialPath("root.sg.d2.s2")))));
       expectedAnalysis.setDeviceViewInputIndexesMap(
-          ImmutableMap.of(
-              "root.sg.d1", Arrays.asList(1, 2, 3), "root.sg.d2", 
Arrays.asList(1, 2, 3)));
+          ImmutableMap.of(DEVICE1, Arrays.asList(1, 2, 3), DEVICE2, 
Arrays.asList(1, 2, 3)));
       expectedAnalysis.setDeviceViewOutputExpressions(
           Sets.newHashSet(
               new TimeSeriesOperand(
@@ -415,7 +418,7 @@ public class AnalyzeTest {
               new ConstantOperand(TSDataType.INT64, "100")));
       expectedAnalysis.setDeviceToSelectExpressions(
           ImmutableMap.of(
-              "root.sg.d1",
+              DEVICE1,
               Sets.newHashSet(
                   new AdditionExpression(
                       new FunctionExpression(
@@ -426,7 +429,7 @@ public class AnalyzeTest {
                                   new TimeSeriesOperand(new 
PartialPath("root.sg.d1.s1")),
                                   new ConstantOperand(TSDataType.INT64, 
"1")))),
                       new ConstantOperand(TSDataType.INT64, "1"))),
-              "root.sg.d2",
+              DEVICE2,
               Sets.newHashSet(
                   new AdditionExpression(
                       new FunctionExpression(
@@ -439,17 +442,17 @@ public class AnalyzeTest {
                       new ConstantOperand(TSDataType.INT64, "1")))));
       expectedAnalysis.setDeviceToWhereExpression(
           ImmutableMap.of(
-              "root.sg.d1",
+              DEVICE1,
               new GreaterThanExpression(
                   new TimeSeriesOperand(new PartialPath("root.sg.d1.s2")),
                   new ConstantOperand(TSDataType.INT64, "10")),
-              "root.sg.d2",
+              DEVICE2,
               new GreaterThanExpression(
                   new TimeSeriesOperand(new PartialPath("root.sg.d2.s2")),
                   new ConstantOperand(TSDataType.INT64, "10"))));
       expectedAnalysis.setDeviceToAggregationExpressions(
           ImmutableMap.of(
-              "root.sg.d1",
+              DEVICE1,
               Sets.newHashSet(
                   new FunctionExpression(
                       "count",
@@ -470,7 +473,7 @@ public class AnalyzeTest {
                       new LinkedHashMap<>(),
                       Collections.singletonList(
                           new TimeSeriesOperand(new 
PartialPath("root.sg.d1.s1"))))),
-              "root.sg.d2",
+              DEVICE2,
               Sets.newHashSet(
                   new FunctionExpression(
                       "count",
@@ -493,7 +496,7 @@ public class AnalyzeTest {
                           new TimeSeriesOperand(new 
PartialPath("root.sg.d2.s1")))))));
       expectedAnalysis.setDeviceToSourceTransformExpressions(
           ImmutableMap.of(
-              "root.sg.d1",
+              DEVICE1,
               Sets.newHashSet(
                   new TimeSeriesOperand(new PartialPath("root.sg.d1.s1")),
                   new AdditionExpression(
@@ -502,7 +505,7 @@ public class AnalyzeTest {
                   new AdditionExpression(
                       new TimeSeriesOperand(new PartialPath("root.sg.d1.s2")),
                       new ConstantOperand(TSDataType.INT64, "1"))),
-              "root.sg.d2",
+              DEVICE2,
               Sets.newHashSet(
                   new TimeSeriesOperand(new PartialPath("root.sg.d2.s1")),
                   new AdditionExpression(
@@ -513,11 +516,11 @@ public class AnalyzeTest {
                       new ConstantOperand(TSDataType.INT64, "1")))));
       expectedAnalysis.setDeviceToSourceExpressions(
           ImmutableMap.of(
-              "root.sg.d1",
+              DEVICE1,
               Sets.newHashSet(
                   new TimeSeriesOperand(new PartialPath("root.sg.d1.s1")),
                   new TimeSeriesOperand(new PartialPath("root.sg.d1.s2"))),
-              "root.sg.d2",
+              DEVICE2,
               Sets.newHashSet(
                   new TimeSeriesOperand(new PartialPath("root.sg.d2.s1")),
                   new TimeSeriesOperand(new PartialPath("root.sg.d2.s2")))));
@@ -544,8 +547,7 @@ public class AnalyzeTest {
                           new TimeSeriesOperand(new PartialPath("s1")),
                           new ConstantOperand(TSDataType.INT64, "1"))))));
       expectedAnalysis.setDeviceViewInputIndexesMap(
-          ImmutableMap.of(
-              "root.sg.d1", Arrays.asList(2, 3, 1), "root.sg.d2", 
Arrays.asList(2, 3, 1)));
+          ImmutableMap.of(DEVICE1, Arrays.asList(2, 3, 1), DEVICE2, 
Arrays.asList(2, 3, 1)));
 
       expectedAnalysis.setRespDatasetHeader(
           new DatasetHeader(
@@ -924,14 +926,14 @@ public class AnalyzeTest {
                   new TimeSeriesOperand(new PartialPath("s2")))));
       expectedAnalysis.setDeviceToOrderByExpressions(
           ImmutableMap.of(
-              "root.sg.d1",
+              DEVICE1,
               Sets.newHashSet(
                   new AdditionExpression(
                       new TimeSeriesOperand(new PartialPath("root.sg.d1.s1")),
                       new TimeSeriesOperand(new 
PartialPath("root.sg.d1.s2"))))));
       expectedAnalysis.setDeviceToSourceTransformExpressions(
           ImmutableMap.of(
-              "root.sg.d1",
+              DEVICE1,
               Sets.newHashSet(
                   new AdditionExpression(
                       new TimeSeriesOperand(new PartialPath("root.sg.d1.s1")),
@@ -963,7 +965,7 @@ public class AnalyzeTest {
                       Collections.singletonList(new TimeSeriesOperand(new 
PartialPath("s2")))))));
       expectedAnalysis.setDeviceToOrderByExpressions(
           ImmutableMap.of(
-              "root.sg.d1",
+              DEVICE1,
               Sets.newHashSet(
                   new AdditionExpression(
                       new FunctionExpression(
@@ -978,7 +980,7 @@ public class AnalyzeTest {
                               new TimeSeriesOperand(new 
PartialPath("root.sg.d1.s2"))))))));
       expectedAnalysis.setDeviceToAggregationExpressions(
           ImmutableMap.of(
-              "root.sg.d1",
+              DEVICE1,
               Sets.newHashSet(
                   new FunctionExpression(
                       "avg",
@@ -992,7 +994,7 @@ public class AnalyzeTest {
                           new TimeSeriesOperand(new 
PartialPath("root.sg.d1.s2")))))));
       expectedAnalysis.setDeviceToSourceTransformExpressions(
           ImmutableMap.of(
-              "root.sg.d1",
+              DEVICE1,
               Sets.newHashSet(
                   new TimeSeriesOperand(new PartialPath("root.sg.d1.s1")),
                   new TimeSeriesOperand(new PartialPath("root.sg.d1.s2")))));
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/optimization/TestPlanBuilder.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/optimization/TestPlanBuilder.java
index aff45606a04..8251054c43d 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/optimization/TestPlanBuilder.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/optimization/TestPlanBuilder.java
@@ -55,12 +55,15 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.component.SortItem;
 import org.apache.iotdb.db.queryengine.plan.statement.literal.LongLiteral;
 import 
org.apache.iotdb.db.utils.columngenerator.parameter.SlidingTimeColumnGeneratorParameter;
 
+import org.apache.tsfile.file.metadata.IDeviceID;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static 
org.apache.iotdb.db.queryengine.common.header.ColumnHeaderConstant.DEVICE;
 
@@ -340,8 +343,9 @@ public class TestPlanBuilder {
   }
 
   public TestPlanBuilder singleDeviceView(String id, String device, String 
measurement) {
-    Map<String, List<Integer>> deviceToMeasurementIndexesMap = new HashMap<>();
-    deviceToMeasurementIndexesMap.put(device, Collections.singletonList(1));
+    IDeviceID deviceID = IDeviceID.Factory.DEFAULT_FACTORY.create(device);
+    Map<IDeviceID, List<Integer>> deviceToMeasurementIndexesMap = new 
HashMap<>();
+    deviceToMeasurementIndexesMap.put(deviceID, Collections.singletonList(1));
     DeviceViewNode deviceViewNode =
         new DeviceViewNode(
             new PlanNodeId(id),
@@ -351,7 +355,7 @@ public class TestPlanBuilder {
                     new SortItem(OrderByKey.TIME, Ordering.ASC))),
             Arrays.asList(DEVICE, measurement),
             deviceToMeasurementIndexesMap);
-    deviceViewNode.addChildDeviceNode(device, getRoot());
+    deviceViewNode.addChildDeviceNode(deviceID, getRoot());
     this.root = deviceViewNode;
     return this;
   }
@@ -407,6 +411,9 @@ public class TestPlanBuilder {
       List<String> devices,
       Map<String, List<Integer>> deviceToMeasurementIndexesMap,
       List<PlanNode> children) {
+    Map<IDeviceID, List<Integer>> map = new HashMap<>();
+    deviceToMeasurementIndexesMap.forEach(
+        (key, value) -> map.put(IDeviceID.Factory.DEFAULT_FACTORY.create(key), 
value));
     DeviceViewNode deviceViewNode =
         new DeviceViewNode(
             new PlanNodeId(id),
@@ -415,8 +422,10 @@ public class TestPlanBuilder {
                     new SortItem(OrderByKey.DEVICE, Ordering.ASC),
                     new SortItem(OrderByKey.TIME, Ordering.ASC))),
             outputColumnNames,
-            devices,
-            deviceToMeasurementIndexesMap);
+            devices.stream()
+                .map(IDeviceID.Factory.DEFAULT_FACTORY::create)
+                .collect(Collectors.toList()),
+            map);
     deviceViewNode.setChildren(children);
     this.root = deviceViewNode;
     return this;
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/PipelineBuilderTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/PipelineBuilderTest.java
index bc644e45cdd..4162f24846b 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/PipelineBuilderTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/PipelineBuilderTest.java
@@ -65,6 +65,7 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.component.SortItem;
 import org.apache.iotdb.db.storageengine.dataregion.DataRegion;
 
 import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.file.metadata.IDeviceID;
 import org.junit.Test;
 import org.mockito.Mockito;
 
@@ -1708,7 +1709,7 @@ public class PipelineBuilderTest {
           new SingleDeviceViewNode(
               new PlanNodeId(String.format("SingleDeviceViewNode%d", i)),
               Arrays.asList("Time", "Device", "s1"),
-              "root.sg.d" + i,
+              IDeviceID.Factory.DEFAULT_FACTORY.create("root.sg.d" + i),
               Arrays.asList(0, 1, 2));
       singleDeviceViewNode.setCacheOutputColumnNames(true);
       SeriesScanNode seriesScanNode =
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/DataQueryLogicalPlannerTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/DataQueryLogicalPlannerTest.java
index 2a14c0cf3b2..9fd121453a8 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/DataQueryLogicalPlannerTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/DataQueryLogicalPlannerTest.java
@@ -51,6 +51,7 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
 import org.apache.iotdb.db.queryengine.plan.statement.component.SortItem;
 
 import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.file.metadata.IDeviceID;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -292,9 +293,11 @@ public class DataQueryLogicalPlannerTest {
             Ordering.DESC,
             true);
 
-    Map<String, List<Integer>> deviceToMeasurementIndexesMap = new HashMap<>();
-    deviceToMeasurementIndexesMap.put("root.sg.d1", Arrays.asList(1, 2, 3));
-    deviceToMeasurementIndexesMap.put("root.sg.d2", Arrays.asList(2, 3, 4));
+    Map<IDeviceID, List<Integer>> deviceToMeasurementIndexesMap = new 
HashMap<>();
+    deviceToMeasurementIndexesMap.put(
+        IDeviceID.Factory.DEFAULT_FACTORY.create("root.sg.d1"), 
Arrays.asList(1, 2, 3));
+    deviceToMeasurementIndexesMap.put(
+        IDeviceID.Factory.DEFAULT_FACTORY.create("root.sg.d2"), 
Arrays.asList(2, 3, 4));
     DeviceViewNode deviceViewNode =
         new DeviceViewNode(
             queryId.genPlanNodeId(),
@@ -304,8 +307,10 @@ public class DataQueryLogicalPlannerTest {
                     new SortItem(OrderByKey.TIME, Ordering.DESC))),
             Arrays.asList(ColumnHeaderConstant.DEVICE, "s3", "s1", "s2", "s4"),
             deviceToMeasurementIndexesMap);
-    deviceViewNode.addChildDeviceNode("root.sg.d1", filterNode1);
-    deviceViewNode.addChildDeviceNode("root.sg.d2", filterNode2);
+    deviceViewNode.addChildDeviceNode(
+        IDeviceID.Factory.DEFAULT_FACTORY.create("root.sg.d1"), filterNode1);
+    deviceViewNode.addChildDeviceNode(
+        IDeviceID.Factory.DEFAULT_FACTORY.create("root.sg.d2"), filterNode2);
 
     OffsetNode offsetNode = new OffsetNode(queryId.genPlanNodeId(), 
deviceViewNode, 100);
     LimitNode limitNode = new LimitNode(queryId.genPlanNodeId(), offsetNode, 
100);
@@ -666,9 +671,11 @@ public class DataQueryLogicalPlannerTest {
             null,
             Ordering.DESC);
 
-    Map<String, List<Integer>> deviceToMeasurementIndexesMap = new HashMap<>();
-    deviceToMeasurementIndexesMap.put("root.sg.d1", Arrays.asList(1, 2, 3));
-    deviceToMeasurementIndexesMap.put("root.sg.d2", Arrays.asList(1, 2, 3));
+    Map<IDeviceID, List<Integer>> deviceToMeasurementIndexesMap = new 
HashMap<>();
+    deviceToMeasurementIndexesMap.put(
+        IDeviceID.Factory.DEFAULT_FACTORY.create("root.sg.d1"), 
Arrays.asList(1, 2, 3));
+    deviceToMeasurementIndexesMap.put(
+        IDeviceID.Factory.DEFAULT_FACTORY.create("root.sg.d2"), 
Arrays.asList(1, 2, 3));
     DeviceViewNode deviceViewNode =
         new DeviceViewNode(
             queryId.genPlanNodeId(),
@@ -679,8 +686,10 @@ public class DataQueryLogicalPlannerTest {
             Arrays.asList(
                 ColumnHeaderConstant.DEVICE, "count(s1)", "max_value(s2)", 
"last_value(s1)"),
             deviceToMeasurementIndexesMap);
-    deviceViewNode.addChildDeviceNode("root.sg.d1", rawDataAggregationNode1);
-    deviceViewNode.addChildDeviceNode("root.sg.d2", rawDataAggregationNode2);
+    deviceViewNode.addChildDeviceNode(
+        IDeviceID.Factory.DEFAULT_FACTORY.create("root.sg.d1"), 
rawDataAggregationNode1);
+    deviceViewNode.addChildDeviceNode(
+        IDeviceID.Factory.DEFAULT_FACTORY.create("root.sg.d2"), 
rawDataAggregationNode2);
 
     OffsetNode offsetNode = new OffsetNode(queryId.genPlanNodeId(), 
deviceViewNode, 100);
     LimitNode limitNode = new LimitNode(queryId.genPlanNodeId(), offsetNode, 
100);
@@ -953,9 +962,11 @@ public class DataQueryLogicalPlannerTest {
             null,
             Ordering.DESC);
 
-    Map<String, List<Integer>> deviceToMeasurementIndexesMap = new HashMap<>();
-    deviceToMeasurementIndexesMap.put("root.sg.d1", Arrays.asList(1, 2, 3));
-    deviceToMeasurementIndexesMap.put("root.sg.d2", Arrays.asList(1, 2, 3));
+    Map<IDeviceID, List<Integer>> deviceToMeasurementIndexesMap = new 
HashMap<>();
+    deviceToMeasurementIndexesMap.put(
+        IDeviceID.Factory.DEFAULT_FACTORY.create("root.sg.d1"), 
Arrays.asList(1, 2, 3));
+    deviceToMeasurementIndexesMap.put(
+        IDeviceID.Factory.DEFAULT_FACTORY.create("root.sg.d2"), 
Arrays.asList(1, 2, 3));
     DeviceViewNode deviceViewNode =
         new DeviceViewNode(
             queryId.genPlanNodeId(),
@@ -966,8 +977,10 @@ public class DataQueryLogicalPlannerTest {
             Arrays.asList(
                 ColumnHeaderConstant.DEVICE, "count(s1)", "max_value(s2)", 
"last_value(s1)"),
             deviceToMeasurementIndexesMap);
-    deviceViewNode.addChildDeviceNode("root.sg.d1", aggregationNode1);
-    deviceViewNode.addChildDeviceNode("root.sg.d2", aggregationNode2);
+    deviceViewNode.addChildDeviceNode(
+        IDeviceID.Factory.DEFAULT_FACTORY.create("root.sg.d1"), 
aggregationNode1);
+    deviceViewNode.addChildDeviceNode(
+        IDeviceID.Factory.DEFAULT_FACTORY.create("root.sg.d2"), 
aggregationNode2);
 
     OffsetNode offsetNode = new OffsetNode(queryId.genPlanNodeId(), 
deviceViewNode, 100);
     LimitNode limitNode = new LimitNode(queryId.genPlanNodeId(), offsetNode, 
100);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/PlanGraphPrinterTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/PlanGraphPrinterTest.java
index dd0e664d38a..c9be00b98ee 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/PlanGraphPrinterTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/PlanGraphPrinterTest.java
@@ -29,6 +29,7 @@ import 
org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.OrderByParame
 import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
 import org.apache.iotdb.db.queryengine.plan.statement.component.SortItem;
 
+import org.apache.tsfile.file.metadata.IDeviceID;
 import org.junit.Test;
 
 import java.util.Arrays;
@@ -57,7 +58,7 @@ public class PlanGraphPrinterTest {
             Collections.emptyMap());
 
     SeriesScanNode scanNode = new SeriesScanNode(new PlanNodeId("3"), new 
MeasurementPath("s1"));
-    deviceViewNode.addChildDeviceNode("d1", scanNode);
+    
deviceViewNode.addChildDeviceNode(IDeviceID.Factory.DEFAULT_FACTORY.create("d1"),
 scanNode);
 
     topKNode.addChild(deviceViewNode);
 
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/process/DeviceViewNodeSerdeTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/process/DeviceViewNodeSerdeTest.java
index ea3e9b8a7dd..264cb2aa0b6 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/process/DeviceViewNodeSerdeTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/process/DeviceViewNodeSerdeTest.java
@@ -28,6 +28,7 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.component.OrderByKey;
 import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
 import org.apache.iotdb.db.queryengine.plan.statement.component.SortItem;
 
+import org.apache.tsfile.file.metadata.IDeviceID;
 import org.junit.Test;
 
 import java.nio.ByteBuffer;
@@ -52,8 +53,10 @@ public class DeviceViewNodeSerdeTest {
                     new SortItem(OrderByKey.TIME, Ordering.DESC))),
             Arrays.asList("s1", "s2"),
             new HashMap<>());
-    deviceViewNode.addChildDeviceNode("root.sg.d1", fullOuterTimeJoinNode1);
-    deviceViewNode.addChildDeviceNode("root.sg.d2", fullOuterTimeJoinNode2);
+    deviceViewNode.addChildDeviceNode(
+        IDeviceID.Factory.DEFAULT_FACTORY.create("root.sg.d1"), 
fullOuterTimeJoinNode1);
+    deviceViewNode.addChildDeviceNode(
+        IDeviceID.Factory.DEFAULT_FACTORY.create("root.sg.d2"), 
fullOuterTimeJoinNode2);
 
     ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
     deviceViewNode.serialize(byteBuffer);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/process/SingleDeviceViewNodeSerdeTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/process/SingleDeviceViewNodeSerdeTest.java
index d1904a4c301..cf95180339c 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/process/SingleDeviceViewNodeSerdeTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/process/SingleDeviceViewNodeSerdeTest.java
@@ -23,6 +23,7 @@ import 
org.apache.iotdb.db.queryengine.plan.planner.node.PlanNodeDeserializeHelp
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.SingleDeviceViewNode;
 
+import org.apache.tsfile.file.metadata.IDeviceID;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -40,7 +41,7 @@ public class SingleDeviceViewNodeSerdeTest {
         new SingleDeviceViewNode(
             new PlanNodeId("TestSingleDeviceViewNode"),
             outputColumnNames,
-            "TestDevice",
+            IDeviceID.Factory.DEFAULT_FACTORY.create("TestDevice"),
             Arrays.asList(1, 2));
 
     // when cache is false
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java
index ebaff888f2a..e46a82a9cdf 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java
@@ -178,7 +178,9 @@ public class PathPatternTree {
 
     Set<IDeviceID> resultPaths = new HashSet<>();
     for (List<String> resultNodes : resultNodesSet) {
-      resultPaths.add(Factory.DEFAULT_FACTORY.create(resultNodes.toArray(new 
String[0])));
+      if (resultNodes != null && !resultNodes.isEmpty()) {
+        resultPaths.add(Factory.DEFAULT_FACTORY.create(resultNodes.toArray(new 
String[0])));
+      }
     }
 
     return new ArrayList<>(resultPaths);
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/PathUtils.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/PathUtils.java
index 06d66b2d10d..5b733f248c1 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/PathUtils.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/PathUtils.java
@@ -183,9 +183,7 @@ public class PathUtils {
   }
 
   public static boolean isStartWith(IDeviceID deviceID, String storageGroup) {
-    // TODO: use correct judgement without converting to string
-    String deviceName = deviceID.toString();
-    return deviceName.equals(storageGroup) || 
deviceName.startsWith(storageGroup + ".");
+    return deviceID.segmentNum() > 0 && 
deviceID.matchDatabaseName(storageGroup);
   }
 
   /** Remove the back quotes of a measurement if necessary */

Reply via email to