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

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


The following commit(s) were added to refs/heads/master by this push:
     new c6b7b5444f [IOTDB-4465] Add interface for PatternTreeMap to optimize 
getOverlapped (#7465)
c6b7b5444f is described below

commit c6b7b5444f4112387bb8b1260819ed6e8ac2b01d
Author: Chen YZ <[email protected]>
AuthorDate: Wed Sep 28 17:36:58 2022 +0800

    [IOTDB-4465] Add interface for PatternTreeMap to optimize getOverlapped 
(#7465)
---
 .../apache/iotdb/commons/path/PatternTreeMap.java  | 50 ++++++++++++++++-
 .../iotdb/db/metadata/path/PatternTreeMapTest.java | 64 ++++++++++++++++++----
 2 files changed, 103 insertions(+), 11 deletions(-)

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
index 7cff90f7a7..2d701dd2c0 100644
--- 
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
@@ -135,7 +135,7 @@ public class PatternTreeMap<V, VSerializer extends 
PathPatternNode.Serializer<V>
    * @param pos current index of pathNodes
    * @param resultList result list
    */
-  public void searchOverlapped(
+  private void searchOverlapped(
       PathPatternNode<V, VSerializer> node, String[] pathNodes, int pos, 
List<V> resultList) {
     if (pos == pathNodes.length - 1) {
       resultList.addAll(node.getValues());
@@ -148,4 +148,52 @@ public class PatternTreeMap<V, VSerializer extends 
PathPatternNode.Serializer<V>
       searchOverlapped(child, pathNodes, pos + 1, resultList);
     }
   }
+
+  /**
+   * Get a list of value lists related to PathPattern that overlapped with 
measurements under the
+   * same device.
+   *
+   * @param devicePath device path without wildcard
+   * @param measurements list of measurements
+   * @return value list
+   */
+  public List<List<V>> getOverlapped(PartialPath devicePath, List<String> 
measurements) {
+    List<List<V>> res = new ArrayList<>();
+    for (int i = 0; i < measurements.size(); i++) {
+      res.add(new ArrayList<>());
+    }
+    searchOverlapped(root, devicePath.getNodes(), 0, measurements, res);
+    return res;
+  }
+
+  /**
+   * Recursive method for search overlapped pattern.
+   *
+   * @param node current PathPatternNode
+   * @param deviceNodes pathNodes of device
+   * @param pos current index of pathNodes
+   * @param measurements list of measurements under device
+   * @param resultList result list
+   */
+  private void searchOverlapped(
+      PathPatternNode<V, VSerializer> node,
+      String[] deviceNodes,
+      int pos,
+      List<String> measurements,
+      List<List<V>> resultList) {
+    if (pos == deviceNodes.length - 1) {
+      for (int i = 0; i < measurements.size(); i++) {
+        for (PathPatternNode<V, VSerializer> child : 
node.getMatchChildren(measurements.get(i))) {
+          resultList.get(i).addAll(child.getValues());
+        }
+      }
+      return;
+    }
+    if (node.isMultiLevelWildcard()) {
+      searchOverlapped(node, deviceNodes, pos + 1, measurements, resultList);
+    }
+    for (PathPatternNode<V, VSerializer> child : 
node.getMatchChildren(deviceNodes[pos + 1])) {
+      searchOverlapped(child, deviceNodes, pos + 1, measurements, resultList);
+    }
+  }
 }
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
index 3a301f125a..3a328cc359 100644
--- 
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
@@ -55,17 +55,31 @@ public class PatternTreeMapTest {
     checkOverlapped(
         patternTreeMap,
         new PartialPath("root.sg1.d1.s1"),
-        new HashSet(Arrays.asList("A", "B", "C", "D", "E", "G", "H", "I", 
"J")));
+        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")));
+        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")));
+        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")));
+        new HashSet<>(Arrays.asList("B", "E", "H", "I", "J")));
+    checkOverlappedByDeviceMeasurements(
+        patternTreeMap,
+        new PartialPath("root.sg1.d1"),
+        Arrays.asList("s1", "s2"),
+        Arrays.asList(
+            new HashSet<>(Arrays.asList("A", "B", "C", "D", "E", "G", "H", 
"I", "J")),
+            new HashSet<>(Arrays.asList("E", "F", "G", "H", "I", "J"))));
+    checkOverlappedByDeviceMeasurements(
+        patternTreeMap,
+        new PartialPath("root.sg1.d2"),
+        Arrays.asList("s1", "s2"),
+        Arrays.asList(
+            new HashSet<>(Arrays.asList("B", "C", "E", "G", "H", "I", "J")),
+            new HashSet<>(Arrays.asList("E", "F", "G", "H", "I", "J"))));
     // delete leaf node with common parent
     patternTreeMap.delete(new PartialPath("root.**.d1.*"), "G");
     // only delete value, no delete leaf node
@@ -75,15 +89,29 @@ public class PatternTreeMapTest {
     checkOverlapped(
         patternTreeMap,
         new PartialPath("root.sg1.d1.s1"),
-        new HashSet(Arrays.asList("A", "B", "C", "E", "H", "I")));
+        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")));
+        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")));
+        new HashSet<>(Arrays.asList("B", "E", "H", "I")));
+    checkOverlappedByDeviceMeasurements(
+        patternTreeMap,
+        new PartialPath("root.sg1.d1"),
+        Arrays.asList("s1", "s2"),
+        Arrays.asList(
+            new HashSet<>(Arrays.asList("A", "B", "C", "E", "H", "I")),
+            new HashSet<>(Arrays.asList("E", "F", "H", "I"))));
+    checkOverlappedByDeviceMeasurements(
+        patternTreeMap,
+        new PartialPath("root.sg1.d2"),
+        Arrays.asList("s1", "s2"),
+        Arrays.asList(
+            new HashSet<>(Arrays.asList("B", "C", "E", "H", "I")),
+            new HashSet<>(Arrays.asList("E", "F", "H", "I"))));
   }
 
   @Test
@@ -112,7 +140,7 @@ public class PatternTreeMapTest {
     checkOverlapped(
         patternTreeMap,
         new PartialPath("root.sg1.d1.s1"),
-        new HashSet(
+        new HashSet<>(
             Arrays.asList(
                 new Deletion(new PartialPath("root.sg1.d1.s1"), 1, 1, 3),
                 new Deletion(new PartialPath("root.sg1.d1.s1"), 1, 6, 10),
@@ -123,7 +151,7 @@ public class PatternTreeMapTest {
     checkOverlapped(
         patternTreeMap,
         new PartialPath("root.sg1.d2.s1"),
-        new HashSet(
+        new HashSet<>(
             Arrays.asList(
                 new Deletion(new PartialPath("root.**.s1"), 5, 10, 100),
                 new Deletion(new PartialPath("root.**.s1"), 10, 100, 200),
@@ -132,7 +160,7 @@ public class PatternTreeMapTest {
     checkOverlapped(
         patternTreeMap,
         new PartialPath("root.sg1.d1.s2"),
-        new HashSet(
+        new HashSet<>(
             Collections.singletonList(new Deletion(new PartialPath("root.**"), 
5, 10, 100))));
   }
 
@@ -144,4 +172,20 @@ public class PatternTreeMapTest {
       Assert.assertTrue(resultSet.contains(o));
     }
   }
+
+  private <T> void checkOverlappedByDeviceMeasurements(
+      PatternTreeMap<T, ?> patternTreeMap,
+      PartialPath devicePath,
+      List<String> measurements,
+      List<Set<T>> resultSet) {
+    List<List<T>> list = patternTreeMap.getOverlapped(devicePath, 
measurements);
+    Assert.assertEquals(resultSet.size(), list.size());
+    for (int i = 0; i < measurements.size(); i++) {
+      List<T> subList = list.get(i);
+      Set<T> subSet = resultSet.get(i);
+      for (T o : subList) {
+        Assert.assertTrue(subSet.contains(o));
+      }
+    }
+  }
 }

Reply via email to