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);
+ }
}