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

qiaojialin pushed a commit to branch optimize_series_reader
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git


The following commit(s) were added to refs/heads/optimize_series_reader by this 
push:
     new 17365a7  remove hasOverlappedPage
17365a7 is described below

commit 17365a75a742d4095de6ea677eb37d35a7b6f7d3
Author: qiaojialin <[email protected]>
AuthorDate: Sun Mar 1 19:06:04 2020 +0800

    remove hasOverlappedPage
---
 .../groupby/GroupByWithoutValueFilterDataSet.java  |  6 +-
 .../db/query/executor/AggregationExecutor.java     | 11 ++-
 .../db/query/reader/series/IAggregateReader.java   |  6 +-
 .../query/reader/series/SeriesAggregateReader.java | 13 ++--
 .../reader/series/SeriesRawDataBatchReader.java    | 26 +------
 .../iotdb/db/query/reader/series/SeriesReader.java | 84 +++++++++++++---------
 .../reader/series/SeriesReaderByTimestamp.java     | 27 +------
 .../reader/series/SeriesAggregateReaderTest.java   |  4 +-
 8 files changed, 75 insertions(+), 102 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithoutValueFilterDataSet.java
 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithoutValueFilterDataSet.java
index bf9c5e6..f756816 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithoutValueFilterDataSet.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithoutValueFilterDataSet.java
@@ -221,10 +221,8 @@ public class GroupByWithoutValueFilterDataSet extends 
GroupByEngineDataSet {
           }
           reader.skipCurrentPage();
           continue;
-        }
-        while (reader.hasNextOverlappedPage()) {
-          // cal by page data
-          BatchData batchData = reader.nextOverlappedPage();
+        } else {
+          BatchData batchData = reader.nextPage();
           for (int i = 0; i < aggregateResultList.size(); i++) {
             if (Boolean.FALSE.equals(isCalculatedList.get(i))) {
               AggregateResult result = aggregateResultList.get(i);
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 c39a392..df3a164 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
@@ -173,15 +173,14 @@ public class AggregationExecutor {
           }
           seriesReader.skipCurrentPage();
           continue;
-        }
-        // cal by page data
-        while (seriesReader.hasNextOverlappedPage()) {
-          BatchData nextOverlappedPageData = seriesReader.nextOverlappedPage();
+        } else {
+          // cal by page data
+          BatchData batchData = seriesReader.nextPage();
           for (int i = 0; i < aggregateResultList.size(); i++) {
             if (Boolean.FALSE.equals(isCalculatedList.get(i))) {
               AggregateResult aggregateResult = aggregateResultList.get(i);
-              aggregateResult.updateResultFromPageData(nextOverlappedPageData);
-              nextOverlappedPageData.resetBatchData();
+              aggregateResult.updateResultFromPageData(batchData);
+              batchData.resetBatchData();
               if (aggregateResult.isCalculatedAggregationResult()) {
                 isCalculatedList.set(i, true);
                 remainingToCalculate--;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/IAggregateReader.java
 
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/IAggregateReader.java
index bd22f3e..691a02a 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/IAggregateReader.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/IAggregateReader.java
@@ -47,7 +47,9 @@ public interface IAggregateReader {
 
   void skipCurrentPage();
 
-  boolean hasNextOverlappedPage() throws IOException;
+  BatchData nextPage() throws IOException;
 
-  BatchData nextOverlappedPage() throws IOException;
+//  boolean hasNextOverlappedPage() throws IOException;
+
+//  BatchData nextOverlappedPage() throws IOException;
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesAggregateReader.java
 
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesAggregateReader.java
index d711f02..453d6af 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesAggregateReader.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesAggregateReader.java
@@ -70,6 +70,9 @@ public class SeriesAggregateReader implements 
IAggregateReader {
   @Override
   public boolean canUseCurrentPageStatistics() throws IOException {
     Statistics currentPageStatistics = currentPageStatistics();
+    if (currentPageStatistics == null) {
+      return false;
+    }
     return !seriesReader.isPageOverlapped() && 
containedByTimeFilter(currentPageStatistics);
   }
 
@@ -84,16 +87,10 @@ public class SeriesAggregateReader implements 
IAggregateReader {
   }
 
   @Override
-  public boolean hasNextOverlappedPage() throws IOException {
-    return seriesReader.hasNextOverlappedPage();
+  public BatchData nextPage() throws IOException {
+    return seriesReader.nextPage();
   }
 
-  @Override
-  public BatchData nextOverlappedPage() throws IOException {
-    return seriesReader.nextOverlappedPage();
-  }
-
-
   private boolean containedByTimeFilter(Statistics statistics) {
     Filter timeFilter = seriesReader.getTimeFilter();
     return timeFilter == null
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesRawDataBatchReader.java
 
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesRawDataBatchReader.java
index 553fdf8..19f3810 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesRawDataBatchReader.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesRawDataBatchReader.java
@@ -69,18 +69,14 @@ public class SeriesRawDataBatchReader implements 
ManagedSeriesReader {
     if (hasCachedBatchData) {
       return true;
     }
-    /*
-     * consume overlapped data firstly
-     */
-    if (readOverlappedPage()) {
-      return hasCachedBatchData = true;
-    }
+
     /*
      * consume page data secondly
      */
     if (readPageData()) {
       return hasCachedBatchData = true;
     }
+
     /*
      * consume next chunk finally
      */
@@ -130,23 +126,7 @@ public class SeriesRawDataBatchReader implements 
ManagedSeriesReader {
 
   private boolean readPageData() throws IOException {
     while (seriesReader.hasNextPage()) {
-      if (!seriesReader.isPageOverlapped()) {
-        batchData = seriesReader.nextPage();
-        if (!isEmpty(batchData)) {
-          return true;
-        }
-        continue;
-      }
-      if (readOverlappedPage()) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  private boolean readOverlappedPage() throws IOException {
-    while (seriesReader.hasNextOverlappedPage()) {
-      batchData = seriesReader.nextOverlappedPage();
+      batchData = seriesReader.nextPage();
       if (!isEmpty(batchData)) {
         return true;
       }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
 
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
index ddd4b4e..aff5159 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
@@ -90,7 +90,7 @@ public class SeriesReader {
   /*
    * result cache
    */
-  private boolean hasCachedNextBatch;
+  private boolean hasCachedNextOverlappedPage;
   private BatchData cachedBatchData;
 
   public SeriesReader(Path seriesPath, TSDataType dataType, QueryContext 
context,
@@ -179,6 +179,18 @@ public class SeriesReader {
       }
     }
 
+    if (firstPageReader != null && isPageOverlapped()) {
+      /*
+       * next page is overlapped, read data and cache
+       */
+      while (hasNextOverlappedPage()) {
+        cachedBatchData = nextOverlappedPage();
+        if (cachedBatchData != null && cachedBatchData.hasCurrent()) {
+          return hasCachedNextOverlappedPage = true;
+        }
+      }
+    }
+
     return firstPageReader != null;
   }
 
@@ -214,9 +226,9 @@ public class SeriesReader {
   /**
    * This method should be called after calling hasNextPage.
    */
-  protected boolean isPageOverlapped() throws IOException {
-    if (firstPageReader == null) {
-      throw new IOException("no next page, make sure hasNextPage() is true");
+  protected boolean isPageOverlapped() {
+    if (hasCachedNextOverlappedPage) {
+      return true;
     }
 
     Statistics firstPageStatistics = firstPageReader.data.getStatistics();
@@ -230,37 +242,43 @@ public class SeriesReader {
    * This method should only be used when the method isPageOverlapped() return 
true.
    */
   protected BatchData nextPage() throws IOException {
-    if (isPageOverlapped()) {
-      throw new IOException("next page is overlapped, make sure 
isPageOverlapped is false");
-    }
 
-    BatchData pageData = firstPageReader.data.getAllSatisfiedPageData();
-    firstPageReader = null;
+    if (hasCachedNextOverlappedPage) {
+      hasCachedNextOverlappedPage = false;
+      return cachedBatchData;
+    } else {
+      /*
+       * next page is not overlapped
+       */
+      BatchData pageData = firstPageReader.data.getAllSatisfiedPageData();
+      firstPageReader = null;
 
-    /*
-     * no value filter
-     * only need to consider valueFilter because timeFilter has been set into 
the page reader
-     */
-    if (valueFilter == null) {
-      return pageData;
-    }
+      /*
+       * no value filter
+       * only need to consider valueFilter because timeFilter has been set 
into the page reader
+       */
+      if (valueFilter == null) {
+        return pageData;
+      }
 
-    /*
-     * has value filter
-     */
-    BatchData batchData = new BatchData(pageData.getDataType());
-    while (pageData.hasCurrent()) {
-      if (valueFilter.satisfy(pageData.currentTime(), 
pageData.currentValue())) {
-        batchData.putAnObject(pageData.currentTime(), pageData.currentValue());
+      /*
+       * has value filter
+       */
+      BatchData batchData = new BatchData(pageData.getDataType());
+      while (pageData.hasCurrent()) {
+        if (valueFilter.satisfy(pageData.currentTime(), 
pageData.currentValue())) {
+          batchData.putAnObject(pageData.currentTime(), 
pageData.currentValue());
+        }
+        pageData.next();
       }
-      pageData.next();
+      return batchData;
     }
-    return batchData;
+
   }
 
   public Statistics currentPageStatistics() throws IOException {
     if (firstPageReader == null) {
-      throw new IOException("No next page.");
+      return null;
     }
     return firstPageReader.data.getStatistics();
   }
@@ -272,9 +290,9 @@ public class SeriesReader {
   /**
    * This method should be called after hasNextChunk and hasNextPage methods.
    */
-  public boolean hasNextOverlappedPage() throws IOException {
+  private boolean hasNextOverlappedPage() throws IOException {
 
-    if (hasCachedNextBatch) {
+    if (hasCachedNextOverlappedPage) {
       return true;
     }
 
@@ -305,9 +323,9 @@ public class SeriesReader {
         mergeReader.nextTimeValuePair();
 
       }
-      hasCachedNextBatch = cachedBatchData.hasCurrent();
+      hasCachedNextOverlappedPage = cachedBatchData.hasCurrent();
     }
-    return hasCachedNextBatch;
+    return hasCachedNextOverlappedPage;
   }
 
   private void tryToPutAllDirectlyOverlappedPageReadersIntoMergeReader() 
throws IOException {
@@ -357,9 +375,9 @@ public class SeriesReader {
         pageReader.version, pageReader.data.getStatistics().getEndTime());
   }
 
-  public BatchData nextOverlappedPage() throws IOException {
-    if (hasCachedNextBatch || hasNextOverlappedPage()) {
-      hasCachedNextBatch = false;
+  private BatchData nextOverlappedPage() throws IOException {
+    if (hasCachedNextOverlappedPage || hasNextOverlappedPage()) {
+      hasCachedNextOverlappedPage = false;
       return cachedBatchData;
     }
     throw new IOException("No more batch data");
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 d5eb43c..70fb748 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
@@ -63,21 +63,14 @@ public class SeriesReaderByTimestamp implements 
IReaderByTimestamp {
   private boolean hasNext(long timestamp) throws IOException {
 
     /*
-     * consume overlapped data firstly
-     */
-    if (readOverlappedPage(timestamp)) {
-      return true;
-    }
-
-    /*
-     * consume pages secondly
+     * consume pages firstly
      */
     if (readPageData(timestamp)) {
       return true;
     }
 
     /*
-     * consume next chunk
+     * consume chunk secondly
      */
     while (seriesReader.hasNextChunk()) {
       if (readPageData(timestamp)) {
@@ -93,23 +86,9 @@ public class SeriesReaderByTimestamp implements 
IReaderByTimestamp {
         if (!satisfyTimeFilter(seriesReader.currentPageStatistics())) {
           seriesReader.skipCurrentPage();
           continue;
-        } else {
-          batchData = seriesReader.nextPage();
-          if (batchData.getTimeByIndex(batchData.length() - 1) >= timestamp) {
-            return true;
-          }
         }
       }
-      if (readOverlappedPage(timestamp)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  private boolean readOverlappedPage(long timestamp) throws IOException {
-    while (seriesReader.hasNextOverlappedPage()) {
-      batchData = seriesReader.nextOverlappedPage();
+      batchData = seriesReader.nextPage();
       if (isEmpty(batchData)) {
         continue;
       }
diff --git 
a/server/src/test/java/org/apache/iotdb/db/query/reader/series/SeriesAggregateReaderTest.java
 
b/server/src/test/java/org/apache/iotdb/db/query/reader/series/SeriesAggregateReaderTest.java
index 55d368b..ee85b15 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/query/reader/series/SeriesAggregateReaderTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/query/reader/series/SeriesAggregateReaderTest.java
@@ -98,8 +98,8 @@ public class SeriesAggregateReaderTest {
             assertEquals((long) loopTime * 20 + 60, 
aggregateResult.getResult());
           }
 
-          while (seriesReader.hasNextOverlappedPage()) {
-            BatchData nextOverlappedPageData = 
seriesReader.nextOverlappedPage();
+          while (seriesReader.hasNextPage()) {
+            BatchData nextOverlappedPageData = seriesReader.nextPage();
             aggregateResult.updateResultFromPageData(nextOverlappedPageData);
             nextOverlappedPageData.resetBatchData();
             assertEquals(true, nextOverlappedPageData.hasCurrent());

Reply via email to