You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2022/04/11 06:40:42 UTC

[iotdb] branch master updated: implement serialize and deserialize of SchemaTree (#5474)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 22fadbfc9c implement serialize and deserialize of SchemaTree (#5474)
22fadbfc9c is described below

commit 22fadbfc9cccb6e5df9dda9ea34538ef93634975
Author: Marcos_Zyk <38...@users.noreply.github.com>
AuthorDate: Mon Apr 11 14:40:38 2022 +0800

    implement serialize and deserialize of SchemaTree (#5474)
---
 ...aMeasurementNode.java => DeviceSchemaInfo.java} | 38 +++++-------
 .../db/mpp/common/schematree/SchemaEntityNode.java | 27 +++++++++
 .../mpp/common/schematree/SchemaInternalNode.java  | 30 +++++++++-
 .../common/schematree/SchemaMeasurementNode.java   | 27 +++++++++
 .../iotdb/db/mpp/common/schematree/SchemaNode.java |  9 +++
 .../iotdb/db/mpp/common/schematree/SchemaTree.java | 68 +++++++++++++++++++---
 .../iotdb/db/mpp/sql/constant/StatementType.java   |  5 +-
 .../iotdb/db/mpp/sql/planner/LogicalPlanner.java   | 27 +++++----
 .../mpp/sql/statement/crud/InsertRowStatement.java |  8 ++-
 .../sql/statement/crud/InsertTabletStatement.java  |  4 +-
 .../apache/iotdb/db/mpp/common/SchemaTreeTest.java | 65 ++++++++++++++++++++-
 11 files changed, 257 insertions(+), 51 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaMeasurementNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/DeviceSchemaInfo.java
similarity index 60%
copy from server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaMeasurementNode.java
copy to server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/DeviceSchemaInfo.java
index e3329768dd..8da6b056d1 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaMeasurementNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/DeviceSchemaInfo.java
@@ -19,37 +19,29 @@
 
 package org.apache.iotdb.db.mpp.common.schematree;
 
+import org.apache.iotdb.db.metadata.path.PartialPath;
 import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 
-public class SchemaMeasurementNode extends SchemaNode {
+import java.util.List;
 
-  private String alias;
-  private final MeasurementSchema schema;
+public class DeviceSchemaInfo {
 
-  public SchemaMeasurementNode(String name, MeasurementSchema schema) {
-    super(name);
-    this.schema = schema;
-  }
-
-  public String getAlias() {
-    return alias;
-  }
-
-  public void setAlias(String alias) {
-    this.alias = alias;
-  }
+  private PartialPath devicePath;
+  private boolean isAligned;
+  private List<MeasurementSchema> measurementSchemaList;
 
-  public MeasurementSchema getSchema() {
-    return schema;
+  public DeviceSchemaInfo(
+      PartialPath devicePath, boolean isAligned, List<MeasurementSchema> measurementSchemaList) {
+    this.devicePath = devicePath;
+    this.isAligned = isAligned;
+    this.measurementSchemaList = measurementSchemaList;
   }
 
-  @Override
-  public boolean isMeasurement() {
-    return true;
+  public List<MeasurementSchema> getMeasurementSchemaList() {
+    return measurementSchemaList;
   }
 
-  @Override
-  public SchemaMeasurementNode getAsMeasurementNode() {
-    return this;
+  public boolean isAligned() {
+    return isAligned;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaEntityNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaEntityNode.java
index 1d07c7b70c..3360286d5d 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaEntityNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaEntityNode.java
@@ -19,6 +19,9 @@
 
 package org.apache.iotdb.db.mpp.common.schematree;
 
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
+
+import java.nio.ByteBuffer;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -65,4 +68,28 @@ public class SchemaEntityNode extends SchemaInternalNode {
   public SchemaEntityNode getAsEntityNode() {
     return this;
   }
+
+  @Override
+  public byte getType() {
+    return SCHEMA_ENTITY_NODE;
+  }
+
+  @Override
+  public void serialize(ByteBuffer buffer) {
+    serializeChildren(buffer);
+
+    ReadWriteIOUtils.write(getType(), buffer);
+    ReadWriteIOUtils.write(name, buffer);
+    ReadWriteIOUtils.write(isAligned, buffer);
+    ReadWriteIOUtils.write(children.size(), buffer);
+  }
+
+  public static SchemaEntityNode deserialize(ByteBuffer buffer) {
+    String name = ReadWriteIOUtils.readString(buffer);
+    boolean isAligned = ReadWriteIOUtils.readBool(buffer);
+
+    SchemaEntityNode entityNode = new SchemaEntityNode(name);
+    entityNode.setAligned(isAligned);
+    return entityNode;
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaInternalNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaInternalNode.java
index 838a20933a..f93c5e4940 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaInternalNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaInternalNode.java
@@ -19,13 +19,16 @@
 
 package org.apache.iotdb.db.mpp.common.schematree;
 
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
+
+import java.nio.ByteBuffer;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 
 public class SchemaInternalNode extends SchemaNode {
 
-  private Map<String, SchemaNode> children;
+  protected Map<String, SchemaNode> children;
 
   public SchemaInternalNode(String name) {
     super(name);
@@ -52,4 +55,29 @@ public class SchemaInternalNode extends SchemaNode {
   public Iterator<SchemaNode> getChildrenIterator() {
     return children.values().iterator();
   }
+
+  @Override
+  public byte getType() {
+    return SCHEMA_INTERNAL_NODE;
+  }
+
+  public void serialize(ByteBuffer buffer) {
+    serializeChildren(buffer);
+
+    ReadWriteIOUtils.write(getType(), buffer);
+    ReadWriteIOUtils.write(name, buffer);
+    ReadWriteIOUtils.write(children.size(), buffer);
+  }
+
+  protected void serializeChildren(ByteBuffer buffer) {
+    for (SchemaNode child : children.values()) {
+      child.serialize(buffer);
+    }
+  }
+
+  public static SchemaInternalNode deserialize(ByteBuffer buffer) {
+    String name = ReadWriteIOUtils.readString(buffer);
+
+    return new SchemaInternalNode(name);
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaMeasurementNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaMeasurementNode.java
index e3329768dd..a2c9f13c53 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaMeasurementNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaMeasurementNode.java
@@ -19,8 +19,11 @@
 
 package org.apache.iotdb.db.mpp.common.schematree;
 
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 
+import java.nio.ByteBuffer;
+
 public class SchemaMeasurementNode extends SchemaNode {
 
   private String alias;
@@ -52,4 +55,28 @@ public class SchemaMeasurementNode extends SchemaNode {
   public SchemaMeasurementNode getAsMeasurementNode() {
     return this;
   }
+
+  @Override
+  public byte getType() {
+    return SCHEMA_MEASUREMENT_NODE;
+  }
+
+  @Override
+  public void serialize(ByteBuffer buffer) {
+    ReadWriteIOUtils.write(getType(), buffer);
+    ReadWriteIOUtils.write(name, buffer);
+
+    ReadWriteIOUtils.write(alias, buffer);
+    schema.serializeTo(buffer);
+  }
+
+  public static SchemaMeasurementNode deserialize(ByteBuffer buffer) {
+    String name = ReadWriteIOUtils.readString(buffer);
+    String alias = ReadWriteIOUtils.readString(buffer);
+    MeasurementSchema schema = MeasurementSchema.deserializeFrom(buffer);
+
+    SchemaMeasurementNode measurementNode = new SchemaMeasurementNode(name, schema);
+    measurementNode.setAlias(alias);
+    return measurementNode;
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaNode.java
index f842506c7b..944bad3fd2 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaNode.java
@@ -19,12 +19,17 @@
 
 package org.apache.iotdb.db.mpp.common.schematree;
 
+import java.nio.ByteBuffer;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.Map;
 
 public abstract class SchemaNode {
 
+  public static final byte SCHEMA_INTERNAL_NODE = 0;
+  public static final byte SCHEMA_ENTITY_NODE = 1;
+  public static final byte SCHEMA_MEASUREMENT_NODE = 2;
+
   protected final String name;
 
   public SchemaNode(String name) {
@@ -64,4 +69,8 @@ public abstract class SchemaNode {
   public SchemaMeasurementNode getAsMeasurementNode() {
     throw new UnsupportedOperationException("This not isn't instance of SchemaMeasurementNode.");
   }
+
+  public abstract byte getType();
+
+  public abstract void serialize(ByteBuffer buffer);
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaTree.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaTree.java
index 240a6c1875..127077f4c7 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaTree.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaTree.java
@@ -19,17 +19,22 @@
 
 package org.apache.iotdb.db.mpp.common.schematree;
 
-import org.apache.iotdb.commons.partition.DataPartitionQueryParam;
 import org.apache.iotdb.db.metadata.path.MeasurementPath;
 import org.apache.iotdb.db.metadata.path.PartialPath;
 import org.apache.iotdb.tsfile.utils.Pair;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.ArrayDeque;
 import java.util.ArrayList;
+import java.util.Deque;
 import java.util.List;
 
+import static org.apache.iotdb.db.mpp.common.schematree.SchemaNode.SCHEMA_ENTITY_NODE;
+import static org.apache.iotdb.db.mpp.common.schematree.SchemaNode.SCHEMA_MEASUREMENT_NODE;
+
 public class SchemaTree {
 
   private final SchemaNode root;
@@ -52,20 +57,65 @@ public class SchemaTree {
     return new Pair<>(visitor.getAllResult(), visitor.getNextOffset());
   }
 
-  public List<MeasurementSchema> searchMeasurementSchema(
+  public DeviceSchemaInfo searchDeviceSchemaInfo(
       PartialPath devicePath, List<String> measurements) {
-    return new ArrayList<>();
+
+    String[] nodes = devicePath.getNodes();
+    SchemaNode cur = root;
+    for (int i = 1; i < nodes.length; i++) {
+      cur = cur.getChild(nodes[i]);
+    }
+
+    List<MeasurementSchema> measurementSchemaList = new ArrayList<>();
+    for (String measurement : measurements) {
+      measurementSchemaList.add(cur.getChild(measurement).getAsMeasurementNode().getSchema());
+    }
+
+    return new DeviceSchemaInfo(
+        devicePath, cur.getAsEntityNode().isAligned(), measurementSchemaList);
   }
 
   public void serialize(ByteBuffer buffer) throws IOException {
-    // TODO
+    root.serialize(buffer);
   }
 
-  public void deserialize(ByteBuffer buffer) throws IOException {
-    // TODO
-  }
+  public static SchemaTree deserialize(ByteBuffer buffer) {
+
+    byte nodeType;
+    int childNum;
+    Deque<SchemaNode> stack = new ArrayDeque<>();
+    SchemaNode child;
+
+    while (buffer.hasRemaining()) {
+      nodeType = ReadWriteIOUtils.readByte(buffer);
+      if (nodeType == SCHEMA_MEASUREMENT_NODE) {
+        SchemaMeasurementNode measurementNode = SchemaMeasurementNode.deserialize(buffer);
+        stack.push(measurementNode);
+      } else {
+        SchemaInternalNode internalNode;
+        if (nodeType == SCHEMA_ENTITY_NODE) {
+          internalNode = SchemaEntityNode.deserialize(buffer);
+        } else {
+          internalNode = SchemaInternalNode.deserialize(buffer);
+        }
 
-  public List<DataPartitionQueryParam> constructDataPartitionQueryParamList() {
-    return new ArrayList<>();
+        childNum = ReadWriteIOUtils.readInt(buffer);
+        while (childNum > 0) {
+          child = stack.pop();
+          internalNode.addChild(child.getName(), child);
+          if (child.isMeasurement()) {
+            SchemaMeasurementNode measurementNode = child.getAsMeasurementNode();
+            if (measurementNode.getAlias() != null) {
+              internalNode
+                  .getAsEntityNode()
+                  .addAliasChild(measurementNode.getAlias(), measurementNode);
+            }
+          }
+          childNum--;
+        }
+        stack.push(internalNode);
+      }
+    }
+    return new SchemaTree(stack.poll());
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/sql/constant/StatementType.java b/server/src/main/java/org/apache/iotdb/db/mpp/sql/constant/StatementType.java
index d2ad8cd8bf..28ce35957a 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/sql/constant/StatementType.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/sql/constant/StatementType.java
@@ -130,5 +130,8 @@ public enum StatementType {
   APPEND_TEMPLATE,
   DROP_TEMPLATE,
 
-  SHOW_QUERY_RESOURCE
+  SHOW_QUERY_RESOURCE,
+
+  FETCH_SCHEMA,
+  FETCH_SCHEMA_WITH_AUTO_CREATE
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/sql/planner/LogicalPlanner.java b/server/src/main/java/org/apache/iotdb/db/mpp/sql/planner/LogicalPlanner.java
index 1b842beac9..56fef149c9 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/sql/planner/LogicalPlanner.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/sql/planner/LogicalPlanner.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.mpp.sql.planner;
 import org.apache.iotdb.db.auth.AuthException;
 import org.apache.iotdb.db.metadata.path.PartialPath;
 import org.apache.iotdb.db.mpp.common.MPPQueryContext;
+import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo;
 import org.apache.iotdb.db.mpp.sql.analyze.Analysis;
 import org.apache.iotdb.db.mpp.sql.optimization.PlanOptimizer;
 import org.apache.iotdb.db.mpp.sql.planner.plan.LogicalQueryPlan;
@@ -34,7 +35,6 @@ import org.apache.iotdb.db.mpp.sql.planner.plan.node.write.InsertRowNode;
 import org.apache.iotdb.db.mpp.sql.planner.plan.node.write.InsertRowsNode;
 import org.apache.iotdb.db.mpp.sql.planner.plan.node.write.InsertTabletNode;
 import org.apache.iotdb.db.mpp.sql.statement.StatementVisitor;
-import org.apache.iotdb.db.mpp.sql.statement.component.*;
 import org.apache.iotdb.db.mpp.sql.statement.crud.*;
 import org.apache.iotdb.db.mpp.sql.statement.crud.AggregationQueryStatement;
 import org.apache.iotdb.db.mpp.sql.statement.crud.FillQueryStatement;
@@ -221,12 +221,13 @@ public class LogicalPlanner {
         InsertTabletStatement insertTabletStatement, MPPQueryContext context) {
       // set schema in insert node
       // convert insert statement to insert node
-      List<MeasurementSchema> measurementSchemas =
+      DeviceSchemaInfo deviceSchemaInfo =
           analysis
               .getSchemaTree()
-              .searchMeasurementSchema(
+              .searchDeviceSchemaInfo(
                   insertTabletStatement.getDevicePath(),
                   Arrays.asList(insertTabletStatement.getMeasurements()));
+      List<MeasurementSchema> measurementSchemas = deviceSchemaInfo.getMeasurementSchemaList();
       return new InsertTabletNode(
           context.getQueryId().genPlanNodeId(),
           insertTabletStatement.getDevicePath(),
@@ -243,12 +244,13 @@ public class LogicalPlanner {
     public PlanNode visitInsertRow(InsertRowStatement insertRowStatement, MPPQueryContext context) {
       // set schema in insert node
       // convert insert statement to insert node
-      List<MeasurementSchema> measurementSchemas =
+      DeviceSchemaInfo deviceSchemaInfo =
           analysis
               .getSchemaTree()
-              .searchMeasurementSchema(
+              .searchDeviceSchemaInfo(
                   insertRowStatement.getDevicePath(),
                   Arrays.asList(insertRowStatement.getMeasurements()));
+      List<MeasurementSchema> measurementSchemas = deviceSchemaInfo.getMeasurementSchemaList();
       return new InsertRowNode(
           context.getQueryId().genPlanNodeId(),
           insertRowStatement.getDevicePath(),
@@ -386,12 +388,13 @@ public class LogicalPlanner {
       for (int i = 0; i < insertRowsStatement.getInsertRowStatementList().size(); i++) {
         InsertRowStatement insertRowStatement =
             insertRowsStatement.getInsertRowStatementList().get(i);
-        List<MeasurementSchema> measurementSchemas =
+        DeviceSchemaInfo deviceSchemaInfo =
             analysis
                 .getSchemaTree()
-                .searchMeasurementSchema(
+                .searchDeviceSchemaInfo(
                     insertRowStatement.getDevicePath(),
                     Arrays.asList(insertRowStatement.getMeasurements()));
+        List<MeasurementSchema> measurementSchemas = deviceSchemaInfo.getMeasurementSchemaList();
         insertRowsNode.addOneInsertRowNode(
             new InsertRowNode(
                 insertRowsNode.getPlanNodeId(),
@@ -417,12 +420,13 @@ public class LogicalPlanner {
       for (int i = 0; i < insertMultiTabletsStatement.getInsertTabletStatementList().size(); i++) {
         InsertTabletStatement insertTabletStatement =
             insertMultiTabletsStatement.getInsertTabletStatementList().get(i);
-        List<MeasurementSchema> measurementSchemas =
+        DeviceSchemaInfo deviceSchemaInfo =
             analysis
                 .getSchemaTree()
-                .searchMeasurementSchema(
+                .searchDeviceSchemaInfo(
                     insertTabletStatement.getDevicePath(),
                     Arrays.asList(insertTabletStatement.getMeasurements()));
+        List<MeasurementSchema> measurementSchemas = deviceSchemaInfo.getMeasurementSchemaList();
         insertTabletNodeList.add(
             new InsertTabletNode(
                 insertMultiTabletsNode.getPlanNodeId(),
@@ -448,12 +452,13 @@ public class LogicalPlanner {
       for (int i = 0; i < insertRowsOfOneDeviceStatement.getInsertRowStatementList().size(); i++) {
         InsertRowStatement insertRowStatement =
             insertRowsOfOneDeviceStatement.getInsertRowStatementList().get(i);
-        List<MeasurementSchema> measurementSchemas =
+        DeviceSchemaInfo deviceSchemaInfo =
             analysis
                 .getSchemaTree()
-                .searchMeasurementSchema(
+                .searchDeviceSchemaInfo(
                     insertRowStatement.getDevicePath(),
                     Arrays.asList(insertRowStatement.getMeasurements()));
+        List<MeasurementSchema> measurementSchemas = deviceSchemaInfo.getMeasurementSchemaList();
         insertRowsNode.addOneInsertRowNode(
             new InsertRowNode(
                 insertRowsNode.getPlanNodeId(),
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/sql/statement/crud/InsertRowStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/sql/statement/crud/InsertRowStatement.java
index 6e751bc52e..d5becb00c2 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/sql/statement/crud/InsertRowStatement.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/sql/statement/crud/InsertRowStatement.java
@@ -124,7 +124,9 @@ public class InsertRowStatement extends InsertBaseStatement {
   @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning
   public void transferType(SchemaTree schemaTree) throws QueryProcessException {
     List<MeasurementSchema> measurementSchemas =
-        schemaTree.searchMeasurementSchema(devicePath, Arrays.asList(measurements));
+        schemaTree
+            .searchDeviceSchemaInfo(devicePath, Arrays.asList(measurements))
+            .getMeasurementSchemaList();
     if (isNeedInferType) {
       for (int i = 0; i < measurementSchemas.size(); i++) {
         if (measurementSchemas.get(i) == null) {
@@ -180,7 +182,9 @@ public class InsertRowStatement extends InsertBaseStatement {
 
   public boolean checkDataType(SchemaTree schemaTree) {
     List<MeasurementSchema> measurementSchemas =
-        schemaTree.searchMeasurementSchema(devicePath, Arrays.asList(measurements));
+        schemaTree
+            .searchDeviceSchemaInfo(devicePath, Arrays.asList(measurements))
+            .getMeasurementSchemaList();
     for (int i = 0; i < measurementSchemas.size(); i++) {
       if (dataTypes[i] != measurementSchemas.get(i).getType()) {
         if (IoTDBDescriptor.getInstance().getConfig().isEnablePartialInsert()) {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/sql/statement/crud/InsertTabletStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/sql/statement/crud/InsertTabletStatement.java
index de87ec94c3..9123601eef 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/sql/statement/crud/InsertTabletStatement.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/sql/statement/crud/InsertTabletStatement.java
@@ -106,7 +106,9 @@ public class InsertTabletStatement extends InsertBaseStatement {
   @Override
   public boolean checkDataType(SchemaTree schemaTree) {
     List<MeasurementSchema> measurementSchemas =
-        schemaTree.searchMeasurementSchema(devicePath, Arrays.asList(measurements));
+        schemaTree
+            .searchDeviceSchemaInfo(devicePath, Arrays.asList(measurements))
+            .getMeasurementSchemaList();
     for (int i = 0; i < measurementSchemas.size(); i++) {
       if (dataTypes[i] != measurementSchemas.get(i).getType()) {
         if (IoTDBDescriptor.getInstance().getConfig().isEnablePartialInsert()) {
diff --git a/server/src/test/java/org/apache/iotdb/db/mpp/common/SchemaTreeTest.java b/server/src/test/java/org/apache/iotdb/db/mpp/common/SchemaTreeTest.java
index 3237e89e97..3da83e3588 100644
--- a/server/src/test/java/org/apache/iotdb/db/mpp/common/SchemaTreeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/mpp/common/SchemaTreeTest.java
@@ -20,17 +20,24 @@ package org.apache.iotdb.db.mpp.common;
 
 import org.apache.iotdb.db.metadata.path.MeasurementPath;
 import org.apache.iotdb.db.metadata.path.PartialPath;
+import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo;
 import org.apache.iotdb.db.mpp.common.schematree.SchemaEntityNode;
 import org.apache.iotdb.db.mpp.common.schematree.SchemaInternalNode;
 import org.apache.iotdb.db.mpp.common.schematree.SchemaMeasurementNode;
 import org.apache.iotdb.db.mpp.common.schematree.SchemaNode;
+import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
 import org.apache.iotdb.db.mpp.common.schematree.SchemaTreeVisitor;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.utils.Pair;
 import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 
 import org.junit.Assert;
 import org.junit.Test;
 
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class SchemaTreeTest {
 
@@ -140,10 +147,11 @@ public class SchemaTreeTest {
     SchemaEntityNode d1 = new SchemaEntityNode("d1");
     sg.addChild("d1", d1);
 
-    MeasurementSchema schema = new MeasurementSchema();
-    SchemaMeasurementNode s1 = new SchemaMeasurementNode("s1", schema);
+    MeasurementSchema schema1 = new MeasurementSchema("s1", TSDataType.INT32);
+    MeasurementSchema schema2 = new MeasurementSchema("s2", TSDataType.INT64);
+    SchemaMeasurementNode s1 = new SchemaMeasurementNode("s1", schema1);
     d1.addChild("s1", s1);
-    SchemaMeasurementNode s2 = new SchemaMeasurementNode("s2", schema);
+    SchemaMeasurementNode s2 = new SchemaMeasurementNode("s2", schema2);
     s2.setAlias("status");
     d1.addChild("s2", s2);
     d1.addAliasChild("status", s2);
@@ -211,4 +219,55 @@ public class SchemaTreeTest {
     }
     Assert.assertEquals(expectedNum, i);
   }
+
+  @Test
+  public void testSearchDeviceInfo() throws Exception {
+    SchemaTree schemaTree = new SchemaTree(generateSchemaTree());
+
+    testSearchDeviceInfo(schemaTree);
+  }
+
+  private void testSearchDeviceInfo(SchemaTree schemaTree) throws Exception {
+    PartialPath devicePath = new PartialPath("root.sg.d1");
+    List<String> measurements = new ArrayList<>();
+    measurements.add("s1");
+    measurements.add("s2");
+
+    DeviceSchemaInfo deviceSchemaInfo = schemaTree.searchDeviceSchemaInfo(devicePath, measurements);
+    Assert.assertEquals(
+        measurements,
+        deviceSchemaInfo.getMeasurementSchemaList().stream()
+            .map(MeasurementSchema::getMeasurementId)
+            .collect(Collectors.toList()));
+
+    devicePath = new PartialPath("root.sg.d2.a");
+    measurements.remove(1);
+    measurements.add("status");
+    deviceSchemaInfo = schemaTree.searchDeviceSchemaInfo(devicePath, measurements);
+    Assert.assertTrue(deviceSchemaInfo.isAligned());
+    measurements.remove(1);
+    measurements.add("s2");
+    Assert.assertEquals(
+        measurements,
+        deviceSchemaInfo.getMeasurementSchemaList().stream()
+            .map(MeasurementSchema::getMeasurementId)
+            .collect(Collectors.toList()));
+  }
+
+  @Test
+  public void testSerialization() throws Exception {
+    SchemaNode root = generateSchemaTree();
+    ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024);
+    root.serialize(buffer);
+    buffer.flip();
+
+    SchemaTree schemaTree = SchemaTree.deserialize(buffer);
+
+    Pair<List<MeasurementPath>, Integer> visitResult =
+        schemaTree.searchMeasurementPaths(new PartialPath("root.sg.**.status"), 2, 1, true);
+    Assert.assertEquals(2, visitResult.left.size());
+    Assert.assertEquals(3, (int) visitResult.right);
+
+    testSearchDeviceInfo(schemaTree);
+  }
 }