You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pegasus.apache.org by la...@apache.org on 2022/06/29 10:01:20 UTC

[incubator-pegasus] branch master updated: feat(java-client): Add hasNext() for PegasusScannerInterface (#1019)

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

laiyingchun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pegasus.git


The following commit(s) were added to refs/heads/master by this push:
     new 289390cae feat(java-client): Add hasNext() for PegasusScannerInterface (#1019)
289390cae is described below

commit 289390cae0cbe42e458d9979aa47696b03c2c9f9
Author: WHBANG <38...@users.noreply.github.com>
AuthorDate: Wed Jun 29 18:01:11 2022 +0800

    feat(java-client): Add hasNext() for PegasusScannerInterface (#1019)
---
 .../org/apache/pegasus/client/PegasusScanner.java  | 21 +++++++++++++
 .../pegasus/client/PegasusScannerInterface.java    |  8 +++++
 .../java/org/apache/pegasus/client/TestScan.java   | 35 ++++++++++++++++++++++
 3 files changed, 64 insertions(+)

diff --git a/java-client/src/main/java/org/apache/pegasus/client/PegasusScanner.java b/java-client/src/main/java/org/apache/pegasus/client/PegasusScanner.java
index 80cf4a48b..a664f02d3 100644
--- a/java-client/src/main/java/org/apache/pegasus/client/PegasusScanner.java
+++ b/java-client/src/main/java/org/apache/pegasus/client/PegasusScanner.java
@@ -88,9 +88,27 @@ public class PegasusScanner implements PegasusScannerInterface {
     _needCheckHash = needCheckHash;
     _incomplete = false;
     _fullScan = fullScan;
+    _nextItem = null;
+  }
+
+  public boolean hasNext() throws PException {
+    synchronized (_nextItemLock) {
+      if (_nextItem != null) {
+        return true;
+      }
+      _nextItem = next();
+      return _nextItem != null;
+    }
   }
 
   public Pair<Pair<byte[], byte[]>, byte[]> next() throws PException {
+    synchronized (_nextItemLock) {
+      if (_nextItem != null) {
+        Pair<Pair<byte[], byte[]>, byte[]> item = _nextItem;
+        _nextItem = null;
+        return item;
+      }
+    }
     try {
       return asyncNext().get(_options.timeoutMillis, TimeUnit.MILLISECONDS);
     } catch (InterruptedException e) {
@@ -359,5 +377,8 @@ public class PegasusScanner implements PegasusScannerInterface {
 
   private boolean _fullScan;
 
+  private final Object _nextItemLock = new Object();
+  private Pair<Pair<byte[], byte[]>, byte[]> _nextItem;
+
   private static final Logger logger = org.slf4j.LoggerFactory.getLogger(PegasusScanner.class);
 }
diff --git a/java-client/src/main/java/org/apache/pegasus/client/PegasusScannerInterface.java b/java-client/src/main/java/org/apache/pegasus/client/PegasusScannerInterface.java
index dadb0bff6..b70c671c2 100644
--- a/java-client/src/main/java/org/apache/pegasus/client/PegasusScannerInterface.java
+++ b/java-client/src/main/java/org/apache/pegasus/client/PegasusScannerInterface.java
@@ -34,6 +34,14 @@ public interface PegasusScannerInterface {
    */
   public Pair<Pair<byte[], byte[]>, byte[]> next() throws PException;
 
+  /**
+   * Judge whether scan completed
+   *
+   * @return Return false if no data left, return true means some data left.
+   * @throws PException
+   */
+  public boolean hasNext() throws PException;
+
   /**
    * Get the next item asynchronously.
    *
diff --git a/java-client/src/test/java/org/apache/pegasus/client/TestScan.java b/java-client/src/test/java/org/apache/pegasus/client/TestScan.java
index 54db4172b..6eef04cdc 100644
--- a/java-client/src/test/java/org/apache/pegasus/client/TestScan.java
+++ b/java-client/src/test/java/org/apache/pegasus/client/TestScan.java
@@ -106,6 +106,41 @@ public class TestScan {
     compareSortMap(data, base.get(expectedHashKey), expectedHashKey);
   }
 
+  @Test
+  public void testHasNext() throws PException {
+    System.out.println("TESTING_HAS_NEXT, ALL SORT_KEYS ....");
+    ScanOptions options = new ScanOptions();
+    TreeMap<String, String> data = new TreeMap<String, String>();
+    PegasusScannerInterface scanner =
+        client.getScanner(
+            tableName, expectedHashKey.getBytes(), new byte[] {}, new byte[] {}, options);
+    Assert.assertNotNull(scanner);
+    Pair<Pair<byte[], byte[]>, byte[]> item;
+    int count = 0;
+    while (scanner.hasNext()) {
+      item = scanner.next();
+      count++;
+      Assert.assertEquals(expectedHashKey, new String(item.getLeft().getLeft()));
+      checkAndPutSortMap(
+          data,
+          expectedHashKey,
+          new String(item.getLeft().getRight()),
+          new String(item.getRight()));
+      if ((item = scanner.next()) != null) {
+        count++;
+      }
+      Assert.assertEquals(expectedHashKey, new String(item.getLeft().getLeft()));
+      checkAndPutSortMap(
+          data,
+          expectedHashKey,
+          new String(item.getLeft().getRight()),
+          new String(item.getRight()));
+    }
+    Assert.assertEquals(1000, count);
+    scanner.close();
+    compareSortMap(data, base.get(expectedHashKey), expectedHashKey);
+  }
+
   @Test
   public void testInclusive() throws PException {
     /** ** [start, stop] *** */


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pegasus.apache.org
For additional commands, e-mail: commits-help@pegasus.apache.org