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

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


The following commit(s) were added to refs/heads/rel/0.12 by this push:
     new 66affbf  [To rel/0.12][IOTDB-2008] Fix null result bug of GROUP BY 
FILL query (#4397)
66affbf is described below

commit 66affbf4ea41121df9e188c51844a2f50a9f9138
Author: BaiJian <[email protected]>
AuthorDate: Tue Nov 16 18:06:37 2021 +0800

    [To rel/0.12][IOTDB-2008] Fix null result bug of GROUP BY FILL query (#4397)
---
 .../java/org/apache/iotdb/cluster/query/LocalQueryExecutor.java  | 7 +++++++
 .../iotdb/cluster/query/groupby/RemoteGroupByExecutor.java       | 4 +++-
 .../iotdb/cluster/query/last/ClusterLastQueryExecutor.java       | 2 +-
 .../iotdb/db/query/dataset/groupby/GroupByFillDataSet.java       | 9 ++++++---
 .../org/apache/iotdb/db/query/executor/LastQueryExecutor.java    | 2 +-
 .../java/org/apache/iotdb/db/query/executor/QueryRouter.java     | 5 ++++-
 6 files changed, 22 insertions(+), 7 deletions(-)

diff --git 
a/cluster/src/main/java/org/apache/iotdb/cluster/query/LocalQueryExecutor.java 
b/cluster/src/main/java/org/apache/iotdb/cluster/query/LocalQueryExecutor.java
index 10f04b4..a2fc36a 100644
--- 
a/cluster/src/main/java/org/apache/iotdb/cluster/query/LocalQueryExecutor.java
+++ 
b/cluster/src/main/java/org/apache/iotdb/cluster/query/LocalQueryExecutor.java
@@ -821,6 +821,10 @@ public class LocalQueryExecutor {
     return resultBuffers;
   }
 
+  /**
+   * returns a non-nul ByteBuffer as thrift response, which not allows null 
objects. If the
+   * ByteBuffer data equals <0, null>, it means that the NextNotNullValue is 
null.
+   */
   public ByteBuffer peekNextNotNullValue(long executorId, long startTime, long 
endTime)
       throws ReaderNotFoundException, IOException {
     GroupByExecutor executor = queryManager.getGroupByExecutor(executorId);
@@ -828,6 +832,9 @@ public class LocalQueryExecutor {
       throw new ReaderNotFoundException(executorId);
     }
     Pair<Long, Object> pair = executor.peekNextNotNullValue(startTime, 
endTime);
+    if (pair == null) {
+      pair = new Pair<>(0L, null);
+    }
     ByteBuffer resultBuffer;
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
     try (DataOutputStream dataOutputStream = new 
DataOutputStream(byteArrayOutputStream)) {
diff --git 
a/cluster/src/main/java/org/apache/iotdb/cluster/query/groupby/RemoteGroupByExecutor.java
 
b/cluster/src/main/java/org/apache/iotdb/cluster/query/groupby/RemoteGroupByExecutor.java
index 468ec57..3b01e54 100644
--- 
a/cluster/src/main/java/org/apache/iotdb/cluster/query/groupby/RemoteGroupByExecutor.java
+++ 
b/cluster/src/main/java/org/apache/iotdb/cluster/query/groupby/RemoteGroupByExecutor.java
@@ -160,7 +160,9 @@ public class RemoteGroupByExecutor implements 
GroupByExecutor {
     if (aggrBuffer != null) {
       long time = aggrBuffer.getLong();
       Object o = SerializeUtils.deserializeObject(aggrBuffer);
-      result = new Pair<>(time, o);
+      if (o != null) {
+        result = new Pair<>(time, o);
+      }
     }
     logger.debug(
         "Fetched peekNextNotNullValue from {} of [{}, {}]: {}",
diff --git 
a/cluster/src/main/java/org/apache/iotdb/cluster/query/last/ClusterLastQueryExecutor.java
 
b/cluster/src/main/java/org/apache/iotdb/cluster/query/last/ClusterLastQueryExecutor.java
index 0ca6a62..5c96ce8 100644
--- 
a/cluster/src/main/java/org/apache/iotdb/cluster/query/last/ClusterLastQueryExecutor.java
+++ 
b/cluster/src/main/java/org/apache/iotdb/cluster/query/last/ClusterLastQueryExecutor.java
@@ -74,7 +74,7 @@ public class ClusterLastQueryExecutor extends 
LastQueryExecutor {
   }
 
   @Override
-  protected List<Pair<Boolean, TimeValuePair>> calculateLastPairForSeries(
+  public List<Pair<Boolean, TimeValuePair>> calculateLastPairForSeries(
       List<PartialPath> seriesPaths,
       List<TSDataType> dataTypes,
       QueryContext context,
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByFillDataSet.java
 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByFillDataSet.java
index 11e82cd..1805216 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByFillDataSet.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByFillDataSet.java
@@ -45,6 +45,7 @@ import java.util.Map;
 public class GroupByFillDataSet extends QueryDataSet {
 
   private GroupByEngineDataSet groupByEngineDataSet;
+  private final LastQueryExecutor lastQueryExecutor;
   private Map<TSDataType, IFill> fillTypes;
   // the first value for each time series
   private Object[] previousValue;
@@ -60,10 +61,12 @@ public class GroupByFillDataSet extends QueryDataSet {
       GroupByEngineDataSet groupByEngineDataSet,
       Map<TSDataType, IFill> fillTypes,
       QueryContext context,
-      GroupByTimeFillPlan groupByFillPlan)
+      GroupByTimeFillPlan groupByFillPlan,
+      LastQueryExecutor lastQueryExecutor)
       throws StorageEngineException, IOException, QueryProcessException {
     super(new ArrayList<>(paths), dataTypes, groupByFillPlan.isAscending());
     this.groupByEngineDataSet = groupByEngineDataSet;
+    this.lastQueryExecutor = lastQueryExecutor;
     this.fillTypes = fillTypes;
     List<StorageGroupProcessor> list = 
StorageEngine.getInstance().mergeLock(paths);
     try {
@@ -125,8 +128,8 @@ public class GroupByFillDataSet extends QueryDataSet {
       seriesPaths.add((PartialPath) paths.get(i));
     }
     List<Pair<Boolean, TimeValuePair>> lastValueContainer =
-        LastQueryExecutor.calculateLastPairForSeriesLocally(
-            seriesPaths, dataTypes, context, null, 
groupByFillPlan.getDeviceToMeasurements());
+        lastQueryExecutor.calculateLastPairForSeries(
+            seriesPaths, dataTypes, context, null, groupByFillPlan);
     for (int i = 0; i < lastValueContainer.size(); i++) {
       if (Boolean.TRUE.equals(lastValueContainer.get(i).left)) {
         lastTimeArray[i] = lastValueContainer.get(i).right.getTimestamp();
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java
 
b/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java
index 6e4f204..5216943 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java
@@ -134,7 +134,7 @@ public class LastQueryExecutor {
     return dataSet;
   }
 
-  protected List<Pair<Boolean, TimeValuePair>> calculateLastPairForSeries(
+  public List<Pair<Boolean, TimeValuePair>> calculateLastPairForSeries(
       List<PartialPath> seriesPaths,
       List<TSDataType> dataTypes,
       QueryContext context,
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/executor/QueryRouter.java 
b/server/src/main/java/org/apache/iotdb/db/query/executor/QueryRouter.java
index cb9da3d..71b0219 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/executor/QueryRouter.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/executor/QueryRouter.java
@@ -240,13 +240,16 @@ public class QueryRouter implements IQueryRouter {
           IOException {
     GroupByEngineDataSet groupByEngineDataSet =
         (GroupByEngineDataSet) groupBy(groupByFillPlan, context);
+    // here we pass an empty LastQueryPlan as we don't depend on it but only 
to generate a
+    // LastQueryExecutor
     return new GroupByFillDataSet(
         groupByFillPlan.getDeduplicatedPaths(),
         groupByFillPlan.getDeduplicatedDataTypes(),
         groupByEngineDataSet,
         groupByFillPlan.getFillType(),
         context,
-        groupByFillPlan);
+        groupByFillPlan,
+        getLastQueryExecutor(new LastQueryPlan()));
   }
 
   @Override

Reply via email to