You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2023/03/02 00:57:39 UTC

[iotdb] branch rel/1.1 updated: [To rel/1.1][IOTDB-5604]Fix NPE when execute Agg + align by device query without assigned DataRegion

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

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


The following commit(s) were added to refs/heads/rel/1.1 by this push:
     new c46b00a5f5 [To rel/1.1][IOTDB-5604]Fix NPE when execute Agg + align by device query without assigned DataRegion
c46b00a5f5 is described below

commit c46b00a5f55538d5f65cc9c02040060c4aee5609
Author: Weihao Li <60...@users.noreply.github.com>
AuthorDate: Thu Mar 2 08:57:34 2023 +0800

    [To rel/1.1][IOTDB-5604]Fix NPE when execute Agg + align by device query without assigned DataRegion
---
 .../iotdb/db/it/aggregation/IoTDBAggregationIT.java    |  9 +++++++++
 .../plan/planner/distribution/NodeGroupContext.java    | 18 ++++++++----------
 2 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/IoTDBAggregationIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/IoTDBAggregationIT.java
index 65aee3dfc2..cd0a1253b1 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/IoTDBAggregationIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/IoTDBAggregationIT.java
@@ -46,7 +46,9 @@ import static org.apache.iotdb.db.constant.TestConstant.maxValue;
 import static org.apache.iotdb.db.constant.TestConstant.minTime;
 import static org.apache.iotdb.db.constant.TestConstant.minValue;
 import static org.apache.iotdb.db.constant.TestConstant.sum;
+import static org.apache.iotdb.db.it.utils.TestUtils.resultSetEqualTest;
 import static org.apache.iotdb.db.it.utils.TestUtils.resultSetEqualWithDescOrderTest;
+import static org.apache.iotdb.itbase.constant.TestConstant.DEVICE;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.fail;
 
@@ -971,5 +973,12 @@ public class IoTDBAggregationIT {
     String[] retArray = new String[] {"0,null,"};
     resultSetEqualWithDescOrderTest(
         "select count(s1), sum(s1) from root.test.noDataRegion", expectedHeader, retArray);
+
+    expectedHeader = new String[] {DEVICE, count("s1"), sum("s1")};
+    retArray = new String[] {"root.test.noDataRegion,0,null,"};
+    resultSetEqualTest(
+        "select count(s1), sum(s1) from root.test.noDataRegion align by device",
+        expectedHeader,
+        retArray);
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/NodeGroupContext.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/NodeGroupContext.java
index 6dda89e41f..cd943761ff 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/NodeGroupContext.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/NodeGroupContext.java
@@ -29,7 +29,6 @@ import org.apache.iotdb.db.mpp.plan.planner.plan.node.source.SourceNode;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 public class NodeGroupContext {
   protected final MPPQueryContext queryContext;
@@ -49,20 +48,19 @@ public class NodeGroupContext {
   private TRegionReplicaSet getMostlyUsedDataRegion(PlanNode root) {
     Map<TRegionReplicaSet, Long> regionCount = new HashMap<>();
     countRegionOfSourceNodes(root, regionCount);
-    return Collections.max(
-            regionCount.entrySet().stream()
-                .filter(e -> e.getKey() != DataPartition.NOT_ASSIGNED)
-                .collect(Collectors.toList()),
-            Map.Entry.comparingByValue())
-        .getKey();
+    if (regionCount.isEmpty()) {
+      return DataPartition.NOT_ASSIGNED;
+    }
+    return Collections.max(regionCount.entrySet(), Map.Entry.comparingByValue()).getKey();
   }
 
   private void countRegionOfSourceNodes(PlanNode root, Map<TRegionReplicaSet, Long> result) {
     root.getChildren().forEach(child -> countRegionOfSourceNodes(child, result));
     if (root instanceof SourceNode) {
-      result.compute(
-          ((SourceNode) root).getRegionReplicaSet(),
-          (region, count) -> (count == null) ? 1 : count + 1);
+      TRegionReplicaSet regionReplicaSet = ((SourceNode) root).getRegionReplicaSet();
+      if (regionReplicaSet != DataPartition.NOT_ASSIGNED) {
+        result.compute(regionReplicaSet, (region, count) -> (count == null) ? 1 : count + 1);
+      }
     }
   }