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

yihua pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hudi.git


The following commit(s) were added to refs/heads/master by this push:
     new 96cb780ec31 [HUDI-7062] Implement Caching Iterator for new filegroup 
reader (#10036)
96cb780ec31 is described below

commit 96cb780ec312e2f6d37e8b6e8468cfdd65a46058
Author: Jon Vexler <[email protected]>
AuthorDate: Thu Nov 9 13:53:27 2023 -0500

    [HUDI-7062] Implement Caching Iterator for new filegroup reader (#10036)
    
    Co-authored-by: Jonathan Vexler <=>
---
 .../table/read/HoodieBaseFileGroupRecordBuffer.java    | 18 ++++++++++++++++--
 .../read/HoodieKeyBasedFileGroupRecordBuffer.java      |  2 +-
 .../read/HoodiePositionBasedFileGroupRecordBuffer.java |  2 +-
 3 files changed, 18 insertions(+), 4 deletions(-)

diff --git 
a/hudi-common/src/main/java/org/apache/hudi/common/table/read/HoodieBaseFileGroupRecordBuffer.java
 
b/hudi-common/src/main/java/org/apache/hudi/common/table/read/HoodieBaseFileGroupRecordBuffer.java
index 06053293adf..f22e8f221f3 100644
--- 
a/hudi-common/src/main/java/org/apache/hudi/common/table/read/HoodieBaseFileGroupRecordBuffer.java
+++ 
b/hudi-common/src/main/java/org/apache/hudi/common/table/read/HoodieBaseFileGroupRecordBuffer.java
@@ -84,9 +84,23 @@ public abstract class HoodieBaseFileGroupRecordBuffer<T> 
implements HoodieFileGr
     this.baseFileIterator = baseFileIterator;
   }
 
+  /**
+   * This allows hasNext() to be called multiple times without incrementing 
the iterator by more than 1
+   * record. It does come with the caveat that hasNext() must be called every 
time before next(). But
+   * that is pretty expected behavior and every user should be doing that 
anyway.
+   */
+  protected abstract boolean doHasNext() throws IOException;
+
+  @Override
+  public final boolean hasNext() throws IOException {
+    return nextRecord != null || doHasNext();
+  }
+
   @Override
-  public T next() {
-    return nextRecord;
+  public final T next() {
+    T record = nextRecord;
+    nextRecord = null;
+    return record;
   }
 
   @Override
diff --git 
a/hudi-common/src/main/java/org/apache/hudi/common/table/read/HoodieKeyBasedFileGroupRecordBuffer.java
 
b/hudi-common/src/main/java/org/apache/hudi/common/table/read/HoodieKeyBasedFileGroupRecordBuffer.java
index 620c3d84940..2ab6048031f 100644
--- 
a/hudi-common/src/main/java/org/apache/hudi/common/table/read/HoodieKeyBasedFileGroupRecordBuffer.java
+++ 
b/hudi-common/src/main/java/org/apache/hudi/common/table/read/HoodieKeyBasedFileGroupRecordBuffer.java
@@ -121,7 +121,7 @@ public class HoodieKeyBasedFileGroupRecordBuffer<T> extends 
HoodieBaseFileGroupR
   }
 
   @Override
-  public boolean hasNext() throws IOException {
+  protected boolean doHasNext() throws IOException {
     ValidationUtils.checkState(baseFileIterator != null, "Base file iterator 
has not been set yet");
 
     // Handle merging.
diff --git 
a/hudi-common/src/main/java/org/apache/hudi/common/table/read/HoodiePositionBasedFileGroupRecordBuffer.java
 
b/hudi-common/src/main/java/org/apache/hudi/common/table/read/HoodiePositionBasedFileGroupRecordBuffer.java
index 4380567eacd..4bb70c1aa3d 100644
--- 
a/hudi-common/src/main/java/org/apache/hudi/common/table/read/HoodiePositionBasedFileGroupRecordBuffer.java
+++ 
b/hudi-common/src/main/java/org/apache/hudi/common/table/read/HoodiePositionBasedFileGroupRecordBuffer.java
@@ -163,7 +163,7 @@ public class HoodiePositionBasedFileGroupRecordBuffer<T> 
extends HoodieBaseFileG
   }
 
   @Override
-  public boolean hasNext() throws IOException {
+  protected boolean doHasNext() throws IOException {
     ValidationUtils.checkState(baseFileIterator != null, "Base file iterator 
has not been set yet");
 
     // Handle merging.

Reply via email to