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