You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ji...@apache.org on 2022/01/15 02:00:04 UTC

[iotdb] 01/01: LEVEL can be specified at non-last level in metadata queries

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

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

commit 195b9b13cf3ec62633acdbb122e8d5a7cd1ea74e
Author: jt <jt...@163.com>
AuthorDate: Sat Jan 15 09:59:25 2022 +0800

    LEVEL can be specified at non-last level in metadata queries
---
 .../iotdb/db/integration/IoTDBMetadataFetchIT.java |  2 +-
 .../mtree/traverser/collector/MNodeCollector.java  | 23 ++++++++++++++++++----
 .../mtree/traverser/counter/MNodeLevelCounter.java | 21 ++++++++++++++++----
 .../org/apache/iotdb/db/metadata/MTreeTest.java    | 13 +++++++++---
 4 files changed, 47 insertions(+), 12 deletions(-)

diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBMetadataFetchIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBMetadataFetchIT.java
index 702edca..52210d2 100644
--- a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBMetadataFetchIT.java
+++ b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBMetadataFetchIT.java
@@ -578,7 +578,7 @@ public class IoTDBMetadataFetchIT {
             "COUNT NODES root.ln.wf01.* level=3",
             "COUNT NODES root.ln.wf01.* level=4"
           };
-      String[] standards = new String[] {"3,\n", "1,\n", "0,\n", "0,\n", "2,\n", "0,\n"};
+      String[] standards = new String[] {"3,\n", "1,\n", "1,\n", "1,\n", "2,\n", "0,\n"};
       for (int n = 0; n < sqls.length; n++) {
         String sql = sqls[n];
         String standard = standards[n];
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/collector/MNodeCollector.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/collector/MNodeCollector.java
index ad9c9b6..f58bd2a 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/collector/MNodeCollector.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/collector/MNodeCollector.java
@@ -23,6 +23,9 @@ import org.apache.iotdb.db.metadata.MManager.StorageGroupFilter;
 import org.apache.iotdb.db.metadata.mnode.IMNode;
 import org.apache.iotdb.db.metadata.path.PartialPath;
 
+import java.util.HashSet;
+import java.util.Set;
+
 // This class defines any node in MTree as potential target node.
 public abstract class MNodeCollector<T> extends CollectorTraverser<T> {
 
@@ -30,7 +33,9 @@ public abstract class MNodeCollector<T> extends CollectorTraverser<T> {
   protected StorageGroupFilter storageGroupFilter = null;
 
   // level query option
-  protected int targetLevel;
+  protected int targetLevel = -1;
+
+  private Set<IMNode> processedNodes = new HashSet<>();
 
   public MNodeCollector(IMNode startNode, PartialPath path) throws MetadataException {
     super(startNode, path);
@@ -53,11 +58,21 @@ public abstract class MNodeCollector<T> extends CollectorTraverser<T> {
 
   @Override
   protected boolean processFullMatchedMNode(IMNode node, int idx, int level) {
-    if (targetLevel > 0) {
-      if (level == targetLevel) {
+    if (targetLevel >= 0) {
+      // move the cursor the given level when matched
+      if (level < targetLevel) {
+        return false;
+      }
+      while (level > targetLevel) {
+        node = node.getParent();
+        level--;
+      }
+      // record processed node so they will not be processed twice
+      if (!processedNodes.contains(node)) {
+        processedNodes.add(node);
         transferToResult(node);
-        return true;
       }
+      return true;
     } else {
       transferToResult(node);
     }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/counter/MNodeLevelCounter.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/counter/MNodeLevelCounter.java
index 90a1784..dc4e746 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/counter/MNodeLevelCounter.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/counter/MNodeLevelCounter.java
@@ -22,12 +22,17 @@ import org.apache.iotdb.db.exception.metadata.MetadataException;
 import org.apache.iotdb.db.metadata.mnode.IMNode;
 import org.apache.iotdb.db.metadata.path.PartialPath;
 
+import java.util.HashSet;
+import java.util.Set;
+
 // This node implements node count function.
 public class MNodeLevelCounter extends CounterTraverser {
 
   // level query option
   protected int targetLevel;
 
+  private Set<IMNode> processedNodes = new HashSet<>();
+
   public MNodeLevelCounter(IMNode startNode, PartialPath path, int targetLevel)
       throws MetadataException {
     super(startNode, path);
@@ -41,11 +46,19 @@ public class MNodeLevelCounter extends CounterTraverser {
 
   @Override
   protected boolean processFullMatchedMNode(IMNode node, int idx, int level) {
-    if (level == targetLevel) {
-      count++;
-      return true;
-    } else {
+    // move the cursor the given level when matched
+    if (level < targetLevel) {
       return false;
     }
+    while (level > targetLevel) {
+      node = node.getParent();
+      level--;
+    }
+    // record processed node so they will not be processed twice
+    if (!processedNodes.contains(node)) {
+      processedNodes.add(node);
+      count++;
+    }
+    return true;
   }
 }
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
index 2cea00f..2842f9e 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
@@ -446,9 +446,9 @@ public class MTreeTest {
       Set<String> result1 = root.getChildNodeNameInNextLevel(new PartialPath("root.a.d0"));
       Set<String> result2 = root.getChildNodeNameInNextLevel(new PartialPath("root.a"));
       Set<String> result3 = root.getChildNodeNameInNextLevel(new PartialPath("root"));
-      assertEquals(result1, new HashSet<>(Arrays.asList("s0", "s1")));
-      assertEquals(result2, new HashSet<>(Arrays.asList("d0", "d5")));
-      assertEquals(result3, new HashSet<>(Arrays.asList("a")));
+      assertEquals(new HashSet<>(Arrays.asList("s0", "s1")), result1);
+      assertEquals(new HashSet<>(Arrays.asList("d0", "d5")), result2);
+      assertEquals(new HashSet<>(Collections.singletonList("a")), result3);
 
       // if child node is nll   will return  null HashSet
       Set<String> result5 = root.getChildNodeNameInNextLevel(new PartialPath("root.a.d5"));
@@ -693,6 +693,9 @@ public class MTreeTest {
       assertEquals(2, root.getAllTimeseriesCount(new PartialPath("root.laptop.*.s1")));
       assertEquals(0, root.getAllTimeseriesCount(new PartialPath("root.laptop.d1.s3")));
 
+      assertEquals(1, root.getNodesCountInGivenLevel(new PartialPath("root.laptop.**.s1"), 1));
+      assertEquals(1, root.getNodesCountInGivenLevel(new PartialPath("root.laptop.*.*"), 1));
+      assertEquals(2, root.getNodesCountInGivenLevel(new PartialPath("root.laptop.*.*"), 2));
       assertEquals(2, root.getNodesCountInGivenLevel(new PartialPath("root.laptop.*"), 2));
       assertEquals(4, root.getNodesCountInGivenLevel(new PartialPath("root.laptop.*.*"), 3));
       assertEquals(2, root.getNodesCountInGivenLevel(new PartialPath("root.laptop.**"), 2));
@@ -936,6 +939,10 @@ public class MTreeTest {
     Assert.assertEquals(
         2, root.getNodesListInGivenLevel(new PartialPath("root.*.*"), 2, null).size());
     Assert.assertEquals(
+        2, root.getNodesListInGivenLevel(new PartialPath("root.*.*"), 1, null).size());
+    Assert.assertEquals(
+        2, root.getNodesListInGivenLevel(new PartialPath("root.*.*.s1"), 2, null).size());
+    Assert.assertEquals(
         1, root.getNodesListInGivenLevel(new PartialPath("root.*.**"), 2, filter).size());
   }