diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java index 77766d78edea..ec119bf98052 100644 --- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java +++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java @@ -34,6 +34,7 @@ import org.apache.iotdb.commons.conf.IoTDBConstant; import org.apache.iotdb.commons.exception.IllegalPathException; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.commons.utils.AuthUtils; import org.apache.iotdb.commons.utils.PathUtils; import org.apache.iotdb.commons.utils.StatusUtils; @@ -98,7 +99,6 @@ import org.apache.iotdb.confignode.rpc.thrift.TShowStorageGroupResp; import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema; import org.apache.iotdb.consensus.common.DataSet; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.rpc.RpcUtils; import org.apache.iotdb.rpc.TSStatusCode; diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java index 08024d440fce..c86ba63a74cd 100644 --- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java +++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java @@ -22,6 +22,7 @@ import org.apache.iotdb.common.rpc.thrift.TFlushReq; import org.apache.iotdb.common.rpc.thrift.TSStatus; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.confignode.consensus.request.auth.AuthorPlan; import org.apache.iotdb.confignode.consensus.request.read.CountStorageGroupPlan; import org.apache.iotdb.confignode.consensus.request.read.GetDataNodeConfigurationPlan; @@ -56,7 +57,6 @@ import org.apache.iotdb.confignode.rpc.thrift.TShowDataNodesResp; import org.apache.iotdb.confignode.rpc.thrift.TShowStorageGroupResp; import org.apache.iotdb.consensus.common.DataSet; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import java.util.List; diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java index 54f77248b0b6..7c611bcd5a5d 100644 --- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java +++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java @@ -21,6 +21,7 @@ import org.apache.iotdb.common.rpc.thrift.TSStatus; import org.apache.iotdb.commons.exception.IoTDBException; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.commons.utils.StatusUtils; import org.apache.iotdb.confignode.conf.ConfigNodeConfig; import org.apache.iotdb.confignode.conf.ConfigNodeDescriptor; @@ -48,7 +49,6 @@ import org.apache.iotdb.confignode.rpc.thrift.TDeleteTimeSeriesReq; import org.apache.iotdb.confignode.rpc.thrift.TRegionMigrateResultReportReq; import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.rpc.RpcUtils; import org.apache.iotdb.rpc.TSStatusCode; diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/DeleteTimeSeriesProcedure.java b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/DeleteTimeSeriesProcedure.java index 970ac365697e..c9be7cd1a90c 100644 --- a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/DeleteTimeSeriesProcedure.java +++ b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/DeleteTimeSeriesProcedure.java @@ -25,6 +25,7 @@ import org.apache.iotdb.common.rpc.thrift.TSStatus; import org.apache.iotdb.commons.exception.MetadataException; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.confignode.client.async.datanode.AsyncDataNodeClientPool; import org.apache.iotdb.confignode.client.async.task.ConstructSchemaBlackListDataNodeTask; import org.apache.iotdb.confignode.client.async.task.DeleteDataForDeleteTimeSeriesDataNodeTask; @@ -40,7 +41,6 @@ import org.apache.iotdb.confignode.procedure.state.DeleteTimeSeriesState; import org.apache.iotdb.confignode.procedure.store.ProcedureFactory; import org.apache.iotdb.db.exception.metadata.PathNotExistException; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.mpp.rpc.thrift.TConstructSchemaBlackListReq; import org.apache.iotdb.mpp.rpc.thrift.TDeleteDataForDeleteTimeSeriesReq; import org.apache.iotdb.mpp.rpc.thrift.TDeleteTimeSeriesReq; diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java index 7c008ecc0ad2..00e33eda2bb5 100644 --- a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java +++ b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java @@ -26,6 +26,7 @@ import org.apache.iotdb.commons.conf.CommonDescriptor; import org.apache.iotdb.commons.consensus.ConsensusGroupId; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.commons.utils.StatusUtils; import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.confignode.conf.ConfigNodeConstant; @@ -105,7 +106,6 @@ import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchemaResp; import org.apache.iotdb.confignode.service.ConfigNode; import org.apache.iotdb.consensus.common.response.ConsensusGenericResponse; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.qp.logical.sys.AuthorOperator; import org.apache.iotdb.rpc.RpcUtils; import org.apache.iotdb.rpc.TSStatusCode; diff --git a/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/DeleteTimeSeriesProcedureTest.java b/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/DeleteTimeSeriesProcedureTest.java index cc62f1c0f8bb..189f855f5412 100644 --- a/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/DeleteTimeSeriesProcedureTest.java +++ b/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/DeleteTimeSeriesProcedureTest.java @@ -21,8 +21,8 @@ import org.apache.iotdb.commons.exception.IllegalPathException; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.confignode.procedure.store.ProcedureFactory; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.junit.Assert; import org.junit.Test; diff --git a/confignode/src/test/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessorTest.java b/confignode/src/test/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessorTest.java index bce8f77cd4cb..5ff8fc8a5cd8 100644 --- a/confignode/src/test/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessorTest.java +++ b/confignode/src/test/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessorTest.java @@ -29,6 +29,7 @@ import org.apache.iotdb.commons.exception.IllegalPathException; import org.apache.iotdb.commons.exception.StartupException; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.commons.udf.service.UDFClassLoaderManager; import org.apache.iotdb.commons.udf.service.UDFExecutableManager; import org.apache.iotdb.commons.udf.service.UDFRegistrationService; @@ -51,7 +52,6 @@ import org.apache.iotdb.confignode.rpc.thrift.TSetTimePartitionIntervalReq; import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema; import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchemaResp; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.rpc.TSStatusCode; import org.apache.iotdb.tsfile.utils.PublicBAOS; diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/confignode/IoTDBClusterPartitionTableTest.java b/integration-test/src/test/java/org/apache/iotdb/db/it/confignode/IoTDBClusterPartitionTableTest.java index 63943d2b12ef..39907d1e8878 100644 --- a/integration-test/src/test/java/org/apache/iotdb/db/it/confignode/IoTDBClusterPartitionTableTest.java +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/confignode/IoTDBClusterPartitionTableTest.java @@ -25,6 +25,7 @@ import org.apache.iotdb.commons.client.sync.SyncConfigNodeIServiceClient; import org.apache.iotdb.commons.exception.IllegalPathException; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.confignode.rpc.thrift.TDataPartitionReq; import org.apache.iotdb.confignode.rpc.thrift.TDataPartitionTableResp; import org.apache.iotdb.confignode.rpc.thrift.TSchemaPartitionReq; @@ -33,7 +34,6 @@ import org.apache.iotdb.confignode.rpc.thrift.TShowRegionReq; import org.apache.iotdb.confignode.rpc.thrift.TShowRegionResp; import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.it.env.ConfigFactory; import org.apache.iotdb.it.env.EnvFactory; import org.apache.iotdb.it.framework.IoTDBTestRunner; diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternNode.java b/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternNode.java new file mode 100644 index 000000000000..571ec200a48c --- /dev/null +++ b/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternNode.java @@ -0,0 +1,311 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.commons.path; + +import org.apache.iotdb.commons.utils.TestOnly; +import org.apache.iotdb.tsfile.utils.PublicBAOS; +import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +import static org.apache.iotdb.commons.conf.IoTDBConstant.MULTI_LEVEL_PATH_WILDCARD; +import static org.apache.iotdb.commons.conf.IoTDBConstant.ONE_LEVEL_PATH_WILDCARD; + +public class PathPatternNode> { + + private final String name; + private final Map> children; + private Set valueSet; + private final VSerializer serializer; + + public PathPatternNode(String name, VSerializer serializer) { + this.name = name; + this.children = new HashMap<>(); + this.serializer = serializer; + } + + public PathPatternNode(String name, Supplier> supplier, VSerializer serialize) { + this.name = name; + this.children = new HashMap<>(); + valueSet = supplier.get(); + this.serializer = serialize; + } + + public String getName() { + return name; + } + + public PathPatternNode getChildren(String nodeName) { + return children.getOrDefault(nodeName, null); + } + + public List> getMatchChildren(String nodeName) { + List> res = new ArrayList<>(); + if (children.containsKey(nodeName)) { + res.add(children.get(nodeName)); + } + if (children.containsKey(ONE_LEVEL_PATH_WILDCARD)) { + res.add(children.get(ONE_LEVEL_PATH_WILDCARD)); + } + if (children.containsKey(MULTI_LEVEL_PATH_WILDCARD)) { + res.add(children.get(MULTI_LEVEL_PATH_WILDCARD)); + } + return res; + } + + public Map> getChildren() { + return children; + } + + public void addChild(PathPatternNode tmpNode) { + children.put(tmpNode.getName(), tmpNode); + } + + public void deleteChild(PathPatternNode tmpNode) { + children.remove(tmpNode.getName()); + } + + public void appendValue(V value, BiConsumer> remappingFunction) { + remappingFunction.accept(value, valueSet); + } + + public void deleteValue(V value, BiConsumer> remappingFunction) { + remappingFunction.accept(value, valueSet); + } + + public Collection getValues() { + return valueSet; + } + + public boolean isLeaf() { + return children.isEmpty(); + } + + public boolean isWildcard() { + return name.equals(ONE_LEVEL_PATH_WILDCARD) || name.equals(MULTI_LEVEL_PATH_WILDCARD); + } + + public boolean isMultiLevelWildcard() { + return name.equals(MULTI_LEVEL_PATH_WILDCARD); + } + + @TestOnly + public boolean equalWith(PathPatternNode that) { + if (this == that) { + return true; + } + if (that == null || getClass() != that.getClass()) { + return false; + } + if (!Objects.equals(that.getName(), this.getName())) { + return false; + } + if (that.isLeaf() && this.isLeaf()) { + return true; + } + if (that.getChildren().size() != this.getChildren().size()) { + return false; + } + if (that.getValues() != null && !that.getValues().equals(this.getValues())) { + return false; + } + for (Map.Entry> entry : this.getChildren().entrySet()) { + String nodeName = entry.getKey(); + if (that.getChildren(nodeName) == null + || !that.getChildren(nodeName).equalWith(this.getChildren(nodeName))) { + return false; + } + } + return true; + } + + public void serialize(ByteBuffer buffer) { + ReadWriteIOUtils.write(name, buffer); + if (valueSet == null) { + ReadWriteIOUtils.write(0, buffer); + } else { + ReadWriteIOUtils.write(valueSet.size(), buffer); + for (V value : valueSet) { + serializer.write(value, buffer); + } + } + ReadWriteIOUtils.write(children.size(), buffer); + serializeChildren(buffer); + } + + void serializeChildren(ByteBuffer buffer) { + for (PathPatternNode childNode : children.values()) { + childNode.serialize(buffer); + } + } + + public void serialize(PublicBAOS outputStream) throws IOException { + ReadWriteIOUtils.write(name, outputStream); + if (valueSet == null) { + ReadWriteIOUtils.write(0, outputStream); + } else { + ReadWriteIOUtils.write(valueSet.size(), outputStream); + for (V value : valueSet) { + serializer.write(value, outputStream); + } + } + ReadWriteIOUtils.write(children.size(), outputStream); + serializeChildren(outputStream); + } + + public void serialize(DataOutputStream outputStream) throws IOException { + ReadWriteIOUtils.write(name, outputStream); + if (valueSet == null) { + ReadWriteIOUtils.write(0, outputStream); + } else { + ReadWriteIOUtils.write(valueSet.size(), outputStream); + for (V value : valueSet) { + serializer.write(value, outputStream); + } + } + ReadWriteIOUtils.write(children.size(), outputStream); + serializeChildren(outputStream); + } + + void serializeChildren(PublicBAOS outputStream) throws IOException { + for (PathPatternNode childNode : children.values()) { + childNode.serialize(outputStream); + } + } + + void serializeChildren(DataOutputStream outputStream) throws IOException { + for (PathPatternNode childNode : children.values()) { + childNode.serialize(outputStream); + } + } + + public static > PathPatternNode deserializeNode( + ByteBuffer buffer, T serializer) { + PathPatternNode node = + new PathPatternNode<>(ReadWriteIOUtils.readString(buffer), serializer); + int valueSize = ReadWriteIOUtils.readInt(buffer); + if (valueSize > 0) { + Set valueSet = new HashSet<>(); + for (int i = 0; i < valueSize; i++) { + valueSet.add(serializer.read(buffer)); + } + node.valueSet = valueSet; + } + int childrenSize = ReadWriteIOUtils.readInt(buffer); + while (childrenSize > 0) { + PathPatternNode tmpNode = deserializeNode(buffer, serializer); + node.addChild(tmpNode); + childrenSize--; + } + return node; + } + + /** + * Interface to support serialize and deserialize valueSet. + * + * @param Type of value. + */ + public interface Serializer { + + void write(T t, ByteBuffer buffer); + + void write(T t, PublicBAOS buffer) throws IOException; + + void write(T t, DataOutputStream buffer) throws IOException; + + T read(ByteBuffer buffer); + } + + public static class StringSerializer implements PathPatternNode.Serializer { + + private static class StringSerializerHolder { + private static final StringSerializer INSTANCE = new StringSerializer(); + + private StringSerializerHolder() {} + } + + public static StringSerializer getInstance() { + return StringSerializerHolder.INSTANCE; + } + + private StringSerializer() {} + + @Override + public void write(String s, ByteBuffer buffer) { + ReadWriteIOUtils.write(s, buffer); + } + + @Override + public void write(String s, PublicBAOS buffer) throws IOException { + ReadWriteIOUtils.write(s, buffer); + } + + @Override + public void write(String s, DataOutputStream buffer) throws IOException { + ReadWriteIOUtils.write(s, buffer); + } + + @Override + public String read(ByteBuffer buffer) { + return ReadWriteIOUtils.readString(buffer); + } + } + + public static class VoidSerializer implements PathPatternNode.Serializer { + + private static class VoidSerializerHolder { + private static final VoidSerializer INSTANCE = new VoidSerializer(); + + private VoidSerializerHolder() {} + } + + public static VoidSerializer getInstance() { + return VoidSerializer.VoidSerializerHolder.INSTANCE; + } + + private VoidSerializer() {} + + @Override + public void write(Void unused, ByteBuffer buffer) {} + + @Override + public void write(Void unused, PublicBAOS buffer) {} + + @Override + public void write(Void unused, DataOutputStream buffer) {} + + @Override + public Void read(ByteBuffer buffer) { + return null; + } + } +} diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/PathPatternTree.java b/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java similarity index 83% rename from server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/PathPatternTree.java rename to node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java index 970e8715cc61..b0572ebbeb0f 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/PathPatternTree.java +++ b/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java @@ -17,15 +17,13 @@ * under the License. */ -package org.apache.iotdb.db.mpp.common.schematree; +package org.apache.iotdb.commons.path; import org.apache.iotdb.commons.conf.IoTDBConstant; -import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternNode.VoidSerializer; import org.apache.iotdb.commons.utils.TestOnly; -import org.apache.iotdb.db.qp.constant.SQLConstant; import org.apache.iotdb.tsfile.common.constant.TsFileConstant; import org.apache.iotdb.tsfile.utils.PublicBAOS; -import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils; import java.io.DataOutputStream; import java.io.IOException; @@ -41,20 +39,20 @@ public class PathPatternTree { - private PathPatternNode root; + private PathPatternNode root; private List pathPatternList; public PathPatternTree() { - this.root = new PathPatternNode(SQLConstant.ROOT); + this.root = new PathPatternNode<>(IoTDBConstant.PATH_ROOT, VoidSerializer.getInstance()); this.pathPatternList = new ArrayList<>(); } - public PathPatternNode getRoot() { + public PathPatternNode getRoot() { return root; } - public void setRoot(PathPatternNode root) { + public void setRoot(PathPatternNode root) { this.root = root; } @@ -103,12 +101,13 @@ public void constructTree() { pathPatternList.clear(); } - private void appendBranchWithoutPrune(PathPatternNode curNode, String[] pathNodes, int pos) { + private void appendBranchWithoutPrune( + PathPatternNode curNode, String[] pathNodes, int pos) { if (pos == pathNodes.length - 1) { return; } - PathPatternNode nextNode = curNode.getChildren(pathNodes[pos + 1]); + PathPatternNode nextNode = curNode.getChildren(pathNodes[pos + 1]); if (nextNode != null) { appendBranchWithoutPrune(nextNode, pathNodes, pos + 1); @@ -117,9 +116,11 @@ private void appendBranchWithoutPrune(PathPatternNode curNode, String[] pathNode } } - private void constructBranch(PathPatternNode curNode, String[] pathNodes, int pos) { + private void constructBranch( + PathPatternNode curNode, String[] pathNodes, int pos) { for (int i = pos; i < pathNodes.length; i++) { - PathPatternNode newNode = new PathPatternNode(pathNodes[i]); + PathPatternNode newNode = + new PathPatternNode<>(pathNodes[i], VoidSerializer.getInstance()); curNode.addChild(newNode); curNode = newNode; } @@ -142,7 +143,7 @@ public List getAllDevicePatterns() { } private void searchDevicePattern( - PathPatternNode curNode, List nodes, Set results) { + PathPatternNode curNode, List nodes, Set results) { nodes.add(curNode.getName()); if (curNode.isLeaf()) { if (!curNode.getName().equals(IoTDBConstant.MULTI_LEVEL_PATH_WILDCARD)) { @@ -159,7 +160,7 @@ private void searchDevicePattern( nodes.remove(nodes.size() - 1); return; } - for (PathPatternNode childNode : curNode.getChildren().values()) { + for (PathPatternNode childNode : curNode.getChildren().values()) { searchDevicePattern(childNode, nodes, results); } nodes.remove(nodes.size() - 1); @@ -173,14 +174,16 @@ public List getAllPathPatterns() { } private void searchPathPattern( - PathPatternNode node, Deque ancestors, List fullPaths) { + PathPatternNode node, + Deque ancestors, + List fullPaths) { if (node.isLeaf()) { fullPaths.add(convertNodesToPartialPath(node, ancestors)); return; } ancestors.push(node.getName()); - for (PathPatternNode child : node.getChildren().values()) { + for (PathPatternNode child : node.getChildren().values()) { searchPathPattern(child, ancestors, fullPaths); } ancestors.pop(); @@ -208,7 +211,8 @@ private String convertNodesToString(List nodes) { return fullPathBuilder.toString(); } - private PartialPath convertNodesToPartialPath(PathPatternNode node, Deque ancestors) { + private PartialPath convertNodesToPartialPath( + PathPatternNode node, Deque ancestors) { Iterator iterator = ancestors.descendingIterator(); List nodeList = new ArrayList<>(ancestors.size() + 1); while (iterator.hasNext()) { @@ -248,23 +252,13 @@ public void serialize(ByteBuffer buffer) { } public static PathPatternTree deserialize(ByteBuffer buffer) { - PathPatternNode root = deserializeNode(buffer); + PathPatternNode root = + PathPatternNode.deserializeNode(buffer, VoidSerializer.getInstance()); PathPatternTree deserializedPatternTree = new PathPatternTree(); deserializedPatternTree.setRoot(root); return deserializedPatternTree; } - private static PathPatternNode deserializeNode(ByteBuffer buffer) { - PathPatternNode node = new PathPatternNode(ReadWriteIOUtils.readString(buffer)); - int childrenSize = ReadWriteIOUtils.readInt(buffer); - while (childrenSize > 0) { - PathPatternNode tmpNode = deserializeNode(buffer); - node.addChild(tmpNode); - childrenSize--; - } - return node; - } - @TestOnly public boolean equalWith(PathPatternTree that) { if (this == that) { diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/path/PatternTreeMap.java b/node-commons/src/main/java/org/apache/iotdb/commons/path/PatternTreeMap.java new file mode 100644 index 000000000000..7cff90f7a79c --- /dev/null +++ b/node-commons/src/main/java/org/apache/iotdb/commons/path/PatternTreeMap.java @@ -0,0 +1,151 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.iotdb.commons.path; + +import org.apache.iotdb.commons.conf.IoTDBConstant; + +import javax.annotation.concurrent.NotThreadSafe; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +@NotThreadSafe +public class PatternTreeMap> { + private final PathPatternNode root; + private final Supplier> supplier; + private final BiConsumer> appendFunction; + private final BiConsumer> deleteFunction; + private final VSerializer serializer; + /** + * Create PatternTreeMap. + * + * @param supplier provide type of set to store values on PathPatternNode + * @param appendFunction define the merge logic of append value + * @param deleteFunction define the split logic of delete value + */ + public PatternTreeMap( + Supplier> supplier, + BiConsumer> appendFunction, + BiConsumer> deleteFunction, + VSerializer serializer) { + this.root = new PathPatternNode<>(IoTDBConstant.PATH_ROOT, supplier, serializer); + this.supplier = supplier; + this.appendFunction = appendFunction; + this.deleteFunction = deleteFunction; + this.serializer = serializer; + } + + /** + * Append key and value to PatternTreeMap. + * + * @param key PartialPath that can contain '*' or '**' + * @param value The value to be appended + */ + public void append(PartialPath key, V value) { + if (appendFunction == null) { + throw new UnsupportedOperationException(); + } + String[] pathNodes = key.getNodes(); + PathPatternNode curNode = root; + for (int i = 1; i < pathNodes.length; i++) { + PathPatternNode nextNode = curNode.getChildren(pathNodes[i]); + if (nextNode == null) { + nextNode = new PathPatternNode<>(pathNodes[i], supplier, serializer); + curNode.addChild(nextNode); + } + curNode = nextNode; + } + curNode.appendValue(value, appendFunction); + } + + /** + * Delete key and value to PatternTreeMap. + * + * @param key PartialPath that can contain '*' or '**' + * @param value The value to be deleted + */ + public void delete(PartialPath key, V value) { + if (deleteFunction == null) { + throw new UnsupportedOperationException(); + } + deletePathNode(root, key.getNodes(), 0, value); + } + + /** + * Recursive method for deleting value. + * + * @param node current PathPatternNode + * @param pathNodes pathNodes of key + * @param pos current index of pathNodes + * @param value the value to be deleted + * @return true if current PathPatternNode can be removed + */ + private boolean deletePathNode( + PathPatternNode node, String[] pathNodes, int pos, V value) { + if (node == null) { + return false; + } + if (pos == pathNodes.length - 1) { + node.deleteValue(value, deleteFunction); + } else { + PathPatternNode child = node.getChildren(pathNodes[pos + 1]); + if (deletePathNode(child, pathNodes, pos + 1, value)) { + node.deleteChild(child); + } + } + return node.isLeaf() && node.getValues().isEmpty(); + } + + /** + * Get value list related to PathPattern that overlapped with fullPath. + * + * @param fullPath full path without wildcard + * @return value list + */ + public List getOverlapped(PartialPath fullPath) { + List res = new ArrayList<>(); + searchOverlapped(root, fullPath.getNodes(), 0, res); + return res; + } + + /** + * Recursive method for search overlapped pattern. + * + * @param node current PathPatternNode + * @param pathNodes pathNodes of key + * @param pos current index of pathNodes + * @param resultList result list + */ + public void searchOverlapped( + PathPatternNode node, String[] pathNodes, int pos, List resultList) { + if (pos == pathNodes.length - 1) { + resultList.addAll(node.getValues()); + return; + } + if (node.isMultiLevelWildcard()) { + searchOverlapped(node, pathNodes, pos + 1, resultList); + } + for (PathPatternNode child : node.getMatchChildren(pathNodes[pos + 1])) { + searchOverlapped(child, pathNodes, pos + 1, resultList); + } + } +} diff --git a/server/src/test/java/org/apache/iotdb/db/mpp/common/schematree/PathPatternTreeTest.java b/node-commons/src/test/java/org/apache/iotdb/commons/path/PathPatternTreeTest.java similarity index 98% rename from server/src/test/java/org/apache/iotdb/db/mpp/common/schematree/PathPatternTreeTest.java rename to node-commons/src/test/java/org/apache/iotdb/commons/path/PathPatternTreeTest.java index eff740e1b21b..170b39e24803 100644 --- a/server/src/test/java/org/apache/iotdb/db/mpp/common/schematree/PathPatternTreeTest.java +++ b/node-commons/src/test/java/org/apache/iotdb/commons/path/PathPatternTreeTest.java @@ -17,10 +17,9 @@ * under the License. */ -package org.apache.iotdb.db.mpp.common.schematree; +package org.apache.iotdb.commons.path; import org.apache.iotdb.commons.exception.IllegalPathException; -import org.apache.iotdb.commons.path.PartialPath; import org.apache.iotdb.tsfile.utils.PublicBAOS; import org.junit.Assert; diff --git a/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/RSchemaRegion.java b/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/RSchemaRegion.java index 6aed5211f795..087d329380ef 100644 --- a/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/RSchemaRegion.java +++ b/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/RSchemaRegion.java @@ -26,6 +26,7 @@ import org.apache.iotdb.commons.exception.MetadataException; import org.apache.iotdb.commons.file.SystemFileFactory; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.commons.utils.PathUtils; import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.db.conf.IoTDBConfig; @@ -56,7 +57,6 @@ import org.apache.iotdb.db.metadata.template.Template; import org.apache.iotdb.db.metadata.utils.MetaFormatUtils; import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.qp.physical.crud.InsertPlan; import org.apache.iotdb.db.qp.physical.crud.InsertRowPlan; import org.apache.iotdb.db.qp.physical.crud.InsertTabletPlan; diff --git a/server/src/main/java/org/apache/iotdb/db/localconfignode/LocalConfigNode.java b/server/src/main/java/org/apache/iotdb/db/localconfignode/LocalConfigNode.java index dff123cbb298..05e24be602c1 100644 --- a/server/src/main/java/org/apache/iotdb/db/localconfignode/LocalConfigNode.java +++ b/server/src/main/java/org/apache/iotdb/db/localconfignode/LocalConfigNode.java @@ -49,6 +49,7 @@ import org.apache.iotdb.commons.partition.DataPartitionQueryParam; import org.apache.iotdb.commons.partition.executor.SeriesPartitionExecutor; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.commons.utils.AuthUtils; import org.apache.iotdb.commons.utils.StatusUtils; import org.apache.iotdb.confignode.rpc.thrift.TPipeInfo; @@ -79,7 +80,6 @@ import org.apache.iotdb.db.metadata.template.Template; import org.apache.iotdb.db.metadata.template.TemplateManager; import org.apache.iotdb.db.metadata.utils.MetaUtils; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.mpp.plan.constant.DataNodeEndPoints; import org.apache.iotdb.db.mpp.plan.statement.sys.AuthorStatement; import org.apache.iotdb.db.mpp.plan.statement.sys.sync.CreatePipeSinkStatement; diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/path/PatternTreeMapFactory.java b/server/src/main/java/org/apache/iotdb/db/metadata/path/PatternTreeMapFactory.java new file mode 100644 index 000000000000..a4ed04aed8e2 --- /dev/null +++ b/server/src/main/java/org/apache/iotdb/db/metadata/path/PatternTreeMapFactory.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.iotdb.db.metadata.path; + +import org.apache.iotdb.commons.path.PathPatternNode.StringSerializer; +import org.apache.iotdb.commons.path.PatternTreeMap; + +import java.util.HashSet; + +public class PatternTreeMapFactory { + public static PatternTreeMap getTriggerPatternTreeMap() { + return new PatternTreeMap<>( + HashSet::new, + (triggerName, set) -> set.add(triggerName), + (triggerName, set) -> set.remove(triggerName), + StringSerializer.getInstance()); + } +} diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java index e8b444a48071..55a5ecbe8f26 100644 --- a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java +++ b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java @@ -23,6 +23,7 @@ import org.apache.iotdb.commons.consensus.SchemaRegionId; import org.apache.iotdb.commons.exception.MetadataException; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.exception.metadata.PathNotExistException; import org.apache.iotdb.db.metadata.LocalSchemaProcessor; import org.apache.iotdb.db.metadata.mnode.IMNode; @@ -30,7 +31,6 @@ import org.apache.iotdb.db.metadata.path.MeasurementPath; import org.apache.iotdb.db.metadata.template.Template; import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.qp.physical.crud.InsertPlan; import org.apache.iotdb.db.qp.physical.sys.ActivateTemplateInClusterPlan; import org.apache.iotdb.db.qp.physical.sys.ActivateTemplatePlan; diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java index b52936f158ad..28cc5feeeaa8 100644 --- a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java +++ b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java @@ -23,6 +23,7 @@ import org.apache.iotdb.commons.exception.MetadataException; import org.apache.iotdb.commons.file.SystemFileFactory; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.commons.utils.FileUtils; import org.apache.iotdb.consensus.ConsensusFactory; import org.apache.iotdb.db.conf.IoTDBConfig; @@ -59,7 +60,6 @@ import org.apache.iotdb.db.metadata.template.TemplateManager; import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo; import org.apache.iotdb.db.mpp.common.schematree.MeasurementSchemaInfo; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.qp.constant.SQLConstant; import org.apache.iotdb.db.qp.physical.PhysicalPlan; import org.apache.iotdb.db.qp.physical.crud.InsertPlan; diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java index 1ce7ecf55056..657fd9b50685 100644 --- a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java +++ b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java @@ -23,6 +23,7 @@ import org.apache.iotdb.commons.exception.MetadataException; import org.apache.iotdb.commons.file.SystemFileFactory; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.conf.IoTDBConfig; import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.engine.StorageEngine; @@ -56,7 +57,6 @@ import org.apache.iotdb.db.metadata.template.Template; import org.apache.iotdb.db.metadata.template.TemplateManager; import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.qp.constant.SQLConstant; import org.apache.iotdb.db.qp.physical.PhysicalPlan; import org.apache.iotdb.db.qp.physical.crud.InsertPlan; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/PathPatternNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/PathPatternNode.java deleted file mode 100644 index 42db1e1995fc..000000000000 --- a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/PathPatternNode.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.iotdb.db.mpp.common.schematree; - -import org.apache.iotdb.commons.utils.TestOnly; -import org.apache.iotdb.tsfile.utils.PublicBAOS; -import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils; - -import java.io.DataOutputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -public class PathPatternNode { - - private final String name; - private final Map children; - - public PathPatternNode(String name) { - this.name = name; - this.children = new HashMap<>(); - } - - public String getName() { - return name; - } - - public PathPatternNode getChildren(String nodeName) { - return children.getOrDefault(nodeName, null); - } - - public Map getChildren() { - return children; - } - - public void addChild(PathPatternNode tmpNode) { - children.put(tmpNode.getName(), tmpNode); - } - - public boolean isLeaf() { - return children.isEmpty(); - } - - public boolean isWildcard() { - return name.equals("*") || name.equals("**"); - } - - @TestOnly - public boolean equalWith(PathPatternNode that) { - if (this == that) { - return true; - } - if (that == null || getClass() != that.getClass()) { - return false; - } - if (!Objects.equals(that.getName(), this.getName())) { - return false; - } - if (that.isLeaf() && this.isLeaf()) { - return true; - } - if (that.getChildren().size() != this.getChildren().size()) { - return false; - } - for (Map.Entry entry : this.getChildren().entrySet()) { - String nodeName = entry.getKey(); - if (that.getChildren(nodeName) == null - || !that.getChildren(nodeName).equalWith(this.getChildren(nodeName))) { - return false; - } - } - return true; - } - - public void serialize(ByteBuffer buffer) { - ReadWriteIOUtils.write(name, buffer); - ReadWriteIOUtils.write(children.size(), buffer); - serializeChildren(buffer); - } - - void serializeChildren(ByteBuffer buffer) { - for (PathPatternNode childNode : children.values()) { - childNode.serialize(buffer); - } - } - - public void serialize(PublicBAOS outputStream) throws IOException { - ReadWriteIOUtils.write(name, outputStream); - ReadWriteIOUtils.write(children.size(), outputStream); - serializeChildren(outputStream); - } - - public void serialize(DataOutputStream outputStream) throws IOException { - ReadWriteIOUtils.write(name, outputStream); - ReadWriteIOUtils.write(children.size(), outputStream); - serializeChildren(outputStream); - } - - void serializeChildren(PublicBAOS outputStream) throws IOException { - for (PathPatternNode childNode : children.values()) { - childNode.serialize(outputStream); - } - } - - void serializeChildren(DataOutputStream outputStream) throws IOException { - for (PathPatternNode childNode : children.values()) { - childNode.serialize(outputStream); - } - } -} diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperator.java index 4e07c4178c26..708725289eca 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperator.java @@ -21,10 +21,10 @@ import org.apache.iotdb.commons.exception.MetadataException; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.metadata.schemaregion.ISchemaRegion; import org.apache.iotdb.db.metadata.template.Template; import org.apache.iotdb.db.mpp.common.schematree.ClusterSchemaTree; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.mpp.execution.operator.OperatorContext; import org.apache.iotdb.db.mpp.execution.operator.source.SourceOperator; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java index b39ebbc08762..391e44d48a88 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java @@ -26,6 +26,7 @@ import org.apache.iotdb.commons.partition.SchemaNodeManagementPartition; import org.apache.iotdb.commons.partition.SchemaPartition; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.engine.StorageEngineV2; import org.apache.iotdb.db.engine.storagegroup.TsFileResource; import org.apache.iotdb.db.exception.metadata.template.TemplateImcompatibeException; @@ -41,7 +42,6 @@ import org.apache.iotdb.db.mpp.common.header.DatasetHeaderFactory; import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo; import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.mpp.plan.expression.Expression; import org.apache.iotdb.db.mpp.plan.expression.ExpressionType; import org.apache.iotdb.db.mpp.plan.expression.leaf.TimeSeriesOperand; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java index 3ff903e1cd04..53d7c0421756 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java @@ -30,6 +30,7 @@ import org.apache.iotdb.commons.partition.SchemaNodeManagementPartition; import org.apache.iotdb.commons.partition.SchemaPartition; import org.apache.iotdb.commons.partition.executor.SeriesPartitionExecutor; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.confignode.rpc.thrift.TDataPartitionReq; import org.apache.iotdb.confignode.rpc.thrift.TDataPartitionTableResp; import org.apache.iotdb.confignode.rpc.thrift.TSchemaNodeManagementReq; @@ -42,7 +43,6 @@ import org.apache.iotdb.db.conf.IoTDBConfig; import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.exception.sql.StatementAnalyzeException; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.mpp.plan.analyze.cache.PartitionCache; import org.apache.iotdb.mpp.rpc.thrift.TRegionRouteReq; import org.apache.iotdb.rpc.TSStatusCode; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterSchemaFetcher.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterSchemaFetcher.java index 49daadf555e3..643e8a374bc1 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterSchemaFetcher.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterSchemaFetcher.java @@ -22,6 +22,7 @@ import org.apache.iotdb.commons.exception.IoTDBException; import org.apache.iotdb.commons.exception.MetadataException; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.conf.IoTDBConfig; import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.metadata.cache.DataNodeSchemaCache; @@ -33,7 +34,6 @@ import org.apache.iotdb.db.mpp.common.schematree.ClusterSchemaTree; import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo; import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.mpp.plan.Coordinator; import org.apache.iotdb.db.mpp.plan.execution.ExecutionResult; import org.apache.iotdb.db.mpp.plan.statement.Statement; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ConcatPathRewriter.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ConcatPathRewriter.java index ed0ed490b601..71273d5c120f 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ConcatPathRewriter.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ConcatPathRewriter.java @@ -19,9 +19,9 @@ package org.apache.iotdb.db.mpp.plan.analyze; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.exception.sql.SemanticException; import org.apache.iotdb.db.exception.sql.StatementAnalyzeException; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.mpp.plan.expression.Expression; import org.apache.iotdb.db.mpp.plan.statement.Statement; import org.apache.iotdb.db.mpp.plan.statement.component.ResultColumn; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java index 491d78aba9af..d8219177c3f8 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java @@ -21,11 +21,11 @@ import org.apache.iotdb.commons.conf.IoTDBConstant; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.exception.sql.MeasurementNotExistException; import org.apache.iotdb.db.exception.sql.SemanticException; import org.apache.iotdb.db.metadata.path.MeasurementPath; import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.mpp.plan.expression.Expression; import org.apache.iotdb.db.mpp.plan.expression.ExpressionType; import org.apache.iotdb.db.mpp.plan.expression.binary.BinaryExpression; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/FakePartitionFetcherImpl.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/FakePartitionFetcherImpl.java index e042e57fad53..014bc6e7fa88 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/FakePartitionFetcherImpl.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/FakePartitionFetcherImpl.java @@ -30,8 +30,8 @@ import org.apache.iotdb.commons.partition.DataPartitionQueryParam; import org.apache.iotdb.commons.partition.SchemaNodeManagementPartition; import org.apache.iotdb.commons.partition.SchemaPartition; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.conf.IoTDBDescriptor; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.mpp.rpc.thrift.TRegionRouteReq; import java.util.ArrayList; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/FakeSchemaFetcherImpl.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/FakeSchemaFetcherImpl.java index 7c620a43e3f1..4e478b18fdf0 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/FakeSchemaFetcherImpl.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/FakeSchemaFetcherImpl.java @@ -20,10 +20,10 @@ package org.apache.iotdb.db.mpp.plan.analyze; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.metadata.template.Template; import org.apache.iotdb.db.mpp.common.schematree.ClusterSchemaTree; import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.mpp.common.schematree.node.SchemaEntityNode; import org.apache.iotdb.db.mpp.common.schematree.node.SchemaInternalNode; import org.apache.iotdb.db.mpp.common.schematree.node.SchemaMeasurementNode; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/IPartitionFetcher.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/IPartitionFetcher.java index c187794e853d..a4287bcde0cb 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/IPartitionFetcher.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/IPartitionFetcher.java @@ -22,7 +22,7 @@ import org.apache.iotdb.commons.partition.DataPartitionQueryParam; import org.apache.iotdb.commons.partition.SchemaNodeManagementPartition; import org.apache.iotdb.commons.partition.SchemaPartition; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.mpp.rpc.thrift.TRegionRouteReq; import java.util.List; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ISchemaFetcher.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ISchemaFetcher.java index e175f5917466..1e319efaec26 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ISchemaFetcher.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ISchemaFetcher.java @@ -20,9 +20,9 @@ package org.apache.iotdb.db.mpp.plan.analyze; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.metadata.template.Template; import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; import org.apache.iotdb.tsfile.utils.Pair; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandalonePartitionFetcher.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandalonePartitionFetcher.java index dab21c0fe2a6..6f149e1b03d6 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandalonePartitionFetcher.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandalonePartitionFetcher.java @@ -26,6 +26,7 @@ import org.apache.iotdb.commons.partition.SchemaPartition; import org.apache.iotdb.commons.partition.executor.SeriesPartitionExecutor; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.commons.utils.PathUtils; import org.apache.iotdb.db.conf.IoTDBConfig; import org.apache.iotdb.db.conf.IoTDBDescriptor; @@ -35,7 +36,6 @@ import org.apache.iotdb.db.localconfignode.LocalConfigNode; import org.apache.iotdb.db.metadata.mnode.MNodeType; import org.apache.iotdb.db.metadata.utils.MetaUtils; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.mpp.rpc.thrift.TRegionRouteReq; import org.apache.iotdb.tsfile.utils.Pair; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandaloneSchemaFetcher.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandaloneSchemaFetcher.java index 924a7517d22b..e056f4240bc7 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandaloneSchemaFetcher.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandaloneSchemaFetcher.java @@ -21,6 +21,7 @@ import org.apache.iotdb.commons.consensus.SchemaRegionId; import org.apache.iotdb.commons.exception.MetadataException; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.conf.IoTDBConfig; import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.exception.sql.StatementAnalyzeException; @@ -32,7 +33,6 @@ import org.apache.iotdb.db.mpp.common.schematree.DeviceGroupSchemaTree; import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo; import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; import org.apache.iotdb.tsfile.utils.Pair; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java index d4bd990140cb..bf4356ec1290 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java @@ -28,6 +28,7 @@ import org.apache.iotdb.commons.exception.IoTDBException; import org.apache.iotdb.commons.executable.ExecutableManager; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.confignode.rpc.thrift.TCountStorageGroupResp; import org.apache.iotdb.confignode.rpc.thrift.TCreateFunctionReq; import org.apache.iotdb.confignode.rpc.thrift.TCreateTriggerReq; @@ -51,7 +52,6 @@ import org.apache.iotdb.db.localconfignode.LocalConfigNode; import org.apache.iotdb.db.metadata.template.ClusterTemplateManager; import org.apache.iotdb.db.metadata.template.Template; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.mpp.plan.execution.config.ConfigTaskResult; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.CountStorageGroupTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.SetStorageGroupTask; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java index 3a35c3369da2..c1b1e3de9616 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java @@ -22,13 +22,13 @@ import org.apache.iotdb.common.rpc.thrift.TSchemaNode; import org.apache.iotdb.commons.exception.IllegalPathException; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.metadata.path.AlignedPath; import org.apache.iotdb.db.metadata.path.MeasurementPath; import org.apache.iotdb.db.metadata.template.Template; import org.apache.iotdb.db.metadata.utils.MetaUtils; import org.apache.iotdb.db.mpp.common.MPPQueryContext; import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.mpp.plan.analyze.Analysis; import org.apache.iotdb.db.mpp.plan.analyze.ExpressionAnalyzer; import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/SchemaFetchScanNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/SchemaFetchScanNode.java index 65adccc001b2..033ec978e63b 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/SchemaFetchScanNode.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/SchemaFetchScanNode.java @@ -21,9 +21,9 @@ import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.metadata.path.PathDeserializeUtil; import org.apache.iotdb.db.metadata.template.Template; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/ConstructSchemaBlackListNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/ConstructSchemaBlackListNode.java index 4d71b22096a4..50916fed636c 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/ConstructSchemaBlackListNode.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/ConstructSchemaBlackListNode.java @@ -19,7 +19,7 @@ package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/DeleteTimeSeriesNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/DeleteTimeSeriesNode.java index 9e70f6100a40..b3251257fe7c 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/DeleteTimeSeriesNode.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/DeleteTimeSeriesNode.java @@ -19,7 +19,7 @@ package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/RollbackSchemaBlackListNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/RollbackSchemaBlackListNode.java index f79b814bff7b..e7287d559388 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/RollbackSchemaBlackListNode.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/RollbackSchemaBlackListNode.java @@ -19,7 +19,7 @@ package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/internal/SchemaFetchStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/internal/SchemaFetchStatement.java index fd55d503c315..56c5ea73901e 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/internal/SchemaFetchStatement.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/internal/SchemaFetchStatement.java @@ -20,8 +20,8 @@ package org.apache.iotdb.db.mpp.plan.statement.internal; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.metadata.template.Template; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.mpp.plan.constant.StatementType; import org.apache.iotdb.db.mpp.plan.statement.Statement; import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor; diff --git a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java index a63b68427416..2e1a9f7f4f3f 100644 --- a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java +++ b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java @@ -33,6 +33,7 @@ import org.apache.iotdb.commons.consensus.SchemaRegionId; import org.apache.iotdb.commons.exception.MetadataException; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.commons.trigger.TriggerInformation; import org.apache.iotdb.commons.trigger.service.TriggerExecutableManager; import org.apache.iotdb.commons.udf.service.UDFExecutableManager; @@ -58,7 +59,6 @@ import org.apache.iotdb.db.metadata.template.ClusterTemplateManager; import org.apache.iotdb.db.metadata.template.TemplateInternalRPCUpdateType; import org.apache.iotdb.db.mpp.common.FragmentInstanceId; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.mpp.execution.fragment.FragmentInstanceInfo; import org.apache.iotdb.db.mpp.execution.fragment.FragmentInstanceManager; import org.apache.iotdb.db.mpp.execution.fragment.FragmentInstanceState; diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/path/PatternTreeMapTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/path/PatternTreeMapTest.java new file mode 100644 index 000000000000..61c8dc2957a7 --- /dev/null +++ b/server/src/test/java/org/apache/iotdb/db/metadata/path/PatternTreeMapTest.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.iotdb.db.metadata.path; + +import org.apache.iotdb.commons.exception.IllegalPathException; +import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternNode.StringSerializer; +import org.apache.iotdb.commons.path.PatternTreeMap; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class PatternTreeMapTest { + + @Test + public void stringAppendPatternTreeMapTest() throws IllegalPathException { + PatternTreeMap patternTreeMap = + PatternTreeMapFactory.getTriggerPatternTreeMap(); + + patternTreeMap.append(new PartialPath("root.sg1.d1.s1"), "A"); + patternTreeMap.append(new PartialPath("root.**.s1"), "B"); + patternTreeMap.append(new PartialPath("root.sg1.*.s1"), "C"); + patternTreeMap.append(new PartialPath("root.sg1.d1.s1"), "D"); + patternTreeMap.append(new PartialPath("root.sg1.**"), "E"); + patternTreeMap.append(new PartialPath("root.sg1.**.s2"), "F"); + patternTreeMap.append(new PartialPath("root.**.d1.*"), "G"); + patternTreeMap.append(new PartialPath("root.**.d1.**"), "H"); + patternTreeMap.append(new PartialPath("root.*.d1.**"), "I"); + patternTreeMap.append(new PartialPath("root.**"), "J"); + checkOverlapped( + patternTreeMap, + new PartialPath("root.sg1.d1.s1"), + new HashSet(Arrays.asList("A", "B", "C", "D", "E", "G", "H", "I", "J"))); + checkOverlapped( + patternTreeMap, new PartialPath("root.sg2.s1"), new HashSet(Arrays.asList("B", "J"))); + checkOverlapped( + patternTreeMap, + new PartialPath("root.sg1.d1.s2"), + new HashSet(Arrays.asList("E", "F", "G", "H", "I", "J"))); + checkOverlapped( + patternTreeMap, + new PartialPath("root.sg1.d1.v1.s1"), + new HashSet(Arrays.asList("B", "E", "H", "I", "J"))); + // delete leaf node with common parent + patternTreeMap.delete(new PartialPath("root.**.d1.*"), "G"); + // only delete value, no delete leaf node + patternTreeMap.delete(new PartialPath("root.sg1.d1.s1"), "D"); + // delete internal node + patternTreeMap.delete(new PartialPath("root.**"), "J"); + checkOverlapped( + patternTreeMap, + new PartialPath("root.sg1.d1.s1"), + new HashSet(Arrays.asList("A", "B", "C", "E", "H", "I"))); + checkOverlapped( + patternTreeMap, + new PartialPath("root.sg1.d1.s2"), + new HashSet(Arrays.asList("E", "F", "H", "I"))); + checkOverlapped( + patternTreeMap, + new PartialPath("root.sg1.d1.v1.s1"), + new HashSet(Arrays.asList("B", "E", "H", "I"))); + } + + private void checkOverlapped( + PatternTreeMap patternTreeMap, PartialPath partialPath, Set resultSet) { + List list = patternTreeMap.getOverlapped(partialPath); + Assert.assertEquals(resultSet.size(), list.size()); + for (Object o : list) { + Assert.assertTrue(resultSet.contains(o)); + } + } +} diff --git a/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperatorTest.java b/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperatorTest.java index a99a4743b9f8..a322049d0a37 100644 --- a/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperatorTest.java +++ b/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperatorTest.java @@ -21,13 +21,13 @@ import org.apache.iotdb.commons.consensus.SchemaRegionId; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.metadata.path.MeasurementPath; import org.apache.iotdb.db.metadata.schemaregion.ISchemaRegion; import org.apache.iotdb.db.metadata.schemaregion.SchemaEngine; import org.apache.iotdb.db.mpp.common.schematree.ClusterSchemaTree; import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo; import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; import org.apache.iotdb.db.qp.physical.sys.CreateAlignedTimeSeriesPlan; import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan; import org.apache.iotdb.db.utils.EnvironmentUtils; diff --git a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/metadata/read/SchemaFetchScanNodeTest.java b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/metadata/read/SchemaFetchScanNodeTest.java index fdc4806e6d44..ad6859d0bf30 100644 --- a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/metadata/read/SchemaFetchScanNodeTest.java +++ b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/metadata/read/SchemaFetchScanNodeTest.java @@ -21,7 +21,7 @@ import org.apache.iotdb.commons.exception.IllegalPathException; import org.apache.iotdb.commons.path.PartialPath; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType; import org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.read.SchemaFetchScanNode; diff --git a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/metadata/write/DeleteTimeSeriesNodeSerdeTest.java b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/metadata/write/DeleteTimeSeriesNodeSerdeTest.java index e2c17af9c73d..74d66d88ecda 100644 --- a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/metadata/write/DeleteTimeSeriesNodeSerdeTest.java +++ b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/metadata/write/DeleteTimeSeriesNodeSerdeTest.java @@ -21,7 +21,7 @@ import org.apache.iotdb.commons.exception.IllegalPathException; import org.apache.iotdb.commons.path.PartialPath; -import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree; +import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId; import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;