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 <[email protected]> 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()); }
