diff --git a/iotdb/src/main/java/org/apache/iotdb/db/metadata/MGraph.java b/iotdb/src/main/java/org/apache/iotdb/db/metadata/MGraph.java index 14c94fbe94cf7be09bb5eebd60e9b4833c376f00..8b2bfdc7f84498676c8e4db42a70e23352fd370f 100644 --- a/iotdb/src/main/java/org/apache/iotdb/db/metadata/MGraph.java +++ b/iotdb/src/main/java/org/apache/iotdb/db/metadata/MGraph.java @@ -148,11 +148,22 @@ public class MGraph implements Serializable { * Check whether the input path is storage level for current Metadata Tree or not. * * @param path Format: root.node.(node)* + * @apiNote :for cluster */ public boolean checkStorageLevel(String path) { return mtree.checkStorageGroup(path); } + /** + * Check whether the storage group of the input path exists or not + * + * @param path Format: root.node.(node)* + * @apiNote :for cluster + */ + public boolean checkStorageExistOfPath(String path) { + return mtree.checkStorageExistOfPath(path); + } + /** * Get all paths for given seriesPath regular expression if given seriesPath belongs to MTree, or * get all linked seriesPath for given seriesPath if given seriesPath belongs to PTree Notice: diff --git a/iotdb/src/main/java/org/apache/iotdb/db/metadata/MManager.java b/iotdb/src/main/java/org/apache/iotdb/db/metadata/MManager.java index c3f07c639ba544a18601519b5b2fe6b6e1733c27..73846950150b0a02023c6c620dcf0e8ab6e59027 100644 --- a/iotdb/src/main/java/org/apache/iotdb/db/metadata/MManager.java +++ b/iotdb/src/main/java/org/apache/iotdb/db/metadata/MManager.java @@ -343,6 +343,7 @@ public class MManager { /** * function for checking if the given path is storage level of mTree or not. + * @apiNote :for cluster */ public boolean checkStorageLevelOfMTree(String path) { lock.readLock().lock(); @@ -353,6 +354,19 @@ public class MManager { } } + /** + * function for checking if the storage group of given path exists in mTree or not. + * @apiNote :for cluster + */ + public boolean checkStorageExistOfPath(String path) { + lock.readLock().lock(); + try { + return mgraph.checkStorageExistOfPath(path); + } finally { + lock.readLock().unlock(); + } + } + /** * function for adding a pTree. */ diff --git a/iotdb/src/main/java/org/apache/iotdb/db/metadata/MTree.java b/iotdb/src/main/java/org/apache/iotdb/db/metadata/MTree.java index 26686197e7b5c2e837e703f7130ed6f02f3f2254..5f6550708fd83ac8ae3c6c9b7877e5bcaeda2081 100644 --- a/iotdb/src/main/java/org/apache/iotdb/db/metadata/MTree.java +++ b/iotdb/src/main/java/org/apache/iotdb/db/metadata/MTree.java @@ -216,6 +216,7 @@ public class MTree implements Serializable { * check whether the input path is storage group or not * @param path input path * @return if it is storage group, return true. Else return false + * @apiNote :for cluster */ public boolean checkStorageGroup(String path) { String[] nodeNames = path.split(DOUB_SEPARATOR); @@ -240,6 +241,38 @@ public class MTree implements Serializable { } } + /** + * Check whether the storage group of the path exists or not + * @param path input path + * @return If it's storage group exists, return true. Else return false + * @apiNote :for cluster + */ + public boolean checkStorageExistOfPath(String path) { + String[] nodeNames = path.split(DOUB_SEPARATOR); + MNode cur = root; + if (nodeNames.length <= 1 || !nodeNames[0].equals(root.getName())) { + return false; + } + int i = 1; + while (i < nodeNames.length - 1) { + MNode temp = cur.getChild(nodeNames[i]); + if (temp == null) { + return false; + } + if(temp.isStorageLevel()){ + return true; + } + cur = cur.getChild(nodeNames[i]); + i++; + } + MNode temp = cur.getChild(nodeNames[i]); + if(temp != null && temp.isStorageLevel()) { + return true; + } else { + return false; + } + } + /** * Check whether set file seriesPath for this node or not. If not, throw an exception */ diff --git a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java index 1316bd3ba32224e5d93fbb8df23324b83293b6f1..bbc41d234edbf24b36cad649c34cca91099c8616 100644 --- a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java +++ b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java @@ -287,4 +287,32 @@ public class MManagerBasicTest { fail(e.getMessage()); } } + + @Test + public void testCheckStorageExistOfPath() { + MManager manager = MManager.getInstance(); + + try { + assertEquals(false, manager.checkStorageExistOfPath("root")); + assertEquals(false, manager.checkStorageExistOfPath("root.vehicle")); + assertEquals(false, manager.checkStorageExistOfPath("root.vehicle.device")); + assertEquals(false, manager.checkStorageExistOfPath("root.vehicle.device.sensor")); + + manager.setStorageLevelToMTree("root.vehicle"); + assertEquals(true, manager.checkStorageExistOfPath("root.vehicle")); + assertEquals(true, manager.checkStorageExistOfPath("root.vehicle.device")); + assertEquals(true, manager.checkStorageExistOfPath("root.vehicle.device.sensor")); + assertEquals(false, manager.checkStorageExistOfPath("root.vehicle1")); + assertEquals(false, manager.checkStorageExistOfPath("root.vehicle1.device")); + + manager.setStorageLevelToMTree("root.vehicle1.device"); + assertEquals(false, manager.checkStorageExistOfPath("root.vehicle1.device1")); + assertEquals(false, manager.checkStorageExistOfPath("root.vehicle1.device2")); + assertEquals(false, manager.checkStorageExistOfPath("root.vehicle1.device3")); + assertEquals(true, manager.checkStorageExistOfPath("root.vehicle1.device")); + } catch (PathErrorException | IOException e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } } diff --git a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java index e4bed2524df6c1bf826f42de474c70137beb04ea..6f8ac942f7596841ff740f0ffbbc11951e1e639f 100644 --- a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java +++ b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java @@ -213,4 +213,33 @@ public class MTreeTest { fail(e.getMessage()); } } + + @Test + public void testCheckStorageExistOfPath() { + // set storage group first + MTree root = new MTree("root"); + try { + assertEquals(false, root.checkStorageExistOfPath("root")); + assertEquals(false, root.checkStorageExistOfPath("root.vehicle")); + assertEquals(false, root.checkStorageExistOfPath("root.vehicle.device")); + assertEquals(false, root.checkStorageExistOfPath("root.vehicle.device.sensor")); + + root.setStorageGroup("root.vehicle"); + assertEquals(true, root.checkStorageExistOfPath("root.vehicle")); + assertEquals(true, root.checkStorageExistOfPath("root.vehicle.device")); + assertEquals(true, root.checkStorageExistOfPath("root.vehicle.device.sensor")); + assertEquals(false, root.checkStorageExistOfPath("root.vehicle1")); + assertEquals(false, root.checkStorageExistOfPath("root.vehicle1.device")); + + root.setStorageGroup("root.vehicle1.device"); + assertEquals(false, root.checkStorageExistOfPath("root.vehicle1.device1")); + assertEquals(false, root.checkStorageExistOfPath("root.vehicle1.device2")); + assertEquals(false, root.checkStorageExistOfPath("root.vehicle1.device3")); + assertEquals(true, root.checkStorageExistOfPath("root.vehicle1.device")); + } catch (PathErrorException e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + }