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:03 UTC

[iotdb] branch fix_2363 created (now 195b9b1)

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

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


      at 195b9b1  LEVEL can be specified at non-last level in metadata queries

This branch includes the following new commits:

     new 195b9b1  LEVEL can be specified at non-last level in metadata queries

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


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

Posted by ji...@apache.org.
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());
   }