You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by xi...@apache.org on 2021/03/14 03:56:28 UTC
[iotdb] 02/02: optimize aggr result
This is an automated email from the ASF dual-hosted git repository.
xiangweiwei pushed a commit to branch clusterQueryOpt
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit aa7cbcf9d538a989dccdc0e197f4bcab8c17a623
Author: Alima777 <wx...@gmail.com>
AuthorDate: Sun Mar 14 11:55:56 2021 +0800
optimize aggr result
---
.../iotdb/cluster/common/TestManagedSeriesReader.java | 4 +---
.../reader/RemoteSeriesReaderByTimestampTest.java | 7 ++-----
.../aggregation/impl/FirstValueDescAggrResult.java | 3 ++-
.../db/query/aggregation/impl/LastValueAggrResult.java | 13 ++++---------
.../aggregation/impl/LastValueDescAggrResult.java | 12 +++---------
.../db/query/aggregation/impl/MaxTimeAggrResult.java | 10 +++-------
.../query/aggregation/impl/MaxTimeDescAggrResult.java | 9 ++-------
.../query/aggregation/impl/MinTimeDescAggrResult.java | 3 ++-
.../query/reader/series/SeriesReaderByTimestamp.java | 18 ++++++++++--------
9 files changed, 29 insertions(+), 50 deletions(-)
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/common/TestManagedSeriesReader.java b/cluster/src/test/java/org/apache/iotdb/cluster/common/TestManagedSeriesReader.java
index 6f220e4..cbd9bb6 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/common/TestManagedSeriesReader.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/common/TestManagedSeriesReader.java
@@ -59,12 +59,10 @@ public class TestManagedSeriesReader implements ManagedSeriesReader, IReaderByTi
@Override
public Object[] getValuesInTimestamps(long[] timestamps, int length) {
Object[] results = new Object[length];
- boolean hasValue = false;
for (int i = 0; i < length; i++) {
while (batchData.hasCurrent()) {
long currTime = batchData.currentTime();
if (currTime == timestamps[i]) {
- hasValue = true;
results[i] = batchData.currentValue();
break;
} else if (currTime > timestamps[i]) {
@@ -74,7 +72,7 @@ public class TestManagedSeriesReader implements ManagedSeriesReader, IReaderByTi
batchData.next();
}
}
- return hasValue ? results : null;
+ return results;
}
@Override
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java
index b8a4706..ef2772e 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java
@@ -83,7 +83,6 @@ public class RemoteSeriesReaderByTimestampTest {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
DataOutputStream dataOutputStream =
new DataOutputStream(byteArrayOutputStream);
- boolean isNull = true;
Object[] results = new Object[timestamps.size()];
for (int i = 0; i < timestamps.size(); i++) {
while (batchData.hasCurrent()) {
@@ -91,7 +90,6 @@ public class RemoteSeriesReaderByTimestampTest {
if (currentTime == timestamps.get(i)) {
results[i] = batchData.currentValue();
batchData.next();
- isNull = false;
break;
} else if (currentTime > timestamps.get(i)) {
results[i] = null;
@@ -101,8 +99,7 @@ public class RemoteSeriesReaderByTimestampTest {
batchData.next();
}
}
- SerializeUtils.serializeObjects(
- isNull ? new Object[0] : results, dataOutputStream);
+ SerializeUtils.serializeObjects(results, dataOutputStream);
resultHandler.onComplete(
ByteBuffer.wrap(byteArrayOutputStream.toByteArray()));
@@ -158,7 +155,7 @@ public class RemoteSeriesReaderByTimestampTest {
assertEquals(i * 1.0, results[i]);
}
times[0] = 101;
- assertEquals(0, reader.getValuesInTimestamps(times, 1).length);
+ assertEquals(null, reader.getValuesInTimestamps(times, 1)[0]);
} finally {
QueryResourceManager.getInstance().endQuery(context.getQueryId());
}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstValueDescAggrResult.java b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstValueDescAggrResult.java
index ad682d4..91d71a6 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstValueDescAggrResult.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstValueDescAggrResult.java
@@ -54,10 +54,11 @@ public class FirstValueDescAggrResult extends FirstValueAggrResult {
public void updateResultUsingTimestamps(
long[] timestamps, int length, IReaderByTimestamp dataReader) throws IOException {
Object[] values = dataReader.getValuesInTimestamps(timestamps, length);
- for (int i = 0; i < length; i++) {
+ for (int i = length - 1; i >= 0; i--) {
if (values[i] != null) {
setValue(values[i]);
timestamp = timestamps[i];
+ return;
}
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastValueAggrResult.java b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastValueAggrResult.java
index bf21f7b..04cb67e 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastValueAggrResult.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastValueAggrResult.java
@@ -85,19 +85,14 @@ public class LastValueAggrResult extends AggregateResult {
@Override
public void updateResultUsingTimestamps(
long[] timestamps, int length, IReaderByTimestamp dataReader) throws IOException {
- long time = Long.MIN_VALUE;
- Object lastVal = null;
Object[] values = dataReader.getValuesInTimestamps(timestamps, length);
- for (int i = 0; i < length; i++) {
+ for (int i = length - 1; i >= 0; i--) {
if (values[i] != null) {
- time = timestamps[i];
- lastVal = values[i];
+ timestamp = timestamps[i];
+ setValue(values[i]);
+ return;
}
}
- if (time != Long.MIN_VALUE) {
- setValue(lastVal);
- timestamp = time;
- }
}
@Override
diff --git a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastValueDescAggrResult.java b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastValueDescAggrResult.java
index 354a360..8cdeaed 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastValueDescAggrResult.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastValueDescAggrResult.java
@@ -68,20 +68,14 @@ public class LastValueDescAggrResult extends LastValueAggrResult {
if (hasFinalResult()) {
return;
}
- long time = Long.MIN_VALUE;
- Object lastVal = null;
Object[] values = dataReader.getValuesInTimestamps(timestamps, length);
for (int i = 0; i < length; i++) {
if (values[i] != null) {
- time = timestamps[i];
- lastVal = values[i];
- break;
+ timestamp = timestamps[i];
+ setValue(values[i]);
+ return;
}
}
- if (time != Long.MIN_VALUE) {
- setValue(lastVal);
- timestamp = time;
- }
}
@Override
diff --git a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxTimeAggrResult.java b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxTimeAggrResult.java
index df19df6..321bc78 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxTimeAggrResult.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxTimeAggrResult.java
@@ -66,17 +66,13 @@ public class MaxTimeAggrResult extends AggregateResult {
@Override
public void updateResultUsingTimestamps(
long[] timestamps, int length, IReaderByTimestamp dataReader) throws IOException {
- long time = -1;
Object[] values = dataReader.getValuesInTimestamps(timestamps, length);
- for (int i = 0; i < length; i++) {
+ for (int i = length - 1; i >= 0; i--) {
if (values[i] != null) {
- time = timestamps[i];
+ updateMaxTimeResult(timestamps[i]);
+ return;
}
}
-
- if (time != -1) {
- updateMaxTimeResult(time);
- }
}
@Override
diff --git a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxTimeDescAggrResult.java b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxTimeDescAggrResult.java
index 3e1bc91..82d6c4e 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxTimeDescAggrResult.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxTimeDescAggrResult.java
@@ -52,18 +52,13 @@ public class MaxTimeDescAggrResult extends MaxTimeAggrResult {
if (hasFinalResult()) {
return;
}
- long time = -1;
Object[] values = dataReader.getValuesInTimestamps(timestamps, length);
for (int i = 0; i < length; i++) {
if (values[i] != null) {
- time = timestamps[i];
- break;
+ updateMaxTimeResult(timestamps[i]);
+ return;
}
}
-
- if (time != -1) {
- updateMaxTimeResult(time);
- }
}
@Override
diff --git a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinTimeDescAggrResult.java b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinTimeDescAggrResult.java
index 3cb1fbb..2e65be3 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinTimeDescAggrResult.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinTimeDescAggrResult.java
@@ -44,9 +44,10 @@ public class MinTimeDescAggrResult extends MinTimeAggrResult {
public void updateResultUsingTimestamps(
long[] timestamps, int length, IReaderByTimestamp dataReader) throws IOException {
Object[] values = dataReader.getValuesInTimestamps(timestamps, length);
- for (int i = 0; i < length; i++) {
+ for (int i = length - 1; i >= 0; i--) {
if (values[i] != null) {
setLongValue(timestamps[i]);
+ return;
}
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReaderByTimestamp.java b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReaderByTimestamp.java
index 7653219..69d3248 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReaderByTimestamp.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReaderByTimestamp.java
@@ -67,20 +67,22 @@ public class SeriesReaderByTimestamp implements IReaderByTimestamp {
}
@Override
- public Object[] getValuesInTimestamps(long[] timestamp, int length) throws IOException {
+ public Object[] getValuesInTimestamps(long[] timestamps, int length) throws IOException {
+ if (length <= 0) {
+ return null;
+ }
Object[] results = new Object[length];
- int timeIndex;
- seriesReader.setTimeFilter(timestamp[0]);
- for (timeIndex = 0; timeIndex < length; timeIndex++) {
- if ((batchData == null || !hasAvailableData(batchData, timestamp[timeIndex]))
- && !hasNext(timestamp[timeIndex])) {
+ seriesReader.setTimeFilter(timestamps[0]);
+ for (int i = 0; i < length; i++) {
+ if ((batchData == null || !hasAvailableData(batchData, timestamps[i]))
+ && !hasNext(timestamps[i])) {
// there is no more data
break;
}
- results[timeIndex] = batchData.getValueInTimestamp(timestamp[timeIndex]);
+ results[i] = batchData.getValueInTimestamp(timestamps[i]);
}
- return timeIndex != 0 ? results : null;
+ return results;
}
@Override