From 3d40ba8214b7968c1b03e80c5b197610131996ce Mon Sep 17 00:00:00 2001 From: Toshihiro Suzuki Date: Sun, 18 Jan 2015 23:26:59 +0900 Subject: [PATCH] HBASE-12602 ResultScanner should implement Iterator --- .../hadoop/hbase/client/AbstractClientScanner.java | 65 ++++++++++++---------- .../apache/hadoop/hbase/client/ClientScanner.java | 2 +- .../hadoop/hbase/client/ClientSmallScanner.java | 2 +- .../apache/hadoop/hbase/client/ResultScanner.java | 7 +++ .../hadoop/hbase/rest/client/RemoteHTable.java | 7 +++ .../hbase/client/ClientSideRegionScanner.java | 2 +- .../hadoop/hbase/client/TableSnapshotScanner.java | 2 +- 7 files changed, 53 insertions(+), 34 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AbstractClientScanner.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AbstractClientScanner.java index 54c97d7..64c9313 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AbstractClientScanner.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AbstractClientScanner.java @@ -33,6 +33,9 @@ public abstract class AbstractClientScanner implements ResultScanner { protected ScanMetrics scanMetrics; + // The next RowResult, possibly pre-read + private Result next = null; + /** * Check and initialize if application wants to collect scan metrics */ @@ -64,9 +67,8 @@ public abstract class AbstractClientScanner implements ResultScanner { // Collect values to be returned here ArrayList resultSets = new ArrayList(nbRows); for(int i = 0; i < nbRows; i++) { - Result next = next(); - if (next != null) { - resultSets.add(next); + if (hasNext()) { + resultSets.add(next()); } else { break; } @@ -75,44 +77,47 @@ public abstract class AbstractClientScanner implements ResultScanner { } @Override + public boolean hasNext() throws IOException { + if (next == null) { + next = nextInternal(); + return next != null; + } + return true; + } + + @Override + public Result next() throws IOException { + if (!hasNext()) { + return null; + } + + Result temp = next; + next = null; + return temp; + } + + public abstract Result nextInternal() throws IOException; + + @Override public Iterator iterator() { return new Iterator() { - // The next RowResult, possibly pre-read - Result next = null; - // return true if there is another item pending, false if there isn't. - // this method is where the actual advancing takes place, but you need - // to call next() to consume it. hasNext() will only advance if there - // isn't a pending next(). @Override public boolean hasNext() { - if (next == null) { - try { - next = AbstractClientScanner.this.next(); - return next != null; - } catch (IOException e) { - throw new RuntimeException(e); - } + try { + return AbstractClientScanner.this.hasNext(); + } catch (IOException e) { + throw new RuntimeException(e); } - return true; } - // get the pending next item and advance the iterator. returns null if - // there is no next item. @Override public Result next() { - // since hasNext() does the real advancing, we call this to determine - // if there is a next before proceeding. - if (!hasNext()) { - return null; + try { + return AbstractClientScanner.this.next(); + } catch (IOException e) { + throw new RuntimeException(e); } - - // if we get to here, then hasNext() has given us an item to return. - // we want to return the item and then null out the next pointer, so - // we use a temporary variable. - Result temp = next; - next = null; - return temp; } @Override diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java index afc9bc4..119230b 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java @@ -331,7 +331,7 @@ public class ClientScanner extends AbstractClientScanner { } @Override - public Result next() throws IOException { + public Result nextInternal() throws IOException { // If the scanner is closed and there's nothing left in the cache, next is a no-op. if (cache.size() == 0 && this.closed) { return null; diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientSmallScanner.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientSmallScanner.java index 9fc9cc6..2d74fb5 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientSmallScanner.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientSmallScanner.java @@ -188,7 +188,7 @@ public class ClientSmallScanner extends ClientScanner { } @Override - public Result next() throws IOException { + public Result nextInternal() throws IOException { // If the scanner is closed and there's nothing left in the cache, next is a // no-op. if (cache.size() == 0 && this.closed) { diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ResultScanner.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ResultScanner.java index 381505c..930b04a 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ResultScanner.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ResultScanner.java @@ -33,6 +33,13 @@ import org.apache.hadoop.hbase.classification.InterfaceStability; public interface ResultScanner extends Closeable, Iterable { /** + * Test for the existence of another row. + * @return true if there is another row. + * @throws IOException e + */ + boolean hasNext() throws IOException; + + /** * Grab the next row's worth of values. The scanner will return a Result. * @return Result object if there is another row, null if the scanner is * exhausted. diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java index 65bf509..9f4f819 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java @@ -574,6 +574,13 @@ public class RemoteHTable implements HTableInterface { } @Override + public boolean hasNext() throws IOException { + // TODO + + return false; + } + + @Override public Result next() throws IOException { Result[] results = next(1); if (results == null || results.length < 1) { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/ClientSideRegionScanner.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/ClientSideRegionScanner.java index ff34460..5e1b02c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/ClientSideRegionScanner.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/ClientSideRegionScanner.java @@ -72,7 +72,7 @@ public class ClientSideRegionScanner extends AbstractClientScanner { } @Override - public Result next() throws IOException { + public Result nextInternal() throws IOException { values.clear(); scanner.nextRaw(values, -1); // pass -1 as limit so that we see the whole row. diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/TableSnapshotScanner.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/TableSnapshotScanner.java index baf2aa6..7c7233f 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/TableSnapshotScanner.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/TableSnapshotScanner.java @@ -158,7 +158,7 @@ public class TableSnapshotScanner extends AbstractClientScanner { } @Override - public Result next() throws IOException { + public Result nextInternal() throws IOException { Result result = null; while (true) { if (currentRegionScanner == null) { -- 1.9.3 (Apple Git-50)