This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch TyPageDebug in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
commit a69d0b7bf7bdaca28e9cabe6c04b1a382ba4c1b0 Author: JackieTien97 <[email protected]> AuthorDate: Fri May 8 13:27:30 2020 +0800 page not consumed bug --- .../db/query/executor/AggregationExecutor.java | 31 +++++++++++----- .../IoTDBMultiOverlappedChunkInUnseqIT.java | 17 +++++---- .../db/integration/IoTDBMultiOverlappedPageIT.java | 42 +++++++++++++++++----- 3 files changed, 63 insertions(+), 27 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java index 9b7567d..f102f54 100644 --- a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java +++ b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java @@ -175,8 +175,12 @@ public class AggregationExecutor { seriesReader.skipCurrentChunk(); continue; } - remainingToCalculate = aggregateOverlappedPages(seriesReader, aggregateResultList, + + remainingToCalculate = aggregatePages(seriesReader, aggregateResultList, isCalculatedArray, remainingToCalculate); + if (remainingToCalculate == 0) { + return; + } } } @@ -211,12 +215,21 @@ public class AggregationExecutor { return newRemainingToCalculate; } - private static int aggregateOverlappedPages(IAggregateReader seriesReader, + private static int aggregatePages(IAggregateReader seriesReader, List<AggregateResult> aggregateResultList, boolean[] isCalculatedArray, int remainingToCalculate) - throws IOException { - // cal by page data - int newRemainingToCalculate = remainingToCalculate; + throws IOException, QueryProcessException { while (seriesReader.hasNextPage()) { + //cal by page statistics + if (seriesReader.canUseCurrentPageStatistics()) { + Statistics pageStatistic = seriesReader.currentPageStatistics(); + remainingToCalculate = aggregateStatistics(aggregateResultList, isCalculatedArray, + remainingToCalculate, pageStatistic); + if (remainingToCalculate == 0) { + return 0; + } + seriesReader.skipCurrentChunk(); + continue; + } BatchData nextOverlappedPageData = seriesReader.nextPage(); for (int i = 0; i < aggregateResultList.size(); i++) { if (!isCalculatedArray[i]) { @@ -225,15 +238,15 @@ public class AggregationExecutor { nextOverlappedPageData.resetBatchData(); if (aggregateResult.isCalculatedAggregationResult()) { isCalculatedArray[i] = true; - newRemainingToCalculate--; - if (newRemainingToCalculate == 0) { - return newRemainingToCalculate; + remainingToCalculate--; + if (remainingToCalculate == 0) { + return 0; } } } } } - return newRemainingToCalculate; + return remainingToCalculate; } /** diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBMultiOverlappedChunkInUnseqIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBMultiOverlappedChunkInUnseqIT.java index 294481d..13fbd5e 100644 --- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBMultiOverlappedChunkInUnseqIT.java +++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBMultiOverlappedChunkInUnseqIT.java @@ -19,6 +19,14 @@ package org.apache.iotdb.db.integration; +import static org.apache.iotdb.db.constant.TestConstant.count; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.utils.EnvironmentUtils; import org.apache.iotdb.jdbc.Config; @@ -26,15 +34,6 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.Statement; - -import static org.apache.iotdb.db.constant.TestConstant.count; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; - /** * Notice that, all test begins with "IoTDB" is integration test. All test which will start the * IoTDB server should be defined as integration test. diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBMultiOverlappedPageIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBMultiOverlappedPageIT.java index ea74a16..a874594 100644 --- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBMultiOverlappedPageIT.java +++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBMultiOverlappedPageIT.java @@ -19,6 +19,15 @@ package org.apache.iotdb.db.integration; +import static org.apache.iotdb.db.constant.TestConstant.TIMESTAMP_STR; +import static org.apache.iotdb.db.constant.TestConstant.first_value; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.utils.EnvironmentUtils; import org.apache.iotdb.jdbc.Config; @@ -27,15 +36,6 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.Statement; - -import static org.apache.iotdb.db.constant.TestConstant.TIMESTAMP_STR; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; - /** * Notice that, all test begins with "IoTDB" is integration test. All test which will start the * IoTDB server should be defined as integration test. @@ -102,6 +102,24 @@ public class IoTDBMultiOverlappedPageIT { } } + @Test + public void selectOverlappedPageTest2() { + + try (Connection connection = DriverManager + .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root"); + Statement statement = connection.createStatement()) { + String sql = "select first_value(s0) from root.vehicle.d0 where time > 18"; + ResultSet resultSet = statement.executeQuery(sql); + while (resultSet.next()) { + String ans = resultSet.getString(first_value("root.vehicle.d0.s0")); + assertEquals("219", ans); + } + } catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + private static void insertData() { try (Connection connection = DriverManager .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root"); @@ -119,6 +137,12 @@ public class IoTDBMultiOverlappedPageIT { .format("insert into root.vehicle.d0(timestamp,s0) values(%s,%s)", time, 100+time); statement.execute(sql); } + + for (long time = 21; time <= 30; time++) { + String sql = String + .format("insert into root.vehicle.d0(timestamp,s0) values(%s,%s)", time, time); + statement.execute(sql); + } statement.execute("flush"); for (long time = 101; time <= 110; time++) { String sql = String
