You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2019/08/16 14:43:39 UTC

[hbase-site] branch asf-site updated: Published site at 3eb602c7f7081cd1a55deb40797f95adbc9e7758.

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

git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/hbase-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 444387f  Published site at 3eb602c7f7081cd1a55deb40797f95adbc9e7758.
444387f is described below

commit 444387f7db902383da2d54812951e6b4489a89a9
Author: jenkins <bu...@apache.org>
AuthorDate: Fri Aug 16 14:43:20 2019 +0000

    Published site at 3eb602c7f7081cd1a55deb40797f95adbc9e7758.
---
 acid-semantics.html                                |     2 +-
 apache_hbase_reference_guide.pdf                   |     4 +-
 apidocs/index-all.html                             |     4 +
 .../apache/hadoop/hbase/client/Scan.ReadType.html  |     8 +-
 apidocs/org/apache/hadoop/hbase/client/Scan.html   |   172 +-
 .../hbase/filter/MultiRowRangeFilter.RowRange.html |    14 +-
 .../hadoop/hbase/filter/MultiRowRangeFilter.html   |    50 +-
 .../apache/hadoop/hbase/client/Scan.ReadType.html  |  2395 +-
 .../org/apache/hadoop/hbase/client/Scan.html       |  2395 +-
 .../hbase/filter/MultiRowRangeFilter.RowRange.html |  1430 +-
 .../hadoop/hbase/filter/MultiRowRangeFilter.html   |  1430 +-
 book.html                                          |     2 +-
 bulk-loads.html                                    |     2 +-
 checkstyle-aggregate.html                          | 23768 +++++++++----------
 checkstyle.rss                                     |     6 +-
 coc.html                                           |     2 +-
 dependencies.html                                  |     2 +-
 dependency-convergence.html                        |     2 +-
 dependency-info.html                               |     2 +-
 dependency-management.html                         |     2 +-
 devapidocs/constant-values.html                    |     4 +-
 devapidocs/index-all.html                          |     8 +-
 .../apache/hadoop/hbase/backup/package-tree.html   |     2 +-
 .../org/apache/hadoop/hbase/client/ClientUtil.html |    46 +-
 .../apache/hadoop/hbase/client/Scan.ReadType.html  |    12 +-
 .../org/apache/hadoop/hbase/client/Scan.html       |   414 +-
 .../apache/hadoop/hbase/client/package-tree.html   |    20 +-
 .../apache/hadoop/hbase/executor/package-tree.html |     2 +-
 .../filter/MultiRowRangeFilter.BasicRowRange.html  |    42 +-
 .../filter/MultiRowRangeFilter.RangeIteration.html |    36 +-
 .../MultiRowRangeFilter.ReversedRowRange.html      |    10 +-
 .../hbase/filter/MultiRowRangeFilter.RowRange.html |    14 +-
 .../hadoop/hbase/filter/MultiRowRangeFilter.html   |   103 +-
 .../class-use/MultiRowRangeFilter.RowRange.html    |     6 +-
 .../apache/hadoop/hbase/filter/package-tree.html   |     6 +-
 .../apache/hadoop/hbase/io/hfile/package-tree.html |     4 +-
 .../org/apache/hadoop/hbase/ipc/package-tree.html  |     2 +-
 .../hadoop/hbase/mapreduce/package-tree.html       |     4 +-
 .../hadoop/hbase/master/MasterFileSystem.html      |    70 +-
 .../apache/hadoop/hbase/master/package-tree.html   |     2 +-
 .../hbase/master/procedure/package-tree.html       |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html      |    16 +-
 .../hadoop/hbase/procedure2/package-tree.html      |     6 +-
 .../apache/hadoop/hbase/quotas/package-tree.html   |     6 +-
 .../hadoop/hbase/regionserver/package-tree.html    |    16 +-
 .../regionserver/querymatcher/package-tree.html    |     2 +-
 .../hbase/regionserver/wal/package-tree.html       |     4 +-
 .../hadoop/hbase/security/access/package-tree.html |     4 +-
 .../apache/hadoop/hbase/security/package-tree.html |     2 +-
 .../apache/hadoop/hbase/thrift/package-tree.html   |     2 +-
 .../hbase/tmpl/master/MasterStatusTmplImpl.html    |    10 +-
 .../org/apache/hadoop/hbase/tool/Canary.html       |     2 +-
 .../org/apache/hadoop/hbase/util/package-tree.html |     8 +-
 .../src-html/org/apache/hadoop/hbase/Version.html  |     4 +-
 .../org/apache/hadoop/hbase/client/ClientUtil.html |    74 +-
 .../apache/hadoop/hbase/client/Scan.ReadType.html  |  2395 +-
 .../org/apache/hadoop/hbase/client/Scan.html       |  2395 +-
 .../filter/MultiRowRangeFilter.BasicRowRange.html  |  1430 +-
 .../filter/MultiRowRangeFilter.RangeIteration.html |  1430 +-
 .../MultiRowRangeFilter.ReversedRowRange.html      |  1430 +-
 .../hbase/filter/MultiRowRangeFilter.RowRange.html |  1430 +-
 .../hadoop/hbase/filter/MultiRowRangeFilter.html   |  1430 +-
 .../hadoop/hbase/master/MasterFileSystem.html      |   833 +-
 .../hbase/tmpl/master/MasterStatusTmplImpl.html    |  1374 +-
 .../apache/hadoop/hbase/tool/Canary.Monitor.html   |     2 +-
 .../hadoop/hbase/tool/Canary.RegionMonitor.html    |     2 +-
 .../hbase/tool/Canary.RegionServerMonitor.html     |     2 +-
 .../hbase/tool/Canary.RegionServerStdOutSink.html  |     2 +-
 .../hadoop/hbase/tool/Canary.RegionServerTask.html |     2 +-
 .../hadoop/hbase/tool/Canary.RegionStdOutSink.html |     2 +-
 .../hbase/tool/Canary.RegionTask.TaskType.html     |     2 +-
 .../hadoop/hbase/tool/Canary.RegionTask.html       |     2 +-
 .../org/apache/hadoop/hbase/tool/Canary.Sink.html  |     2 +-
 .../hadoop/hbase/tool/Canary.StdOutSink.html       |     2 +-
 .../hadoop/hbase/tool/Canary.ZookeeperMonitor.html |     2 +-
 .../hbase/tool/Canary.ZookeeperStdOutSink.html     |     2 +-
 .../hadoop/hbase/tool/Canary.ZookeeperTask.html    |     2 +-
 .../org/apache/hadoop/hbase/tool/Canary.html       |     2 +-
 downloads.html                                     |     2 +-
 export_control.html                                |     2 +-
 index.html                                         |     2 +-
 issue-tracking.html                                |     2 +-
 mail-lists.html                                    |     2 +-
 metrics.html                                       |     2 +-
 old_news.html                                      |     2 +-
 plugin-management.html                             |     2 +-
 plugins.html                                       |     2 +-
 poweredbyhbase.html                                |     2 +-
 project-info.html                                  |     2 +-
 project-reports.html                               |     2 +-
 project-summary.html                               |     2 +-
 pseudo-distributed.html                            |     2 +-
 replication.html                                   |     2 +-
 resources.html                                     |     2 +-
 source-repository.html                             |     2 +-
 sponsors.html                                      |     2 +-
 supportingprojects.html                            |     2 +-
 team-list.html                                     |     2 +-
 testdevapidocs/index-all.html                      |     8 +
 .../hbase/filter/TestMultiRowRangeFilter.html      |   134 +-
 .../org/apache/hadoop/hbase/package-tree.html      |    10 +-
 .../hadoop/hbase/procedure2/package-tree.html      |     4 +-
 .../hadoop/hbase/regionserver/package-tree.html    |     4 +-
 .../hbase/security/access/TestHDFSAclHelper.html   |    32 +-
 .../TestSnapshotScannerHDFSAclController.html      |    84 +-
 .../org/apache/hadoop/hbase/test/package-tree.html |     2 +-
 .../org/apache/hadoop/hbase/wal/package-tree.html  |     4 +-
 .../hbase/filter/TestMultiRowRangeFilter.html      |  1223 +-
 .../hbase/security/access/TestHDFSAclHelper.html   |  2037 +-
 .../TestSnapshotScannerHDFSAclController.html      |  2037 +-
 110 files changed, 26380 insertions(+), 26071 deletions(-)

diff --git a/acid-semantics.html b/acid-semantics.html
index 6b5d3ab..e5cad5c 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -450,7 +450,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index bd26d08..d3be196 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20190815143825+00'00')
-/CreationDate (D:20190815143825+00'00')
+/ModDate (D:20190816144000+00'00')
+/CreationDate (D:20190816144000+00'00')
 >>
 endobj
 2 0 obj
diff --git a/apidocs/index-all.html b/apidocs/index-all.html
index 6f45585..c6ad8d3 100644
--- a/apidocs/index-all.html
+++ b/apidocs/index-all.html
@@ -12191,6 +12191,10 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#MultiRowRangeFilter-java.util.List-">MultiRowRangeFilter(List&lt;MultiRowRangeFilter.RowRange&gt;)</a></span> - Constructor for class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html" title="class in org.apache.hadoop.hbase.filter">MultiRowRangeFilter</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#MultiRowRangeFilter-byte:A:A-">MultiRowRangeFilter(byte[][])</a></span> - Constructor for class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html" title="class in org.apache.hadoop.hbase.filter">MultiRowRangeFilter</a></dt>
+<dd>
+<div class="block">Constructor for creating a <code>MultiRowRangeFilter</code> from multiple rowkey prefixes.</div>
+</dd>
 <dt><a href="org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html" title="class in org.apache.hadoop.hbase.filter"><span class="typeNameLink">MultiRowRangeFilter.RowRange</span></a> - Class in <a href="org/apache/hadoop/hbase/filter/package-summary.html">org.apache.hadoop.hbase.filter</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/mapreduce/MultiTableHFileOutputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">MultiTableHFileOutputFormat</span></a> - Class in <a href="org/apache/hadoop/hbase/mapreduce/package-summary.html">org.apache.hadoop.hbase.mapreduce</a></dt>
diff --git a/apidocs/org/apache/hadoop/hbase/client/Scan.ReadType.html b/apidocs/org/apache/hadoop/hbase/client/Scan.ReadType.html
index a26d5f8..3e3afc5 100644
--- a/apidocs/org/apache/hadoop/hbase/client/Scan.ReadType.html
+++ b/apidocs/org/apache/hadoop/hbase/client/Scan.ReadType.html
@@ -123,7 +123,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Public
-public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1175">Scan.ReadType</a>
+public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1132">Scan.ReadType</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client">Scan.ReadType</a>&gt;</pre>
 </li>
 </ul>
@@ -214,7 +214,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client">Scan.ReadType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html#line.1176">DEFAULT</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client">Scan.ReadType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html#line.1133">DEFAULT</a></pre>
 </li>
 </ul>
 <a name="STREAM">
@@ -223,7 +223,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>STREAM</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client">Scan.ReadType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html#line.1176">STREAM</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client">Scan.ReadType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html#line.1133">STREAM</a></pre>
 </li>
 </ul>
 <a name="PREAD">
@@ -232,7 +232,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>PREAD</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client">Scan.ReadType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html#line.1176">PREAD</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client">Scan.ReadType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html#line.1133">PREAD</a></pre>
 </li>
 </ul>
 </li>
diff --git a/apidocs/org/apache/hadoop/hbase/client/Scan.html b/apidocs/org/apache/hadoop/hbase/client/Scan.html
index 3a7c478..cb987d6 100644
--- a/apidocs/org/apache/hadoop/hbase/client/Scan.html
+++ b/apidocs/org/apache/hadoop/hbase/client/Scan.html
@@ -129,7 +129,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Public
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.87">Scan</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.86">Scan</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/client/Query.html" title="class in org.apache.hadoop.hbase.client">Query</a></pre>
 <div class="block">Used to perform Scan operations.
  <p>
@@ -805,7 +805,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/Query.html" title
 <ul class="blockList">
 <li class="blockList">
 <h4>SCAN_ATTRIBUTES_TABLE_NAME</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.120">SCAN_ATTRIBUTES_TABLE_NAME</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.119">SCAN_ATTRIBUTES_TABLE_NAME</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.client.Scan.SCAN_ATTRIBUTES_TABLE_NAME">Constant Field Values</a></dd>
@@ -818,7 +818,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/Query.html" title
 <ul class="blockList">
 <li class="blockList">
 <h4>HBASE_CLIENT_SCANNER_ASYNC_PREFETCH</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.141">HBASE_CLIENT_SCANNER_ASYNC_PREFETCH</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.140">HBASE_CLIENT_SCANNER_ASYNC_PREFETCH</a></pre>
 <div class="block">Parameter name for client scanner sync/async prefetch toggle.
  When using async scanner, prefetching data from the server is done at the background.
  The parameter currently won't have any effect in the case that the user has set
@@ -835,7 +835,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/Query.html" title
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_HBASE_CLIENT_SCANNER_ASYNC_PREFETCH</h4>
-<pre>public static final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.147">DEFAULT_HBASE_CLIENT_SCANNER_ASYNC_PREFETCH</a></pre>
+<pre>public static final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.146">DEFAULT_HBASE_CLIENT_SCANNER_ASYNC_PREFETCH</a></pre>
 <div class="block">Default value of <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html#HBASE_CLIENT_SCANNER_ASYNC_PREFETCH"><code>HBASE_CLIENT_SCANNER_ASYNC_PREFETCH</code></a>.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -857,7 +857,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/Query.html" title
 <ul class="blockList">
 <li class="blockList">
 <h4>Scan</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.182">Scan</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.181">Scan</a>()</pre>
 <div class="block">Create a Scan operation across all rows.</div>
 </li>
 </ul>
@@ -868,7 +868,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/Query.html" title
 <li class="blockList">
 <h4>Scan</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.190">Scan</a>(byte[]&nbsp;startRow,
+public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.189">Scan</a>(byte[]&nbsp;startRow,
                         <a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&nbsp;filter)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use
    <code>new Scan().withStartRow(startRow).setFilter(filter)</code> instead.</span></div>
@@ -885,7 +885,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan
 <li class="blockList">
 <h4>Scan</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.206">Scan</a>(byte[]&nbsp;startRow)</pre>
+public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.205">Scan</a>(byte[]&nbsp;startRow)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use
    <code>new Scan().withStartRow(startRow)</code> instead.</span></div>
 <div class="block">Create a Scan operation starting at the specified row.
@@ -907,7 +907,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan
 <li class="blockList">
 <h4>Scan</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.219">Scan</a>(byte[]&nbsp;startRow,
+public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.218">Scan</a>(byte[]&nbsp;startRow,
                         byte[]&nbsp;stopRow)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use
    <code>new Scan().withStartRow(startRow).withStopRow(stopRow)</code> instead.</span></div>
@@ -927,7 +927,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan
 <ul class="blockList">
 <li class="blockList">
 <h4>Scan</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.230">Scan</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.229">Scan</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)
      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Creates a new instance of this class while copying all values.</div>
 <dl>
@@ -944,7 +944,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Scan</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.282">Scan</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Get.html" title="class in org.apache.hadoop.hbase.client">Get</a>&nbsp;get)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.281">Scan</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Get.html" title="class in org.apache.hadoop.hbase.client">Get</a>&nbsp;get)</pre>
 <div class="block">Builds a scan object with the same specs as get.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -966,7 +966,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan
 <ul class="blockList">
 <li class="blockList">
 <h4>isGetScan</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.310">isGetScan</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.309">isGetScan</a>()</pre>
 </li>
 </ul>
 <a name="addFamily-byte:A-">
@@ -975,7 +975,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan
 <ul class="blockList">
 <li class="blockList">
 <h4>addFamily</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.322">addFamily</a>(byte[]&nbsp;family)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.321">addFamily</a>(byte[]&nbsp;family)</pre>
 <div class="block">Get all columns from the specified family.
  <p>
  Overrides previous calls to addColumn for this family.</div>
@@ -993,7 +993,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan
 <ul class="blockList">
 <li class="blockList">
 <h4>addColumn</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.336">addColumn</a>(byte[]&nbsp;family,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.335">addColumn</a>(byte[]&nbsp;family,
                       byte[]&nbsp;qualifier)</pre>
 <div class="block">Get the column from the specified family with the specified qualifier.
  <p>
@@ -1013,7 +1013,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan
 <ul class="blockList">
 <li class="blockList">
 <h4>setTimeRange</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.360">setTimeRange</a>(long&nbsp;minStamp,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.359">setTimeRange</a>(long&nbsp;minStamp,
                          long&nbsp;maxStamp)
                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Get versions of columns only within the specified timestamp range,
@@ -1041,7 +1041,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan
 <li class="blockList">
 <h4>setTimeStamp</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.378">setTimeStamp</a>(long&nbsp;timestamp)
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.377">setTimeStamp</a>(long&nbsp;timestamp)
                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.
              Use <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html#setTimestamp-long-"><code>setTimestamp(long)</code></a> instead</span></div>
@@ -1068,7 +1068,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setTimestamp</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.393">setTimestamp</a>(long&nbsp;timestamp)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.392">setTimestamp</a>(long&nbsp;timestamp)</pre>
 <div class="block">Get versions of columns with the specified timestamp. Note, default maximum
  versions to return is 1.  If your time range spans more than one version
  and you want all versions returned, up the number of versions beyond the
@@ -1090,7 +1090,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setColumnFamilyTimeRange</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.405">setColumnFamilyTimeRange</a>(byte[]&nbsp;cf,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.404">setColumnFamilyTimeRange</a>(byte[]&nbsp;cf,
                                      long&nbsp;minStamp,
                                      long&nbsp;maxStamp)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Query.html#setColumnFamilyTimeRange-byte:A-long-long-">Query</a></code></span></div>
@@ -1118,7 +1118,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <li class="blockList">
 <h4>setStartRow</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.425">setStartRow</a>(byte[]&nbsp;startRow)</pre>
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.424">setStartRow</a>(byte[]&nbsp;startRow)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html#withStartRow-byte:A-"><code>withStartRow(byte[])</code></a>
    instead. This method may change the inclusive of the stop row to keep compatible with the old
    behavior.</span></div>
@@ -1146,7 +1146,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>withStartRow</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.444">withStartRow</a>(byte[]&nbsp;startRow)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.443">withStartRow</a>(byte[]&nbsp;startRow)</pre>
 <div class="block">Set the start row of the scan.
  <p>
  If the specified row does not exist, the Scanner will start from the next closest row after the
@@ -1168,7 +1168,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>withStartRow</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.459">withStartRow</a>(byte[]&nbsp;startRow,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.458">withStartRow</a>(byte[]&nbsp;startRow,
                          boolean&nbsp;inclusive)</pre>
 <div class="block">Set the start row of the scan.
  <p>
@@ -1193,7 +1193,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <li class="blockList">
 <h4>setStopRow</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.488">setStopRow</a>(byte[]&nbsp;stopRow)</pre>
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.487">setStopRow</a>(byte[]&nbsp;stopRow)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html#withStopRow-byte:A-"><code>withStopRow(byte[])</code></a> instead.
    This method may change the inclusive of the stop row to keep compatible with the old
    behavior.</span></div>
@@ -1224,7 +1224,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>withStopRow</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.510">withStopRow</a>(byte[]&nbsp;stopRow)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.509">withStopRow</a>(byte[]&nbsp;stopRow)</pre>
 <div class="block">Set the stop row of the scan.
  <p>
  The scan will include rows that are lexicographically less than the provided stopRow.
@@ -1249,7 +1249,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>withStopRow</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.525">withStopRow</a>(byte[]&nbsp;stopRow,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.524">withStopRow</a>(byte[]&nbsp;stopRow,
                         boolean&nbsp;inclusive)</pre>
 <div class="block">Set the stop row of the scan.
  <p>
@@ -1273,7 +1273,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setRowPrefixFilter</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.546">setRowPrefixFilter</a>(byte[]&nbsp;rowPrefix)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.545">setRowPrefixFilter</a>(byte[]&nbsp;rowPrefix)</pre>
 <div class="block"><p>Set a filter (using stopRow and startRow) so the result set only contains rows where the
  rowKey starts with the specified prefix.</p>
  <p>This is a utility method that converts the desired rowPrefix into the appropriate values
@@ -1296,7 +1296,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <li class="blockList">
 <h4>setMaxVersions</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.608">setMaxVersions</a>()</pre>
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.565">setMaxVersions</a>()</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. It is easy to misunderstand with column
    family's max versions, so use <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html#readAllVersions--"><code>readAllVersions()</code></a> instead.</span></div>
 <div class="block">Get all available versions.</div>
@@ -1316,7 +1316,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <li class="blockList">
 <h4>setMaxVersions</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.622">setMaxVersions</a>(int&nbsp;maxVersions)</pre>
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.579">setMaxVersions</a>(int&nbsp;maxVersions)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. It is easy to misunderstand with column
    family's max versions, so use <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html#readVersions-int-"><code>readVersions(int)</code></a> instead.</span></div>
 <div class="block">Get up to the specified number of versions of each column.</div>
@@ -1337,7 +1337,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>readAllVersions</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.630">readAllVersions</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.587">readAllVersions</a>()</pre>
 <div class="block">Get all available versions.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -1351,7 +1351,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>readVersions</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.640">readVersions</a>(int&nbsp;versions)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.597">readVersions</a>(int&nbsp;versions)</pre>
 <div class="block">Get up to the specified number of versions of each column.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1367,7 +1367,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setBatch</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.654">setBatch</a>(int&nbsp;batch)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.611">setBatch</a>(int&nbsp;batch)</pre>
 <div class="block">Set the maximum number of cells to return for each call to next(). Callers should be aware
  that this is not equivalent to calling <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html#setAllowPartialResults-boolean-"><code>setAllowPartialResults(boolean)</code></a>.
  If you don't allow partial results, the number of cells in each Result must equal to your
@@ -1387,7 +1387,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setMaxResultsPerColumnFamily</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.668">setMaxResultsPerColumnFamily</a>(int&nbsp;limit)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.625">setMaxResultsPerColumnFamily</a>(int&nbsp;limit)</pre>
 <div class="block">Set the maximum number of values to return per row per Column Family</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1401,7 +1401,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setRowOffsetPerColumnFamily</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.677">setRowOffsetPerColumnFamily</a>(int&nbsp;offset)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.634">setRowOffsetPerColumnFamily</a>(int&nbsp;offset)</pre>
 <div class="block">Set offset for the row per Column Family.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1415,7 +1415,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setCaching</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.689">setCaching</a>(int&nbsp;caching)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.646">setCaching</a>(int&nbsp;caching)</pre>
 <div class="block">Set the number of rows for caching that will be passed to scanners.
  If not set, the Configuration setting <a href="../../../../../org/apache/hadoop/hbase/HConstants.html#HBASE_CLIENT_SCANNER_CACHING"><code>HConstants.HBASE_CLIENT_SCANNER_CACHING</code></a> will
  apply.
@@ -1432,7 +1432,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxResultSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.697">getMaxResultSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.654">getMaxResultSize</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the maximum result size in bytes. See <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html#setMaxResultSize-long-"><code>setMaxResultSize(long)</code></a></dd>
@@ -1445,7 +1445,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setMaxResultSize</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.708">setMaxResultSize</a>(long&nbsp;maxResultSize)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.665">setMaxResultSize</a>(long&nbsp;maxResultSize)</pre>
 <div class="block">Set the maximum result size. The default is -1; this means that no specific
  maximum result size will be set for this scan, and the global configured
  value will be used instead. (Defaults to unlimited).</div>
@@ -1461,7 +1461,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setFilter</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.714">setFilter</a>(<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&nbsp;filter)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.671">setFilter</a>(<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&nbsp;filter)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Query.html#setFilter-org.apache.hadoop.hbase.filter.Filter-">Query</a></code></span></div>
 <div class="block">Apply the specified server-side filter when performing the Query. Only
  <a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html#filterCell-org.apache.hadoop.hbase.Cell-"><code>Filter.filterCell(org.apache.hadoop.hbase.Cell)</code></a> is called AFTER all tests for ttl,
@@ -1482,7 +1482,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setFamilyMap</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.724">setFamilyMap</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/NavigableSet.html?is-external=true" tit [...]
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.681">setFamilyMap</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/NavigableSet.html?is-external=true" tit [...]
 <div class="block">Setting the familyMap</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1498,7 +1498,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getFamilyMap</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/NavigableSet.html?is-external=true" title="class or interface in java.util">NavigableSet</a>&lt;byte[]&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.733">getFamilyMap</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/NavigableSet.html?is-external=true" title="class or interface in java.util">NavigableSet</a>&lt;byte[]&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.690">getFamilyMap</a>()</pre>
 <div class="block">Getting the familyMap</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -1512,7 +1512,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>numFamilies</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.740">numFamilies</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.697">numFamilies</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the number of families in familyMap</dd>
@@ -1525,7 +1525,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>hasFamilies</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.750">hasFamilies</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.707">hasFamilies</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true if familyMap is non empty, false otherwise</dd>
@@ -1538,7 +1538,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getFamilies</h4>
-<pre>public&nbsp;byte[][]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.757">getFamilies</a>()</pre>
+<pre>public&nbsp;byte[][]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.714">getFamilies</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the keys of the familyMap</dd>
@@ -1551,7 +1551,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getStartRow</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.767">getStartRow</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.724">getStartRow</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the startrow</dd>
@@ -1564,7 +1564,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>includeStartRow</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.774">includeStartRow</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.731">includeStartRow</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>if we should include start row when scan</dd>
@@ -1577,7 +1577,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getStopRow</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.781">getStopRow</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.738">getStopRow</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the stoprow</dd>
@@ -1590,7 +1590,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>includeStopRow</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.788">includeStopRow</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.745">includeStopRow</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>if we should include stop row when scan</dd>
@@ -1603,7 +1603,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxVersions</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.795">getMaxVersions</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.752">getMaxVersions</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the max number of versions to fetch</dd>
@@ -1616,7 +1616,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getBatch</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.802">getBatch</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.759">getBatch</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>maximum number of values to return for a single call to next()</dd>
@@ -1629,7 +1629,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxResultsPerColumnFamily</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.809">getMaxResultsPerColumnFamily</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.766">getMaxResultsPerColumnFamily</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>maximum number of values to return per row per CF</dd>
@@ -1642,7 +1642,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getRowOffsetPerColumnFamily</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.818">getRowOffsetPerColumnFamily</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.775">getRowOffsetPerColumnFamily</a>()</pre>
 <div class="block">Method for retrieving the scan's offset per row per column
  family (#kvs to be skipped)</div>
 <dl>
@@ -1657,7 +1657,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getCaching</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.825">getCaching</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.782">getCaching</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>caching the number of rows fetched when calling next on a scanner</dd>
@@ -1670,7 +1670,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getTimeRange</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.832">getTimeRange</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.789">getTimeRange</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>TimeRange</dd>
@@ -1683,7 +1683,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getFilter</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.840">getFilter</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.797">getFilter</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/Query.html#getFilter--">getFilter</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Query.html" title="class in org.apache.hadoop.hbase.client">Query</a></code></dd>
@@ -1698,7 +1698,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>hasFilter</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.847">hasFilter</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.804">hasFilter</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true is a filter has been specified, false if not</dd>
@@ -1711,7 +1711,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setCacheBlocks</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.861">setCacheBlocks</a>(boolean&nbsp;cacheBlocks)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.818">setCacheBlocks</a>(boolean&nbsp;cacheBlocks)</pre>
 <div class="block">Set whether blocks should be cached for this Scan.
  <p>
  This is true by default.  When true, default settings of the table and
@@ -1730,7 +1730,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getCacheBlocks</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.871">getCacheBlocks</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.828">getCacheBlocks</a>()</pre>
 <div class="block">Get whether blocks should be cached for this Scan.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -1745,7 +1745,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setReversed</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.883">setReversed</a>(boolean&nbsp;reversed)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.840">setReversed</a>(boolean&nbsp;reversed)</pre>
 <div class="block">Set whether this scan is a reversed one
  <p>
  This is false by default which means forward(normal) scan.</div>
@@ -1763,7 +1763,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>isReversed</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.892">isReversed</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.849">isReversed</a>()</pre>
 <div class="block">Get whether this scan is a reversed one.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -1777,7 +1777,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setAllowPartialResults</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.906">setAllowPartialResults</a>(boolean&nbsp;allowPartialResults)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.863">setAllowPartialResults</a>(boolean&nbsp;allowPartialResults)</pre>
 <div class="block">Setting whether the caller wants to see the partial results when server returns
  less-than-expected cells. It is helpful while scanning a huge row to prevent OOM at client.
  By default this value is false and the complete results will be assembled client side
@@ -1799,7 +1799,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getAllowPartialResults</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.916">getAllowPartialResults</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.873">getAllowPartialResults</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true when the constructor of this scan understands that the results they will see may
@@ -1814,7 +1814,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setLoadColumnFamiliesOnDemand</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.921">setLoadColumnFamiliesOnDemand</a>(boolean&nbsp;value)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.878">setLoadColumnFamiliesOnDemand</a>(boolean&nbsp;value)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Query.html#setLoadColumnFamiliesOnDemand-boolean-">Query</a></code></span></div>
 <div class="block">Set the value indicating whether loading CFs on demand should be allowed (cluster
  default is false). On-demand CF loading doesn't load column families until necessary, e.g.
@@ -1842,7 +1842,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getFingerprint</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache [...]
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache [...]
 <div class="block">Compile the table and column family (i.e. schema) information
  into a String. Useful for parsing and aggregation by debugging,
  logging, and administration tools.</div>
@@ -1860,7 +1860,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>toMap</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache [...]
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache [...]
 <div class="block">Compile the details beyond the scope of getFingerprint (row, columns,
  timestamps, etc.) into a Map along with the fingerprinted information.
  Useful for debugging, logging, and administration tools.</div>
@@ -1880,7 +1880,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setRaw</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1019">setRaw</a>(boolean&nbsp;raw)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.976">setRaw</a>(boolean&nbsp;raw)</pre>
 <div class="block">Enable/disable "raw" mode for this scan.
  If "raw" is enabled the scan will return all
  delete marker and deleted rows that have not
@@ -1900,7 +1900,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>isRaw</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1027">isRaw</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.984">isRaw</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>True if this Scan is in "raw" mode.</dd>
@@ -1914,7 +1914,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <li class="blockList">
 <h4>setSmall</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1051">setSmall</a>(boolean&nbsp;small)</pre>
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1008">setSmall</a>(boolean&nbsp;small)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html#setLimit-int-"><code>setLimit(int)</code></a> and
    <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html#setReadType-org.apache.hadoop.hbase.client.Scan.ReadType-"><code>setReadType(ReadType)</code></a> instead. And for the one rpc optimization, now we will also
    fetch data when openScanner, and if the number of rows reaches the limit then we will close
@@ -1944,7 +1944,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <li class="blockList">
 <h4>isSmall</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1065">isSmall</a>()</pre>
+public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1022">isSmall</a>()</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. See the comment of
    <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html#setSmall-boolean-"><code>setSmall(boolean)</code></a></span></div>
 <div class="block">Get whether this scan is a small scan</div>
@@ -1962,7 +1962,7 @@ public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>setAttribute</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1070">setAttribute</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1027">setAttribute</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                          byte[]&nbsp;value)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Attributes.html#setAttribute-java.lang.String-byte:A-">Attributes</a></code></span></div>
 <div class="block">Sets an attribute.
@@ -1985,7 +1985,7 @@ public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>setId</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1075">setId</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;id)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1032">setId</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;id)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/OperationWithAttributes.html#setId-java.lang.String-">OperationWithAttributes</a></code></span></div>
 <div class="block">This method allows you to set an identifier on an operation. The original
  motivation for this was to allow the identifier to be used in slow query
@@ -2006,7 +2006,7 @@ public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>setAuthorizations</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1080">setAuthorizations</a>(org.apache.hadoop.hbase.security.visibility.Authorizations&nbsp;authorizations)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1037">setAuthorizations</a>(org.apache.hadoop.hbase.security.visibility.Authorizations&nbsp;authorizations)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Query.html#setAuthorizations-org.apache.hadoop.hbase.security.visibility.Authorizations-">Query</a></code></span></div>
 <div class="block">Sets the authorizations to be used by this Query</div>
 <dl>
@@ -2021,7 +2021,7 @@ public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>setACL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1085">setACL</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or inter [...]
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1042">setACL</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or inter [...]
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/Query.html#setACL-java.util.Map-">setACL</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Query.html" title="class in org.apache.hadoop.hbase.client">Query</a></code></dd>
@@ -2036,7 +2036,7 @@ public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>setACL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1090">setACL</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;user,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1047">setACL</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;user,
                    org.apache.hadoop.hbase.security.access.Permission&nbsp;perms)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -2053,7 +2053,7 @@ public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>setConsistency</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1095">setConsistency</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client">Consistency</a>&nbsp;consistency)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1052">setConsistency</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client">Consistency</a>&nbsp;consistency)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Query.html#setConsistency-org.apache.hadoop.hbase.client.Consistency-">Query</a></code></span></div>
 <div class="block">Sets the consistency level for this operation</div>
 <dl>
@@ -2070,7 +2070,7 @@ public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>setReplicaId</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1100">setReplicaId</a>(int&nbsp;Id)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1057">setReplicaId</a>(int&nbsp;Id)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Query.html#setReplicaId-int-">Query</a></code></span></div>
 <div class="block">Specify region replica id where Query will fetch data from. Use this together with
  <a href="../../../../../org/apache/hadoop/hbase/client/Query.html#setConsistency-org.apache.hadoop.hbase.client.Consistency-"><code>Query.setConsistency(Consistency)</code></a> passing <a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html#TIMELINE"><code>Consistency.TIMELINE</code></a> to read data from
@@ -2088,7 +2088,7 @@ public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>setIsolationLevel</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1105">setIsolationLevel</a>(<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client">IsolationLevel</a>&nbsp;level)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1062">setIsolationLevel</a>(<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client">IsolationLevel</a>&nbsp;level)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Query.html#setIsolationLevel-org.apache.hadoop.hbase.client.IsolationLevel-">Query</a></code></span></div>
 <div class="block">Set the isolation level for this query. If the
  isolation level is set to READ_UNCOMMITTED, then
@@ -2112,7 +2112,7 @@ public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>setPriority</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1110">setPriority</a>(int&nbsp;priority)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1067">setPriority</a>(int&nbsp;priority)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/OperationWithAttributes.html#setPriority-int-">setPriority</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/OperationWithAttributes.html" title="class in org.apache.hadoop.hbase.client">OperationWithAttributes</a></code></dd>
@@ -2125,7 +2125,7 @@ public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>setScanMetricsEnabled</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1118">setScanMetricsEnabled</a>(boolean&nbsp;enabled)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1075">setScanMetricsEnabled</a>(boolean&nbsp;enabled)</pre>
 <div class="block">Enable collection of <code>ScanMetrics</code>. For advanced users.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -2139,7 +2139,7 @@ public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>isScanMetricsEnabled</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1126">isScanMetricsEnabled</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1083">isScanMetricsEnabled</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>True if collection of scan metrics is enabled. For advanced users.</dd>
@@ -2152,7 +2152,7 @@ public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>isAsyncPrefetch</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1131">isAsyncPrefetch</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1088">isAsyncPrefetch</a>()</pre>
 </li>
 </ul>
 <a name="setAsyncPrefetch-boolean-">
@@ -2162,7 +2162,7 @@ public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbas
 <li class="blockList">
 <h4>setAsyncPrefetch</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1140">setAsyncPrefetch</a>(boolean&nbsp;asyncPrefetch)</pre>
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1097">setAsyncPrefetch</a>(boolean&nbsp;asyncPrefetch)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 3.0.0, will be removed in 4.0.0. After building sync client upon async
              client, the implementation is always 'async prefetch', so this flag is useless now.</span></div>
 </li>
@@ -2173,7 +2173,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getLimit</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1148">getLimit</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1105">getLimit</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the limit of rows for this scan</dd>
@@ -2186,7 +2186,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setLimit</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1160">setLimit</a>(int&nbsp;limit)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1117">setLimit</a>(int&nbsp;limit)</pre>
 <div class="block">Set the limit of rows for this scan. We will terminate the scan if the number of returned rows
  reaches this value.
  <p>
@@ -2205,7 +2205,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setOneRowLimit</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1170">setOneRowLimit</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1127">setOneRowLimit</a>()</pre>
 <div class="block">Call this when you only want to get one row. It will set <code>limit</code> to <code>1</code>, and also
  set <code>readType</code> to <a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html#PREAD"><code>Scan.ReadType.PREAD</code></a>.</div>
 <dl>
@@ -2220,7 +2220,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getReadType</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client">Scan.ReadType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1182">getReadType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client">Scan.ReadType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1139">getReadType</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the read type for this scan</dd>
@@ -2233,7 +2233,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setReadType</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1193">setReadType</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client">Scan.ReadType</a>&nbsp;readType)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1150">setReadType</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client">Scan.ReadType</a>&nbsp;readType)</pre>
 <div class="block">Set the read type for this scan.
  <p>
  Notice that we may choose to use pread even if you specific <a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html#STREAM"><code>Scan.ReadType.STREAM</code></a> here. For
@@ -2250,7 +2250,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setNeedCursorResult</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1239">setNeedCursorResult</a>(boolean&nbsp;needCursorResult)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1196">setNeedCursorResult</a>(boolean&nbsp;needCursorResult)</pre>
 <div class="block">When the server is slow or we scan a table with many deleted data or we use a sparse filter,
  the server will response heartbeat to prevent timeout. However the scanner will return a Result
  only when client can do it. So if there are many heartbeats, the blocking time on
@@ -2276,7 +2276,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>isNeedCursorResult</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1244">isNeedCursorResult</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1201">isNeedCursorResult</a>()</pre>
 </li>
 </ul>
 <a name="createScanFromCursor-org.apache.hadoop.hbase.client.Cursor-">
@@ -2285,7 +2285,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" ti
 <ul class="blockListLast">
 <li class="blockList">
 <h4>createScanFromCursor</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1255">createScanFromCursor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Cursor.html" title="class in org.apache.hadoop.hbase.client">Cursor</a>&nbsp;cursor)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Scan.html#line.1212">createScanFromCursor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Cursor.html" title="class in org.apache.hadoop.hbase.client">Cursor</a>&nbsp;cursor)</pre>
 <div class="block">Create a new Scan with a cursor. It only set the position information like start row key.
  The others (like cfs, stop row, limit) should still be filled in by the user.
  <a href="../../../../../org/apache/hadoop/hbase/client/Result.html#isCursor--"><code>Result.isCursor()</code></a>
diff --git a/apidocs/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html b/apidocs/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html
index 3b68176..6805775 100644
--- a/apidocs/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html
+++ b/apidocs/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Public
-public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.564">MultiRowRangeFilter.RowRange</a>
+public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.592">MultiRowRangeFilter.RowRange</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -214,7 +214,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>RowRange</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html#line.565">RowRange</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html#line.593">RowRange</a>()</pre>
 </li>
 </ul>
 <a name="RowRange-java.lang.String-boolean-java.lang.String-boolean-">
@@ -223,7 +223,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>RowRange</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html#line.572">RowRange</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;startRow,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html#line.600">RowRange</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;startRow,
                 boolean&nbsp;startRowInclusive,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;stopRow,
                 boolean&nbsp;stopRowInclusive)</pre>
@@ -238,7 +238,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RowRange</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html#line.577">RowRange</a>(byte[]&nbsp;startRow,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html#line.605">RowRange</a>(byte[]&nbsp;startRow,
                 boolean&nbsp;startRowInclusive,
                 byte[]&nbsp;stopRow,
                 boolean&nbsp;stopRowInclusive)</pre>
@@ -258,7 +258,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getComparisonData</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html#line.583">getComparisonData</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html#line.611">getComparisonData</a>()</pre>
 <div class="block">Returns the data to be used to compare <code>this</code> to another object.</div>
 </li>
 </ul>
@@ -268,7 +268,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isSearchRowInclusive</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html#line.588">isSearchRowInclusive</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html#line.616">isSearchRowInclusive</a>()</pre>
 <div class="block">Returns whether the bounding row used for binary-search is inclusive or not.
 
  For forward scans, we would check the starRow, but we would check the stopRow for
@@ -281,7 +281,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>isAscendingOrder</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html#line.593">isAscendingOrder</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html#line.621">isAscendingOrder</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/apidocs/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html b/apidocs/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html
index 55fe25a..eee0361 100644
--- a/apidocs/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html
+++ b/apidocs/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html
@@ -120,7 +120,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Public
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.52">MultiRowRangeFilter</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.53">MultiRowRangeFilter</a>
 extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <div class="block">Filter to support scan multiple row key ranges. It can construct the row key ranges from the
  passed list which can be accessed by each region server.
@@ -194,6 +194,11 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <th class="colOne" scope="col">Constructor and Description</th>
 </tr>
 <tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#MultiRowRangeFilter-byte:A:A-">MultiRowRangeFilter</a></span>(byte[][]&nbsp;rowKeyPrefixes)</code>
+<div class="block">Constructor for creating a <code>MultiRowRangeFilter</code> from multiple rowkey prefixes.</div>
+</td>
+</tr>
+<tr class="rowColor">
 <td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#MultiRowRangeFilter-java.util.List-">MultiRowRangeFilter</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html" title="class in org.apache.hadoop.hbase.filter">MultiRowRan [...]
 </tr>
 </table>
@@ -304,16 +309,35 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <a name="MultiRowRangeFilter-java.util.List-">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>MultiRowRangeFilter</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.67">MultiRowRangeFilter</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html" title="class in org.apache.hadoop.hbase.filter">MultiRowRangeFilter.RowRange</a>&gt;&nbsp;list)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.68">MultiRowRangeFilter</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html" title="class in org.apache.hadoop.hbase.filter">MultiRowRangeFilter.RowRange</a>&gt;&nbsp;list)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>list</code> - A list of <code>RowRange</code></dd>
 </dl>
 </li>
 </ul>
+<a name="MultiRowRangeFilter-byte:A:A-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>MultiRowRangeFilter</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.85">MultiRowRangeFilter</a>(byte[][]&nbsp;rowKeyPrefixes)</pre>
+<div class="block">Constructor for creating a <code>MultiRowRangeFilter</code> from multiple rowkey prefixes.
+
+ As <code>MultiRowRangeFilter</code> javadoc says (See the solution 1 of the first statement),
+ if you try to create a filter list that scans row keys corresponding to given prefixes (e.g.,
+ <code>FilterList</code> composed of multiple <code>PrefixFilter</code>s), this constructor
+ provides a way to avoid creating an inefficient one.</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>rowKeyPrefixes</code> - the array of byte array</dd>
+</dl>
+</li>
+</ul>
 </li>
 </ul>
 <!-- ============ METHOD DETAIL ========== -->
@@ -328,7 +352,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getRowRanges</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html" title="class in org.apache.hadoop.hbase.filter">MultiRowRangeFilter.RowRange</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.74">getRowRanges</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html" title="class in org.apache.hadoop.hbase.filter">MultiRowRangeFilter.RowRange</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.102">getRowRanges</a>()</pre>
 </li>
 </ul>
 <a name="filterAllRemaining--">
@@ -337,7 +361,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>filterAllRemaining</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.80">filterAllRemaining</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.108">filterAllRemaining</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code>org.apache.hadoop.hbase.filter.FilterBase</code></span></div>
 <div class="block">Filters that never filter all remaining can inherit this implementation that
  never stops the filter early.
@@ -360,7 +384,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>filterRowKey</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.85">filterRowKey</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.113">filterRowKey</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;firstRowCell)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html#filterRowKey-org.apache.hadoop.hbase.Cell-">Filter</a></code></span></div>
 <div class="block">Filters a row based on the row key. If this returns true, the entire row will be excluded. If
  false, each KeyValue in the row will be passed to <a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html#filterCell-org.apache.hadoop.hbase.Cell-"><code>Filter.filterCell(Cell)</code></a> below.
@@ -385,7 +409,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>filterCell</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter">Filter.ReturnCode</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.141">filterCell</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;ignored)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter">Filter.ReturnCode</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.169">filterCell</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;ignored)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html#filterCell-org.apache.hadoop.hbase.Cell-">Filter</a></code></span></div>
 <div class="block">A way to filter based on the column family, column qualifier and/or the column value. Return
  code is described below. This allows filters to filter only certain number of columns, then
@@ -419,7 +443,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getNextCellHint</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.146">getNextCellHint</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentKV)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.174">getNextCellHint</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentKV)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code>org.apache.hadoop.hbase.filter.FilterBase</code></span></div>
 <div class="block">Filters that are not sure which key must be next seeked to, can inherit
  this implementation that, by default, returns a null Cell.
@@ -445,7 +469,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>toByteArray</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.157">toByteArray</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.185">toByteArray</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code>org.apache.hadoop.hbase.filter.FilterBase</code></span></div>
 <div class="block">Return length 0 byte array for Filters that don't require special serialization</div>
 <dl>
@@ -462,7 +486,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>parseFrom</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html" title="class in org.apache.hadoop.hbase.filter">MultiRowRangeFilter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.180">parseFrom</a>(byte[]&nbsp;pbBytes)
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html" title="class in org.apache.hadoop.hbase.filter">MultiRowRangeFilter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.208">parseFrom</a>(byte[]&nbsp;pbBytes)
                                      throws org.apache.hadoop.hbase.exceptions.DeserializationException</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -480,7 +504,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>sortAndMerge</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html" title="class in org.apache.hadoop.hbase.filter">MultiRowRangeFilter.RowRange</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.234">sortAndMerge</a>(<a href="https://docs.oracle.co [...]
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html" title="class in org.apache.hadoop.hbase.filter">MultiRowRangeFilter.RowRange</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.262">sortAndMerge</a>(<a href="https://docs.oracle.co [...]
 <div class="block">sort the ranges and if the ranges with overlap, then merge them.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -496,7 +520,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.738">equals</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;obj)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.766">equals</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;obj)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -509,7 +533,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.743">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#line.771">hashCode</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html b/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html
index 8bde22b..c749d04 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.ReadType.html
@@ -29,1241 +29,1198 @@
 <span class="sourceLineNo">021</span><a name="line.21"></a>
 <span class="sourceLineNo">022</span>import java.io.IOException;<a name="line.22"></a>
 <span class="sourceLineNo">023</span>import java.util.ArrayList;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import java.util.Arrays;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import java.util.HashMap;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.Map;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.NavigableSet;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.TreeMap;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.TreeSet;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.HConstants;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.filter.IncompatibleFilterException;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.io.TimeRange;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.security.access.Permission;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.security.visibility.Authorizations;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.slf4j.Logger;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.slf4j.LoggerFactory;<a name="line.41"></a>
-<span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>/**<a name="line.43"></a>
-<span class="sourceLineNo">044</span> * Used to perform Scan operations.<a name="line.44"></a>
-<span class="sourceLineNo">045</span> * &lt;p&gt;<a name="line.45"></a>
-<span class="sourceLineNo">046</span> * All operations are identical to {@link Get} with the exception of instantiation. Rather than<a name="line.46"></a>
-<span class="sourceLineNo">047</span> * specifying a single row, an optional startRow and stopRow may be defined. If rows are not<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * specified, the Scanner will iterate over all rows.<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * &lt;p&gt;<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * To get all columns from all rows of a Table, create an instance with no constraints; use the<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * {@link #Scan()} constructor. To constrain the scan to specific column families, call<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * {@link #addFamily(byte[]) addFamily} for each family to retrieve on your Scan instance.<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * &lt;p&gt;<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * To get specific columns, call {@link #addColumn(byte[], byte[]) addColumn} for each column to<a name="line.54"></a>
-<span class="sourceLineNo">055</span> * retrieve.<a name="line.55"></a>
-<span class="sourceLineNo">056</span> * &lt;p&gt;<a name="line.56"></a>
-<span class="sourceLineNo">057</span> * To only retrieve columns within a specific range of version timestamps, call<a name="line.57"></a>
-<span class="sourceLineNo">058</span> * {@link #setTimeRange(long, long) setTimeRange}.<a name="line.58"></a>
-<span class="sourceLineNo">059</span> * &lt;p&gt;<a name="line.59"></a>
-<span class="sourceLineNo">060</span> * To only retrieve columns with a specific timestamp, call {@link #setTimestamp(long) setTimestamp}<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * .<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * &lt;p&gt;<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * To limit the number of versions of each column to be returned, call {@link #setMaxVersions(int)<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * setMaxVersions}.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;p&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * To limit the maximum number of values returned for each call to next(), call<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * {@link #setBatch(int) setBatch}.<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;p&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * To add a filter, call {@link #setFilter(org.apache.hadoop.hbase.filter.Filter) setFilter}.<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;p&gt;<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * For small scan, it is deprecated in 2.0.0. Now we have a {@link #setLimit(int)} method in Scan<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * object which is used to tell RS how many rows we want. If the rows return reaches the limit, the<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * RS will close the RegionScanner automatically. And we will also fetch data when openScanner in<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * the new implementation, this means we can also finish a scan operation in one rpc call. And we<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * have also introduced a {@link #setReadType(ReadType)} method. You can use this method to tell RS<a name="line.75"></a>
-<span class="sourceLineNo">076</span> * to use pread explicitly.<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;p&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> * Expert: To explicitly disable server-side block caching for this scan, execute<a name="line.78"></a>
-<span class="sourceLineNo">079</span> * {@link #setCacheBlocks(boolean)}.<a name="line.79"></a>
-<span class="sourceLineNo">080</span> * &lt;p&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> * &lt;em&gt;Note:&lt;/em&gt; Usage alters Scan instances. Internally, attributes are updated as the Scan runs<a name="line.81"></a>
-<span class="sourceLineNo">082</span> * and if enabled, metrics accumulate in the Scan instance. Be aware this is the case when you go to<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * clone a Scan instance or if you go to reuse a created Scan instance; safer is create a Scan<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * instance per usage.<a name="line.84"></a>
-<span class="sourceLineNo">085</span> */<a name="line.85"></a>
-<span class="sourceLineNo">086</span>@InterfaceAudience.Public<a name="line.86"></a>
-<span class="sourceLineNo">087</span>public class Scan extends Query {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  private static final Logger LOG = LoggerFactory.getLogger(Scan.class);<a name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  private static final String RAW_ATTR = "_raw_";<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private byte[] startRow = HConstants.EMPTY_START_ROW;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  private boolean includeStartRow = true;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  private byte[] stopRow  = HConstants.EMPTY_END_ROW;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  private boolean includeStopRow = false;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private int maxVersions = 1;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  private int batch = -1;<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>  /**<a name="line.99"></a>
-<span class="sourceLineNo">100</span>   * Partial {@link Result}s are {@link Result}s must be combined to form a complete {@link Result}.<a name="line.100"></a>
-<span class="sourceLineNo">101</span>   * The {@link Result}s had to be returned in fragments (i.e. as partials) because the size of the<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * cells in the row exceeded max result size on the server. Typically partial results will be<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   * combined client side into complete results before being delivered to the caller. However, if<a name="line.103"></a>
-<span class="sourceLineNo">104</span>   * this flag is set, the caller is indicating that they do not mind seeing partial results (i.e.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>   * they understand that the results returned from the Scanner may only represent part of a<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * particular row). In such a case, any attempt to combine the partials into a complete result on<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   * the client side will be skipped, and the caller will be able to see the exact results returned<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * from the server.<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  private boolean allowPartialResults = false;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>  private int storeLimit = -1;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  private int storeOffset = 0;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  private static final String SCAN_ATTRIBUTES_METRICS_ENABLE = "scan.attributes.metrics.enable";<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span>  // If an application wants to use multiple scans over different tables each scan must<a name="line.117"></a>
-<span class="sourceLineNo">118</span>  // define this attribute with the appropriate table name by calling<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // scan.setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME, Bytes.toBytes(tableName))<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  static public final String SCAN_ATTRIBUTES_TABLE_NAME = "scan.attributes.table.name";<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  /**<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   * -1 means no caching specified and the value of {@link HConstants#HBASE_CLIENT_SCANNER_CACHING}<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   * (default to {@link HConstants#DEFAULT_HBASE_CLIENT_SCANNER_CACHING}) will be used<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   */<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  private int caching = -1;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  private long maxResultSize = -1;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  private boolean cacheBlocks = true;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  private boolean reversed = false;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  private TimeRange tr = TimeRange.allTime();<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  private Map&lt;byte [], NavigableSet&lt;byte []&gt;&gt; familyMap =<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    new TreeMap&lt;byte [], NavigableSet&lt;byte []&gt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private Boolean asyncPrefetch = null;<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>  /**<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * Parameter name for client scanner sync/async prefetch toggle.<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   * When using async scanner, prefetching data from the server is done at the background.<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   * The parameter currently won't have any effect in the case that the user has set<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   * Scan#setSmall or Scan#setReversed<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final String HBASE_CLIENT_SCANNER_ASYNC_PREFETCH =<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      "hbase.client.scanner.async.prefetch";<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  /**<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   * Default value of {@link #HBASE_CLIENT_SCANNER_ASYNC_PREFETCH}.<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   */<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  public static final boolean DEFAULT_HBASE_CLIENT_SCANNER_ASYNC_PREFETCH = false;<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>  /**<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * Set it true for small scan to get better performance Small scan should use pread and big scan<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * can use seek + read seek + read is fast but can cause two problem (1) resource contention (2)<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * cause too much network io [89-fb] Using pread for non-compaction read request<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * https://issues.apache.org/jira/browse/HBASE-7266 On the other hand, if setting it true, we<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * would do openScanner,next,closeScanner in one RPC call. It means the better performance for<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * small scan. [HBASE-9488]. Generally, if the scan range is within one data block(64KB), it could<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   * be considered as a small scan.<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   */<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private boolean small = false;<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
-<span class="sourceLineNo">161</span>   * The mvcc read point to use when open a scanner. Remember to clear it after switching regions as<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * the mvcc is only valid within region scope.<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  private long mvccReadPoint = -1L;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The number of rows we want for this scan. We will terminate the scan if the number of return<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * rows reaches this value.<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  private int limit = -1;<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * Control whether to use pread at server side.<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  private ReadType readType = ReadType.DEFAULT;<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>  private boolean needCursorResult = false;<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  /**<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * Create a Scan operation across all rows.<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   */<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  public Scan() {}<a name="line.182"></a>
-<span class="sourceLineNo">183</span><a name="line.183"></a>
-<span class="sourceLineNo">184</span>  /**<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   *   {@code new Scan().withStartRow(startRow).setFilter(filter)} instead.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
-<span class="sourceLineNo">189</span>  @Deprecated<a name="line.189"></a>
-<span class="sourceLineNo">190</span>  public Scan(byte[] startRow, Filter filter) {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    this(startRow);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    this.filter = filter;<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  }<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>  /**<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * Create a Scan operation starting at the specified row.<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * &lt;p&gt;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * If the specified row does not exist, the Scanner will start from the next closest row after the<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * specified row.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * @param startRow row to start scanner at or after<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   *   {@code new Scan().withStartRow(startRow)} instead.<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  @Deprecated<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  public Scan(byte[] startRow) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    setStartRow(startRow);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  /**<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   * Create a Scan operation for the range of rows specified.<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   * @param startRow row to start scanner at or after (inclusive)<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * @param stopRow row to stop scanner before (exclusive)<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   *   {@code new Scan().withStartRow(startRow).withStopRow(stopRow)} instead.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   */<a name="line.217"></a>
-<span class="sourceLineNo">218</span>  @Deprecated<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  public Scan(byte[] startRow, byte[] stopRow) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    setStartRow(startRow);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    setStopRow(stopRow);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  /**<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * Creates a new instance of this class while copying all values.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>   *<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   * @param scan  The scan instance to copy from.<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * @throws IOException When copying the values fails.<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   */<a name="line.229"></a>
-<span class="sourceLineNo">230</span>  public Scan(Scan scan) throws IOException {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    startRow = scan.getStartRow();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    includeStartRow = scan.includeStartRow();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    stopRow  = scan.getStopRow();<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    includeStopRow = scan.includeStopRow();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    maxVersions = scan.getMaxVersions();<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    batch = scan.getBatch();<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    storeLimit = scan.getMaxResultsPerColumnFamily();<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    storeOffset = scan.getRowOffsetPerColumnFamily();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    caching = scan.getCaching();<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    maxResultSize = scan.getMaxResultSize();<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    cacheBlocks = scan.getCacheBlocks();<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    filter = scan.getFilter(); // clone?<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    loadColumnFamiliesOnDemand = scan.getLoadColumnFamiliesOnDemandValue();<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    consistency = scan.getConsistency();<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    this.setIsolationLevel(scan.getIsolationLevel());<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    reversed = scan.isReversed();<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    asyncPrefetch = scan.isAsyncPrefetch();<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    small = scan.isSmall();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    allowPartialResults = scan.getAllowPartialResults();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    tr = scan.getTimeRange(); // TimeRange is immutable<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    Map&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; fams = scan.getFamilyMap();<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    for (Map.Entry&lt;byte[],NavigableSet&lt;byte[]&gt;&gt; entry : fams.entrySet()) {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      byte [] fam = entry.getKey();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      NavigableSet&lt;byte[]&gt; cols = entry.getValue();<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      if (cols != null &amp;&amp; cols.size() &gt; 0) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        for (byte[] col : cols) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>          addColumn(fam, col);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      } else {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        addFamily(fam);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      }<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    for (Map.Entry&lt;String, byte[]&gt; attr : scan.getAttributesMap().entrySet()) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      setAttribute(attr.getKey(), attr.getValue());<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    for (Map.Entry&lt;byte[], TimeRange&gt; entry : scan.getColumnFamilyTimeRange().entrySet()) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      TimeRange tr = entry.getValue();<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      setColumnFamilyTimeRange(entry.getKey(), tr.getMin(), tr.getMax());<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    this.mvccReadPoint = scan.getMvccReadPoint();<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    this.limit = scan.getLimit();<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    this.needCursorResult = scan.isNeedCursorResult();<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    setPriority(scan.getPriority());<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    readType = scan.getReadType();<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    super.setReplicaId(scan.getReplicaId());<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   * Builds a scan object with the same specs as get.<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   * @param get get to model scan after<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   */<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  public Scan(Get get) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    this.startRow = get.getRow();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    this.includeStartRow = true;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    this.stopRow = get.getRow();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    this.includeStopRow = true;<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    this.filter = get.getFilter();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    this.cacheBlocks = get.getCacheBlocks();<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    this.maxVersions = get.getMaxVersions();<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    this.storeLimit = get.getMaxResultsPerColumnFamily();<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    this.storeOffset = get.getRowOffsetPerColumnFamily();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    this.tr = get.getTimeRange();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    this.familyMap = get.getFamilyMap();<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    this.asyncPrefetch = false;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    this.consistency = get.getConsistency();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    this.setIsolationLevel(get.getIsolationLevel());<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    this.loadColumnFamiliesOnDemand = get.getLoadColumnFamiliesOnDemandValue();<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    for (Map.Entry&lt;String, byte[]&gt; attr : get.getAttributesMap().entrySet()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      setAttribute(attr.getKey(), attr.getValue());<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    for (Map.Entry&lt;byte[], TimeRange&gt; entry : get.getColumnFamilyTimeRange().entrySet()) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      TimeRange tr = entry.getValue();<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      setColumnFamilyTimeRange(entry.getKey(), tr.getMin(), tr.getMax());<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    this.mvccReadPoint = -1L;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    setPriority(get.getPriority());<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    super.setReplicaId(get.getReplicaId());<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  public boolean isGetScan() {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    return includeStartRow &amp;&amp; includeStopRow<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        &amp;&amp; ClientUtil.areScanStartRowAndStopRowEqual(this.startRow, this.stopRow);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  /**<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * Get all columns from the specified family.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   * &lt;p&gt;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * Overrides previous calls to addColumn for this family.<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * @param family family name<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * @return this<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  public Scan addFamily(byte [] family) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    familyMap.remove(family);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    familyMap.put(family, null);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    return this;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  }<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  /**<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   * Get the column from the specified family with the specified qualifier.<a name="line.329"></a>
-<span class="sourceLineNo">330</span>   * &lt;p&gt;<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * Overrides previous calls to addFamily for this family.<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * @param family family name<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * @param qualifier column qualifier<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * @return this<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  public Scan addColumn(byte [] family, byte [] qualifier) {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    NavigableSet&lt;byte []&gt; set = familyMap.get(family);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    if(set == null) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      set = new TreeSet&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      familyMap.put(family, set);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    if (qualifier == null) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      qualifier = HConstants.EMPTY_BYTE_ARRAY;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    set.add(qualifier);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    return this;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  }<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   * Get versions of columns only within the specified timestamp range,<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * [minStamp, maxStamp).  Note, default maximum versions to return is 1.  If<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * your time range spans more than one version and you want all versions<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * returned, up the number of versions beyond the default.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   * @param minStamp minimum timestamp value, inclusive<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   * @param maxStamp maximum timestamp value, exclusive<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * @see #setMaxVersions()<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * @see #setMaxVersions(int)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   * @return this<a name="line.358"></a>
-<span class="sourceLineNo">359</span>   */<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  public Scan setTimeRange(long minStamp, long maxStamp) throws IOException {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    tr = new TimeRange(minStamp, maxStamp);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    return this;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  /**<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * Get versions of columns with the specified timestamp. Note, default maximum<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   * versions to return is 1.  If your time range spans more than one version<a name="line.367"></a>
-<span class="sourceLineNo">368</span>   * and you want all versions returned, up the number of versions beyond the<a name="line.368"></a>
-<span class="sourceLineNo">369</span>   * defaut.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   * @param timestamp version timestamp<a name="line.370"></a>
-<span class="sourceLineNo">371</span>   * @see #setMaxVersions()<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * @see #setMaxVersions(int)<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * @return this<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @deprecated As of release 2.0.0, this will be removed in HBase 3.0.0.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   *             Use {@link #setTimestamp(long)} instead<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  @Deprecated<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public Scan setTimeStamp(long timestamp)<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  throws IOException {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    return this.setTimestamp(timestamp);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span>  /**<a name="line.383"></a>
-<span class="sourceLineNo">384</span>   * Get versions of columns with the specified timestamp. Note, default maximum<a name="line.384"></a>
-<span class="sourceLineNo">385</span>   * versions to return is 1.  If your time range spans more than one version<a name="line.385"></a>
-<span class="sourceLineNo">386</span>   * and you want all versions returned, up the number of versions beyond the<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   * defaut.<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   * @param timestamp version timestamp<a name="line.388"></a>
-<span class="sourceLineNo">389</span>   * @see #setMaxVersions()<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @see #setMaxVersions(int)<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * @return this<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   */<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  public Scan setTimestamp(long timestamp) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    try {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      tr = new TimeRange(timestamp, timestamp + 1);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    } catch(Exception e) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      // This should never happen, unless integer overflow or something extremely wrong...<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      LOG.error("TimeRange failed, likely caused by integer overflow. ", e);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      throw e;<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    }<a name="line.400"></a>
-<span class="sourceLineNo">401</span><a name="line.401"></a>
-<span class="sourceLineNo">402</span>    return this;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  @Override public Scan setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp) {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    return (Scan) super.setColumnFamilyTimeRange(cf, minStamp, maxStamp);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>  /**<a name="line.409"></a>
-<span class="sourceLineNo">410</span>   * Set the start row of the scan.<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * &lt;p&gt;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * If the specified row does not exist, the Scanner will start from the next closest row after the<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   * specified row.<a name="line.413"></a>
-<span class="sourceLineNo">414</span>   * @param startRow row to start scanner at or after<a name="line.414"></a>
-<span class="sourceLineNo">415</span>   * @return this<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * @throws IllegalArgumentException if startRow does not meet criteria for a row key (when length<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use {@link #withStartRow(byte[])}<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   *   instead. This method may change the inclusive of the stop row to keep compatible with the old<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   *   behavior.<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   * @see #withStartRow(byte[])<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  @Deprecated<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  public Scan setStartRow(byte[] startRow) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    withStartRow(startRow);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    if (ClientUtil.areScanStartRowAndStopRowEqual(this.startRow, this.stopRow)) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      // for keeping the old behavior that a scan with the same start and stop row is a get scan.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      this.includeStopRow = true;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    return this;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  }<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>  /**<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * Set the start row of the scan.<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * &lt;p&gt;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   * If the specified row does not exist, the Scanner will start from the next closest row after the<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * specified row.<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * @param startRow row to start scanner at or after<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @return this<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * @throws IllegalArgumentException if startRow does not meet criteria for a row key (when length<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public Scan withStartRow(byte[] startRow) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    return withStartRow(startRow, true);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>  }<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>  /**<a name="line.448"></a>
-<span class="sourceLineNo">449</span>   * Set the start row of the scan.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   * &lt;p&gt;<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * If the specified row does not exist, or the {@code inclusive} is {@code false}, the Scanner<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * will start from the next closest row after the specified row.<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   * @param startRow row to start scanner at or after<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * @param inclusive whether we should include the start row when scan<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   * @return this<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * @throws IllegalArgumentException if startRow does not meet criteria for a row key (when length<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   */<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  public Scan withStartRow(byte[] startRow, boolean inclusive) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    if (Bytes.len(startRow) &gt; HConstants.MAX_ROW_LENGTH) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throw new IllegalArgumentException("startRow's length must be less than or equal to "<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          + HConstants.MAX_ROW_LENGTH + " to meet the criteria" + " for a row key.");<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    this.startRow = startRow;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    this.includeStartRow = inclusive;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    return this;<a name="line.466"></a>
-<span class="sourceLineNo">467</span>  }<a name="line.467"></a>
-<span class="sourceLineNo">468</span><a name="line.468"></a>
-<span class="sourceLineNo">469</span>  /**<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * Set the stop row of the scan.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   * &lt;p&gt;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * The scan will include rows that are lexicographically less than the provided stopRow.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * &lt;p&gt;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * &lt;b&gt;Note:&lt;/b&gt; When doing a filter for a rowKey &lt;u&gt;Prefix&lt;/u&gt; use<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * {@link #setRowPrefixFilter(byte[])}. The 'trailing 0' will not yield the desired result.<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * &lt;/p&gt;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * @param stopRow row to end at (exclusive)<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * @return this<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * @throws IllegalArgumentException if stopRow does not meet criteria for a row key (when length<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.480"></a>
-<span class="sourceLineNo">481</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use {@link #withStopRow(byte[])} instead.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   *   This method may change the inclusive of the stop row to keep compatible with the old<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   *   behavior.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   * @see #withStopRow(byte[])<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   */<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  @Deprecated<a name="line.487"></a>
-<span class="sourceLineNo">488</span>  public Scan setStopRow(byte[] stopRow) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    withStopRow(stopRow);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (ClientUtil.areScanStartRowAndStopRowEqual(this.startRow, this.stopRow)) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      // for keeping the old behavior that a scan with the same start and stop row is a get scan.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      this.includeStopRow = true;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    }<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    return this;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>  /**<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * Set the stop row of the scan.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * &lt;p&gt;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   * The scan will include rows that are lexicographically less than the provided stopRow.<a name="line.500"></a>
-<span class="sourceLineNo">501</span>   * &lt;p&gt;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   * &lt;b&gt;Note:&lt;/b&gt; When doing a filter for a rowKey &lt;u&gt;Prefix&lt;/u&gt; use<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   * {@link #setRowPrefixFilter(byte[])}. The 'trailing 0' will not yield the desired result.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>   * &lt;/p&gt;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>   * @param stopRow row to end at (exclusive)<a name="line.505"></a>
-<span class="sourceLineNo">506</span>   * @return this<a name="line.506"></a>
-<span class="sourceLineNo">507</span>   * @throws IllegalArgumentException if stopRow does not meet criteria for a row key (when length<a name="line.507"></a>
-<span class="sourceLineNo">508</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.508"></a>
-<span class="sourceLineNo">509</span>   */<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  public Scan withStopRow(byte[] stopRow) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    return withStopRow(stopRow, false);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  }<a name="line.512"></a>
-<span class="sourceLineNo">513</span><a name="line.513"></a>
-<span class="sourceLineNo">514</span>  /**<a name="line.514"></a>
-<span class="sourceLineNo">515</span>   * Set the stop row of the scan.<a name="line.515"></a>
-<span class="sourceLineNo">516</span>   * &lt;p&gt;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>   * The scan will include rows that are lexicographically less than (or equal to if<a name="line.517"></a>
-<span class="sourceLineNo">518</span>   * {@code inclusive} is {@code true}) the provided stopRow.<a name="line.518"></a>
-<span class="sourceLineNo">519</span>   * @param stopRow row to end at<a name="line.519"></a>
-<span class="sourceLineNo">520</span>   * @param inclusive whether we should include the stop row when scan<a name="line.520"></a>
-<span class="sourceLineNo">521</span>   * @return this<a name="line.521"></a>
-<span class="sourceLineNo">522</span>   * @throws IllegalArgumentException if stopRow does not meet criteria for a row key (when length<a name="line.522"></a>
-<span class="sourceLineNo">523</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.523"></a>
-<span class="sourceLineNo">524</span>   */<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  public Scan withStopRow(byte[] stopRow, boolean inclusive) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    if (Bytes.len(stopRow) &gt; HConstants.MAX_ROW_LENGTH) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      throw new IllegalArgumentException("stopRow's length must be less than or equal to "<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          + HConstants.MAX_ROW_LENGTH + " to meet the criteria" + " for a row key.");<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    }<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    this.stopRow = stopRow;<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    this.includeStopRow = inclusive;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    return this;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  }<a name="line.533"></a>
-<span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>  /**<a name="line.535"></a>
-<span class="sourceLineNo">536</span>   * &lt;p&gt;Set a filter (using stopRow and startRow) so the result set only contains rows where the<a name="line.536"></a>
-<span class="sourceLineNo">537</span>   * rowKey starts with the specified prefix.&lt;/p&gt;<a name="line.537"></a>
-<span class="sourceLineNo">538</span>   * &lt;p&gt;This is a utility method that converts the desired rowPrefix into the appropriate values<a name="line.538"></a>
-<span class="sourceLineNo">539</span>   * for the startRow and stopRow to achieve the desired result.&lt;/p&gt;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>   * &lt;p&gt;This can safely be used in combination with setFilter.&lt;/p&gt;<a name="line.540"></a>
-<span class="sourceLineNo">541</span>   * &lt;p&gt;&lt;b&gt;NOTE: Doing a {@link #setStartRow(byte[])} and/or {@link #setStopRow(byte[])}<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * after this method will yield undefined results.&lt;/b&gt;&lt;/p&gt;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   * @param rowPrefix the prefix all rows must start with. (Set &lt;i&gt;null&lt;/i&gt; to remove the filter.)<a name="line.543"></a>
-<span class="sourceLineNo">544</span>   * @return this<a name="line.544"></a>
-<span class="sourceLineNo">545</span>   */<a name="line.545"></a>
-<span class="sourceLineNo">546</span>  public Scan setRowPrefixFilter(byte[] rowPrefix) {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    if (rowPrefix == null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      setStartRow(HConstants.EMPTY_START_ROW);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      setStopRow(HConstants.EMPTY_END_ROW);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    } else {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      this.setStartRow(rowPrefix);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this.setStopRow(calculateTheClosestNextRowKeyForPrefix(rowPrefix));<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return this;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  /**<a name="line.557"></a>
-<span class="sourceLineNo">558</span>   * &lt;p&gt;When scanning for a prefix the scan should stop immediately after the the last row that<a name="line.558"></a>
-<span class="sourceLineNo">559</span>   * has the specified prefix. This method calculates the closest next rowKey immediately following<a name="line.559"></a>
-<span class="sourceLineNo">560</span>   * the given rowKeyPrefix.&lt;/p&gt;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>   * &lt;p&gt;&lt;b&gt;IMPORTANT: This converts a rowKey&lt;u&gt;Prefix&lt;/u&gt; into a rowKey&lt;/b&gt;.&lt;/p&gt;<a name="line.561"></a>
-<span class="sourceLineNo">562</span>   * &lt;p&gt;If the prefix is an 'ASCII' string put into a byte[] then this is easy because you can<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * simply increment the last byte of the array.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   * But if your application uses real binary rowids you may run into the scenario that your<a name="line.564"></a>
-<span class="sourceLineNo">565</span>   * prefix is something like:&lt;/p&gt;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>   * &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;{ 0x12, 0x23, 0xFF, 0xFF }&lt;/b&gt;&lt;br/&gt;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>   * Then this stopRow needs to be fed into the actual scan&lt;br/&gt;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>   * &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;{ 0x12, 0x24 }&lt;/b&gt; (Notice that it is shorter now)&lt;br/&gt;<a name="line.568"></a>
-<span class="sourceLineNo">569</span>   * This method calculates the correct stop row value for this usecase.<a name="line.569"></a>
-<span class="sourceLineNo">570</span>   *<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   * @param rowKeyPrefix the rowKey&lt;u&gt;Prefix&lt;/u&gt;.<a name="line.571"></a>
-<span class="sourceLineNo">572</span>   * @return the closest next rowKey immediately following the given rowKeyPrefix.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>   */<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  private byte[] calculateTheClosestNextRowKeyForPrefix(byte[] rowKeyPrefix) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    // Essentially we are treating it like an 'unsigned very very long' and doing +1 manually.<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    // Search for the place where the trailing 0xFFs start<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    int offset = rowKeyPrefix.length;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    while (offset &gt; 0) {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      if (rowKeyPrefix[offset - 1] != (byte) 0xFF) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        break;<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      offset--;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
-<span class="sourceLineNo">584</span><a name="line.584"></a>
-<span class="sourceLineNo">585</span>    if (offset == 0) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      // We got an 0xFFFF... (only FFs) stopRow value which is<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      // the last possible prefix before the end of the table.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      // So set it to stop at the 'end of the table'<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      return HConstants.EMPTY_END_ROW;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    }<a name="line.590"></a>
+<span class="sourceLineNo">024</span>import java.util.HashMap;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.util.List;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.Map;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.NavigableSet;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.TreeMap;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.TreeSet;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.HConstants;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.filter.IncompatibleFilterException;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.io.TimeRange;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.security.access.Permission;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.security.visibility.Authorizations;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.slf4j.Logger;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.slf4j.LoggerFactory;<a name="line.40"></a>
+<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">042</span>/**<a name="line.42"></a>
+<span class="sourceLineNo">043</span> * Used to perform Scan operations.<a name="line.43"></a>
+<span class="sourceLineNo">044</span> * &lt;p&gt;<a name="line.44"></a>
+<span class="sourceLineNo">045</span> * All operations are identical to {@link Get} with the exception of instantiation. Rather than<a name="line.45"></a>
+<span class="sourceLineNo">046</span> * specifying a single row, an optional startRow and stopRow may be defined. If rows are not<a name="line.46"></a>
+<span class="sourceLineNo">047</span> * specified, the Scanner will iterate over all rows.<a name="line.47"></a>
+<span class="sourceLineNo">048</span> * &lt;p&gt;<a name="line.48"></a>
+<span class="sourceLineNo">049</span> * To get all columns from all rows of a Table, create an instance with no constraints; use the<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * {@link #Scan()} constructor. To constrain the scan to specific column families, call<a name="line.50"></a>
+<span class="sourceLineNo">051</span> * {@link #addFamily(byte[]) addFamily} for each family to retrieve on your Scan instance.<a name="line.51"></a>
+<span class="sourceLineNo">052</span> * &lt;p&gt;<a name="line.52"></a>
+<span class="sourceLineNo">053</span> * To get specific columns, call {@link #addColumn(byte[], byte[]) addColumn} for each column to<a name="line.53"></a>
+<span class="sourceLineNo">054</span> * retrieve.<a name="line.54"></a>
+<span class="sourceLineNo">055</span> * &lt;p&gt;<a name="line.55"></a>
+<span class="sourceLineNo">056</span> * To only retrieve columns within a specific range of version timestamps, call<a name="line.56"></a>
+<span class="sourceLineNo">057</span> * {@link #setTimeRange(long, long) setTimeRange}.<a name="line.57"></a>
+<span class="sourceLineNo">058</span> * &lt;p&gt;<a name="line.58"></a>
+<span class="sourceLineNo">059</span> * To only retrieve columns with a specific timestamp, call {@link #setTimestamp(long) setTimestamp}<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * .<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * &lt;p&gt;<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * To limit the number of versions of each column to be returned, call {@link #setMaxVersions(int)<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * setMaxVersions}.<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;p&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * To limit the maximum number of values returned for each call to next(), call<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * {@link #setBatch(int) setBatch}.<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;p&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * To add a filter, call {@link #setFilter(org.apache.hadoop.hbase.filter.Filter) setFilter}.<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;p&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * For small scan, it is deprecated in 2.0.0. Now we have a {@link #setLimit(int)} method in Scan<a name="line.70"></a>
+<span class="sourceLineNo">071</span> * object which is used to tell RS how many rows we want. If the rows return reaches the limit, the<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * RS will close the RegionScanner automatically. And we will also fetch data when openScanner in<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * the new implementation, this means we can also finish a scan operation in one rpc call. And we<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * have also introduced a {@link #setReadType(ReadType)} method. You can use this method to tell RS<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * to use pread explicitly.<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;p&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * Expert: To explicitly disable server-side block caching for this scan, execute<a name="line.77"></a>
+<span class="sourceLineNo">078</span> * {@link #setCacheBlocks(boolean)}.<a name="line.78"></a>
+<span class="sourceLineNo">079</span> * &lt;p&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> * &lt;em&gt;Note:&lt;/em&gt; Usage alters Scan instances. Internally, attributes are updated as the Scan runs<a name="line.80"></a>
+<span class="sourceLineNo">081</span> * and if enabled, metrics accumulate in the Scan instance. Be aware this is the case when you go to<a name="line.81"></a>
+<span class="sourceLineNo">082</span> * clone a Scan instance or if you go to reuse a created Scan instance; safer is create a Scan<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * instance per usage.<a name="line.83"></a>
+<span class="sourceLineNo">084</span> */<a name="line.84"></a>
+<span class="sourceLineNo">085</span>@InterfaceAudience.Public<a name="line.85"></a>
+<span class="sourceLineNo">086</span>public class Scan extends Query {<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private static final Logger LOG = LoggerFactory.getLogger(Scan.class);<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  private static final String RAW_ATTR = "_raw_";<a name="line.89"></a>
+<span class="sourceLineNo">090</span><a name="line.90"></a>
+<span class="sourceLineNo">091</span>  private byte[] startRow = HConstants.EMPTY_START_ROW;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  private boolean includeStartRow = true;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private byte[] stopRow  = HConstants.EMPTY_END_ROW;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private boolean includeStopRow = false;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private int maxVersions = 1;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  private int batch = -1;<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  /**<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   * Partial {@link Result}s are {@link Result}s must be combined to form a complete {@link Result}.<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   * The {@link Result}s had to be returned in fragments (i.e. as partials) because the size of the<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * cells in the row exceeded max result size on the server. Typically partial results will be<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   * combined client side into complete results before being delivered to the caller. However, if<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   * this flag is set, the caller is indicating that they do not mind seeing partial results (i.e.<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   * they understand that the results returned from the Scanner may only represent part of a<a name="line.104"></a>
+<span class="sourceLineNo">105</span>   * particular row). In such a case, any attempt to combine the partials into a complete result on<a name="line.105"></a>
+<span class="sourceLineNo">106</span>   * the client side will be skipped, and the caller will be able to see the exact results returned<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * from the server.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  private boolean allowPartialResults = false;<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  private int storeLimit = -1;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  private int storeOffset = 0;<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  private static final String SCAN_ATTRIBUTES_METRICS_ENABLE = "scan.attributes.metrics.enable";<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  // If an application wants to use multiple scans over different tables each scan must<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  // define this attribute with the appropriate table name by calling<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  // scan.setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME, Bytes.toBytes(tableName))<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  static public final String SCAN_ATTRIBUTES_TABLE_NAME = "scan.attributes.table.name";<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>  /**<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   * -1 means no caching specified and the value of {@link HConstants#HBASE_CLIENT_SCANNER_CACHING}<a name="line.122"></a>
+<span class="sourceLineNo">123</span>   * (default to {@link HConstants#DEFAULT_HBASE_CLIENT_SCANNER_CACHING}) will be used<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   */<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  private int caching = -1;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  private long maxResultSize = -1;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  private boolean cacheBlocks = true;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  private boolean reversed = false;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  private TimeRange tr = TimeRange.allTime();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  private Map&lt;byte [], NavigableSet&lt;byte []&gt;&gt; familyMap =<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    new TreeMap&lt;byte [], NavigableSet&lt;byte []&gt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  private Boolean asyncPrefetch = null;<a name="line.132"></a>
+<span class="sourceLineNo">133</span><a name="line.133"></a>
+<span class="sourceLineNo">134</span>  /**<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   * Parameter name for client scanner sync/async prefetch toggle.<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   * When using async scanner, prefetching data from the server is done at the background.<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   * The parameter currently won't have any effect in the case that the user has set<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   * Scan#setSmall or Scan#setReversed<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   */<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String HBASE_CLIENT_SCANNER_ASYNC_PREFETCH =<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      "hbase.client.scanner.async.prefetch";<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  /**<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   * Default value of {@link #HBASE_CLIENT_SCANNER_ASYNC_PREFETCH}.<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   */<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final boolean DEFAULT_HBASE_CLIENT_SCANNER_ASYNC_PREFETCH = false;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  /**<a name="line.148"></a>
+<span class="sourceLineNo">149</span>   * Set it true for small scan to get better performance Small scan should use pread and big scan<a name="line.149"></a>
+<span class="sourceLineNo">150</span>   * can use seek + read seek + read is fast but can cause two problem (1) resource contention (2)<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   * cause too much network io [89-fb] Using pread for non-compaction read request<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * https://issues.apache.org/jira/browse/HBASE-7266 On the other hand, if setting it true, we<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   * would do openScanner,next,closeScanner in one RPC call. It means the better performance for<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * small scan. [HBASE-9488]. Generally, if the scan range is within one data block(64KB), it could<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * be considered as a small scan.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   */<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private boolean small = false;<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>  /**<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   * The mvcc read point to use when open a scanner. Remember to clear it after switching regions as<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * the mvcc is only valid within region scope.<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  private long mvccReadPoint = -1L;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The number of rows we want for this scan. We will terminate the scan if the number of return<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * rows reaches this value.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  private int limit = -1;<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>  /**<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   * Control whether to use pread at server side.<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   */<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  private ReadType readType = ReadType.DEFAULT;<a name="line.174"></a>
+<span class="sourceLineNo">175</span><a name="line.175"></a>
+<span class="sourceLineNo">176</span>  private boolean needCursorResult = false;<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  /**<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * Create a Scan operation across all rows.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   */<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  public Scan() {}<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   *   {@code new Scan().withStartRow(startRow).setFilter(filter)} instead.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   */<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  @Deprecated<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  public Scan(byte[] startRow, Filter filter) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    this(startRow);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    this.filter = filter;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  /**<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * Create a Scan operation starting at the specified row.<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   * &lt;p&gt;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * If the specified row does not exist, the Scanner will start from the next closest row after the<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * specified row.<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * @param startRow row to start scanner at or after<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   *   {@code new Scan().withStartRow(startRow)} instead.<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   */<a name="line.203"></a>
+<span class="sourceLineNo">204</span>  @Deprecated<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public Scan(byte[] startRow) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    setStartRow(startRow);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>  }<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>  /**<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   * Create a Scan operation for the range of rows specified.<a name="line.210"></a>
+<span class="sourceLineNo">211</span>   * @param startRow row to start scanner at or after (inclusive)<a name="line.211"></a>
+<span class="sourceLineNo">212</span>   * @param stopRow row to stop scanner before (exclusive)<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   *   {@code new Scan().withStartRow(startRow).withStopRow(stopRow)} instead.<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  @Deprecated<a name="line.217"></a>
+<span class="sourceLineNo">218</span>  public Scan(byte[] startRow, byte[] stopRow) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    setStartRow(startRow);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    setStopRow(stopRow);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>  /**<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * Creates a new instance of this class while copying all values.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   *<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   * @param scan  The scan instance to copy from.<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * @throws IOException When copying the values fails.<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   */<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  public Scan(Scan scan) throws IOException {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    startRow = scan.getStartRow();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    includeStartRow = scan.includeStartRow();<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    stopRow  = scan.getStopRow();<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    includeStopRow = scan.includeStopRow();<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    maxVersions = scan.getMaxVersions();<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    batch = scan.getBatch();<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    storeLimit = scan.getMaxResultsPerColumnFamily();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    storeOffset = scan.getRowOffsetPerColumnFamily();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    caching = scan.getCaching();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    maxResultSize = scan.getMaxResultSize();<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    cacheBlocks = scan.getCacheBlocks();<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    filter = scan.getFilter(); // clone?<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    loadColumnFamiliesOnDemand = scan.getLoadColumnFamiliesOnDemandValue();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    consistency = scan.getConsistency();<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    this.setIsolationLevel(scan.getIsolationLevel());<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    reversed = scan.isReversed();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    asyncPrefetch = scan.isAsyncPrefetch();<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    small = scan.isSmall();<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    allowPartialResults = scan.getAllowPartialResults();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    tr = scan.getTimeRange(); // TimeRange is immutable<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    Map&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; fams = scan.getFamilyMap();<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    for (Map.Entry&lt;byte[],NavigableSet&lt;byte[]&gt;&gt; entry : fams.entrySet()) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      byte [] fam = entry.getKey();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      NavigableSet&lt;byte[]&gt; cols = entry.getValue();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      if (cols != null &amp;&amp; cols.size() &gt; 0) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        for (byte[] col : cols) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          addColumn(fam, col);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      } else {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        addFamily(fam);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      }<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    for (Map.Entry&lt;String, byte[]&gt; attr : scan.getAttributesMap().entrySet()) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      setAttribute(attr.getKey(), attr.getValue());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    for (Map.Entry&lt;byte[], TimeRange&gt; entry : scan.getColumnFamilyTimeRange().entrySet()) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      TimeRange tr = entry.getValue();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      setColumnFamilyTimeRange(entry.getKey(), tr.getMin(), tr.getMax());<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    this.mvccReadPoint = scan.getMvccReadPoint();<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    this.limit = scan.getLimit();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    this.needCursorResult = scan.isNeedCursorResult();<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    setPriority(scan.getPriority());<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    readType = scan.getReadType();<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    super.setReplicaId(scan.getReplicaId());<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  /**<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   * Builds a scan object with the same specs as get.<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * @param get get to model scan after<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  public Scan(Get get) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    this.startRow = get.getRow();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    this.includeStartRow = true;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    this.stopRow = get.getRow();<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    this.includeStopRow = true;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    this.filter = get.getFilter();<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    this.cacheBlocks = get.getCacheBlocks();<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    this.maxVersions = get.getMaxVersions();<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    this.storeLimit = get.getMaxResultsPerColumnFamily();<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    this.storeOffset = get.getRowOffsetPerColumnFamily();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    this.tr = get.getTimeRange();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    this.familyMap = get.getFamilyMap();<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    this.asyncPrefetch = false;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    this.consistency = get.getConsistency();<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    this.setIsolationLevel(get.getIsolationLevel());<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    this.loadColumnFamiliesOnDemand = get.getLoadColumnFamiliesOnDemandValue();<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    for (Map.Entry&lt;String, byte[]&gt; attr : get.getAttributesMap().entrySet()) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      setAttribute(attr.getKey(), attr.getValue());<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    for (Map.Entry&lt;byte[], TimeRange&gt; entry : get.getColumnFamilyTimeRange().entrySet()) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      TimeRange tr = entry.getValue();<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      setColumnFamilyTimeRange(entry.getKey(), tr.getMin(), tr.getMax());<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    this.mvccReadPoint = -1L;<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    setPriority(get.getPriority());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    super.setReplicaId(get.getReplicaId());<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  public boolean isGetScan() {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    return includeStartRow &amp;&amp; includeStopRow<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        &amp;&amp; ClientUtil.areScanStartRowAndStopRowEqual(this.startRow, this.stopRow);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>  /**<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   * Get all columns from the specified family.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   * &lt;p&gt;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>   * Overrides previous calls to addColumn for this family.<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   * @param family family name<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * @return this<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   */<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  public Scan addFamily(byte [] family) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    familyMap.remove(family);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    familyMap.put(family, null);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    return this;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>  /**<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * Get the column from the specified family with the specified qualifier.<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * &lt;p&gt;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * Overrides previous calls to addFamily for this family.<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * @param family family name<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * @param qualifier column qualifier<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * @return this<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  public Scan addColumn(byte [] family, byte [] qualifier) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    NavigableSet&lt;byte []&gt; set = familyMap.get(family);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    if(set == null) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      set = new TreeSet&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      familyMap.put(family, set);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    if (qualifier == null) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      qualifier = HConstants.EMPTY_BYTE_ARRAY;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    set.add(qualifier);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    return this;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>  /**<a name="line.348"></a>
+<span class="sourceLineNo">349</span>   * Get versions of columns only within the specified timestamp range,<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * [minStamp, maxStamp).  Note, default maximum versions to return is 1.  If<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   * your time range spans more than one version and you want all versions<a name="line.351"></a>
+<span class="sourceLineNo">352</span>   * returned, up the number of versions beyond the default.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>   * @param minStamp minimum timestamp value, inclusive<a name="line.353"></a>
+<span class="sourceLineNo">354</span>   * @param maxStamp maximum timestamp value, exclusive<a name="line.354"></a>
+<span class="sourceLineNo">355</span>   * @see #setMaxVersions()<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   * @see #setMaxVersions(int)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   * @return this<a name="line.357"></a>
+<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  public Scan setTimeRange(long minStamp, long maxStamp) throws IOException {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    tr = new TimeRange(minStamp, maxStamp);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    return this;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * Get versions of columns with the specified timestamp. Note, default maximum<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   * versions to return is 1.  If your time range spans more than one version<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   * and you want all versions returned, up the number of versions beyond the<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * defaut.<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * @param timestamp version timestamp<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   * @see #setMaxVersions()<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * @see #setMaxVersions(int)<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * @return this<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   * @deprecated As of release 2.0.0, this will be removed in HBase 3.0.0.<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   *             Use {@link #setTimestamp(long)} instead<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   */<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  @Deprecated<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public Scan setTimeStamp(long timestamp)<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  throws IOException {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    return this.setTimestamp(timestamp);<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  }<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>  /**<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   * Get versions of columns with the specified timestamp. Note, default maximum<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * versions to return is 1.  If your time range spans more than one version<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   * and you want all versions returned, up the number of versions beyond the<a name="line.385"></a>
+<span class="sourceLineNo">386</span>   * defaut.<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   * @param timestamp version timestamp<a name="line.387"></a>
+<span class="sourceLineNo">388</span>   * @see #setMaxVersions()<a name="line.388"></a>
+<span class="sourceLineNo">389</span>   * @see #setMaxVersions(int)<a name="line.389"></a>
+<span class="sourceLineNo">390</span>   * @return this<a name="line.390"></a>
+<span class="sourceLineNo">391</span>   */<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  public Scan setTimestamp(long timestamp) {<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    try {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      tr = new TimeRange(timestamp, timestamp + 1);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    } catch(Exception e) {<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      // This should never happen, unless integer overflow or something extremely wrong...<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      LOG.error("TimeRange failed, likely caused by integer overflow. ", e);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      throw e;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    }<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>    return this;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>  }<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @Override public Scan setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    return (Scan) super.setColumnFamilyTimeRange(cf, minStamp, maxStamp);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>  }<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>  /**<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   * Set the start row of the scan.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   * &lt;p&gt;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>   * If the specified row does not exist, the Scanner will start from the next closest row after the<a name="line.411"></a>
+<span class="sourceLineNo">412</span>   * specified row.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>   * @param startRow row to start scanner at or after<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * @return this<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * @throws IllegalArgumentException if startRow does not meet criteria for a row key (when length<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.416"></a>
+<span class="sourceLineNo">417</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use {@link #withStartRow(byte[])}<a name="line.417"></a>
+<span class="sourceLineNo">418</span>   *   instead. This method may change the inclusive of the stop row to keep compatible with the old<a name="line.418"></a>
+<span class="sourceLineNo">419</span>   *   behavior.<a name="line.419"></a>
+<span class="sourceLineNo">420</span>   * @see #withStartRow(byte[])<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   */<a name="line.422"></a>
+<span class="sourceLineNo">423</span>  @Deprecated<a name="line.423"></a>
+<span class="sourceLineNo">424</span>  public Scan setStartRow(byte[] startRow) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    withStartRow(startRow);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    if (ClientUtil.areScanStartRowAndStopRowEqual(this.startRow, this.stopRow)) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      // for keeping the old behavior that a scan with the same start and stop row is a get scan.<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      this.includeStopRow = true;<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    return this;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>  /**<a name="line.433"></a>
+<span class="sourceLineNo">434</span>   * Set the start row of the scan.<a name="line.434"></a>
+<span class="sourceLineNo">435</span>   * &lt;p&gt;<a name="line.435"></a>
+<span class="sourceLineNo">436</span>   * If the specified row does not exist, the Scanner will start from the next closest row after the<a name="line.436"></a>
+<span class="sourceLineNo">437</span>   * specified row.<a name="line.437"></a>
+<span class="sourceLineNo">438</span>   * @param startRow row to start scanner at or after<a name="line.438"></a>
+<span class="sourceLineNo">439</span>   * @return this<a name="line.439"></a>
+<span class="sourceLineNo">440</span>   * @throws IllegalArgumentException if startRow does not meet criteria for a row key (when length<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  public Scan withStartRow(byte[] startRow) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    return withStartRow(startRow, true);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>  /**<a name="line.447"></a>
+<span class="sourceLineNo">448</span>   * Set the start row of the scan.<a name="line.448"></a>
+<span class="sourceLineNo">449</span>   * &lt;p&gt;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>   * If the specified row does not exist, or the {@code inclusive} is {@code false}, the Scanner<a name="line.450"></a>
+<span class="sourceLineNo">451</span>   * will start from the next closest row after the specified row.<a name="line.451"></a>
+<span class="sourceLineNo">452</span>   * @param startRow row to start scanner at or after<a name="line.452"></a>
+<span class="sourceLineNo">453</span>   * @param inclusive whether we should include the start row when scan<a name="line.453"></a>
+<span class="sourceLineNo">454</span>   * @return this<a name="line.454"></a>
+<span class="sourceLineNo">455</span>   * @throws IllegalArgumentException if startRow does not meet criteria for a row key (when length<a name="line.455"></a>
+<span class="sourceLineNo">456</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.456"></a>
+<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  public Scan withStartRow(byte[] startRow, boolean inclusive) {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    if (Bytes.len(startRow) &gt; HConstants.MAX_ROW_LENGTH) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      throw new IllegalArgumentException("startRow's length must be less than or equal to "<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          + HConstants.MAX_ROW_LENGTH + " to meet the criteria" + " for a row key.");<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    this.startRow = startRow;<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    this.includeStartRow = inclusive;<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    return this;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>  }<a name="line.466"></a>
+<span class="sourceLineNo">467</span><a name="line.467"></a>
+<span class="sourceLineNo">468</span>  /**<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * Set the stop row of the scan.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   * &lt;p&gt;<a name="line.470"></a>
+<span class="sourceLineNo">471</span>   * The scan will include rows that are lexicographically less than the provided stopRow.<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * &lt;p&gt;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * &lt;b&gt;Note:&lt;/b&gt; When doing a filter for a rowKey &lt;u&gt;Prefix&lt;/u&gt; use<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   * {@link #setRowPrefixFilter(byte[])}. The 'trailing 0' will not yield the desired result.<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   * &lt;/p&gt;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * @param stopRow row to end at (exclusive)<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * @return this<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * @throws IllegalArgumentException if stopRow does not meet criteria for a row key (when length<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use {@link #withStopRow(byte[])} instead.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   *   This method may change the inclusive of the stop row to keep compatible with the old<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   *   behavior.<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * @see #withStopRow(byte[])<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  @Deprecated<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  public Scan setStopRow(byte[] stopRow) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    withStopRow(stopRow);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    if (ClientUtil.areScanStartRowAndStopRowEqual(this.startRow, this.stopRow)) {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      // for keeping the old behavior that a scan with the same start and stop row is a get scan.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      this.includeStopRow = true;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    return this;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>  }<a name="line.494"></a>
+<span class="sourceLineNo">495</span><a name="line.495"></a>
+<span class="sourceLineNo">496</span>  /**<a name="line.496"></a>
+<span class="sourceLineNo">497</span>   * Set the stop row of the scan.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>   * &lt;p&gt;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>   * The scan will include rows that are lexicographically less than the provided stopRow.<a name="line.499"></a>
+<span class="sourceLineNo">500</span>   * &lt;p&gt;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>   * &lt;b&gt;Note:&lt;/b&gt; When doing a filter for a rowKey &lt;u&gt;Prefix&lt;/u&gt; use<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * {@link #setRowPrefixFilter(byte[])}. The 'trailing 0' will not yield the desired result.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * &lt;/p&gt;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * @param stopRow row to end at (exclusive)<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @return this<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IllegalArgumentException if stopRow does not meet criteria for a row key (when length<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.507"></a>
+<span class="sourceLineNo">508</span>   */<a name="line.508"></a>
+<span class="sourceLineNo">509</span>  public Scan withStopRow(byte[] stopRow) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    return withStopRow(stopRow, false);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
+<span class="sourceLineNo">512</span><a name="line.512"></a>
+<span class="sourceLineNo">513</span>  /**<a name="line.513"></a>
+<span class="sourceLineNo">514</span>   * Set the stop row of the scan.<a name="line.514"></a>
+<span class="sourceLineNo">515</span>   * &lt;p&gt;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>   * The scan will include rows that are lexicographically less than (or equal to if<a name="line.516"></a>
+<span class="sourceLineNo">517</span>   * {@code inclusive} is {@code true}) the provided stopRow.<a name="line.517"></a>
+<span class="sourceLineNo">518</span>   * @param stopRow row to end at<a name="line.518"></a>
+<span class="sourceLineNo">519</span>   * @param inclusive whether we should include the stop row when scan<a name="line.519"></a>
+<span class="sourceLineNo">520</span>   * @return this<a name="line.520"></a>
+<span class="sourceLineNo">521</span>   * @throws IllegalArgumentException if stopRow does not meet criteria for a row key (when length<a name="line.521"></a>
+<span class="sourceLineNo">522</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.522"></a>
+<span class="sourceLineNo">523</span>   */<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  public Scan withStopRow(byte[] stopRow, boolean inclusive) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    if (Bytes.len(stopRow) &gt; HConstants.MAX_ROW_LENGTH) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      throw new IllegalArgumentException("stopRow's length must be less than or equal to "<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          + HConstants.MAX_ROW_LENGTH + " to meet the criteria" + " for a row key.");<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    }<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    this.stopRow = stopRow;<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    this.includeStopRow = inclusive;<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    return this;<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>  /**<a name="line.534"></a>
+<span class="sourceLineNo">535</span>   * &lt;p&gt;Set a filter (using stopRow and startRow) so the result set only contains rows where the<a name="line.535"></a>
+<span class="sourceLineNo">536</span>   * rowKey starts with the specified prefix.&lt;/p&gt;<a name="line.536"></a>
+<span class="sourceLineNo">537</span>   * &lt;p&gt;This is a utility method that converts the desired rowPrefix into the appropriate values<a name="line.537"></a>
+<span class="sourceLineNo">538</span>   * for the startRow and stopRow to achieve the desired result.&lt;/p&gt;<a name="line.538"></a>
+<span class="sourceLineNo">539</span>   * &lt;p&gt;This can safely be used in combination with setFilter.&lt;/p&gt;<a name="line.539"></a>
+<span class="sourceLineNo">540</span>   * &lt;p&gt;&lt;b&gt;NOTE: Doing a {@link #setStartRow(byte[])} and/or {@link #setStopRow(byte[])}<a name="line.540"></a>
+<span class="sourceLineNo">541</span>   * after this method will yield undefined results.&lt;/b&gt;&lt;/p&gt;<a name="line.541"></a>
+<span class="sourceLineNo">542</span>   * @param rowPrefix the prefix all rows must start with. (Set &lt;i&gt;null&lt;/i&gt; to remove the filter.)<a name="line.542"></a>
+<span class="sourceLineNo">543</span>   * @return this<a name="line.543"></a>
+<span class="sourceLineNo">544</span>   */<a name="line.544"></a>
+<span class="sourceLineNo">545</span>  public Scan setRowPrefixFilter(byte[] rowPrefix) {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    if (rowPrefix == null) {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      setStartRow(HConstants.EMPTY_START_ROW);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      setStopRow(HConstants.EMPTY_END_ROW);<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    } else {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      this.setStartRow(rowPrefix);<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      this.setStopRow(ClientUtil.calculateTheClosestNextRowKeyForPrefix(rowPrefix));<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    return this;<a name="line.553"></a>
+<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
+<span class="sourceLineNo">555</span><a name="line.555"></a>
+<span class="sourceLineNo">556</span>  /**<a name="line.556"></a>
+<span class="sourceLineNo">557</span>   * Get all available versions.<a name="line.557"></a>
+<span class="sourceLineNo">558</span>   * @return this<a name="line.558"></a>
+<span class="sourceLineNo">559</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. It is easy to misunderstand with column<a name="line.559"></a>
+<span class="sourceLineNo">560</span>   *   family's max versions, so use {@link #readAllVersions()} instead.<a name="line.560"></a>
+<span class="sourceLineNo">561</span>   * @see #readAllVersions()<a name="line.561"></a>
+<span class="sourceLineNo">562</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17125"&gt;HBASE-17125&lt;/a&gt;<a name="line.562"></a>
+<span class="sourceLineNo">563</span>   */<a name="line.563"></a>
+<span class="sourceLineNo">564</span>  @Deprecated<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  public Scan setMaxVersions() {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    return readAllVersions();<a name="line.566"></a>
+<span class="sourceLineNo">567</span>  }<a name="line.567"></a>
+<span class="sourceLineNo">568</span><a name="line.568"></a>
+<span class="sourceLineNo">569</span>  /**<a name="line.569"></a>
+<span class="sourceLineNo">570</span>   * Get up to the specified number of versions of each column.<a name="line.570"></a>
+<span class="sourceLineNo">571</span>   * @param maxVersions maximum versions for each column<a name="line.571"></a>
+<span class="sourceLineNo">572</span>   * @return this<a name="line.572"></a>
+<span class="sourceLineNo">573</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. It is easy to misunderstand with column<a name="line.573"></a>
+<span class="sourceLineNo">574</span>   *   family's max versions, so use {@link #readVersions(int)} instead.<a name="line.574"></a>
+<span class="sourceLineNo">575</span>   * @see #readVersions(int)<a name="line.575"></a>
+<span class="sourceLineNo">576</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17125"&gt;HBASE-17125&lt;/a&gt;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>   */<a name="line.577"></a>
+<span class="sourceLineNo">578</span>  @Deprecated<a name="line.578"></a>
+<span class="sourceLineNo">579</span>  public Scan setMaxVersions(int maxVersions) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    return readVersions(maxVersions);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>  }<a name="line.581"></a>
+<span class="sourceLineNo">582</span><a name="line.582"></a>
+<span class="sourceLineNo">583</span>  /**<a name="line.583"></a>
+<span class="sourceLineNo">584</span>   * Get all available versions.<a name="line.584"></a>
+<span class="sourceLineNo">585</span>   * @return this<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   */<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  public Scan readAllVersions() {<a name="line.587"></a>
+<span class="sourceLineNo">588</span>    this.maxVersions = Integer.MAX_VALUE;<a name="line.588"></a>
+<span class="sourceLineNo">589</span>    return this;<a name="line.589"></a>
+<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
 <span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>    // Copy the right length of the original<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    byte[] newStopRow = Arrays.copyOfRange(rowKeyPrefix, 0, offset);<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    // And increment the last one<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    newStopRow[newStopRow.length - 1]++;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    return newStopRow;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>  }<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>  /**<a name="line.599"></a>
-<span class="sourceLineNo">600</span>   * Get all available versions.<a name="line.600"></a>
-<span class="sourceLineNo">601</span>   * @return this<a name="line.601"></a>
-<span class="sourceLineNo">602</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. It is easy to misunderstand with column<a name="line.602"></a>
-<span class="sourceLineNo">603</span>   *   family's max versions, so use {@link #readAllVersions()} instead.<a name="line.603"></a>
-<span class="sourceLineNo">604</span>   * @see #readAllVersions()<a name="line.604"></a>
-<span class="sourceLineNo">605</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17125"&gt;HBASE-17125&lt;/a&gt;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>   */<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  @Deprecated<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  public Scan setMaxVersions() {<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    return readAllVersions();<a name="line.609"></a>
-<span class="sourceLineNo">610</span>  }<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>  /**<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   * Get up to the specified number of versions of each column.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>   * @param maxVersions maximum versions for each column<a name="line.614"></a>
-<span class="sourceLineNo">615</span>   * @return this<a name="line.615"></a>
-<span class="sourceLineNo">616</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. It is easy to misunderstand with column<a name="line.616"></a>
-<span class="sourceLineNo">617</span>   *   family's max versions, so use {@link #readVersions(int)} instead.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>   * @see #readVersions(int)<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17125"&gt;HBASE-17125&lt;/a&gt;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  @Deprecated<a name="line.621"></a>
-<span class="sourceLineNo">622</span>  public Scan setMaxVersions(int maxVersions) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    return readVersions(maxVersions);<a name="line.623"></a>
-<span class="sourceLineNo">624</span>  }<a name="line.624"></a>
-<span class="sourceLineNo">625</span><a name="line.625"></a>
-<span class="sourceLineNo">626</span>  /**<a name="line.626"></a>
-<span class="sourceLineNo">627</span>   * Get all available versions.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>   * @return this<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   */<a name="line.629"></a>
-<span class="sourceLineNo">630</span>  public Scan readAllVersions() {<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    this.maxVersions = Integer.MAX_VALUE;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    return this;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>  }<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>  /**<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   * Get up to the specified number of versions of each column.<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   * @param versions specified number of versions for each column<a name="line.637"></a>
-<span class="sourceLineNo">638</span>   * @return this<a name="line.638"></a>
-<span class="sourceLineNo">639</span>   */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  public Scan readVersions(int versions) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    this.maxVersions = versions;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    return this;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>  }<a name="line.643"></a>
-<span class="sourceLineNo">644</span><a name="line.644"></a>
-<span class="sourceLineNo">645</span>  /**<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * Set the maximum number of cells to return for each call to next(). Callers should be aware<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   * that this is not equivalent to calling {@link #setAllowPartialResults(boolean)}.<a name="line.647"></a>
-<span class="sourceLineNo">648</span>   * If you don't allow partial results, the number of cells in each Result must equal to your<a name="line.648"></a>
-<span class="sourceLineNo">649</span>   * batch setting unless it is the last Result for current row. So this method is helpful in paging<a name="line.649"></a>
-<span class="sourceLineNo">650</span>   * queries. If you just want to prevent OOM at client, use setAllowPartialResults(true) is better.<a name="line.650"></a>
-<span class="sourceLineNo">651</span>   * @param batch the maximum number of values<a name="line.651"></a>
-<span class="sourceLineNo">652</span>   * @see Result#mayHaveMoreCellsInRow()<a name="line.652"></a>
+<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
+<span class="sourceLineNo">593</span>   * Get up to the specified number of versions of each column.<a name="line.593"></a>
+<span class="sourceLineNo">594</span>   * @param versions specified number of versions for each column<a name="line.594"></a>
+<span class="sourceLineNo">595</span>   * @return this<a name="line.595"></a>
+<span class="sourceLineNo">596</span>   */<a name="line.596"></a>
+<span class="sourceLineNo">597</span>  public Scan readVersions(int versions) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    this.maxVersions = versions;<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    return this;<a name="line.599"></a>
+<span class="sourceLineNo">600</span>  }<a name="line.600"></a>
+<span class="sourceLineNo">601</span><a name="line.601"></a>
+<span class="sourceLineNo">602</span>  /**<a name="line.602"></a>
+<span class="sourceLineNo">603</span>   * Set the maximum number of cells to return for each call to next(). Callers should be aware<a name="line.603"></a>
+<span class="sourceLineNo">604</span>   * that this is not equivalent to calling {@link #setAllowPartialResults(boolean)}.<a name="line.604"></a>
+<span class="sourceLineNo">605</span>   * If you don't allow partial results, the number of cells in each Result must equal to your<a name="line.605"></a>
+<span class="sourceLineNo">606</span>   * batch setting unless it is the last Result for current row. So this method is helpful in paging<a name="line.606"></a>
+<span class="sourceLineNo">607</span>   * queries. If you just want to prevent OOM at client, use setAllowPartialResults(true) is better.<a name="line.607"></a>
+<span class="sourceLineNo">608</span>   * @param batch the maximum number of values<a name="line.608"></a>
+<span class="sourceLineNo">609</span>   * @see Result#mayHaveMoreCellsInRow()<a name="line.609"></a>
+<span class="sourceLineNo">610</span>   */<a name="line.610"></a>
+<span class="sourceLineNo">611</span>  public Scan setBatch(int batch) {<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    if (this.hasFilter() &amp;&amp; this.filter.hasFilterRow()) {<a name="line.612"></a>
+<span class="sourceLineNo">613</span>      throw new IncompatibleFilterException(<a name="line.613"></a>
+<span class="sourceLineNo">614</span>        "Cannot set batch on a scan using a filter" +<a name="line.614"></a>
+<span class="sourceLineNo">615</span>        " that returns true for filter.hasFilterRow");<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    this.batch = batch;<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    return this;<a name="line.618"></a>
+<span class="sourceLineNo">619</span>  }<a name="line.619"></a>
+<span class="sourceLineNo">620</span><a name="line.620"></a>
+<span class="sourceLineNo">621</span>  /**<a name="line.621"></a>
+<span class="sourceLineNo">622</span>   * Set the maximum number of values to return per row per Column Family<a name="line.622"></a>
+<span class="sourceLineNo">623</span>   * @param limit the maximum number of values returned / row / CF<a name="line.623"></a>
+<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
+<span class="sourceLineNo">625</span>  public Scan setMaxResultsPerColumnFamily(int limit) {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    this.storeLimit = limit;<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    return this;<a name="line.627"></a>
+<span class="sourceLineNo">628</span>  }<a name="line.628"></a>
+<span class="sourceLineNo">629</span><a name="line.629"></a>
+<span class="sourceLineNo">630</span>  /**<a name="line.630"></a>
+<span class="sourceLineNo">631</span>   * Set offset for the row per Column Family.<a name="line.631"></a>
+<span class="sourceLineNo">632</span>   * @param offset is the number of kvs that will be skipped.<a name="line.632"></a>
+<span class="sourceLineNo">633</span>   */<a name="line.633"></a>
+<span class="sourceLineNo">634</span>  public Scan setRowOffsetPerColumnFamily(int offset) {<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    this.storeOffset = offset;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    return this;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>  }<a name="line.637"></a>
+<span class="sourceLineNo">638</span><a name="line.638"></a>
+<span class="sourceLineNo">639</span>  /**<a name="line.639"></a>
+<span class="sourceLineNo">640</span>   * Set the number of rows for caching that will be passed to scanners.<a name="line.640"></a>
+<span class="sourceLineNo">641</span>   * If not set, the Configuration setting {@link HConstants#HBASE_CLIENT_SCANNER_CACHING} will<a name="line.641"></a>
+<span class="sourceLineNo">642</span>   * apply.<a name="line.642"></a>
+<span class="sourceLineNo">643</span>   * Higher caching values will enable faster scanners but will use more memory.<a name="line.643"></a>
+<span class="sourceLineNo">644</span>   * @param caching the number of rows for caching<a name="line.644"></a>
+<span class="sourceLineNo">645</span>   */<a name="line.645"></a>
+<span class="sourceLineNo">646</span>  public Scan setCaching(int caching) {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    this.caching = caching;<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    return this;<a name="line.648"></a>
+<span class="sourceLineNo">649</span>  }<a name="line.649"></a>
+<span class="sourceLineNo">650</span><a name="line.650"></a>
+<span class="sourceLineNo">651</span>  /**<a name="line.651"></a>
+<span class="sourceLineNo">652</span>   * @return the maximum result size in bytes. See {@link #setMaxResultSize(long)}<a name="line.652"></a>
 <span class="sourceLineNo">653</span>   */<a name="line.653"></a>
-<span class="sourceLineNo">654</span>  public Scan setBatch(int batch) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    if (this.hasFilter() &amp;&amp; this.filter.hasFilterRow()) {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      throw new IncompatibleFilterException(<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        "Cannot set batch on a scan using a filter" +<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        " that returns true for filter.hasFilterRow");<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    }<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    this.batch = batch;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    return this;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>  }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>  /**<a name="line.664"></a>
-<span class="sourceLineNo">665</span>   * Set the maximum number of values to return per row per Column Family<a name="line.665"></a>
-<span class="sourceLineNo">666</span>   * @param limit the maximum number of values returned / row / CF<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   */<a name="line.667"></a>
-<span class="sourceLineNo">668</span>  public Scan setMaxResultsPerColumnFamily(int limit) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    this.storeLimit = limit;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    return this;<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  }<a name="line.671"></a>
-<span class="sourceLineNo">672</span><a name="line.672"></a>
-<span class="sourceLineNo">673</span>  /**<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * Set offset for the row per Column Family.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   * @param offset is the number of kvs that will be skipped.<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   */<a name="line.676"></a>
-<span class="sourceLineNo">677</span>  public Scan setRowOffsetPerColumnFamily(int offset) {<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    this.storeOffset = offset;<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    return this;<a name="line.679"></a>
-<span class="sourceLineNo">680</span>  }<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>  /**<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * Set the number of rows for caching that will be passed to scanners.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   * If not set, the Configuration setting {@link HConstants#HBASE_CLIENT_SCANNER_CACHING} will<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * apply.<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * Higher caching values will enable faster scanners but will use more memory.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param caching the number of rows for caching<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   */<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  public Scan setCaching(int caching) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    this.caching = caching;<a name="line.690"></a>
-<span class="sourceLineNo">691</span>    return this;<a name="line.691"></a>
+<span class="sourceLineNo">654</span>  public long getMaxResultSize() {<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    return maxResultSize;<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
+<span class="sourceLineNo">659</span>   * Set the maximum result size. The default is -1; this means that no specific<a name="line.659"></a>
+<span class="sourceLineNo">660</span>   * maximum result size will be set for this scan, and the global configured<a name="line.660"></a>
+<span class="sourceLineNo">661</span>   * value will be used instead. (Defaults to unlimited).<a name="line.661"></a>
+<span class="sourceLineNo">662</span>   *<a name="line.662"></a>
+<span class="sourceLineNo">663</span>   * @param maxResultSize The maximum result size in bytes.<a name="line.663"></a>
+<span class="sourceLineNo">664</span>   */<a name="line.664"></a>
+<span class="sourceLineNo">665</span>  public Scan setMaxResultSize(long maxResultSize) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    this.maxResultSize = maxResultSize;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    return this;<a name="line.667"></a>
+<span class="sourceLineNo">668</span>  }<a name="line.668"></a>
+<span class="sourceLineNo">669</span><a name="line.669"></a>
+<span class="sourceLineNo">670</span>  @Override<a name="line.670"></a>
+<span class="sourceLineNo">671</span>  public Scan setFilter(Filter filter) {<a name="line.671"></a>
+<span class="sourceLineNo">672</span>    super.setFilter(filter);<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    return this;<a name="line.673"></a>
+<span class="sourceLineNo">674</span>  }<a name="line.674"></a>
+<span class="sourceLineNo">675</span><a name="line.675"></a>
+<span class="sourceLineNo">676</span>  /**<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   * Setting the familyMap<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   * @param familyMap map of family to qualifier<a name="line.678"></a>
+<span class="sourceLineNo">679</span>   * @return this<a name="line.679"></a>
+<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
+<span class="sourceLineNo">681</span>  public Scan setFamilyMap(Map&lt;byte [], NavigableSet&lt;byte []&gt;&gt; familyMap) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    this.familyMap = familyMap;<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    return this;<a name="line.683"></a>
+<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>  /**<a name="line.686"></a>
+<span class="sourceLineNo">687</span>   * Getting the familyMap<a name="line.687"></a>
+<span class="sourceLineNo">688</span>   * @return familyMap<a name="line.688"></a>
+<span class="sourceLineNo">689</span>   */<a name="line.689"></a>
+<span class="sourceLineNo">690</span>  public Map&lt;byte [], NavigableSet&lt;byte []&gt;&gt; getFamilyMap() {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    return this.familyMap;<a name="line.691"></a>
 <span class="sourceLineNo">692</span>  }<a name="line.692"></a>
 <span class="sourceLineNo">693</span><a name="line.693"></a>
 <span class="sourceLineNo">694</span>  /**<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @return the maximum result size in bytes. See {@link #setMaxResultSize(long)}<a name="line.695"></a>
+<span class="sourceLineNo">695</span>   * @return the number of families in familyMap<a name="line.695"></a>
 <span class="sourceLineNo">696</span>   */<a name="line.696"></a>
-<span class="sourceLineNo">697</span>  public long getMaxResultSize() {<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    return maxResultSize;<a name="line.698"></a>
-<span class="sourceLineNo">699</span>  }<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>  /**<a name="line.701"></a>
-<span class="sourceLineNo">702</span>   * Set the maximum result size. The default is -1; this means that no specific<a name="line.702"></a>
-<span class="sourceLineNo">703</span>   * maximum result size will be set for this scan, and the global configured<a name="line.703"></a>
-<span class="sourceLineNo">704</span>   * value will be used instead. (Defaults to unlimited).<a name="line.704"></a>
-<span class="sourceLineNo">705</span>   *<a name="line.705"></a>
-<span class="sourceLineNo">706</span>   * @param maxResultSize The maximum result size in bytes.<a name="line.706"></a>
-<span class="sourceLineNo">707</span>   */<a name="line.707"></a>
-<span class="sourceLineNo">708</span>  public Scan setMaxResultSize(long maxResultSize) {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    this.maxResultSize = maxResultSize;<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    return this;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  @Override<a name="line.713"></a>
-<span class="sourceLineNo">714</span>  public Scan setFilter(Filter filter) {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    super.setFilter(filter);<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    return this;<a name="line.716"></a>
-<span class="sourceLineNo">717</span>  }<a name="line.717"></a>
-<span class="sourceLineNo">718</span><a name="line.718"></a>
-<span class="sourceLineNo">719</span>  /**<a name="line.719"></a>
-<span class="sourceLineNo">720</span>   * Setting the familyMap<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * @param familyMap map of family to qualifier<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * @return this<a name="line.722"></a>
+<span class="sourceLineNo">697</span>  public int numFamilies() {<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    if(hasFamilies()) {<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      return this.familyMap.size();<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    }<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    return 0;<a name="line.701"></a>
+<span class="sourceLineNo">702</span>  }<a name="line.702"></a>
+<span class="sourceLineNo">703</span><a name="line.703"></a>
+<span class="sourceLineNo">704</span>  /**<a name="line.704"></a>
+<span class="sourceLineNo">705</span>   * @return true if familyMap is non empty, false otherwise<a name="line.705"></a>
+<span class="sourceLineNo">706</span>   */<a name="line.706"></a>
+<span class="sourceLineNo">707</span>  public boolean hasFamilies() {<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    return !this.familyMap.isEmpty();<a name="line.708"></a>
+<span class="sourceLineNo">709</span>  }<a name="line.709"></a>
+<span class="sourceLineNo">710</span><a name="line.710"></a>
+<span class="sourceLineNo">711</span>  /**<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * @return the keys of the familyMap<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   */<a name="line.713"></a>
+<span class="sourceLineNo">714</span>  public byte[][] getFamilies() {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    if(hasFamilies()) {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      return this.familyMap.keySet().toArray(new byte[0][0]);<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    return null;<a name="line.718"></a>
+<span class="sourceLineNo">719</span>  }<a name="line.719"></a>
+<span class="sourceLineNo">720</span><a name="line.720"></a>
+<span class="sourceLineNo">721</span>  /**<a name="line.721"></a>
+<span class="sourceLineNo">722</span>   * @return the startrow<a name="line.722"></a>
 <span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  public Scan setFamilyMap(Map&lt;byte [], NavigableSet&lt;byte []&gt;&gt; familyMap) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    this.familyMap = familyMap;<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    return this;<a name="line.726"></a>
-<span class="sourceLineNo">727</span>  }<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>  /**<a name="line.729"></a>
-<span class="sourceLineNo">730</span>   * Getting the familyMap<a name="line.730"></a>
-<span class="sourceLineNo">731</span>   * @return familyMap<a name="line.731"></a>
-<span class="sourceLineNo">732</span>   */<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  public Map&lt;byte [], NavigableSet&lt;byte []&gt;&gt; getFamilyMap() {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    return this.familyMap;<a name="line.734"></a>
-<span class="sourceLineNo">735</span>  }<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>  /**<a name="line.737"></a>
-<span class="sourceLineNo">738</span>   * @return the number of families in familyMap<a name="line.738"></a>
-<span class="sourceLineNo">739</span>   */<a name="line.739"></a>
-<span class="sourceLineNo">740</span>  public int numFamilies() {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    if(hasFamilies()) {<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      return this.familyMap.size();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    }<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    return 0;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>  }<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>  /**<a name="line.747"></a>
-<span class="sourceLineNo">748</span>   * @return true if familyMap is non empty, false otherwise<a name="line.748"></a>
-<span class="sourceLineNo">749</span>   */<a name="line.749"></a>
-<span class="sourceLineNo">750</span>  public boolean hasFamilies() {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    return !this.familyMap.isEmpty();<a name="line.751"></a>
-<span class="sourceLineNo">752</span>  }<a name="line.752"></a>
-<span class="sourceLineNo">753</span><a name="line.753"></a>
-<span class="sourceLineNo">754</span>  /**<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   * @return the keys of the familyMap<a name="line.755"></a>
-<span class="sourceLineNo">756</span>   */<a name="line.756"></a>
-<span class="sourceLineNo">757</span>  public byte[][] getFamilies() {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    if(hasFamilies()) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>      return this.familyMap.keySet().toArray(new byte[0][0]);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    return null;<a name="line.761"></a>
-<span class="sourceLineNo">762</span>  }<a name="line.762"></a>
-<span class="sourceLineNo">763</span><a name="line.763"></a>
-<span class="sourceLineNo">764</span>  /**<a name="line.764"></a>
-<span class="sourceLineNo">765</span>   * @return the startrow<a name="line.765"></a>
-<span class="sourceLineNo">766</span>   */<a name="line.766"></a>
-<span class="sourceLineNo">767</span>  public byte [] getStartRow() {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    return this.startRow;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>  }<a name="line.769"></a>
-<span class="sourceLineNo">770</span><a name="line.770"></a>
-<span class="sourceLineNo">771</span>  /**<a name="line.771"></a>
-<span class="sourceLineNo">772</span>   * @return if we should include start row when scan<a name="line.772"></a>
-<span class="sourceLineNo">773</span>   */<a name="line.773"></a>
-<span class="sourceLineNo">774</span>  public boolean includeStartRow() {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    return includeStartRow;<a name="line.775"></a>
-<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>  /**<a name="line.778"></a>
-<span class="sourceLineNo">779</span>   * @return the stoprow<a name="line.779"></a>
-<span class="sourceLineNo">780</span>   */<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  public byte[] getStopRow() {<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    return this.stopRow;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>  }<a name="line.783"></a>
-<span class="sourceLineNo">784</span><a name="line.784"></a>
-<span class="sourceLineNo">785</span>  /**<a name="line.785"></a>
-<span class="sourceLineNo">786</span>   * @return if we should include stop row when scan<a name="line.786"></a>
-<span class="sourceLineNo">787</span>   */<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  public boolean includeStopRow() {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    return includeStopRow;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  /**<a name="line.792"></a>
-<span class="sourceLineNo">793</span>   * @return the max number of versions to fetch<a name="line.793"></a>
-<span class="sourceLineNo">794</span>   */<a name="line.794"></a>
-<span class="sourceLineNo">795</span>  public int getMaxVersions() {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    return this.maxVersions;<a name="line.796"></a>
-<span class="sourceLineNo">797</span>  }<a name="line.797"></a>
-<span class="sourceLineNo">798</span><a name="line.798"></a>
-<span class="sourceLineNo">799</span>  /**<a name="line.799"></a>
-<span class="sourceLineNo">800</span>   * @return maximum number of values to return for a single call to next()<a name="line.800"></a>
-<span class="sourceLineNo">801</span>   */<a name="line.801"></a>
-<span class="sourceLineNo">802</span>  public int getBatch() {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>    return this.batch;<a name="line.803"></a>
-<span class="sourceLineNo">804</span>  }<a name="line.804"></a>
-<span class="sourceLineNo">805</span><a name="line.805"></a>
-<span class="sourceLineNo">806</span>  /**<a name="line.806"></a>
-<span class="sourceLineNo">807</span>   * @return maximum number of values to return per row per CF<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   */<a name="line.808"></a>
-<span class="sourceLineNo">809</span>  public int getMaxResultsPerColumnFamily() {<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    return this.storeLimit;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>  }<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>  /**<a name="line.813"></a>
-<span class="sourceLineNo">814</span>   * Method for retrieving the scan's offset per row per column<a name="line.814"></a>
-<span class="sourceLineNo">815</span>   * family (#kvs to be skipped)<a name="line.815"></a>
-<span class="sourceLineNo">816</span>   * @return row offset<a name="line.816"></a>
+<span class="sourceLineNo">724</span>  public byte [] getStartRow() {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    return this.startRow;<a name="line.725"></a>
+<span class="sourceLineNo">726</span>  }<a name="line.726"></a>
+<span class="sourceLineNo">727</span><a name="line.727"></a>
+<span class="sourceLineNo">728</span>  /**<a name="line.728"></a>
+<span class="sourceLineNo">729</span>   * @return if we should include start row when scan<a name="line.729"></a>
+<span class="sourceLineNo">730</span>   */<a name="line.730"></a>
+<span class="sourceLineNo">731</span>  public boolean includeStartRow() {<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    return includeStartRow;<a name="line.732"></a>
+<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>  /**<a name="line.735"></a>
+<span class="sourceLineNo">736</span>   * @return the stoprow<a name="line.736"></a>
+<span class="sourceLineNo">737</span>   */<a name="line.737"></a>
+<span class="sourceLineNo">738</span>  public byte[] getStopRow() {<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    return this.stopRow;<a name="line.739"></a>
+<span class="sourceLineNo">740</span>  }<a name="line.740"></a>
+<span class="sourceLineNo">741</span><a name="line.741"></a>
+<span class="sourceLineNo">742</span>  /**<a name="line.742"></a>
+<span class="sourceLineNo">743</span>   * @return if we should include stop row when scan<a name="line.743"></a>
+<span class="sourceLineNo">744</span>   */<a name="line.744"></a>
+<span class="sourceLineNo">745</span>  public boolean includeStopRow() {<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    return includeStopRow;<a name="line.746"></a>
+<span class="sourceLineNo">747</span>  }<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>  /**<a name="line.749"></a>
+<span class="sourceLineNo">750</span>   * @return the max number of versions to fetch<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   */<a name="line.751"></a>
+<span class="sourceLineNo">752</span>  public int getMaxVersions() {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    return this.maxVersions;<a name="line.753"></a>
+<span class="sourceLineNo">754</span>  }<a name="line.754"></a>
+<span class="sourceLineNo">755</span><a name="line.755"></a>
+<span class="sourceLineNo">756</span>  /**<a name="line.756"></a>
+<span class="sourceLineNo">757</span>   * @return maximum number of values to return for a single call to next()<a name="line.757"></a>
+<span class="sourceLineNo">758</span>   */<a name="line.758"></a>
+<span class="sourceLineNo">759</span>  public int getBatch() {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    return this.batch;<a name="line.760"></a>
+<span class="sourceLineNo">761</span>  }<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>  /**<a name="line.763"></a>
+<span class="sourceLineNo">764</span>   * @return maximum number of values to return per row per CF<a name="line.764"></a>
+<span class="sourceLineNo">765</span>   */<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  public int getMaxResultsPerColumnFamily() {<a name="line.766"></a>
+<span class="sourceLineNo">767</span>    return this.storeLimit;<a name="line.767"></a>
+<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
+<span class="sourceLineNo">769</span><a name="line.769"></a>
+<span class="sourceLineNo">770</span>  /**<a name="line.770"></a>
+<span class="sourceLineNo">771</span>   * Method for retrieving the scan's offset per row per column<a name="line.771"></a>
+<span class="sourceLineNo">772</span>   * family (#kvs to be skipped)<a name="line.772"></a>
+<span class="sourceLineNo">773</span>   * @return row offset<a name="line.773"></a>
+<span class="sourceLineNo">774</span>   */<a name="line.774"></a>
+<span class="sourceLineNo">775</span>  public int getRowOffsetPerColumnFamily() {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    return this.storeOffset;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
+<span class="sourceLineNo">778</span><a name="line.778"></a>
+<span class="sourceLineNo">779</span>  /**<a name="line.779"></a>
+<span class="sourceLineNo">780</span>   * @return caching the number of rows fetched when calling next on a scanner<a name="line.780"></a>
+<span class="sourceLineNo">781</span>   */<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  public int getCaching() {<a name="line.782"></a>
+<span class="sourceLineNo">783</span>    return this.caching;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>  }<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>  /**<a name="line.786"></a>
+<span class="sourceLineNo">787</span>   * @return TimeRange<a name="line.787"></a>
+<span class="sourceLineNo">788</span>   */<a name="line.788"></a>
+<span class="sourceLineNo">789</span>  public TimeRange getTimeRange() {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>    return this.tr;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  }<a name="line.791"></a>
+<span class="sourceLineNo">792</span><a name="line.792"></a>
+<span class="sourceLineNo">793</span>  /**<a name="line.793"></a>
+<span class="sourceLineNo">794</span>   * @return RowFilter<a name="line.794"></a>
+<span class="sourceLineNo">795</span>   */<a name="line.795"></a>
+<span class="sourceLineNo">796</span>  @Override<a name="line.796"></a>
+<span class="sourceLineNo">797</span>  public Filter getFilter() {<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    return filter;<a name="line.798"></a>
+<span class="sourceLineNo">799</span>  }<a name="line.799"></a>
+<span class="sourceLineNo">800</span><a name="line.800"></a>
+<span class="sourceLineNo">801</span>  /**<a name="line.801"></a>
+<span class="sourceLineNo">802</span>   * @return true is a filter has been specified, false if not<a name="line.802"></a>
+<span class="sourceLineNo">803</span>   */<a name="line.803"></a>
+<span class="sourceLineNo">804</span>  public boolean hasFilter() {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    return filter != null;<a name="line.805"></a>
+<span class="sourceLineNo">806</span>  }<a name="line.806"></a>
+<span class="sourceLineNo">807</span><a name="line.807"></a>
+<span class="sourceLineNo">808</span>  /**<a name="line.808"></a>
+<span class="sourceLineNo">809</span>   * Set whether blocks should be cached for this Scan.<a name="line.809"></a>
+<span class="sourceLineNo">810</span>   * &lt;p&gt;<a name="line.810"></a>
+<span class="sourceLineNo">811</span>   * This is true by default.  When true, default settings of the table and<a name="line.811"></a>
+<span class="sourceLineNo">812</span>   * family are used (this will never override caching blocks if the block<a name="line.812"></a>
+<span class="sourceLineNo">813</span>   * cache is disabled for that family or entirely).<a name="line.813"></a>
+<span class="sourceLineNo">814</span>   *<a name="line.814"></a>
+<span class="sourceLineNo">815</span>   * @param cacheBlocks if false, default settings are overridden and blocks<a name="line.815"></a>
+<span class="sourceLineNo">816</span>   * will not be cached<a name="line.816"></a>
 <span class="sourceLineNo">817</span>   */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>  public int getRowOffsetPerColumnFamily() {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>    return this.storeOffset;<a name="line.819"></a>
-<span class="sourceLineNo">820</span>  }<a name="line.820"></a>
-<span class="sourceLineNo">821</span><a name="line.821"></a>
-<span class="sourceLineNo">822</span>  /**<a name="line.822"></a>
-<span class="sourceLineNo">823</span>   * @return caching the number of rows fetched when calling next on a scanner<a name="line.823"></a>
-<span class="sourceLineNo">824</span>   */<a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public int getCaching() {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return this.caching;<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>  /**<a name="line.829"></a>
-<span class="sourceLineNo">830</span>   * @return TimeRange<a name="line.830"></a>
-<span class="sourceLineNo">831</span>   */<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  public TimeRange getTimeRange() {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    return this.tr;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>  }<a name="line.834"></a>
-<span class="sourceLineNo">835</span><a name="line.835"></a>
-<span class="sourceLineNo">836</span>  /**<a name="line.836"></a>
-<span class="sourceLineNo">837</span>   * @return RowFilter<a name="line.837"></a>
-<span class="sourceLineNo">838</span>   */<a name="line.838"></a>
-<span class="sourceLineNo">839</span>  @Override<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  public Filter getFilter() {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    return filter;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>  }<a name="line.842"></a>
-<span class="sourceLineNo">843</span><a name="line.843"></a>
-<span class="sourceLineNo">844</span>  /**<a name="line.844"></a>
-<span class="sourceLineNo">845</span>   * @return true is a filter has been specified, false if not<a name="line.845"></a>
-<span class="sourceLineNo">846</span>   */<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  public boolean hasFilter() {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    return filter != null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>  }<a name="line.849"></a>
-<span class="sourceLineNo">850</span><a name="line.850"></a>
-<span class="sourceLineNo">851</span>  /**<a name="line.851"></a>
-<span class="sourceLineNo">852</span>   * Set whether blocks should be cached for this Scan.<a name="line.852"></a>
-<span class="sourceLineNo">853</span>   * &lt;p&gt;<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * This is true by default.  When true, default settings of the table and<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   * family are used (this will never override caching blocks if the block<a name="line.855"></a>
-<span class="sourceLineNo">856</span>   * cache is disabled for that family or entirely).<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   *<a name="line.857"></a>
-<span class="sourceLineNo">858</span>   * @param cacheBlocks if false, default settings are overridden and blocks<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   * will not be cached<a name="line.859"></a>
-<span class="sourceLineNo">860</span>   */<a name="line.860"></a>
-<span class="sourceLineNo">861</span>  public Scan setCacheBlocks(boolean cacheBlocks) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    this.cacheBlocks = cacheBlocks;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    return this;<a name="line.863"></a>
-<span class="sourceLineNo">864</span>  }<a name="line.864"></a>
-<span class="sourceLineNo">865</span><a name="line.865"></a>
-<span class="sourceLineNo">866</span>  /**<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * Get whether blocks should be cached for this Scan.<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * @return true if default caching should be used, false if blocks should not<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * be cached<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   */<a name="line.870"></a>
-<span class="sourceLineNo">871</span>  public boolean getCacheBlocks() {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>    return cacheBlocks;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>  }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>  /**<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * Set whether this scan is a reversed one<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * &lt;p&gt;<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   * This is false by default which means forward(normal) scan.<a name="line.878"></a>
-<span class="sourceLineNo">879</span>   *<a name="line.879"></a>
-<span class="sourceLineNo">880</span>   * @param reversed if true, scan will be backward order<a name="line.880"></a>
-<span class="sourceLineNo">881</span>   * @return this<a name="line.881"></a>
-<span class="sourceLineNo">882</span>   */<a name="line.882"></a>
-<span class="sourceLineNo">883</span>  public Scan setReversed(boolean reversed) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    this.reversed = reversed;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    return this;<a name="line.885"></a>
-<span class="sourceLineNo">886</span>  }<a name="line.886"></a>
-<span class="sourceLineNo">887</span><a name="line.887"></a>
-<span class="sourceLineNo">888</span>  /**<a name="line.888"></a>
-<span class="sourceLineNo">889</span>   * Get whether this scan is a reversed one.<a name="line.889"></a>
-<span class="sourceLineNo">890</span>   * @return true if backward scan, false if forward(default) scan<a name="line.890"></a>
-<span class="sourceLineNo">891</span>   */<a name="line.891"></a>
-<span class="sourceLineNo">892</span>  public boolean isReversed() {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    return reversed;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>  }<a name="line.894"></a>
-<span class="sourceLineNo">895</span><a name="line.895"></a>
-<span class="sourceLineNo">896</span>  /**<a name="line.896"></a>
-<span class="sourceLineNo">897</span>   * Setting whether the caller wants to see the partial results when server returns<a name="line.897"></a>
-<span class="sourceLineNo">898</span>   * less-than-expected cells. It is helpful while scanning a huge row to prevent OOM at client.<a name="line.898"></a>
-<span class="sourceLineNo">899</span>   * By default this value is false and the complete results will be assembled client side<a name="line.899"></a>
-<span class="sourceLineNo">900</span>   * before being delivered to the caller.<a name="line.900"></a>
-<span class="sourceLineNo">901</span>   * @param allowPartialResults<a name="line.901"></a>
-<span class="sourceLineNo">902</span>   * @return this<a name="line.902"></a>
-<span class="sourceLineNo">903</span>   * @see Result#mayHaveMoreCellsInRow()<a name="line.903"></a>
-<span class="sourceLineNo">904</span>   * @see #setBatch(int)<a name="line.904"></a>
-<span class="sourceLineNo">905</span>   */<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  public Scan setAllowPartialResults(final boolean allowPartialResults) {<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    this.allowPartialResults = allowPartialResults;<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    return this;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  }<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>  /**<a name="line.911"></a>
-<span class="sourceLineNo">912</span>   * @return true when the constructor of this scan understands that the results they will see may<a name="line.912"></a>
-<span class="sourceLineNo">913</span>   *         only represent a partial portion of a row. The entire row would be retrieved by<a name="line.913"></a>
-<span class="sourceLineNo">914</span>   *         subsequent calls to {@link ResultScanner#next()}<a name="line.914"></a>
-<span class="sourceLineNo">915</span>   */<a name="line.915"></a>
-<span class="sourceLineNo">916</span>  public boolean getAllowPartialResults() {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    return allowPartialResults;<a name="line.917"></a>
-<span class="sourceLineNo">918</span>  }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>  @Override<a name="line.920"></a>
-<span class="sourceLineNo">921</span>  public Scan setLoadColumnFamiliesOnDemand(boolean value) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>    return (Scan) super.setLoadColumnFamiliesOnDemand(value);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>  }<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>  /**<a name="line.925"></a>
-<span class="sourceLineNo">926</span>   * Compile the table and column family (i.e. schema) information<a name="line.926"></a>
-<span class="sourceLineNo">927</span>   * into a String. Useful for parsing and aggregation by debugging,<a name="line.927"></a>
-<span class="sourceLineNo">928</span>   * logging, and administration tools.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>   * @return Map<a name="line.929"></a>
-<span class="sourceLineNo">930</span>   */<a name="line.930"></a>
-<span class="sourceLineNo">931</span>  @Override<a name="line.931"></a>
-<span class="sourceLineNo">932</span>  public Map&lt;String, Object&gt; getFingerprint() {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    List&lt;String&gt; families = new ArrayList&lt;&gt;();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    if(this.familyMap.isEmpty()) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      map.put("families", "ALL");<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      return map;<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    } else {<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      map.put("families", families);<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    for (Map.Entry&lt;byte [], NavigableSet&lt;byte[]&gt;&gt; entry :<a name="line.941"></a>
-<span class="sourceLineNo">942</span>        this.familyMap.entrySet()) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      families.add(Bytes.toStringBinary(entry.getKey()));<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
-<span class="sourceLineNo">945</span>    return map;<a name="line.945"></a>
-<span class="sourceLineNo">946</span>  }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>  /**<a name="line.948"></a>
-<span class="sourceLineNo">949</span>   * Compile the details beyond the scope of getFingerprint (row, columns,<a name="line.949"></a>
-<span class="sourceLineNo">950</span>   * timestamps, etc.) into a Map along with the fingerprinted information.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>   * Useful for debugging, logging, and administration tools.<a name="line.951"></a>
-<span class="sourceLineNo">952</span>   * @param maxCols a limit on the number of columns output prior to truncation<a name="line.952"></a>
-<span class="sourceLineNo">953</span>   * @return Map<a name="line.953"></a>
-<span class="sourceLineNo">954</span>   */<a name="line.954"></a>
-<span class="sourceLineNo">955</span>  @Override<a name="line.955"></a>
-<span class="sourceLineNo">956</span>  public Map&lt;String, Object&gt; toMap(int maxCols) {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>    // start with the fingerpring map and build on top of it<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    Map&lt;String, Object&gt; map = getFingerprint();<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    // map from families to column list replaces fingerprint's list of families<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    Map&lt;String, List&lt;String&gt;&gt; familyColumns = new HashMap&lt;&gt;();<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    map.put("families", familyColumns);<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    // add scalar information first<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    map.put("startRow", Bytes.toStringBinary(this.startRow));<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    map.put("stopRow", Bytes.toStringBinary(this.stopRow));<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    map.put("maxVersions", this.maxVersions);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    map.put("batch", this.batch);<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    map.put("caching", this.caching);<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    map.put("maxResultSize", this.maxResultSize);<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    map.put("cacheBlocks", this.cacheBlocks);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    map.put("loadColumnFamiliesOnDemand", this.loadColumnFamiliesOnDemand);<a name="line.970"></a>
-<span class="sourceLineNo">971</span>    List&lt;Long&gt; timeRange = new ArrayList&lt;&gt;(2);<a name="line.971"></a>
-<span class="sourceLineNo">972</span>    timeRange.add(this.tr.getMin());<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    timeRange.add(this.tr.getMax());<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    map.put("timeRange", timeRange);<a name="line.974"></a>
-<span class="sourceLineNo">975</span>    int colCount = 0;<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    // iterate through affected families and list out up to maxCols columns<a name="line.976"></a>
-<span class="sourceLineNo">977</span>    for (Map.Entry&lt;byte [], NavigableSet&lt;byte[]&gt;&gt; entry :<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      this.familyMap.entrySet()) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      List&lt;String&gt; columns = new ArrayList&lt;&gt;();<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      familyColumns.put(Bytes.toStringBinary(entry.getKey()), columns);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      if(entry.getValue() == null) {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        colCount++;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>        --maxCols;<a name="line.983"></a>
-<span class="sourceLineNo">984</span>        columns.add("ALL");<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      } else {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        colCount += entry.getValue().size();<a name="line.986"></a>
-<span class="sourceLineNo">987</span>        if (maxCols &lt;= 0) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>          continue;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        }<a name="line.989"></a>
-<span class="sourceLineNo">990</span>        for (byte [] column : entry.getValue()) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>          if (--maxCols &lt;= 0) {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>            continue;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>          }<a name="line.993"></a>
-<span class="sourceLineNo">994</span>          columns.add(Bytes.toStringBinary(column));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>        }<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    map.put("totalColumns", colCount);<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    if (this.filter != null) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>      map.put("filter", this.filter.toString());<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    // add the id if set<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    if (getId() != null) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      map.put("id", getId());<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    }<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    return map;<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>  }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>  /**<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>   * Enable/disable "raw" mode for this scan.<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   * If "raw" is enabled the scan will return all<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>   * delete marker and deleted rows that have not<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>   * been collected, yet.<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>   * This is mostly useful for Scan on column families<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>   * that have KEEP_DELETED_ROWS enabled.<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>   * It is an error to specify any column when "raw" is set.<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * @param raw True/False to enable/disable "raw" mode.<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   */<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>  public Scan setRaw(boolean raw) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>    setAttribute(RAW_ATTR, Bytes.toBytes(raw));<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    return this;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * @return True if this Scan is in "raw" mode.<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   */<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  public boolean isRaw() {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    byte[] attr = getAttribute(RAW_ATTR);<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    return attr == null ? false : Bytes.toBoolean(attr);<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>  }<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span><a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>  /**<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>   * Set whether this scan is a small scan<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>   * &lt;p&gt;<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>   * Small scan should use pread and big scan can use seek + read seek + read is fast but can cause<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>   * two problem (1) resource contention (2) cause too much network io [89-fb] Using pread for<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>   * non-compaction read request https://issues.apache.org/jira/browse/HBASE-7266 On the other hand,<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>   * if setting it true, we would do openScanner,next,closeScanner in one RPC call. It means the<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>   * better performance for small scan. [HBASE-9488]. Generally, if the scan range is within one<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>   * data block(64KB), it could be considered as a small scan.<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>   * @param small<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use {@link #setLimit(int)} and<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>   *   {@link #setReadType(ReadType)} instead. And for the one rpc optimization, now we will also<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>   *   fetch data when openScanner, and if the number of rows reaches the limit then we will close<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>   *   the scanner automatically which means we will fall back to one rpc.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>   * @see #setLimit(int)<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>   * @see #setReadType(ReadType)<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17045"&gt;HBASE-17045&lt;/a&gt;<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>   */<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>  @Deprecated<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  public Scan setSmall(boolean small) {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    this.small = small;<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>    this.readType = ReadType.PREAD;<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    return this;<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>  }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  /**<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>   * Get whether this scan is a small scan<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>   * @return true if small scan<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. See the comment of<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>   *   {@link #setSmall(boolean)}<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17045"&gt;HBASE-17045&lt;/a&gt;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>   */<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>  @Deprecated<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>  public boolean isSmall() {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    return small;<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>  }<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>  @Override<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>  public Scan setAttribute(String name, byte[] value) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    return (Scan) super.setAttribute(name, value);<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>  }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>  @Override<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>  public Scan setId(String id) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    return (Scan) super.setId(id);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>  }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>  @Override<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>  public Scan setAuthorizations(Authorizations authorizations) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>    return (Scan) super.setAuthorizations(authorizations);<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>  }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>  @Override<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>  public Scan setACL(Map&lt;String, Permission&gt; perms) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>    return (Scan) super.setACL(perms);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>  }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>  @Override<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>  public Scan setACL(String user, Permission perms) {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>    return (Scan) super.setACL(user, perms);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>  }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span><a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>  @Override<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  public Scan setConsistency(Consistency consistency) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    return (Scan) super.setConsistency(consistency);<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span><a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>  @Override<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>  public Scan setReplicaId(int Id) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    return (Scan) super.setReplicaId(Id);<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>  @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  public Scan setIsolationLevel(IsolationLevel level) {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    return (Scan) super.setIsolationLevel(level);<a name="line.1106"></a>
+<span class="sourceLineNo">818</span>  public Scan setCacheBlocks(boolean cacheBlocks) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    this.cacheBlocks = cacheBlocks;<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    return this;<a name="line.820"></a>
+<span class="sourceLineNo">821</span>  }<a name="line.821"></a>
+<span class="sourceLineNo">822</span><a name="line.822"></a>
+<span class="sourceLineNo">823</span>  /**<a name="line.823"></a>
+<span class="sourceLineNo">824</span>   * Get whether blocks should be cached for this Scan.<a name="line.824"></a>
+<span class="sourceLineNo">825</span>   * @return true if default caching should be used, false if blocks should not<a name="line.825"></a>
+<span class="sourceLineNo">826</span>   * be cached<a name="line.826"></a>
+<span class="sourceLineNo">827</span>   */<a name="line.827"></a>
+<span class="sourceLineNo">828</span>  public boolean getCacheBlocks() {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    return cacheBlocks;<a name="line.829"></a>
+<span class="sourceLineNo">830</span>  }<a name="line.830"></a>
+<span class="sourceLineNo">831</span><a name="line.831"></a>
+<span class="sourceLineNo">832</span>  /**<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   * Set whether this scan is a reversed one<a name="line.833"></a>
+<span class="sourceLineNo">834</span>   * &lt;p&gt;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>   * This is false by default which means forward(normal) scan.<a name="line.835"></a>
+<span class="sourceLineNo">836</span>   *<a name="line.836"></a>
+<span class="sourceLineNo">837</span>   * @param reversed if true, scan will be backward order<a name="line.837"></a>
+<span class="sourceLineNo">838</span>   * @return this<a name="line.838"></a>
+<span class="sourceLineNo">839</span>   */<a name="line.839"></a>
+<span class="sourceLineNo">840</span>  public Scan setReversed(boolean reversed) {<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    this.reversed = reversed;<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    return this;<a name="line.842"></a>
+<span class="sourceLineNo">843</span>  }<a name="line.843"></a>
+<span class="sourceLineNo">844</span><a name="line.844"></a>
+<span class="sourceLineNo">845</span>  /**<a name="line.845"></a>
+<span class="sourceLineNo">846</span>   * Get whether this scan is a reversed one.<a name="line.846"></a>
+<span class="sourceLineNo">847</span>   * @return true if backward scan, false if forward(default) scan<a name="line.847"></a>
+<span class="sourceLineNo">848</span>   */<a name="line.848"></a>
+<span class="sourceLineNo">849</span>  public boolean isReversed() {<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    return reversed;<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  }<a name="line.851"></a>
+<span class="sourceLineNo">852</span><a name="line.852"></a>
+<span class="sourceLineNo">853</span>  /**<a name="line.853"></a>
+<span class="sourceLineNo">854</span>   * Setting whether the caller wants to see the partial results when server returns<a name="line.854"></a>
+<span class="sourceLineNo">855</span>   * less-than-expected cells. It is helpful while scanning a huge row to prevent OOM at client.<a name="line.855"></a>
+<span class="sourceLineNo">856</span>   * By default this value is false and the complete results will be assembled client side<a name="line.856"></a>
+<span class="sourceLineNo">857</span>   * before being delivered to the caller.<a name="line.857"></a>
+<span class="sourceLineNo">858</span>   * @param allowPartialResults<a name="line.858"></a>
+<span class="sourceLineNo">859</span>   * @return this<a name="line.859"></a>
+<span class="sourceLineNo">860</span>   * @see Result#mayHaveMoreCellsInRow()<a name="line.860"></a>
+<span class="sourceLineNo">861</span>   * @see #setBatch(int)<a name="line.861"></a>
+<span class="sourceLineNo">862</span>   */<a name="line.862"></a>
+<span class="sourceLineNo">863</span>  public Scan setAllowPartialResults(final boolean allowPartialResults) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    this.allowPartialResults = allowPartialResults;<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    return this;<a name="line.865"></a>
+<span class="sourceLineNo">866</span>  }<a name="line.866"></a>
+<span class="sourceLineNo">867</span><a name="line.867"></a>
+<span class="sourceLineNo">868</span>  /**<a name="line.868"></a>
+<span class="sourceLineNo">869</span>   * @return true when the constructor of this scan understands that the results they will see may<a name="line.869"></a>
+<span class="sourceLineNo">870</span>   *         only represent a partial portion of a row. The entire row would be retrieved by<a name="line.870"></a>
+<span class="sourceLineNo">871</span>   *         subsequent calls to {@link ResultScanner#next()}<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   */<a name="line.872"></a>
+<span class="sourceLineNo">873</span>  public boolean getAllowPartialResults() {<a name="line.873"></a>
+<span class="sourceLineNo">874</span>    return allowPartialResults;<a name="line.874"></a>
+<span class="sourceLineNo">875</span>  }<a name="line.875"></a>
+<span class="sourceLineNo">876</span><a name="line.876"></a>
+<span class="sourceLineNo">877</span>  @Override<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  public Scan setLoadColumnFamiliesOnDemand(boolean value) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    return (Scan) super.setLoadColumnFamiliesOnDemand(value);<a name="line.879"></a>
+<span class="sourceLineNo">880</span>  }<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>  /**<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   * Compile the table and column family (i.e. schema) information<a name="line.883"></a>
+<span class="sourceLineNo">884</span>   * into a String. Useful for parsing and aggregation by debugging,<a name="line.884"></a>
+<span class="sourceLineNo">885</span>   * logging, and administration tools.<a name="line.885"></a>
+<span class="sourceLineNo">886</span>   * @return Map<a name="line.886"></a>
+<span class="sourceLineNo">887</span>   */<a name="line.887"></a>
+<span class="sourceLineNo">888</span>  @Override<a name="line.888"></a>
+<span class="sourceLineNo">889</span>  public Map&lt;String, Object&gt; getFingerprint() {<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    List&lt;String&gt; families = new ArrayList&lt;&gt;();<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    if(this.familyMap.isEmpty()) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      map.put("families", "ALL");<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      return map;<a name="line.894"></a>
+<span class="sourceLineNo">895</span>    } else {<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      map.put("families", families);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    }<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    for (Map.Entry&lt;byte [], NavigableSet&lt;byte[]&gt;&gt; entry :<a name="line.898"></a>
+<span class="sourceLineNo">899</span>        this.familyMap.entrySet()) {<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      families.add(Bytes.toStringBinary(entry.getKey()));<a name="line.900"></a>
+<span class="sourceLineNo">901</span>    }<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    return map;<a name="line.902"></a>
+<span class="sourceLineNo">903</span>  }<a name="line.903"></a>
+<span class="sourceLineNo">904</span><a name="line.904"></a>
+<span class="sourceLineNo">905</span>  /**<a name="line.905"></a>
+<span class="sourceLineNo">906</span>   * Compile the details beyond the scope of getFingerprint (row, columns,<a name="line.906"></a>
+<span class="sourceLineNo">907</span>   * timestamps, etc.) into a Map along with the fingerprinted information.<a name="line.907"></a>
+<span class="sourceLineNo">908</span>   * Useful for debugging, logging, and administration tools.<a name="line.908"></a>
+<span class="sourceLineNo">909</span>   * @param maxCols a limit on the number of columns output prior to truncation<a name="line.909"></a>
+<span class="sourceLineNo">910</span>   * @return Map<a name="line.910"></a>
+<span class="sourceLineNo">911</span>   */<a name="line.911"></a>
+<span class="sourceLineNo">912</span>  @Override<a name="line.912"></a>
+<span class="sourceLineNo">913</span>  public Map&lt;String, Object&gt; toMap(int maxCols) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    // start with the fingerpring map and build on top of it<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    Map&lt;String, Object&gt; map = getFingerprint();<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    // map from families to column list replaces fingerprint's list of families<a name="line.916"></a>
+<span class="sourceLineNo">917</span>    Map&lt;String, List&lt;String&gt;&gt; familyColumns = new HashMap&lt;&gt;();<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    map.put("families", familyColumns);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    // add scalar information first<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    map.put("startRow", Bytes.toStringBinary(this.startRow));<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    map.put("stopRow", Bytes.toStringBinary(this.stopRow));<a name="line.921"></a>
+<span class="sourceLineNo">922</span>    map.put("maxVersions", this.maxVersions);<a name="line.922"></a>
+<span class="sourceLineNo">923</span>    map.put("batch", this.batch);<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    map.put("caching", this.caching);<a name="line.924"></a>
+<span class="sourceLineNo">925</span>    map.put("maxResultSize", this.maxResultSize);<a name="line.925"></a>
+<span class="sourceLineNo">926</span>    map.put("cacheBlocks", this.cacheBlocks);<a name="line.926"></a>
+<span class="sourceLineNo">927</span>    map.put("loadColumnFamiliesOnDemand", this.loadColumnFamiliesOnDemand);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    List&lt;Long&gt; timeRange = new ArrayList&lt;&gt;(2);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>    timeRange.add(this.tr.getMin());<a name="line.929"></a>
+<span class="sourceLineNo">930</span>    timeRange.add(this.tr.getMax());<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    map.put("timeRange", timeRange);<a name="line.931"></a>
+<span class="sourceLineNo">932</span>    int colCount = 0;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>    // iterate through affected families and list out up to maxCols columns<a name="line.933"></a>
+<span class="sourceLineNo">934</span>    for (Map.Entry&lt;byte [], NavigableSet&lt;byte[]&gt;&gt; entry :<a name="line.934"></a>
+<span class="sourceLineNo">935</span>      this.familyMap.entrySet()) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>      List&lt;String&gt; columns = new ArrayList&lt;&gt;();<a name="line.936"></a>
+<span class="sourceLineNo">937</span>      familyColumns.put(Bytes.toStringBinary(entry.getKey()), columns);<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      if(entry.getValue() == null) {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>        colCount++;<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        --maxCols;<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        columns.add("ALL");<a name="line.941"></a>
+<span class="sourceLineNo">942</span>      } else {<a name="line.942"></a>
+<span class="sourceLineNo">943</span>        colCount += entry.getValue().size();<a name="line.943"></a>
+<span class="sourceLineNo">944</span>        if (maxCols &lt;= 0) {<a name="line.944"></a>
+<span class="sourceLineNo">945</span>          continue;<a name="line.945"></a>
+<span class="sourceLineNo">946</span>        }<a name="line.946"></a>
+<span class="sourceLineNo">947</span>        for (byte [] column : entry.getValue()) {<a name="line.947"></a>
+<span class="sourceLineNo">948</span>          if (--maxCols &lt;= 0) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>            continue;<a name="line.949"></a>
+<span class="sourceLineNo">950</span>          }<a name="line.950"></a>
+<span class="sourceLineNo">951</span>          columns.add(Bytes.toStringBinary(column));<a name="line.951"></a>
+<span class="sourceLineNo">952</span>        }<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      }<a name="line.953"></a>
+<span class="sourceLineNo">954</span>    }<a name="line.954"></a>
+<span class="sourceLineNo">955</span>    map.put("totalColumns", colCount);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>    if (this.filter != null) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>      map.put("filter", this.filter.toString());<a name="line.957"></a>
+<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
+<span class="sourceLineNo">959</span>    // add the id if set<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    if (getId() != null) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      map.put("id", getId());<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span>    return map;<a name="line.963"></a>
+<span class="sourceLineNo">964</span>  }<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>  /**<a name="line.966"></a>
+<span class="sourceLineNo">967</span>   * Enable/disable "raw" mode for this scan.<a name="line.967"></a>
+<span class="sourceLineNo">968</span>   * If "raw" is enabled the scan will return all<a name="line.968"></a>
+<span class="sourceLineNo">969</span>   * delete marker and deleted rows that have not<a name="line.969"></a>
+<span class="sourceLineNo">970</span>   * been collected, yet.<a name="line.970"></a>
+<span class="sourceLineNo">971</span>   * This is mostly useful for Scan on column families<a name="line.971"></a>
+<span class="sourceLineNo">972</span>   * that have KEEP_DELETED_ROWS enabled.<a name="line.972"></a>
+<span class="sourceLineNo">973</span>   * It is an error to specify any column when "raw" is set.<a name="line.973"></a>
+<span class="sourceLineNo">974</span>   * @param raw True/False to enable/disable "raw" mode.<a name="line.974"></a>
+<span class="sourceLineNo">975</span>   */<a name="line.975"></a>
+<span class="sourceLineNo">976</span>  public Scan setRaw(boolean raw) {<a name="line.976"></a>
+<span class="sourceLineNo">977</span>    setAttribute(RAW_ATTR, Bytes.toBytes(raw));<a name="line.977"></a>
+<span class="sourceLineNo">978</span>    return this;<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  }<a name="line.979"></a>
+<span class="sourceLineNo">980</span><a name="line.980"></a>
+<span class="sourceLineNo">981</span>  /**<a name="line.981"></a>
+<span class="sourceLineNo">982</span>   * @return True if this Scan is in "raw" mode.<a name="line.982"></a>
+<span class="sourceLineNo">983</span>   */<a name="line.983"></a>
+<span class="sourceLineNo">984</span>  public boolean isRaw() {<a name="line.984"></a>
+<span class="sourceLineNo">985</span>    byte[] attr = getAttribute(RAW_ATTR);<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    return attr == null ? false : Bytes.toBoolean(attr);<a name="line.986"></a>
+<span class="sourceLineNo">987</span>  }<a name="line.987"></a>
+<span class="sourceLineNo">988</span><a name="line.988"></a>
+<span class="sourceLineNo">989</span>  /**<a name="line.989"></a>
+<span class="sourceLineNo">990</span>   * Set whether this scan is a small scan<a name="line.990"></a>
+<span class="sourceLineNo">991</span>   * &lt;p&gt;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>   * Small scan should use pread and big scan can use seek + read seek + read is fast but can cause<a name="line.992"></a>
+<span class="sourceLineNo">993</span>   * two problem (1) resource contention (2) cause too much network io [89-fb] Using pread for<a name="line.993"></a>
+<span class="sourceLineNo">994</span>   * non-compaction read request https://issues.apache.org/jira/browse/HBASE-7266 On the other hand,<a name="line.994"></a>
+<span class="sourceLineNo">995</span>   * if setting it true, we would do openScanner,next,closeScanner in one RPC call. It means the<a name="line.995"></a>
+<span class="sourceLineNo">996</span>   * better performance for small scan. [HBASE-9488]. Generally, if the scan range is within one<a name="line.996"></a>
+<span class="sourceLineNo">997</span>   * data block(64KB), it could be considered as a small scan.<a name="line.997"></a>
+<span class="sourceLineNo">998</span>   * @param small<a name="line.998"></a>
+<span class="sourceLineNo">999</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use {@link #setLimit(int)} and<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>   *   {@link #setReadType(ReadType)} instead. And for the one rpc optimization, now we will also<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>   *   fetch data when openScanner, and if the number of rows reaches the limit then we will close<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>   *   the scanner automatically which means we will fall back to one rpc.<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>   * @see #setLimit(int)<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>   * @see #setReadType(ReadType)<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17045"&gt;HBASE-17045&lt;/a&gt;<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>   */<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>  @Deprecated<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>  public Scan setSmall(boolean small) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    this.small = small;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>    this.readType = ReadType.PREAD;<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    return this;<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>  }<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span><a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>  /**<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>   * Get whether this scan is a small scan<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>   * @return true if small scan<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. See the comment of<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>   *   {@link #setSmall(boolean)}<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17045"&gt;HBASE-17045&lt;/a&gt;<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>   */<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  @Deprecated<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>  public boolean isSmall() {<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    return small;<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  }<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span><a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>  @Override<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>  public Scan setAttribute(String name, byte[] value) {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>    return (Scan) super.setAttribute(name, value);<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>  }<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>  @Override<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>  public Scan setId(String id) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    return (Scan) super.setId(id);<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>  }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>  @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>  public Scan setAuthorizations(Authorizations authorizations) {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    return (Scan) super.setAuthorizations(authorizations);<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>  }<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span><a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>  @Override<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>  public Scan setACL(Map&lt;String, Permission&gt; perms) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>    return (Scan) super.setACL(perms);<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>  }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>  @Override<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>  public Scan setACL(String user, Permission perms) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>    return (Scan) super.setACL(user, perms);<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>  }<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span><a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>  @Override<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>  public Scan setConsistency(Consistency consistency) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    return (Scan) super.setConsistency(consistency);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>  @Override<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>  public Scan setReplicaId(int Id) {<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    return (Scan) super.setReplicaId(Id);<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>  }<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span><a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  @Override<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>  public Scan setIsolationLevel(IsolationLevel level) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    return (Scan) super.setIsolationLevel(level);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>  }<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span><a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>  @Override<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>  public Scan setPriority(int priority) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    return (Scan) super.setPriority(priority);<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>  }<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span><a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>  /**<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>   * Enable collection of {@link ScanMetrics}. For advanced users.<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>   * @param enabled Set to true to enable accumulating scan metrics<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>   */<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>  public Scan setScanMetricsEnabled(final boolean enabled) {<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    setAttribute(Scan.SCAN_ATTRIBUTES_METRICS_ENABLE, Bytes.toBytes(Boolean.valueOf(enabled)));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>    return this;<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>  }<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span><a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>  /**<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>   * @return True if collection of scan metrics is enabled. For advanced users.<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>   */<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>  public boolean isScanMetricsEnabled() {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    byte[] attr = getAttribute(Scan.SCAN_ATTRIBUTES_METRICS_ENABLE);<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    return attr == null ? false : Bytes.toBoolean(attr);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>  }<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span><a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>  public Boolean isAsyncPrefetch() {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>    return asyncPrefetch;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>  }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>  /**<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>   * @deprecated Since 3.0.0, will be removed in 4.0.0. After building sync client upon async<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>   *             client, the implementation is always 'async prefetch', so this flag is useless now.<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>   */<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>  @Deprecated<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>  public Scan setAsyncPrefetch(boolean asyncPrefetch) {<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    this.asyncPrefetch = asyncPrefetch;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    return this;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  }<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span><a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>  /**<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * @return the limit of rows for this scan<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  public int getLimit() {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    return limit;<a name="line.1106"></a>
 <span class="sourceLineNo">1107</span>  }<a name="line.1107"></a>
 <span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  @Override<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  public Scan setPriority(int priority) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    return (Scan) super.setPriority(priority);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>  /**<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>   * Enable collection of {@link ScanMetrics}. For advanced users.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>   * @param enabled Set to true to enable accumulating scan metrics<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>   */<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>  public Scan setScanMetricsEnabled(final boolean enabled) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    setAttribute(Scan.SCAN_ATTRIBUTES_METRICS_ENABLE, Bytes.toBytes(Boolean.valueOf(enabled)));<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    return this;<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>  }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span><a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  /**<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>   * @return True if collection of scan metrics is enabled. For advanced users.<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>   */<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>  public boolean isScanMetricsEnabled() {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    byte[] attr = getAttribute(Scan.SCAN_ATTRIBUTES_METRICS_ENABLE);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    return attr == null ? false : Bytes.toBoolean(attr);<a name="line.1128"></a>
+<span class="sourceLineNo">1109</span>  /**<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>   * Set the limit of rows for this scan. We will terminate the scan if the number of returned rows<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>   * reaches this value.<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>   * &lt;p&gt;<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>   * This condition will be tested at last, after all other conditions such as stopRow, filter, etc.<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>   * @param limit the limit of rows for this scan<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>   * @return this<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>   */<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>  public Scan setLimit(int limit) {<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    this.limit = limit;<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    return this;<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>  }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span><a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  /**<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>   * Call this when you only want to get one row. It will set {@code limit} to {@code 1}, and also<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>   * set {@code readType} to {@link ReadType#PREAD}.<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>   * @return this<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>   */<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>  public Scan setOneRowLimit() {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    return setLimit(1).setReadType(ReadType.PREAD);<a name="line.1128"></a>
 <span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
 <span class="sourceLineNo">1130</span><a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>  public Boolean isAsyncPrefetch() {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    return asyncPrefetch;<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>  }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>  /**<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>   * @deprecated Since 3.0.0, will be removed in 4.0.0. After building sync client upon async<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>   *             client, the implementation is always 'async prefetch', so this flag is useless now.<a name="line.1137"></a>
+<span class="sourceLineNo">1131</span>  @InterfaceAudience.Public<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>  public enum ReadType {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    DEFAULT, STREAM, PREAD<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>  }<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span><a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>  /**<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>   * @return the read type for this scan<a name="line.1137"></a>
 <span class="sourceLineNo">1138</span>   */<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  @Deprecated<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>  public Scan setAsyncPrefetch(boolean asyncPrefetch) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    this.asyncPrefetch = asyncPrefetch;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>    return this;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  }<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span><a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>  /**<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>   * @return the limit of rows for this scan<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>   */<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  public int getLimit() {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    return limit;<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>  }<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span><a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>  /**<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>   * Set the limit of rows for this scan. We will terminate the scan if the number of returned rows<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>   * reaches this value.<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>   * &lt;p&gt;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>   * This condition will be tested at last, after all other conditions such as stopRow, filter, etc.<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>   * @param limit the limit of rows for this scan<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>   * @return this<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>   */<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  public Scan setLimit(int limit) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    this.limit = limit;<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    return this;<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>  }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span><a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>  /**<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>   * Call this when you only want to get one row. It will set {@code limit} to {@code 1}, and also<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>   * set {@code readType} to {@link ReadType#PREAD}.<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>   * @return this<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>   */<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  public Scan setOneRowLimit() {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    return setLimit(1).setReadType(ReadType.PREAD);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span><a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  @InterfaceAudience.Public<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>  public enum ReadType {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    DEFAULT, STREAM, PREAD<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>  /**<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>   * @return the read type for this scan<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>   */<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>  public ReadType getReadType() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    return readType;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>  }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>  /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>   * Set the read type for this scan.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>   * &lt;p&gt;<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>   * Notice that we may choose to use pread even if you specific {@link ReadType#STREAM} here. For<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>   * example, we will always use pread if this is a get scan.<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>   * @return this<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   */<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>  public Scan setReadType(ReadType readType) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>    this.readType = readType;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    return this;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>  }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>  /**<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>   * Get the mvcc read point used to open a scanner.<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>   */<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>  long getMvccReadPoint() {<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    return mvccReadPoint;<a name="line.1202"></a>
+<span class="sourceLineNo">1139</span>  public ReadType getReadType() {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    return readType;<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>  }<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span><a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>  /**<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>   * Set the read type for this scan.<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>   * &lt;p&gt;<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>   * Notice that we may choose to use pread even if you specific {@link ReadType#STREAM} here. For<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * example, we will always use pread if this is a get scan.<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * @return this<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  public Scan setReadType(ReadType readType) {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    this.readType = readType;<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    return this;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>  }<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span><a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  /**<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>   * Get the mvcc read point used to open a scanner.<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>   */<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>  long getMvccReadPoint() {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    return mvccReadPoint;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>  }<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span><a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>  /**<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>   * Set the mvcc read point used to open a scanner.<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>   */<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>  Scan setMvccReadPoint(long mvccReadPoint) {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>    this.mvccReadPoint = mvccReadPoint;<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    return this;<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span><a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>   * Set the mvcc read point to -1 which means do not use it.<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>   */<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>  Scan resetMvccReadPoint() {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    return setMvccReadPoint(-1L);<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>  /**<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   * When the server is slow or we scan a table with many deleted data or we use a sparse filter,<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   * the server will response heartbeat to prevent timeout. However the scanner will return a Result<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>   * only when client can do it. So if there are many heartbeats, the blocking time on<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>   * ResultScanner#next() may be very long, which is not friendly to online services.<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>   *<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>   * Set this to true then you can get a special Result whose #isCursor() returns true and is not<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>   * contains any real data. It only tells you where the server has scanned. You can call next<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>   * to continue scanning or open a new scanner with this row key as start row whenever you want.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>   *<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>   * Users can get a cursor when and only when there is a response from the server but we can not<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>   * return a Result to users, for example, this response is a heartbeat or there are partial cells<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>   * but users do not allow partial result.<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>   *<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>   * Now the cursor is in row level which means the special Result will only contains a row key.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>   * {@link Result#isCursor()}<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>   * {@link Result#getCursor()}<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   * {@link Cursor}<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>   */<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>  public Scan setNeedCursorResult(boolean needCursorResult) {<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    this.needCursorResult = needCursorResult;<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    return this;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>  }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span><a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>  public boolean isNeedCursorResult() {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    return needCursorResult;<a name="line.1202"></a>
 <span class="sourceLineNo">1203</span>  }<a name="line.1203"></a>
 <span class="sourceLineNo">1204</span><a name="line.1204"></a>
 <span class="sourceLineNo">1205</span>  /**<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * Set the mvcc read point used to open a scanner.<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   */<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  Scan setMvccReadPoint(long mvccReadPoint) {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>    this.mvccReadPoint = mvccReadPoint;<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    return this;<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Set the mvcc read point to -1 which means do not use it.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   */<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  Scan resetMvccReadPoint() {<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    return setMvccReadPoint(-1L);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  }<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>  /**<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   * When the server is slow or we scan a table with many deleted data or we use a sparse filter,<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>   * the server will response heartbeat to prevent timeout. However the scanner will return a Result<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>   * only when client can do it. So if there are many heartbeats, the blocking time on<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>   * ResultScanner#next() may be very long, which is not friendly to online services.<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>   *<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>   * Set this to true then you can get a special Result whose #isCursor() returns true and is not<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * contains any real data. It only tells you where the server has scanned. You can call next<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * to continue scanning or open a new scanner with this row key as start row whenever you want.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   *<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>   * Users can get a cursor when and only when there is a response from the server but we can not<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>   * return a Result to users, for example, this response is a heartbeat or there are partial cells<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>   * but users do not allow partial result.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>   *<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>   * Now the cursor is in row level which means the special Result will only contains a row key.<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>   * {@link Result#isCursor()}<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>   * {@link Result#getCursor()}<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>   * {@link Cursor}<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>   */<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  public Scan setNeedCursorResult(boolean needCursorResult) {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    this.needCursorResult = needCursorResult;<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    return this;<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  }<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span><a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>  public boolean isNeedCursorResult() {<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    return needCursorResult;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>  }<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span><a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  /**<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>   * Create a new Scan with a cursor. It only set the position information like start row key.<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>   * The others (like cfs, stop row, limit) should still be filled in by the user.<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>   * {@link Result#isCursor()}<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>   * {@link Result#getCursor()}<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>   * {@link Cursor}<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>   */<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>  public static Scan createScanFromCursor(Cursor cursor) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    return new Scan().withStartRow(cursor.getRow());<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>  }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>}<a name="line.1258"></a>
+<span class="sourceLineNo">1206</span>   * Create a new Scan with a cursor. It only set the position information like start row key.<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>   * The others (like cfs, stop row, limit) should still be filled in by the user.<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>   * {@link Result#isCursor()}<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>   * {@link Result#getCursor()}<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>   * {@link Cursor}<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   */<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  public static Scan createScanFromCursor(Cursor cursor) {<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    return new Scan().withStartRow(cursor.getRow());<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>  }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>}<a name="line.1215"></a>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.html b/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.html
index 8bde22b..c749d04 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/client/Scan.html
@@ -29,1241 +29,1198 @@
 <span class="sourceLineNo">021</span><a name="line.21"></a>
 <span class="sourceLineNo">022</span>import java.io.IOException;<a name="line.22"></a>
 <span class="sourceLineNo">023</span>import java.util.ArrayList;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import java.util.Arrays;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import java.util.HashMap;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.Map;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.NavigableSet;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.TreeMap;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.TreeSet;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.HConstants;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.filter.IncompatibleFilterException;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.io.TimeRange;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.security.access.Permission;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.security.visibility.Authorizations;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.slf4j.Logger;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.slf4j.LoggerFactory;<a name="line.41"></a>
-<span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>/**<a name="line.43"></a>
-<span class="sourceLineNo">044</span> * Used to perform Scan operations.<a name="line.44"></a>
-<span class="sourceLineNo">045</span> * &lt;p&gt;<a name="line.45"></a>
-<span class="sourceLineNo">046</span> * All operations are identical to {@link Get} with the exception of instantiation. Rather than<a name="line.46"></a>
-<span class="sourceLineNo">047</span> * specifying a single row, an optional startRow and stopRow may be defined. If rows are not<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * specified, the Scanner will iterate over all rows.<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * &lt;p&gt;<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * To get all columns from all rows of a Table, create an instance with no constraints; use the<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * {@link #Scan()} constructor. To constrain the scan to specific column families, call<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * {@link #addFamily(byte[]) addFamily} for each family to retrieve on your Scan instance.<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * &lt;p&gt;<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * To get specific columns, call {@link #addColumn(byte[], byte[]) addColumn} for each column to<a name="line.54"></a>
-<span class="sourceLineNo">055</span> * retrieve.<a name="line.55"></a>
-<span class="sourceLineNo">056</span> * &lt;p&gt;<a name="line.56"></a>
-<span class="sourceLineNo">057</span> * To only retrieve columns within a specific range of version timestamps, call<a name="line.57"></a>
-<span class="sourceLineNo">058</span> * {@link #setTimeRange(long, long) setTimeRange}.<a name="line.58"></a>
-<span class="sourceLineNo">059</span> * &lt;p&gt;<a name="line.59"></a>
-<span class="sourceLineNo">060</span> * To only retrieve columns with a specific timestamp, call {@link #setTimestamp(long) setTimestamp}<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * .<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * &lt;p&gt;<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * To limit the number of versions of each column to be returned, call {@link #setMaxVersions(int)<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * setMaxVersions}.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;p&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * To limit the maximum number of values returned for each call to next(), call<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * {@link #setBatch(int) setBatch}.<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;p&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * To add a filter, call {@link #setFilter(org.apache.hadoop.hbase.filter.Filter) setFilter}.<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;p&gt;<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * For small scan, it is deprecated in 2.0.0. Now we have a {@link #setLimit(int)} method in Scan<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * object which is used to tell RS how many rows we want. If the rows return reaches the limit, the<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * RS will close the RegionScanner automatically. And we will also fetch data when openScanner in<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * the new implementation, this means we can also finish a scan operation in one rpc call. And we<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * have also introduced a {@link #setReadType(ReadType)} method. You can use this method to tell RS<a name="line.75"></a>
-<span class="sourceLineNo">076</span> * to use pread explicitly.<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;p&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> * Expert: To explicitly disable server-side block caching for this scan, execute<a name="line.78"></a>
-<span class="sourceLineNo">079</span> * {@link #setCacheBlocks(boolean)}.<a name="line.79"></a>
-<span class="sourceLineNo">080</span> * &lt;p&gt;<a name="line.80"></a>
-<span class="sourceLineNo">081</span> * &lt;em&gt;Note:&lt;/em&gt; Usage alters Scan instances. Internally, attributes are updated as the Scan runs<a name="line.81"></a>
-<span class="sourceLineNo">082</span> * and if enabled, metrics accumulate in the Scan instance. Be aware this is the case when you go to<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * clone a Scan instance or if you go to reuse a created Scan instance; safer is create a Scan<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * instance per usage.<a name="line.84"></a>
-<span class="sourceLineNo">085</span> */<a name="line.85"></a>
-<span class="sourceLineNo">086</span>@InterfaceAudience.Public<a name="line.86"></a>
-<span class="sourceLineNo">087</span>public class Scan extends Query {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  private static final Logger LOG = LoggerFactory.getLogger(Scan.class);<a name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  private static final String RAW_ATTR = "_raw_";<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private byte[] startRow = HConstants.EMPTY_START_ROW;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  private boolean includeStartRow = true;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  private byte[] stopRow  = HConstants.EMPTY_END_ROW;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  private boolean includeStopRow = false;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private int maxVersions = 1;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  private int batch = -1;<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>  /**<a name="line.99"></a>
-<span class="sourceLineNo">100</span>   * Partial {@link Result}s are {@link Result}s must be combined to form a complete {@link Result}.<a name="line.100"></a>
-<span class="sourceLineNo">101</span>   * The {@link Result}s had to be returned in fragments (i.e. as partials) because the size of the<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * cells in the row exceeded max result size on the server. Typically partial results will be<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   * combined client side into complete results before being delivered to the caller. However, if<a name="line.103"></a>
-<span class="sourceLineNo">104</span>   * this flag is set, the caller is indicating that they do not mind seeing partial results (i.e.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>   * they understand that the results returned from the Scanner may only represent part of a<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * particular row). In such a case, any attempt to combine the partials into a complete result on<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   * the client side will be skipped, and the caller will be able to see the exact results returned<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * from the server.<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  private boolean allowPartialResults = false;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>  private int storeLimit = -1;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  private int storeOffset = 0;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  private static final String SCAN_ATTRIBUTES_METRICS_ENABLE = "scan.attributes.metrics.enable";<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span>  // If an application wants to use multiple scans over different tables each scan must<a name="line.117"></a>
-<span class="sourceLineNo">118</span>  // define this attribute with the appropriate table name by calling<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // scan.setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME, Bytes.toBytes(tableName))<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  static public final String SCAN_ATTRIBUTES_TABLE_NAME = "scan.attributes.table.name";<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  /**<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   * -1 means no caching specified and the value of {@link HConstants#HBASE_CLIENT_SCANNER_CACHING}<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   * (default to {@link HConstants#DEFAULT_HBASE_CLIENT_SCANNER_CACHING}) will be used<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   */<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  private int caching = -1;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  private long maxResultSize = -1;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  private boolean cacheBlocks = true;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  private boolean reversed = false;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  private TimeRange tr = TimeRange.allTime();<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  private Map&lt;byte [], NavigableSet&lt;byte []&gt;&gt; familyMap =<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    new TreeMap&lt;byte [], NavigableSet&lt;byte []&gt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private Boolean asyncPrefetch = null;<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>  /**<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * Parameter name for client scanner sync/async prefetch toggle.<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   * When using async scanner, prefetching data from the server is done at the background.<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   * The parameter currently won't have any effect in the case that the user has set<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   * Scan#setSmall or Scan#setReversed<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final String HBASE_CLIENT_SCANNER_ASYNC_PREFETCH =<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      "hbase.client.scanner.async.prefetch";<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  /**<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   * Default value of {@link #HBASE_CLIENT_SCANNER_ASYNC_PREFETCH}.<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   */<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  public static final boolean DEFAULT_HBASE_CLIENT_SCANNER_ASYNC_PREFETCH = false;<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>  /**<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * Set it true for small scan to get better performance Small scan should use pread and big scan<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * can use seek + read seek + read is fast but can cause two problem (1) resource contention (2)<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * cause too much network io [89-fb] Using pread for non-compaction read request<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * https://issues.apache.org/jira/browse/HBASE-7266 On the other hand, if setting it true, we<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * would do openScanner,next,closeScanner in one RPC call. It means the better performance for<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * small scan. [HBASE-9488]. Generally, if the scan range is within one data block(64KB), it could<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   * be considered as a small scan.<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   */<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private boolean small = false;<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
-<span class="sourceLineNo">161</span>   * The mvcc read point to use when open a scanner. Remember to clear it after switching regions as<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * the mvcc is only valid within region scope.<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  private long mvccReadPoint = -1L;<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * The number of rows we want for this scan. We will terminate the scan if the number of return<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * rows reaches this value.<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  private int limit = -1;<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * Control whether to use pread at server side.<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  private ReadType readType = ReadType.DEFAULT;<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>  private boolean needCursorResult = false;<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  /**<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * Create a Scan operation across all rows.<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   */<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  public Scan() {}<a name="line.182"></a>
-<span class="sourceLineNo">183</span><a name="line.183"></a>
-<span class="sourceLineNo">184</span>  /**<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   *   {@code new Scan().withStartRow(startRow).setFilter(filter)} instead.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
-<span class="sourceLineNo">189</span>  @Deprecated<a name="line.189"></a>
-<span class="sourceLineNo">190</span>  public Scan(byte[] startRow, Filter filter) {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    this(startRow);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    this.filter = filter;<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  }<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>  /**<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * Create a Scan operation starting at the specified row.<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * &lt;p&gt;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * If the specified row does not exist, the Scanner will start from the next closest row after the<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * specified row.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * @param startRow row to start scanner at or after<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   *   {@code new Scan().withStartRow(startRow)} instead.<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  @Deprecated<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  public Scan(byte[] startRow) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    setStartRow(startRow);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  /**<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   * Create a Scan operation for the range of rows specified.<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   * @param startRow row to start scanner at or after (inclusive)<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * @param stopRow row to stop scanner before (exclusive)<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   *   {@code new Scan().withStartRow(startRow).withStopRow(stopRow)} instead.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   */<a name="line.217"></a>
-<span class="sourceLineNo">218</span>  @Deprecated<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  public Scan(byte[] startRow, byte[] stopRow) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    setStartRow(startRow);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    setStopRow(stopRow);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  /**<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * Creates a new instance of this class while copying all values.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>   *<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   * @param scan  The scan instance to copy from.<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * @throws IOException When copying the values fails.<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   */<a name="line.229"></a>
-<span class="sourceLineNo">230</span>  public Scan(Scan scan) throws IOException {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    startRow = scan.getStartRow();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    includeStartRow = scan.includeStartRow();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    stopRow  = scan.getStopRow();<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    includeStopRow = scan.includeStopRow();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    maxVersions = scan.getMaxVersions();<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    batch = scan.getBatch();<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    storeLimit = scan.getMaxResultsPerColumnFamily();<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    storeOffset = scan.getRowOffsetPerColumnFamily();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    caching = scan.getCaching();<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    maxResultSize = scan.getMaxResultSize();<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    cacheBlocks = scan.getCacheBlocks();<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    filter = scan.getFilter(); // clone?<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    loadColumnFamiliesOnDemand = scan.getLoadColumnFamiliesOnDemandValue();<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    consistency = scan.getConsistency();<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    this.setIsolationLevel(scan.getIsolationLevel());<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    reversed = scan.isReversed();<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    asyncPrefetch = scan.isAsyncPrefetch();<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    small = scan.isSmall();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    allowPartialResults = scan.getAllowPartialResults();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    tr = scan.getTimeRange(); // TimeRange is immutable<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    Map&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; fams = scan.getFamilyMap();<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    for (Map.Entry&lt;byte[],NavigableSet&lt;byte[]&gt;&gt; entry : fams.entrySet()) {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      byte [] fam = entry.getKey();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      NavigableSet&lt;byte[]&gt; cols = entry.getValue();<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      if (cols != null &amp;&amp; cols.size() &gt; 0) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        for (byte[] col : cols) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>          addColumn(fam, col);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      } else {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        addFamily(fam);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      }<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    for (Map.Entry&lt;String, byte[]&gt; attr : scan.getAttributesMap().entrySet()) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      setAttribute(attr.getKey(), attr.getValue());<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    for (Map.Entry&lt;byte[], TimeRange&gt; entry : scan.getColumnFamilyTimeRange().entrySet()) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      TimeRange tr = entry.getValue();<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      setColumnFamilyTimeRange(entry.getKey(), tr.getMin(), tr.getMax());<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    this.mvccReadPoint = scan.getMvccReadPoint();<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    this.limit = scan.getLimit();<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    this.needCursorResult = scan.isNeedCursorResult();<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    setPriority(scan.getPriority());<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    readType = scan.getReadType();<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    super.setReplicaId(scan.getReplicaId());<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   * Builds a scan object with the same specs as get.<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   * @param get get to model scan after<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   */<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  public Scan(Get get) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    this.startRow = get.getRow();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    this.includeStartRow = true;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    this.stopRow = get.getRow();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    this.includeStopRow = true;<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    this.filter = get.getFilter();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    this.cacheBlocks = get.getCacheBlocks();<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    this.maxVersions = get.getMaxVersions();<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    this.storeLimit = get.getMaxResultsPerColumnFamily();<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    this.storeOffset = get.getRowOffsetPerColumnFamily();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    this.tr = get.getTimeRange();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    this.familyMap = get.getFamilyMap();<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    this.asyncPrefetch = false;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    this.consistency = get.getConsistency();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    this.setIsolationLevel(get.getIsolationLevel());<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    this.loadColumnFamiliesOnDemand = get.getLoadColumnFamiliesOnDemandValue();<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    for (Map.Entry&lt;String, byte[]&gt; attr : get.getAttributesMap().entrySet()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      setAttribute(attr.getKey(), attr.getValue());<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    for (Map.Entry&lt;byte[], TimeRange&gt; entry : get.getColumnFamilyTimeRange().entrySet()) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      TimeRange tr = entry.getValue();<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      setColumnFamilyTimeRange(entry.getKey(), tr.getMin(), tr.getMax());<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    this.mvccReadPoint = -1L;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    setPriority(get.getPriority());<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    super.setReplicaId(get.getReplicaId());<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  public boolean isGetScan() {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    return includeStartRow &amp;&amp; includeStopRow<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        &amp;&amp; ClientUtil.areScanStartRowAndStopRowEqual(this.startRow, this.stopRow);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  /**<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * Get all columns from the specified family.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   * &lt;p&gt;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * Overrides previous calls to addColumn for this family.<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * @param family family name<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * @return this<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  public Scan addFamily(byte [] family) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    familyMap.remove(family);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    familyMap.put(family, null);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    return this;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  }<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  /**<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   * Get the column from the specified family with the specified qualifier.<a name="line.329"></a>
-<span class="sourceLineNo">330</span>   * &lt;p&gt;<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * Overrides previous calls to addFamily for this family.<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * @param family family name<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * @param qualifier column qualifier<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * @return this<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  public Scan addColumn(byte [] family, byte [] qualifier) {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    NavigableSet&lt;byte []&gt; set = familyMap.get(family);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    if(set == null) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      set = new TreeSet&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      familyMap.put(family, set);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    if (qualifier == null) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      qualifier = HConstants.EMPTY_BYTE_ARRAY;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    set.add(qualifier);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    return this;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  }<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   * Get versions of columns only within the specified timestamp range,<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * [minStamp, maxStamp).  Note, default maximum versions to return is 1.  If<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * your time range spans more than one version and you want all versions<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * returned, up the number of versions beyond the default.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   * @param minStamp minimum timestamp value, inclusive<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   * @param maxStamp maximum timestamp value, exclusive<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * @see #setMaxVersions()<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * @see #setMaxVersions(int)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   * @return this<a name="line.358"></a>
-<span class="sourceLineNo">359</span>   */<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  public Scan setTimeRange(long minStamp, long maxStamp) throws IOException {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    tr = new TimeRange(minStamp, maxStamp);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    return this;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  /**<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * Get versions of columns with the specified timestamp. Note, default maximum<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   * versions to return is 1.  If your time range spans more than one version<a name="line.367"></a>
-<span class="sourceLineNo">368</span>   * and you want all versions returned, up the number of versions beyond the<a name="line.368"></a>
-<span class="sourceLineNo">369</span>   * defaut.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   * @param timestamp version timestamp<a name="line.370"></a>
-<span class="sourceLineNo">371</span>   * @see #setMaxVersions()<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * @see #setMaxVersions(int)<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * @return this<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @deprecated As of release 2.0.0, this will be removed in HBase 3.0.0.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   *             Use {@link #setTimestamp(long)} instead<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  @Deprecated<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public Scan setTimeStamp(long timestamp)<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  throws IOException {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    return this.setTimestamp(timestamp);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span>  /**<a name="line.383"></a>
-<span class="sourceLineNo">384</span>   * Get versions of columns with the specified timestamp. Note, default maximum<a name="line.384"></a>
-<span class="sourceLineNo">385</span>   * versions to return is 1.  If your time range spans more than one version<a name="line.385"></a>
-<span class="sourceLineNo">386</span>   * and you want all versions returned, up the number of versions beyond the<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   * defaut.<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   * @param timestamp version timestamp<a name="line.388"></a>
-<span class="sourceLineNo">389</span>   * @see #setMaxVersions()<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @see #setMaxVersions(int)<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * @return this<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   */<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  public Scan setTimestamp(long timestamp) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    try {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      tr = new TimeRange(timestamp, timestamp + 1);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    } catch(Exception e) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      // This should never happen, unless integer overflow or something extremely wrong...<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      LOG.error("TimeRange failed, likely caused by integer overflow. ", e);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      throw e;<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    }<a name="line.400"></a>
-<span class="sourceLineNo">401</span><a name="line.401"></a>
-<span class="sourceLineNo">402</span>    return this;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  @Override public Scan setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp) {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    return (Scan) super.setColumnFamilyTimeRange(cf, minStamp, maxStamp);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>  /**<a name="line.409"></a>
-<span class="sourceLineNo">410</span>   * Set the start row of the scan.<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * &lt;p&gt;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * If the specified row does not exist, the Scanner will start from the next closest row after the<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   * specified row.<a name="line.413"></a>
-<span class="sourceLineNo">414</span>   * @param startRow row to start scanner at or after<a name="line.414"></a>
-<span class="sourceLineNo">415</span>   * @return this<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * @throws IllegalArgumentException if startRow does not meet criteria for a row key (when length<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use {@link #withStartRow(byte[])}<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   *   instead. This method may change the inclusive of the stop row to keep compatible with the old<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   *   behavior.<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   * @see #withStartRow(byte[])<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  @Deprecated<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  public Scan setStartRow(byte[] startRow) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    withStartRow(startRow);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    if (ClientUtil.areScanStartRowAndStopRowEqual(this.startRow, this.stopRow)) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      // for keeping the old behavior that a scan with the same start and stop row is a get scan.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      this.includeStopRow = true;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    return this;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  }<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>  /**<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * Set the start row of the scan.<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * &lt;p&gt;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   * If the specified row does not exist, the Scanner will start from the next closest row after the<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * specified row.<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * @param startRow row to start scanner at or after<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @return this<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * @throws IllegalArgumentException if startRow does not meet criteria for a row key (when length<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public Scan withStartRow(byte[] startRow) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    return withStartRow(startRow, true);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>  }<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>  /**<a name="line.448"></a>
-<span class="sourceLineNo">449</span>   * Set the start row of the scan.<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   * &lt;p&gt;<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * If the specified row does not exist, or the {@code inclusive} is {@code false}, the Scanner<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * will start from the next closest row after the specified row.<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   * @param startRow row to start scanner at or after<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * @param inclusive whether we should include the start row when scan<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   * @return this<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * @throws IllegalArgumentException if startRow does not meet criteria for a row key (when length<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   */<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  public Scan withStartRow(byte[] startRow, boolean inclusive) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    if (Bytes.len(startRow) &gt; HConstants.MAX_ROW_LENGTH) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throw new IllegalArgumentException("startRow's length must be less than or equal to "<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          + HConstants.MAX_ROW_LENGTH + " to meet the criteria" + " for a row key.");<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    this.startRow = startRow;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    this.includeStartRow = inclusive;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    return this;<a name="line.466"></a>
-<span class="sourceLineNo">467</span>  }<a name="line.467"></a>
-<span class="sourceLineNo">468</span><a name="line.468"></a>
-<span class="sourceLineNo">469</span>  /**<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * Set the stop row of the scan.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   * &lt;p&gt;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * The scan will include rows that are lexicographically less than the provided stopRow.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * &lt;p&gt;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * &lt;b&gt;Note:&lt;/b&gt; When doing a filter for a rowKey &lt;u&gt;Prefix&lt;/u&gt; use<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * {@link #setRowPrefixFilter(byte[])}. The 'trailing 0' will not yield the desired result.<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * &lt;/p&gt;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * @param stopRow row to end at (exclusive)<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * @return this<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * @throws IllegalArgumentException if stopRow does not meet criteria for a row key (when length<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.480"></a>
-<span class="sourceLineNo">481</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use {@link #withStopRow(byte[])} instead.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   *   This method may change the inclusive of the stop row to keep compatible with the old<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   *   behavior.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   * @see #withStopRow(byte[])<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   */<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  @Deprecated<a name="line.487"></a>
-<span class="sourceLineNo">488</span>  public Scan setStopRow(byte[] stopRow) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    withStopRow(stopRow);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (ClientUtil.areScanStartRowAndStopRowEqual(this.startRow, this.stopRow)) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      // for keeping the old behavior that a scan with the same start and stop row is a get scan.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      this.includeStopRow = true;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    }<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    return this;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>  /**<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * Set the stop row of the scan.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * &lt;p&gt;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   * The scan will include rows that are lexicographically less than the provided stopRow.<a name="line.500"></a>
-<span class="sourceLineNo">501</span>   * &lt;p&gt;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   * &lt;b&gt;Note:&lt;/b&gt; When doing a filter for a rowKey &lt;u&gt;Prefix&lt;/u&gt; use<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   * {@link #setRowPrefixFilter(byte[])}. The 'trailing 0' will not yield the desired result.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>   * &lt;/p&gt;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>   * @param stopRow row to end at (exclusive)<a name="line.505"></a>
-<span class="sourceLineNo">506</span>   * @return this<a name="line.506"></a>
-<span class="sourceLineNo">507</span>   * @throws IllegalArgumentException if stopRow does not meet criteria for a row key (when length<a name="line.507"></a>
-<span class="sourceLineNo">508</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.508"></a>
-<span class="sourceLineNo">509</span>   */<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  public Scan withStopRow(byte[] stopRow) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    return withStopRow(stopRow, false);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  }<a name="line.512"></a>
-<span class="sourceLineNo">513</span><a name="line.513"></a>
-<span class="sourceLineNo">514</span>  /**<a name="line.514"></a>
-<span class="sourceLineNo">515</span>   * Set the stop row of the scan.<a name="line.515"></a>
-<span class="sourceLineNo">516</span>   * &lt;p&gt;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>   * The scan will include rows that are lexicographically less than (or equal to if<a name="line.517"></a>
-<span class="sourceLineNo">518</span>   * {@code inclusive} is {@code true}) the provided stopRow.<a name="line.518"></a>
-<span class="sourceLineNo">519</span>   * @param stopRow row to end at<a name="line.519"></a>
-<span class="sourceLineNo">520</span>   * @param inclusive whether we should include the stop row when scan<a name="line.520"></a>
-<span class="sourceLineNo">521</span>   * @return this<a name="line.521"></a>
-<span class="sourceLineNo">522</span>   * @throws IllegalArgumentException if stopRow does not meet criteria for a row key (when length<a name="line.522"></a>
-<span class="sourceLineNo">523</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.523"></a>
-<span class="sourceLineNo">524</span>   */<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  public Scan withStopRow(byte[] stopRow, boolean inclusive) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    if (Bytes.len(stopRow) &gt; HConstants.MAX_ROW_LENGTH) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      throw new IllegalArgumentException("stopRow's length must be less than or equal to "<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          + HConstants.MAX_ROW_LENGTH + " to meet the criteria" + " for a row key.");<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    }<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    this.stopRow = stopRow;<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    this.includeStopRow = inclusive;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    return this;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  }<a name="line.533"></a>
-<span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>  /**<a name="line.535"></a>
-<span class="sourceLineNo">536</span>   * &lt;p&gt;Set a filter (using stopRow and startRow) so the result set only contains rows where the<a name="line.536"></a>
-<span class="sourceLineNo">537</span>   * rowKey starts with the specified prefix.&lt;/p&gt;<a name="line.537"></a>
-<span class="sourceLineNo">538</span>   * &lt;p&gt;This is a utility method that converts the desired rowPrefix into the appropriate values<a name="line.538"></a>
-<span class="sourceLineNo">539</span>   * for the startRow and stopRow to achieve the desired result.&lt;/p&gt;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>   * &lt;p&gt;This can safely be used in combination with setFilter.&lt;/p&gt;<a name="line.540"></a>
-<span class="sourceLineNo">541</span>   * &lt;p&gt;&lt;b&gt;NOTE: Doing a {@link #setStartRow(byte[])} and/or {@link #setStopRow(byte[])}<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * after this method will yield undefined results.&lt;/b&gt;&lt;/p&gt;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   * @param rowPrefix the prefix all rows must start with. (Set &lt;i&gt;null&lt;/i&gt; to remove the filter.)<a name="line.543"></a>
-<span class="sourceLineNo">544</span>   * @return this<a name="line.544"></a>
-<span class="sourceLineNo">545</span>   */<a name="line.545"></a>
-<span class="sourceLineNo">546</span>  public Scan setRowPrefixFilter(byte[] rowPrefix) {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    if (rowPrefix == null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      setStartRow(HConstants.EMPTY_START_ROW);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      setStopRow(HConstants.EMPTY_END_ROW);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    } else {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      this.setStartRow(rowPrefix);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this.setStopRow(calculateTheClosestNextRowKeyForPrefix(rowPrefix));<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return this;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  /**<a name="line.557"></a>
-<span class="sourceLineNo">558</span>   * &lt;p&gt;When scanning for a prefix the scan should stop immediately after the the last row that<a name="line.558"></a>
-<span class="sourceLineNo">559</span>   * has the specified prefix. This method calculates the closest next rowKey immediately following<a name="line.559"></a>
-<span class="sourceLineNo">560</span>   * the given rowKeyPrefix.&lt;/p&gt;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>   * &lt;p&gt;&lt;b&gt;IMPORTANT: This converts a rowKey&lt;u&gt;Prefix&lt;/u&gt; into a rowKey&lt;/b&gt;.&lt;/p&gt;<a name="line.561"></a>
-<span class="sourceLineNo">562</span>   * &lt;p&gt;If the prefix is an 'ASCII' string put into a byte[] then this is easy because you can<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * simply increment the last byte of the array.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   * But if your application uses real binary rowids you may run into the scenario that your<a name="line.564"></a>
-<span class="sourceLineNo">565</span>   * prefix is something like:&lt;/p&gt;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>   * &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;{ 0x12, 0x23, 0xFF, 0xFF }&lt;/b&gt;&lt;br/&gt;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>   * Then this stopRow needs to be fed into the actual scan&lt;br/&gt;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>   * &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;{ 0x12, 0x24 }&lt;/b&gt; (Notice that it is shorter now)&lt;br/&gt;<a name="line.568"></a>
-<span class="sourceLineNo">569</span>   * This method calculates the correct stop row value for this usecase.<a name="line.569"></a>
-<span class="sourceLineNo">570</span>   *<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   * @param rowKeyPrefix the rowKey&lt;u&gt;Prefix&lt;/u&gt;.<a name="line.571"></a>
-<span class="sourceLineNo">572</span>   * @return the closest next rowKey immediately following the given rowKeyPrefix.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>   */<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  private byte[] calculateTheClosestNextRowKeyForPrefix(byte[] rowKeyPrefix) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    // Essentially we are treating it like an 'unsigned very very long' and doing +1 manually.<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    // Search for the place where the trailing 0xFFs start<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    int offset = rowKeyPrefix.length;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    while (offset &gt; 0) {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      if (rowKeyPrefix[offset - 1] != (byte) 0xFF) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        break;<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      offset--;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
-<span class="sourceLineNo">584</span><a name="line.584"></a>
-<span class="sourceLineNo">585</span>    if (offset == 0) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      // We got an 0xFFFF... (only FFs) stopRow value which is<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      // the last possible prefix before the end of the table.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      // So set it to stop at the 'end of the table'<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      return HConstants.EMPTY_END_ROW;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    }<a name="line.590"></a>
+<span class="sourceLineNo">024</span>import java.util.HashMap;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.util.List;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.Map;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.NavigableSet;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.TreeMap;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.TreeSet;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.HConstants;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.filter.IncompatibleFilterException;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.io.TimeRange;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.security.access.Permission;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.security.visibility.Authorizations;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.slf4j.Logger;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.slf4j.LoggerFactory;<a name="line.40"></a>
+<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">042</span>/**<a name="line.42"></a>
+<span class="sourceLineNo">043</span> * Used to perform Scan operations.<a name="line.43"></a>
+<span class="sourceLineNo">044</span> * &lt;p&gt;<a name="line.44"></a>
+<span class="sourceLineNo">045</span> * All operations are identical to {@link Get} with the exception of instantiation. Rather than<a name="line.45"></a>
+<span class="sourceLineNo">046</span> * specifying a single row, an optional startRow and stopRow may be defined. If rows are not<a name="line.46"></a>
+<span class="sourceLineNo">047</span> * specified, the Scanner will iterate over all rows.<a name="line.47"></a>
+<span class="sourceLineNo">048</span> * &lt;p&gt;<a name="line.48"></a>
+<span class="sourceLineNo">049</span> * To get all columns from all rows of a Table, create an instance with no constraints; use the<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * {@link #Scan()} constructor. To constrain the scan to specific column families, call<a name="line.50"></a>
+<span class="sourceLineNo">051</span> * {@link #addFamily(byte[]) addFamily} for each family to retrieve on your Scan instance.<a name="line.51"></a>
+<span class="sourceLineNo">052</span> * &lt;p&gt;<a name="line.52"></a>
+<span class="sourceLineNo">053</span> * To get specific columns, call {@link #addColumn(byte[], byte[]) addColumn} for each column to<a name="line.53"></a>
+<span class="sourceLineNo">054</span> * retrieve.<a name="line.54"></a>
+<span class="sourceLineNo">055</span> * &lt;p&gt;<a name="line.55"></a>
+<span class="sourceLineNo">056</span> * To only retrieve columns within a specific range of version timestamps, call<a name="line.56"></a>
+<span class="sourceLineNo">057</span> * {@link #setTimeRange(long, long) setTimeRange}.<a name="line.57"></a>
+<span class="sourceLineNo">058</span> * &lt;p&gt;<a name="line.58"></a>
+<span class="sourceLineNo">059</span> * To only retrieve columns with a specific timestamp, call {@link #setTimestamp(long) setTimestamp}<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * .<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * &lt;p&gt;<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * To limit the number of versions of each column to be returned, call {@link #setMaxVersions(int)<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * setMaxVersions}.<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;p&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * To limit the maximum number of values returned for each call to next(), call<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * {@link #setBatch(int) setBatch}.<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;p&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * To add a filter, call {@link #setFilter(org.apache.hadoop.hbase.filter.Filter) setFilter}.<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;p&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * For small scan, it is deprecated in 2.0.0. Now we have a {@link #setLimit(int)} method in Scan<a name="line.70"></a>
+<span class="sourceLineNo">071</span> * object which is used to tell RS how many rows we want. If the rows return reaches the limit, the<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * RS will close the RegionScanner automatically. And we will also fetch data when openScanner in<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * the new implementation, this means we can also finish a scan operation in one rpc call. And we<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * have also introduced a {@link #setReadType(ReadType)} method. You can use this method to tell RS<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * to use pread explicitly.<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * &lt;p&gt;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * Expert: To explicitly disable server-side block caching for this scan, execute<a name="line.77"></a>
+<span class="sourceLineNo">078</span> * {@link #setCacheBlocks(boolean)}.<a name="line.78"></a>
+<span class="sourceLineNo">079</span> * &lt;p&gt;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> * &lt;em&gt;Note:&lt;/em&gt; Usage alters Scan instances. Internally, attributes are updated as the Scan runs<a name="line.80"></a>
+<span class="sourceLineNo">081</span> * and if enabled, metrics accumulate in the Scan instance. Be aware this is the case when you go to<a name="line.81"></a>
+<span class="sourceLineNo">082</span> * clone a Scan instance or if you go to reuse a created Scan instance; safer is create a Scan<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * instance per usage.<a name="line.83"></a>
+<span class="sourceLineNo">084</span> */<a name="line.84"></a>
+<span class="sourceLineNo">085</span>@InterfaceAudience.Public<a name="line.85"></a>
+<span class="sourceLineNo">086</span>public class Scan extends Query {<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private static final Logger LOG = LoggerFactory.getLogger(Scan.class);<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  private static final String RAW_ATTR = "_raw_";<a name="line.89"></a>
+<span class="sourceLineNo">090</span><a name="line.90"></a>
+<span class="sourceLineNo">091</span>  private byte[] startRow = HConstants.EMPTY_START_ROW;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  private boolean includeStartRow = true;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private byte[] stopRow  = HConstants.EMPTY_END_ROW;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private boolean includeStopRow = false;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private int maxVersions = 1;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  private int batch = -1;<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  /**<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   * Partial {@link Result}s are {@link Result}s must be combined to form a complete {@link Result}.<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   * The {@link Result}s had to be returned in fragments (i.e. as partials) because the size of the<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * cells in the row exceeded max result size on the server. Typically partial results will be<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   * combined client side into complete results before being delivered to the caller. However, if<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   * this flag is set, the caller is indicating that they do not mind seeing partial results (i.e.<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   * they understand that the results returned from the Scanner may only represent part of a<a name="line.104"></a>
+<span class="sourceLineNo">105</span>   * particular row). In such a case, any attempt to combine the partials into a complete result on<a name="line.105"></a>
+<span class="sourceLineNo">106</span>   * the client side will be skipped, and the caller will be able to see the exact results returned<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * from the server.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  private boolean allowPartialResults = false;<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  private int storeLimit = -1;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  private int storeOffset = 0;<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  private static final String SCAN_ATTRIBUTES_METRICS_ENABLE = "scan.attributes.metrics.enable";<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  // If an application wants to use multiple scans over different tables each scan must<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  // define this attribute with the appropriate table name by calling<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  // scan.setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME, Bytes.toBytes(tableName))<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  static public final String SCAN_ATTRIBUTES_TABLE_NAME = "scan.attributes.table.name";<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>  /**<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   * -1 means no caching specified and the value of {@link HConstants#HBASE_CLIENT_SCANNER_CACHING}<a name="line.122"></a>
+<span class="sourceLineNo">123</span>   * (default to {@link HConstants#DEFAULT_HBASE_CLIENT_SCANNER_CACHING}) will be used<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   */<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  private int caching = -1;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  private long maxResultSize = -1;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  private boolean cacheBlocks = true;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  private boolean reversed = false;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  private TimeRange tr = TimeRange.allTime();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  private Map&lt;byte [], NavigableSet&lt;byte []&gt;&gt; familyMap =<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    new TreeMap&lt;byte [], NavigableSet&lt;byte []&gt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  private Boolean asyncPrefetch = null;<a name="line.132"></a>
+<span class="sourceLineNo">133</span><a name="line.133"></a>
+<span class="sourceLineNo">134</span>  /**<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   * Parameter name for client scanner sync/async prefetch toggle.<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   * When using async scanner, prefetching data from the server is done at the background.<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   * The parameter currently won't have any effect in the case that the user has set<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   * Scan#setSmall or Scan#setReversed<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   */<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String HBASE_CLIENT_SCANNER_ASYNC_PREFETCH =<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      "hbase.client.scanner.async.prefetch";<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  /**<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   * Default value of {@link #HBASE_CLIENT_SCANNER_ASYNC_PREFETCH}.<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   */<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final boolean DEFAULT_HBASE_CLIENT_SCANNER_ASYNC_PREFETCH = false;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  /**<a name="line.148"></a>
+<span class="sourceLineNo">149</span>   * Set it true for small scan to get better performance Small scan should use pread and big scan<a name="line.149"></a>
+<span class="sourceLineNo">150</span>   * can use seek + read seek + read is fast but can cause two problem (1) resource contention (2)<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   * cause too much network io [89-fb] Using pread for non-compaction read request<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * https://issues.apache.org/jira/browse/HBASE-7266 On the other hand, if setting it true, we<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   * would do openScanner,next,closeScanner in one RPC call. It means the better performance for<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * small scan. [HBASE-9488]. Generally, if the scan range is within one data block(64KB), it could<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * be considered as a small scan.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   */<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private boolean small = false;<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>  /**<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   * The mvcc read point to use when open a scanner. Remember to clear it after switching regions as<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * the mvcc is only valid within region scope.<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  private long mvccReadPoint = -1L;<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * The number of rows we want for this scan. We will terminate the scan if the number of return<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * rows reaches this value.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  private int limit = -1;<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>  /**<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   * Control whether to use pread at server side.<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   */<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  private ReadType readType = ReadType.DEFAULT;<a name="line.174"></a>
+<span class="sourceLineNo">175</span><a name="line.175"></a>
+<span class="sourceLineNo">176</span>  private boolean needCursorResult = false;<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  /**<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * Create a Scan operation across all rows.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   */<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  public Scan() {}<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   *   {@code new Scan().withStartRow(startRow).setFilter(filter)} instead.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   */<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  @Deprecated<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  public Scan(byte[] startRow, Filter filter) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    this(startRow);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    this.filter = filter;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  /**<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * Create a Scan operation starting at the specified row.<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   * &lt;p&gt;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * If the specified row does not exist, the Scanner will start from the next closest row after the<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * specified row.<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * @param startRow row to start scanner at or after<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   *   {@code new Scan().withStartRow(startRow)} instead.<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   */<a name="line.203"></a>
+<span class="sourceLineNo">204</span>  @Deprecated<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public Scan(byte[] startRow) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    setStartRow(startRow);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>  }<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>  /**<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   * Create a Scan operation for the range of rows specified.<a name="line.210"></a>
+<span class="sourceLineNo">211</span>   * @param startRow row to start scanner at or after (inclusive)<a name="line.211"></a>
+<span class="sourceLineNo">212</span>   * @param stopRow row to stop scanner before (exclusive)<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   *   {@code new Scan().withStartRow(startRow).withStopRow(stopRow)} instead.<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  @Deprecated<a name="line.217"></a>
+<span class="sourceLineNo">218</span>  public Scan(byte[] startRow, byte[] stopRow) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    setStartRow(startRow);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    setStopRow(stopRow);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>  /**<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * Creates a new instance of this class while copying all values.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   *<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   * @param scan  The scan instance to copy from.<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * @throws IOException When copying the values fails.<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   */<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  public Scan(Scan scan) throws IOException {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    startRow = scan.getStartRow();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    includeStartRow = scan.includeStartRow();<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    stopRow  = scan.getStopRow();<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    includeStopRow = scan.includeStopRow();<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    maxVersions = scan.getMaxVersions();<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    batch = scan.getBatch();<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    storeLimit = scan.getMaxResultsPerColumnFamily();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    storeOffset = scan.getRowOffsetPerColumnFamily();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    caching = scan.getCaching();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    maxResultSize = scan.getMaxResultSize();<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    cacheBlocks = scan.getCacheBlocks();<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    filter = scan.getFilter(); // clone?<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    loadColumnFamiliesOnDemand = scan.getLoadColumnFamiliesOnDemandValue();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    consistency = scan.getConsistency();<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    this.setIsolationLevel(scan.getIsolationLevel());<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    reversed = scan.isReversed();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    asyncPrefetch = scan.isAsyncPrefetch();<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    small = scan.isSmall();<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    allowPartialResults = scan.getAllowPartialResults();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    tr = scan.getTimeRange(); // TimeRange is immutable<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    Map&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; fams = scan.getFamilyMap();<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    for (Map.Entry&lt;byte[],NavigableSet&lt;byte[]&gt;&gt; entry : fams.entrySet()) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      byte [] fam = entry.getKey();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      NavigableSet&lt;byte[]&gt; cols = entry.getValue();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      if (cols != null &amp;&amp; cols.size() &gt; 0) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        for (byte[] col : cols) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          addColumn(fam, col);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      } else {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        addFamily(fam);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      }<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    for (Map.Entry&lt;String, byte[]&gt; attr : scan.getAttributesMap().entrySet()) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      setAttribute(attr.getKey(), attr.getValue());<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    for (Map.Entry&lt;byte[], TimeRange&gt; entry : scan.getColumnFamilyTimeRange().entrySet()) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      TimeRange tr = entry.getValue();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      setColumnFamilyTimeRange(entry.getKey(), tr.getMin(), tr.getMax());<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    this.mvccReadPoint = scan.getMvccReadPoint();<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    this.limit = scan.getLimit();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    this.needCursorResult = scan.isNeedCursorResult();<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    setPriority(scan.getPriority());<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    readType = scan.getReadType();<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    super.setReplicaId(scan.getReplicaId());<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  /**<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   * Builds a scan object with the same specs as get.<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * @param get get to model scan after<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  public Scan(Get get) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    this.startRow = get.getRow();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    this.includeStartRow = true;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    this.stopRow = get.getRow();<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    this.includeStopRow = true;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    this.filter = get.getFilter();<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    this.cacheBlocks = get.getCacheBlocks();<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    this.maxVersions = get.getMaxVersions();<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    this.storeLimit = get.getMaxResultsPerColumnFamily();<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    this.storeOffset = get.getRowOffsetPerColumnFamily();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    this.tr = get.getTimeRange();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    this.familyMap = get.getFamilyMap();<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    this.asyncPrefetch = false;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    this.consistency = get.getConsistency();<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    this.setIsolationLevel(get.getIsolationLevel());<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    this.loadColumnFamiliesOnDemand = get.getLoadColumnFamiliesOnDemandValue();<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    for (Map.Entry&lt;String, byte[]&gt; attr : get.getAttributesMap().entrySet()) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      setAttribute(attr.getKey(), attr.getValue());<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    for (Map.Entry&lt;byte[], TimeRange&gt; entry : get.getColumnFamilyTimeRange().entrySet()) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      TimeRange tr = entry.getValue();<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      setColumnFamilyTimeRange(entry.getKey(), tr.getMin(), tr.getMax());<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    this.mvccReadPoint = -1L;<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    setPriority(get.getPriority());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    super.setReplicaId(get.getReplicaId());<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  public boolean isGetScan() {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    return includeStartRow &amp;&amp; includeStopRow<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        &amp;&amp; ClientUtil.areScanStartRowAndStopRowEqual(this.startRow, this.stopRow);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>  /**<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   * Get all columns from the specified family.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   * &lt;p&gt;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>   * Overrides previous calls to addColumn for this family.<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   * @param family family name<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * @return this<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   */<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  public Scan addFamily(byte [] family) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    familyMap.remove(family);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    familyMap.put(family, null);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    return this;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>  /**<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * Get the column from the specified family with the specified qualifier.<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * &lt;p&gt;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * Overrides previous calls to addFamily for this family.<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * @param family family name<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * @param qualifier column qualifier<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * @return this<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  public Scan addColumn(byte [] family, byte [] qualifier) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    NavigableSet&lt;byte []&gt; set = familyMap.get(family);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    if(set == null) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      set = new TreeSet&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      familyMap.put(family, set);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    if (qualifier == null) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      qualifier = HConstants.EMPTY_BYTE_ARRAY;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    set.add(qualifier);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    return this;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>  /**<a name="line.348"></a>
+<span class="sourceLineNo">349</span>   * Get versions of columns only within the specified timestamp range,<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * [minStamp, maxStamp).  Note, default maximum versions to return is 1.  If<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   * your time range spans more than one version and you want all versions<a name="line.351"></a>
+<span class="sourceLineNo">352</span>   * returned, up the number of versions beyond the default.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>   * @param minStamp minimum timestamp value, inclusive<a name="line.353"></a>
+<span class="sourceLineNo">354</span>   * @param maxStamp maximum timestamp value, exclusive<a name="line.354"></a>
+<span class="sourceLineNo">355</span>   * @see #setMaxVersions()<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   * @see #setMaxVersions(int)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   * @return this<a name="line.357"></a>
+<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  public Scan setTimeRange(long minStamp, long maxStamp) throws IOException {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    tr = new TimeRange(minStamp, maxStamp);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    return this;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * Get versions of columns with the specified timestamp. Note, default maximum<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   * versions to return is 1.  If your time range spans more than one version<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   * and you want all versions returned, up the number of versions beyond the<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * defaut.<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * @param timestamp version timestamp<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   * @see #setMaxVersions()<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * @see #setMaxVersions(int)<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * @return this<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   * @deprecated As of release 2.0.0, this will be removed in HBase 3.0.0.<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   *             Use {@link #setTimestamp(long)} instead<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   */<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  @Deprecated<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public Scan setTimeStamp(long timestamp)<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  throws IOException {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    return this.setTimestamp(timestamp);<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  }<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>  /**<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   * Get versions of columns with the specified timestamp. Note, default maximum<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * versions to return is 1.  If your time range spans more than one version<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   * and you want all versions returned, up the number of versions beyond the<a name="line.385"></a>
+<span class="sourceLineNo">386</span>   * defaut.<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   * @param timestamp version timestamp<a name="line.387"></a>
+<span class="sourceLineNo">388</span>   * @see #setMaxVersions()<a name="line.388"></a>
+<span class="sourceLineNo">389</span>   * @see #setMaxVersions(int)<a name="line.389"></a>
+<span class="sourceLineNo">390</span>   * @return this<a name="line.390"></a>
+<span class="sourceLineNo">391</span>   */<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  public Scan setTimestamp(long timestamp) {<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    try {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      tr = new TimeRange(timestamp, timestamp + 1);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    } catch(Exception e) {<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      // This should never happen, unless integer overflow or something extremely wrong...<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      LOG.error("TimeRange failed, likely caused by integer overflow. ", e);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      throw e;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    }<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>    return this;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>  }<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @Override public Scan setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    return (Scan) super.setColumnFamilyTimeRange(cf, minStamp, maxStamp);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>  }<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>  /**<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   * Set the start row of the scan.<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   * &lt;p&gt;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>   * If the specified row does not exist, the Scanner will start from the next closest row after the<a name="line.411"></a>
+<span class="sourceLineNo">412</span>   * specified row.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>   * @param startRow row to start scanner at or after<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * @return this<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * @throws IllegalArgumentException if startRow does not meet criteria for a row key (when length<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.416"></a>
+<span class="sourceLineNo">417</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use {@link #withStartRow(byte[])}<a name="line.417"></a>
+<span class="sourceLineNo">418</span>   *   instead. This method may change the inclusive of the stop row to keep compatible with the old<a name="line.418"></a>
+<span class="sourceLineNo">419</span>   *   behavior.<a name="line.419"></a>
+<span class="sourceLineNo">420</span>   * @see #withStartRow(byte[])<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   */<a name="line.422"></a>
+<span class="sourceLineNo">423</span>  @Deprecated<a name="line.423"></a>
+<span class="sourceLineNo">424</span>  public Scan setStartRow(byte[] startRow) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    withStartRow(startRow);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    if (ClientUtil.areScanStartRowAndStopRowEqual(this.startRow, this.stopRow)) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      // for keeping the old behavior that a scan with the same start and stop row is a get scan.<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      this.includeStopRow = true;<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    return this;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>  /**<a name="line.433"></a>
+<span class="sourceLineNo">434</span>   * Set the start row of the scan.<a name="line.434"></a>
+<span class="sourceLineNo">435</span>   * &lt;p&gt;<a name="line.435"></a>
+<span class="sourceLineNo">436</span>   * If the specified row does not exist, the Scanner will start from the next closest row after the<a name="line.436"></a>
+<span class="sourceLineNo">437</span>   * specified row.<a name="line.437"></a>
+<span class="sourceLineNo">438</span>   * @param startRow row to start scanner at or after<a name="line.438"></a>
+<span class="sourceLineNo">439</span>   * @return this<a name="line.439"></a>
+<span class="sourceLineNo">440</span>   * @throws IllegalArgumentException if startRow does not meet criteria for a row key (when length<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  public Scan withStartRow(byte[] startRow) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    return withStartRow(startRow, true);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>  /**<a name="line.447"></a>
+<span class="sourceLineNo">448</span>   * Set the start row of the scan.<a name="line.448"></a>
+<span class="sourceLineNo">449</span>   * &lt;p&gt;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>   * If the specified row does not exist, or the {@code inclusive} is {@code false}, the Scanner<a name="line.450"></a>
+<span class="sourceLineNo">451</span>   * will start from the next closest row after the specified row.<a name="line.451"></a>
+<span class="sourceLineNo">452</span>   * @param startRow row to start scanner at or after<a name="line.452"></a>
+<span class="sourceLineNo">453</span>   * @param inclusive whether we should include the start row when scan<a name="line.453"></a>
+<span class="sourceLineNo">454</span>   * @return this<a name="line.454"></a>
+<span class="sourceLineNo">455</span>   * @throws IllegalArgumentException if startRow does not meet criteria for a row key (when length<a name="line.455"></a>
+<span class="sourceLineNo">456</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.456"></a>
+<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  public Scan withStartRow(byte[] startRow, boolean inclusive) {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    if (Bytes.len(startRow) &gt; HConstants.MAX_ROW_LENGTH) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      throw new IllegalArgumentException("startRow's length must be less than or equal to "<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          + HConstants.MAX_ROW_LENGTH + " to meet the criteria" + " for a row key.");<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    this.startRow = startRow;<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    this.includeStartRow = inclusive;<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    return this;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>  }<a name="line.466"></a>
+<span class="sourceLineNo">467</span><a name="line.467"></a>
+<span class="sourceLineNo">468</span>  /**<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * Set the stop row of the scan.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   * &lt;p&gt;<a name="line.470"></a>
+<span class="sourceLineNo">471</span>   * The scan will include rows that are lexicographically less than the provided stopRow.<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * &lt;p&gt;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * &lt;b&gt;Note:&lt;/b&gt; When doing a filter for a rowKey &lt;u&gt;Prefix&lt;/u&gt; use<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   * {@link #setRowPrefixFilter(byte[])}. The 'trailing 0' will not yield the desired result.<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   * &lt;/p&gt;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * @param stopRow row to end at (exclusive)<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * @return this<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * @throws IllegalArgumentException if stopRow does not meet criteria for a row key (when length<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use {@link #withStopRow(byte[])} instead.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   *   This method may change the inclusive of the stop row to keep compatible with the old<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   *   behavior.<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * @see #withStopRow(byte[])<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17320"&gt;HBASE-17320&lt;/a&gt;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  @Deprecated<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  public Scan setStopRow(byte[] stopRow) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    withStopRow(stopRow);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    if (ClientUtil.areScanStartRowAndStopRowEqual(this.startRow, this.stopRow)) {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      // for keeping the old behavior that a scan with the same start and stop row is a get scan.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      this.includeStopRow = true;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    return this;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>  }<a name="line.494"></a>
+<span class="sourceLineNo">495</span><a name="line.495"></a>
+<span class="sourceLineNo">496</span>  /**<a name="line.496"></a>
+<span class="sourceLineNo">497</span>   * Set the stop row of the scan.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>   * &lt;p&gt;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>   * The scan will include rows that are lexicographically less than the provided stopRow.<a name="line.499"></a>
+<span class="sourceLineNo">500</span>   * &lt;p&gt;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>   * &lt;b&gt;Note:&lt;/b&gt; When doing a filter for a rowKey &lt;u&gt;Prefix&lt;/u&gt; use<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * {@link #setRowPrefixFilter(byte[])}. The 'trailing 0' will not yield the desired result.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * &lt;/p&gt;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * @param stopRow row to end at (exclusive)<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @return this<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IllegalArgumentException if stopRow does not meet criteria for a row key (when length<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.507"></a>
+<span class="sourceLineNo">508</span>   */<a name="line.508"></a>
+<span class="sourceLineNo">509</span>  public Scan withStopRow(byte[] stopRow) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    return withStopRow(stopRow, false);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
+<span class="sourceLineNo">512</span><a name="line.512"></a>
+<span class="sourceLineNo">513</span>  /**<a name="line.513"></a>
+<span class="sourceLineNo">514</span>   * Set the stop row of the scan.<a name="line.514"></a>
+<span class="sourceLineNo">515</span>   * &lt;p&gt;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>   * The scan will include rows that are lexicographically less than (or equal to if<a name="line.516"></a>
+<span class="sourceLineNo">517</span>   * {@code inclusive} is {@code true}) the provided stopRow.<a name="line.517"></a>
+<span class="sourceLineNo">518</span>   * @param stopRow row to end at<a name="line.518"></a>
+<span class="sourceLineNo">519</span>   * @param inclusive whether we should include the stop row when scan<a name="line.519"></a>
+<span class="sourceLineNo">520</span>   * @return this<a name="line.520"></a>
+<span class="sourceLineNo">521</span>   * @throws IllegalArgumentException if stopRow does not meet criteria for a row key (when length<a name="line.521"></a>
+<span class="sourceLineNo">522</span>   *           exceeds {@link HConstants#MAX_ROW_LENGTH})<a name="line.522"></a>
+<span class="sourceLineNo">523</span>   */<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  public Scan withStopRow(byte[] stopRow, boolean inclusive) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    if (Bytes.len(stopRow) &gt; HConstants.MAX_ROW_LENGTH) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      throw new IllegalArgumentException("stopRow's length must be less than or equal to "<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          + HConstants.MAX_ROW_LENGTH + " to meet the criteria" + " for a row key.");<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    }<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    this.stopRow = stopRow;<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    this.includeStopRow = inclusive;<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    return this;<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>  /**<a name="line.534"></a>
+<span class="sourceLineNo">535</span>   * &lt;p&gt;Set a filter (using stopRow and startRow) so the result set only contains rows where the<a name="line.535"></a>
+<span class="sourceLineNo">536</span>   * rowKey starts with the specified prefix.&lt;/p&gt;<a name="line.536"></a>
+<span class="sourceLineNo">537</span>   * &lt;p&gt;This is a utility method that converts the desired rowPrefix into the appropriate values<a name="line.537"></a>
+<span class="sourceLineNo">538</span>   * for the startRow and stopRow to achieve the desired result.&lt;/p&gt;<a name="line.538"></a>
+<span class="sourceLineNo">539</span>   * &lt;p&gt;This can safely be used in combination with setFilter.&lt;/p&gt;<a name="line.539"></a>
+<span class="sourceLineNo">540</span>   * &lt;p&gt;&lt;b&gt;NOTE: Doing a {@link #setStartRow(byte[])} and/or {@link #setStopRow(byte[])}<a name="line.540"></a>
+<span class="sourceLineNo">541</span>   * after this method will yield undefined results.&lt;/b&gt;&lt;/p&gt;<a name="line.541"></a>
+<span class="sourceLineNo">542</span>   * @param rowPrefix the prefix all rows must start with. (Set &lt;i&gt;null&lt;/i&gt; to remove the filter.)<a name="line.542"></a>
+<span class="sourceLineNo">543</span>   * @return this<a name="line.543"></a>
+<span class="sourceLineNo">544</span>   */<a name="line.544"></a>
+<span class="sourceLineNo">545</span>  public Scan setRowPrefixFilter(byte[] rowPrefix) {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    if (rowPrefix == null) {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      setStartRow(HConstants.EMPTY_START_ROW);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      setStopRow(HConstants.EMPTY_END_ROW);<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    } else {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      this.setStartRow(rowPrefix);<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      this.setStopRow(ClientUtil.calculateTheClosestNextRowKeyForPrefix(rowPrefix));<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    return this;<a name="line.553"></a>
+<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
+<span class="sourceLineNo">555</span><a name="line.555"></a>
+<span class="sourceLineNo">556</span>  /**<a name="line.556"></a>
+<span class="sourceLineNo">557</span>   * Get all available versions.<a name="line.557"></a>
+<span class="sourceLineNo">558</span>   * @return this<a name="line.558"></a>
+<span class="sourceLineNo">559</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. It is easy to misunderstand with column<a name="line.559"></a>
+<span class="sourceLineNo">560</span>   *   family's max versions, so use {@link #readAllVersions()} instead.<a name="line.560"></a>
+<span class="sourceLineNo">561</span>   * @see #readAllVersions()<a name="line.561"></a>
+<span class="sourceLineNo">562</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17125"&gt;HBASE-17125&lt;/a&gt;<a name="line.562"></a>
+<span class="sourceLineNo">563</span>   */<a name="line.563"></a>
+<span class="sourceLineNo">564</span>  @Deprecated<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  public Scan setMaxVersions() {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    return readAllVersions();<a name="line.566"></a>
+<span class="sourceLineNo">567</span>  }<a name="line.567"></a>
+<span class="sourceLineNo">568</span><a name="line.568"></a>
+<span class="sourceLineNo">569</span>  /**<a name="line.569"></a>
+<span class="sourceLineNo">570</span>   * Get up to the specified number of versions of each column.<a name="line.570"></a>
+<span class="sourceLineNo">571</span>   * @param maxVersions maximum versions for each column<a name="line.571"></a>
+<span class="sourceLineNo">572</span>   * @return this<a name="line.572"></a>
+<span class="sourceLineNo">573</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. It is easy to misunderstand with column<a name="line.573"></a>
+<span class="sourceLineNo">574</span>   *   family's max versions, so use {@link #readVersions(int)} instead.<a name="line.574"></a>
+<span class="sourceLineNo">575</span>   * @see #readVersions(int)<a name="line.575"></a>
+<span class="sourceLineNo">576</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17125"&gt;HBASE-17125&lt;/a&gt;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>   */<a name="line.577"></a>
+<span class="sourceLineNo">578</span>  @Deprecated<a name="line.578"></a>
+<span class="sourceLineNo">579</span>  public Scan setMaxVersions(int maxVersions) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    return readVersions(maxVersions);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>  }<a name="line.581"></a>
+<span class="sourceLineNo">582</span><a name="line.582"></a>
+<span class="sourceLineNo">583</span>  /**<a name="line.583"></a>
+<span class="sourceLineNo">584</span>   * Get all available versions.<a name="line.584"></a>
+<span class="sourceLineNo">585</span>   * @return this<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   */<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  public Scan readAllVersions() {<a name="line.587"></a>
+<span class="sourceLineNo">588</span>    this.maxVersions = Integer.MAX_VALUE;<a name="line.588"></a>
+<span class="sourceLineNo">589</span>    return this;<a name="line.589"></a>
+<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
 <span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>    // Copy the right length of the original<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    byte[] newStopRow = Arrays.copyOfRange(rowKeyPrefix, 0, offset);<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    // And increment the last one<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    newStopRow[newStopRow.length - 1]++;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    return newStopRow;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>  }<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>  /**<a name="line.599"></a>
-<span class="sourceLineNo">600</span>   * Get all available versions.<a name="line.600"></a>
-<span class="sourceLineNo">601</span>   * @return this<a name="line.601"></a>
-<span class="sourceLineNo">602</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. It is easy to misunderstand with column<a name="line.602"></a>
-<span class="sourceLineNo">603</span>   *   family's max versions, so use {@link #readAllVersions()} instead.<a name="line.603"></a>
-<span class="sourceLineNo">604</span>   * @see #readAllVersions()<a name="line.604"></a>
-<span class="sourceLineNo">605</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17125"&gt;HBASE-17125&lt;/a&gt;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>   */<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  @Deprecated<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  public Scan setMaxVersions() {<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    return readAllVersions();<a name="line.609"></a>
-<span class="sourceLineNo">610</span>  }<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>  /**<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   * Get up to the specified number of versions of each column.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>   * @param maxVersions maximum versions for each column<a name="line.614"></a>
-<span class="sourceLineNo">615</span>   * @return this<a name="line.615"></a>
-<span class="sourceLineNo">616</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. It is easy to misunderstand with column<a name="line.616"></a>
-<span class="sourceLineNo">617</span>   *   family's max versions, so use {@link #readVersions(int)} instead.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>   * @see #readVersions(int)<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17125"&gt;HBASE-17125&lt;/a&gt;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  @Deprecated<a name="line.621"></a>
-<span class="sourceLineNo">622</span>  public Scan setMaxVersions(int maxVersions) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    return readVersions(maxVersions);<a name="line.623"></a>
-<span class="sourceLineNo">624</span>  }<a name="line.624"></a>
-<span class="sourceLineNo">625</span><a name="line.625"></a>
-<span class="sourceLineNo">626</span>  /**<a name="line.626"></a>
-<span class="sourceLineNo">627</span>   * Get all available versions.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>   * @return this<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   */<a name="line.629"></a>
-<span class="sourceLineNo">630</span>  public Scan readAllVersions() {<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    this.maxVersions = Integer.MAX_VALUE;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    return this;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>  }<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>  /**<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   * Get up to the specified number of versions of each column.<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   * @param versions specified number of versions for each column<a name="line.637"></a>
-<span class="sourceLineNo">638</span>   * @return this<a name="line.638"></a>
-<span class="sourceLineNo">639</span>   */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  public Scan readVersions(int versions) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    this.maxVersions = versions;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    return this;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>  }<a name="line.643"></a>
-<span class="sourceLineNo">644</span><a name="line.644"></a>
-<span class="sourceLineNo">645</span>  /**<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * Set the maximum number of cells to return for each call to next(). Callers should be aware<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   * that this is not equivalent to calling {@link #setAllowPartialResults(boolean)}.<a name="line.647"></a>
-<span class="sourceLineNo">648</span>   * If you don't allow partial results, the number of cells in each Result must equal to your<a name="line.648"></a>
-<span class="sourceLineNo">649</span>   * batch setting unless it is the last Result for current row. So this method is helpful in paging<a name="line.649"></a>
-<span class="sourceLineNo">650</span>   * queries. If you just want to prevent OOM at client, use setAllowPartialResults(true) is better.<a name="line.650"></a>
-<span class="sourceLineNo">651</span>   * @param batch the maximum number of values<a name="line.651"></a>
-<span class="sourceLineNo">652</span>   * @see Result#mayHaveMoreCellsInRow()<a name="line.652"></a>
+<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
+<span class="sourceLineNo">593</span>   * Get up to the specified number of versions of each column.<a name="line.593"></a>
+<span class="sourceLineNo">594</span>   * @param versions specified number of versions for each column<a name="line.594"></a>
+<span class="sourceLineNo">595</span>   * @return this<a name="line.595"></a>
+<span class="sourceLineNo">596</span>   */<a name="line.596"></a>
+<span class="sourceLineNo">597</span>  public Scan readVersions(int versions) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    this.maxVersions = versions;<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    return this;<a name="line.599"></a>
+<span class="sourceLineNo">600</span>  }<a name="line.600"></a>
+<span class="sourceLineNo">601</span><a name="line.601"></a>
+<span class="sourceLineNo">602</span>  /**<a name="line.602"></a>
+<span class="sourceLineNo">603</span>   * Set the maximum number of cells to return for each call to next(). Callers should be aware<a name="line.603"></a>
+<span class="sourceLineNo">604</span>   * that this is not equivalent to calling {@link #setAllowPartialResults(boolean)}.<a name="line.604"></a>
+<span class="sourceLineNo">605</span>   * If you don't allow partial results, the number of cells in each Result must equal to your<a name="line.605"></a>
+<span class="sourceLineNo">606</span>   * batch setting unless it is the last Result for current row. So this method is helpful in paging<a name="line.606"></a>
+<span class="sourceLineNo">607</span>   * queries. If you just want to prevent OOM at client, use setAllowPartialResults(true) is better.<a name="line.607"></a>
+<span class="sourceLineNo">608</span>   * @param batch the maximum number of values<a name="line.608"></a>
+<span class="sourceLineNo">609</span>   * @see Result#mayHaveMoreCellsInRow()<a name="line.609"></a>
+<span class="sourceLineNo">610</span>   */<a name="line.610"></a>
+<span class="sourceLineNo">611</span>  public Scan setBatch(int batch) {<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    if (this.hasFilter() &amp;&amp; this.filter.hasFilterRow()) {<a name="line.612"></a>
+<span class="sourceLineNo">613</span>      throw new IncompatibleFilterException(<a name="line.613"></a>
+<span class="sourceLineNo">614</span>        "Cannot set batch on a scan using a filter" +<a name="line.614"></a>
+<span class="sourceLineNo">615</span>        " that returns true for filter.hasFilterRow");<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    this.batch = batch;<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    return this;<a name="line.618"></a>
+<span class="sourceLineNo">619</span>  }<a name="line.619"></a>
+<span class="sourceLineNo">620</span><a name="line.620"></a>
+<span class="sourceLineNo">621</span>  /**<a name="line.621"></a>
+<span class="sourceLineNo">622</span>   * Set the maximum number of values to return per row per Column Family<a name="line.622"></a>
+<span class="sourceLineNo">623</span>   * @param limit the maximum number of values returned / row / CF<a name="line.623"></a>
+<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
+<span class="sourceLineNo">625</span>  public Scan setMaxResultsPerColumnFamily(int limit) {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    this.storeLimit = limit;<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    return this;<a name="line.627"></a>
+<span class="sourceLineNo">628</span>  }<a name="line.628"></a>
+<span class="sourceLineNo">629</span><a name="line.629"></a>
+<span class="sourceLineNo">630</span>  /**<a name="line.630"></a>
+<span class="sourceLineNo">631</span>   * Set offset for the row per Column Family.<a name="line.631"></a>
+<span class="sourceLineNo">632</span>   * @param offset is the number of kvs that will be skipped.<a name="line.632"></a>
+<span class="sourceLineNo">633</span>   */<a name="line.633"></a>
+<span class="sourceLineNo">634</span>  public Scan setRowOffsetPerColumnFamily(int offset) {<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    this.storeOffset = offset;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    return this;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>  }<a name="line.637"></a>
+<span class="sourceLineNo">638</span><a name="line.638"></a>
+<span class="sourceLineNo">639</span>  /**<a name="line.639"></a>
+<span class="sourceLineNo">640</span>   * Set the number of rows for caching that will be passed to scanners.<a name="line.640"></a>
+<span class="sourceLineNo">641</span>   * If not set, the Configuration setting {@link HConstants#HBASE_CLIENT_SCANNER_CACHING} will<a name="line.641"></a>
+<span class="sourceLineNo">642</span>   * apply.<a name="line.642"></a>
+<span class="sourceLineNo">643</span>   * Higher caching values will enable faster scanners but will use more memory.<a name="line.643"></a>
+<span class="sourceLineNo">644</span>   * @param caching the number of rows for caching<a name="line.644"></a>
+<span class="sourceLineNo">645</span>   */<a name="line.645"></a>
+<span class="sourceLineNo">646</span>  public Scan setCaching(int caching) {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    this.caching = caching;<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    return this;<a name="line.648"></a>
+<span class="sourceLineNo">649</span>  }<a name="line.649"></a>
+<span class="sourceLineNo">650</span><a name="line.650"></a>
+<span class="sourceLineNo">651</span>  /**<a name="line.651"></a>
+<span class="sourceLineNo">652</span>   * @return the maximum result size in bytes. See {@link #setMaxResultSize(long)}<a name="line.652"></a>
 <span class="sourceLineNo">653</span>   */<a name="line.653"></a>
-<span class="sourceLineNo">654</span>  public Scan setBatch(int batch) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    if (this.hasFilter() &amp;&amp; this.filter.hasFilterRow()) {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      throw new IncompatibleFilterException(<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        "Cannot set batch on a scan using a filter" +<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        " that returns true for filter.hasFilterRow");<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    }<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    this.batch = batch;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    return this;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>  }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>  /**<a name="line.664"></a>
-<span class="sourceLineNo">665</span>   * Set the maximum number of values to return per row per Column Family<a name="line.665"></a>
-<span class="sourceLineNo">666</span>   * @param limit the maximum number of values returned / row / CF<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   */<a name="line.667"></a>
-<span class="sourceLineNo">668</span>  public Scan setMaxResultsPerColumnFamily(int limit) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    this.storeLimit = limit;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    return this;<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  }<a name="line.671"></a>
-<span class="sourceLineNo">672</span><a name="line.672"></a>
-<span class="sourceLineNo">673</span>  /**<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * Set offset for the row per Column Family.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   * @param offset is the number of kvs that will be skipped.<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   */<a name="line.676"></a>
-<span class="sourceLineNo">677</span>  public Scan setRowOffsetPerColumnFamily(int offset) {<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    this.storeOffset = offset;<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    return this;<a name="line.679"></a>
-<span class="sourceLineNo">680</span>  }<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>  /**<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * Set the number of rows for caching that will be passed to scanners.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   * If not set, the Configuration setting {@link HConstants#HBASE_CLIENT_SCANNER_CACHING} will<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * apply.<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * Higher caching values will enable faster scanners but will use more memory.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param caching the number of rows for caching<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   */<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  public Scan setCaching(int caching) {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    this.caching = caching;<a name="line.690"></a>
-<span class="sourceLineNo">691</span>    return this;<a name="line.691"></a>
+<span class="sourceLineNo">654</span>  public long getMaxResultSize() {<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    return maxResultSize;<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
+<span class="sourceLineNo">659</span>   * Set the maximum result size. The default is -1; this means that no specific<a name="line.659"></a>
+<span class="sourceLineNo">660</span>   * maximum result size will be set for this scan, and the global configured<a name="line.660"></a>
+<span class="sourceLineNo">661</span>   * value will be used instead. (Defaults to unlimited).<a name="line.661"></a>
+<span class="sourceLineNo">662</span>   *<a name="line.662"></a>
+<span class="sourceLineNo">663</span>   * @param maxResultSize The maximum result size in bytes.<a name="line.663"></a>
+<span class="sourceLineNo">664</span>   */<a name="line.664"></a>
+<span class="sourceLineNo">665</span>  public Scan setMaxResultSize(long maxResultSize) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    this.maxResultSize = maxResultSize;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    return this;<a name="line.667"></a>
+<span class="sourceLineNo">668</span>  }<a name="line.668"></a>
+<span class="sourceLineNo">669</span><a name="line.669"></a>
+<span class="sourceLineNo">670</span>  @Override<a name="line.670"></a>
+<span class="sourceLineNo">671</span>  public Scan setFilter(Filter filter) {<a name="line.671"></a>
+<span class="sourceLineNo">672</span>    super.setFilter(filter);<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    return this;<a name="line.673"></a>
+<span class="sourceLineNo">674</span>  }<a name="line.674"></a>
+<span class="sourceLineNo">675</span><a name="line.675"></a>
+<span class="sourceLineNo">676</span>  /**<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   * Setting the familyMap<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   * @param familyMap map of family to qualifier<a name="line.678"></a>
+<span class="sourceLineNo">679</span>   * @return this<a name="line.679"></a>
+<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
+<span class="sourceLineNo">681</span>  public Scan setFamilyMap(Map&lt;byte [], NavigableSet&lt;byte []&gt;&gt; familyMap) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    this.familyMap = familyMap;<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    return this;<a name="line.683"></a>
+<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
+<span class="sourceLineNo">685</span><a name="line.685"></a>
+<span class="sourceLineNo">686</span>  /**<a name="line.686"></a>
+<span class="sourceLineNo">687</span>   * Getting the familyMap<a name="line.687"></a>
+<span class="sourceLineNo">688</span>   * @return familyMap<a name="line.688"></a>
+<span class="sourceLineNo">689</span>   */<a name="line.689"></a>
+<span class="sourceLineNo">690</span>  public Map&lt;byte [], NavigableSet&lt;byte []&gt;&gt; getFamilyMap() {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    return this.familyMap;<a name="line.691"></a>
 <span class="sourceLineNo">692</span>  }<a name="line.692"></a>
 <span class="sourceLineNo">693</span><a name="line.693"></a>
 <span class="sourceLineNo">694</span>  /**<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @return the maximum result size in bytes. See {@link #setMaxResultSize(long)}<a name="line.695"></a>
+<span class="sourceLineNo">695</span>   * @return the number of families in familyMap<a name="line.695"></a>
 <span class="sourceLineNo">696</span>   */<a name="line.696"></a>
-<span class="sourceLineNo">697</span>  public long getMaxResultSize() {<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    return maxResultSize;<a name="line.698"></a>
-<span class="sourceLineNo">699</span>  }<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>  /**<a name="line.701"></a>
-<span class="sourceLineNo">702</span>   * Set the maximum result size. The default is -1; this means that no specific<a name="line.702"></a>
-<span class="sourceLineNo">703</span>   * maximum result size will be set for this scan, and the global configured<a name="line.703"></a>
-<span class="sourceLineNo">704</span>   * value will be used instead. (Defaults to unlimited).<a name="line.704"></a>
-<span class="sourceLineNo">705</span>   *<a name="line.705"></a>
-<span class="sourceLineNo">706</span>   * @param maxResultSize The maximum result size in bytes.<a name="line.706"></a>
-<span class="sourceLineNo">707</span>   */<a name="line.707"></a>
-<span class="sourceLineNo">708</span>  public Scan setMaxResultSize(long maxResultSize) {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    this.maxResultSize = maxResultSize;<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    return this;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  @Override<a name="line.713"></a>
-<span class="sourceLineNo">714</span>  public Scan setFilter(Filter filter) {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    super.setFilter(filter);<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    return this;<a name="line.716"></a>
-<span class="sourceLineNo">717</span>  }<a name="line.717"></a>
-<span class="sourceLineNo">718</span><a name="line.718"></a>
-<span class="sourceLineNo">719</span>  /**<a name="line.719"></a>
-<span class="sourceLineNo">720</span>   * Setting the familyMap<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * @param familyMap map of family to qualifier<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * @return this<a name="line.722"></a>
+<span class="sourceLineNo">697</span>  public int numFamilies() {<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    if(hasFamilies()) {<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      return this.familyMap.size();<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    }<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    return 0;<a name="line.701"></a>
+<span class="sourceLineNo">702</span>  }<a name="line.702"></a>
+<span class="sourceLineNo">703</span><a name="line.703"></a>
+<span class="sourceLineNo">704</span>  /**<a name="line.704"></a>
+<span class="sourceLineNo">705</span>   * @return true if familyMap is non empty, false otherwise<a name="line.705"></a>
+<span class="sourceLineNo">706</span>   */<a name="line.706"></a>
+<span class="sourceLineNo">707</span>  public boolean hasFamilies() {<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    return !this.familyMap.isEmpty();<a name="line.708"></a>
+<span class="sourceLineNo">709</span>  }<a name="line.709"></a>
+<span class="sourceLineNo">710</span><a name="line.710"></a>
+<span class="sourceLineNo">711</span>  /**<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * @return the keys of the familyMap<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   */<a name="line.713"></a>
+<span class="sourceLineNo">714</span>  public byte[][] getFamilies() {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    if(hasFamilies()) {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      return this.familyMap.keySet().toArray(new byte[0][0]);<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    return null;<a name="line.718"></a>
+<span class="sourceLineNo">719</span>  }<a name="line.719"></a>
+<span class="sourceLineNo">720</span><a name="line.720"></a>
+<span class="sourceLineNo">721</span>  /**<a name="line.721"></a>
+<span class="sourceLineNo">722</span>   * @return the startrow<a name="line.722"></a>
 <span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  public Scan setFamilyMap(Map&lt;byte [], NavigableSet&lt;byte []&gt;&gt; familyMap) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    this.familyMap = familyMap;<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    return this;<a name="line.726"></a>
-<span class="sourceLineNo">727</span>  }<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>  /**<a name="line.729"></a>
-<span class="sourceLineNo">730</span>   * Getting the familyMap<a name="line.730"></a>
-<span class="sourceLineNo">731</span>   * @return familyMap<a name="line.731"></a>
-<span class="sourceLineNo">732</span>   */<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  public Map&lt;byte [], NavigableSet&lt;byte []&gt;&gt; getFamilyMap() {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    return this.familyMap;<a name="line.734"></a>
-<span class="sourceLineNo">735</span>  }<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>  /**<a name="line.737"></a>
-<span class="sourceLineNo">738</span>   * @return the number of families in familyMap<a name="line.738"></a>
-<span class="sourceLineNo">739</span>   */<a name="line.739"></a>
-<span class="sourceLineNo">740</span>  public int numFamilies() {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    if(hasFamilies()) {<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      return this.familyMap.size();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    }<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    return 0;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>  }<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>  /**<a name="line.747"></a>
-<span class="sourceLineNo">748</span>   * @return true if familyMap is non empty, false otherwise<a name="line.748"></a>
-<span class="sourceLineNo">749</span>   */<a name="line.749"></a>
-<span class="sourceLineNo">750</span>  public boolean hasFamilies() {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    return !this.familyMap.isEmpty();<a name="line.751"></a>
-<span class="sourceLineNo">752</span>  }<a name="line.752"></a>
-<span class="sourceLineNo">753</span><a name="line.753"></a>
-<span class="sourceLineNo">754</span>  /**<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   * @return the keys of the familyMap<a name="line.755"></a>
-<span class="sourceLineNo">756</span>   */<a name="line.756"></a>
-<span class="sourceLineNo">757</span>  public byte[][] getFamilies() {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    if(hasFamilies()) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>      return this.familyMap.keySet().toArray(new byte[0][0]);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    return null;<a name="line.761"></a>
-<span class="sourceLineNo">762</span>  }<a name="line.762"></a>
-<span class="sourceLineNo">763</span><a name="line.763"></a>
-<span class="sourceLineNo">764</span>  /**<a name="line.764"></a>
-<span class="sourceLineNo">765</span>   * @return the startrow<a name="line.765"></a>
-<span class="sourceLineNo">766</span>   */<a name="line.766"></a>
-<span class="sourceLineNo">767</span>  public byte [] getStartRow() {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    return this.startRow;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>  }<a name="line.769"></a>
-<span class="sourceLineNo">770</span><a name="line.770"></a>
-<span class="sourceLineNo">771</span>  /**<a name="line.771"></a>
-<span class="sourceLineNo">772</span>   * @return if we should include start row when scan<a name="line.772"></a>
-<span class="sourceLineNo">773</span>   */<a name="line.773"></a>
-<span class="sourceLineNo">774</span>  public boolean includeStartRow() {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    return includeStartRow;<a name="line.775"></a>
-<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>  /**<a name="line.778"></a>
-<span class="sourceLineNo">779</span>   * @return the stoprow<a name="line.779"></a>
-<span class="sourceLineNo">780</span>   */<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  public byte[] getStopRow() {<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    return this.stopRow;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>  }<a name="line.783"></a>
-<span class="sourceLineNo">784</span><a name="line.784"></a>
-<span class="sourceLineNo">785</span>  /**<a name="line.785"></a>
-<span class="sourceLineNo">786</span>   * @return if we should include stop row when scan<a name="line.786"></a>
-<span class="sourceLineNo">787</span>   */<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  public boolean includeStopRow() {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    return includeStopRow;<a name="line.789"></a>
-<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>  /**<a name="line.792"></a>
-<span class="sourceLineNo">793</span>   * @return the max number of versions to fetch<a name="line.793"></a>
-<span class="sourceLineNo">794</span>   */<a name="line.794"></a>
-<span class="sourceLineNo">795</span>  public int getMaxVersions() {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    return this.maxVersions;<a name="line.796"></a>
-<span class="sourceLineNo">797</span>  }<a name="line.797"></a>
-<span class="sourceLineNo">798</span><a name="line.798"></a>
-<span class="sourceLineNo">799</span>  /**<a name="line.799"></a>
-<span class="sourceLineNo">800</span>   * @return maximum number of values to return for a single call to next()<a name="line.800"></a>
-<span class="sourceLineNo">801</span>   */<a name="line.801"></a>
-<span class="sourceLineNo">802</span>  public int getBatch() {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>    return this.batch;<a name="line.803"></a>
-<span class="sourceLineNo">804</span>  }<a name="line.804"></a>
-<span class="sourceLineNo">805</span><a name="line.805"></a>
-<span class="sourceLineNo">806</span>  /**<a name="line.806"></a>
-<span class="sourceLineNo">807</span>   * @return maximum number of values to return per row per CF<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   */<a name="line.808"></a>
-<span class="sourceLineNo">809</span>  public int getMaxResultsPerColumnFamily() {<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    return this.storeLimit;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>  }<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>  /**<a name="line.813"></a>
-<span class="sourceLineNo">814</span>   * Method for retrieving the scan's offset per row per column<a name="line.814"></a>
-<span class="sourceLineNo">815</span>   * family (#kvs to be skipped)<a name="line.815"></a>
-<span class="sourceLineNo">816</span>   * @return row offset<a name="line.816"></a>
+<span class="sourceLineNo">724</span>  public byte [] getStartRow() {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    return this.startRow;<a name="line.725"></a>
+<span class="sourceLineNo">726</span>  }<a name="line.726"></a>
+<span class="sourceLineNo">727</span><a name="line.727"></a>
+<span class="sourceLineNo">728</span>  /**<a name="line.728"></a>
+<span class="sourceLineNo">729</span>   * @return if we should include start row when scan<a name="line.729"></a>
+<span class="sourceLineNo">730</span>   */<a name="line.730"></a>
+<span class="sourceLineNo">731</span>  public boolean includeStartRow() {<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    return includeStartRow;<a name="line.732"></a>
+<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>  /**<a name="line.735"></a>
+<span class="sourceLineNo">736</span>   * @return the stoprow<a name="line.736"></a>
+<span class="sourceLineNo">737</span>   */<a name="line.737"></a>
+<span class="sourceLineNo">738</span>  public byte[] getStopRow() {<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    return this.stopRow;<a name="line.739"></a>
+<span class="sourceLineNo">740</span>  }<a name="line.740"></a>
+<span class="sourceLineNo">741</span><a name="line.741"></a>
+<span class="sourceLineNo">742</span>  /**<a name="line.742"></a>
+<span class="sourceLineNo">743</span>   * @return if we should include stop row when scan<a name="line.743"></a>
+<span class="sourceLineNo">744</span>   */<a name="line.744"></a>
+<span class="sourceLineNo">745</span>  public boolean includeStopRow() {<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    return includeStopRow;<a name="line.746"></a>
+<span class="sourceLineNo">747</span>  }<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>  /**<a name="line.749"></a>
+<span class="sourceLineNo">750</span>   * @return the max number of versions to fetch<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   */<a name="line.751"></a>
+<span class="sourceLineNo">752</span>  public int getMaxVersions() {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    return this.maxVersions;<a name="line.753"></a>
+<span class="sourceLineNo">754</span>  }<a name="line.754"></a>
+<span class="sourceLineNo">755</span><a name="line.755"></a>
+<span class="sourceLineNo">756</span>  /**<a name="line.756"></a>
+<span class="sourceLineNo">757</span>   * @return maximum number of values to return for a single call to next()<a name="line.757"></a>
+<span class="sourceLineNo">758</span>   */<a name="line.758"></a>
+<span class="sourceLineNo">759</span>  public int getBatch() {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    return this.batch;<a name="line.760"></a>
+<span class="sourceLineNo">761</span>  }<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>  /**<a name="line.763"></a>
+<span class="sourceLineNo">764</span>   * @return maximum number of values to return per row per CF<a name="line.764"></a>
+<span class="sourceLineNo">765</span>   */<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  public int getMaxResultsPerColumnFamily() {<a name="line.766"></a>
+<span class="sourceLineNo">767</span>    return this.storeLimit;<a name="line.767"></a>
+<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
+<span class="sourceLineNo">769</span><a name="line.769"></a>
+<span class="sourceLineNo">770</span>  /**<a name="line.770"></a>
+<span class="sourceLineNo">771</span>   * Method for retrieving the scan's offset per row per column<a name="line.771"></a>
+<span class="sourceLineNo">772</span>   * family (#kvs to be skipped)<a name="line.772"></a>
+<span class="sourceLineNo">773</span>   * @return row offset<a name="line.773"></a>
+<span class="sourceLineNo">774</span>   */<a name="line.774"></a>
+<span class="sourceLineNo">775</span>  public int getRowOffsetPerColumnFamily() {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    return this.storeOffset;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
+<span class="sourceLineNo">778</span><a name="line.778"></a>
+<span class="sourceLineNo">779</span>  /**<a name="line.779"></a>
+<span class="sourceLineNo">780</span>   * @return caching the number of rows fetched when calling next on a scanner<a name="line.780"></a>
+<span class="sourceLineNo">781</span>   */<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  public int getCaching() {<a name="line.782"></a>
+<span class="sourceLineNo">783</span>    return this.caching;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>  }<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>  /**<a name="line.786"></a>
+<span class="sourceLineNo">787</span>   * @return TimeRange<a name="line.787"></a>
+<span class="sourceLineNo">788</span>   */<a name="line.788"></a>
+<span class="sourceLineNo">789</span>  public TimeRange getTimeRange() {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>    return this.tr;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  }<a name="line.791"></a>
+<span class="sourceLineNo">792</span><a name="line.792"></a>
+<span class="sourceLineNo">793</span>  /**<a name="line.793"></a>
+<span class="sourceLineNo">794</span>   * @return RowFilter<a name="line.794"></a>
+<span class="sourceLineNo">795</span>   */<a name="line.795"></a>
+<span class="sourceLineNo">796</span>  @Override<a name="line.796"></a>
+<span class="sourceLineNo">797</span>  public Filter getFilter() {<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    return filter;<a name="line.798"></a>
+<span class="sourceLineNo">799</span>  }<a name="line.799"></a>
+<span class="sourceLineNo">800</span><a name="line.800"></a>
+<span class="sourceLineNo">801</span>  /**<a name="line.801"></a>
+<span class="sourceLineNo">802</span>   * @return true is a filter has been specified, false if not<a name="line.802"></a>
+<span class="sourceLineNo">803</span>   */<a name="line.803"></a>
+<span class="sourceLineNo">804</span>  public boolean hasFilter() {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    return filter != null;<a name="line.805"></a>
+<span class="sourceLineNo">806</span>  }<a name="line.806"></a>
+<span class="sourceLineNo">807</span><a name="line.807"></a>
+<span class="sourceLineNo">808</span>  /**<a name="line.808"></a>
+<span class="sourceLineNo">809</span>   * Set whether blocks should be cached for this Scan.<a name="line.809"></a>
+<span class="sourceLineNo">810</span>   * &lt;p&gt;<a name="line.810"></a>
+<span class="sourceLineNo">811</span>   * This is true by default.  When true, default settings of the table and<a name="line.811"></a>
+<span class="sourceLineNo">812</span>   * family are used (this will never override caching blocks if the block<a name="line.812"></a>
+<span class="sourceLineNo">813</span>   * cache is disabled for that family or entirely).<a name="line.813"></a>
+<span class="sourceLineNo">814</span>   *<a name="line.814"></a>
+<span class="sourceLineNo">815</span>   * @param cacheBlocks if false, default settings are overridden and blocks<a name="line.815"></a>
+<span class="sourceLineNo">816</span>   * will not be cached<a name="line.816"></a>
 <span class="sourceLineNo">817</span>   */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>  public int getRowOffsetPerColumnFamily() {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>    return this.storeOffset;<a name="line.819"></a>
-<span class="sourceLineNo">820</span>  }<a name="line.820"></a>
-<span class="sourceLineNo">821</span><a name="line.821"></a>
-<span class="sourceLineNo">822</span>  /**<a name="line.822"></a>
-<span class="sourceLineNo">823</span>   * @return caching the number of rows fetched when calling next on a scanner<a name="line.823"></a>
-<span class="sourceLineNo">824</span>   */<a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public int getCaching() {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return this.caching;<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>  /**<a name="line.829"></a>
-<span class="sourceLineNo">830</span>   * @return TimeRange<a name="line.830"></a>
-<span class="sourceLineNo">831</span>   */<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  public TimeRange getTimeRange() {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    return this.tr;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>  }<a name="line.834"></a>
-<span class="sourceLineNo">835</span><a name="line.835"></a>
-<span class="sourceLineNo">836</span>  /**<a name="line.836"></a>
-<span class="sourceLineNo">837</span>   * @return RowFilter<a name="line.837"></a>
-<span class="sourceLineNo">838</span>   */<a name="line.838"></a>
-<span class="sourceLineNo">839</span>  @Override<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  public Filter getFilter() {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    return filter;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>  }<a name="line.842"></a>
-<span class="sourceLineNo">843</span><a name="line.843"></a>
-<span class="sourceLineNo">844</span>  /**<a name="line.844"></a>
-<span class="sourceLineNo">845</span>   * @return true is a filter has been specified, false if not<a name="line.845"></a>
-<span class="sourceLineNo">846</span>   */<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  public boolean hasFilter() {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    return filter != null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>  }<a name="line.849"></a>
-<span class="sourceLineNo">850</span><a name="line.850"></a>
-<span class="sourceLineNo">851</span>  /**<a name="line.851"></a>
-<span class="sourceLineNo">852</span>   * Set whether blocks should be cached for this Scan.<a name="line.852"></a>
-<span class="sourceLineNo">853</span>   * &lt;p&gt;<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * This is true by default.  When true, default settings of the table and<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   * family are used (this will never override caching blocks if the block<a name="line.855"></a>
-<span class="sourceLineNo">856</span>   * cache is disabled for that family or entirely).<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   *<a name="line.857"></a>
-<span class="sourceLineNo">858</span>   * @param cacheBlocks if false, default settings are overridden and blocks<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   * will not be cached<a name="line.859"></a>
-<span class="sourceLineNo">860</span>   */<a name="line.860"></a>
-<span class="sourceLineNo">861</span>  public Scan setCacheBlocks(boolean cacheBlocks) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    this.cacheBlocks = cacheBlocks;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    return this;<a name="line.863"></a>
-<span class="sourceLineNo">864</span>  }<a name="line.864"></a>
-<span class="sourceLineNo">865</span><a name="line.865"></a>
-<span class="sourceLineNo">866</span>  /**<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * Get whether blocks should be cached for this Scan.<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * @return true if default caching should be used, false if blocks should not<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * be cached<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   */<a name="line.870"></a>
-<span class="sourceLineNo">871</span>  public boolean getCacheBlocks() {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>    return cacheBlocks;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>  }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>  /**<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * Set whether this scan is a reversed one<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * &lt;p&gt;<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   * This is false by default which means forward(normal) scan.<a name="line.878"></a>
-<span class="sourceLineNo">879</span>   *<a name="line.879"></a>
-<span class="sourceLineNo">880</span>   * @param reversed if true, scan will be backward order<a name="line.880"></a>
-<span class="sourceLineNo">881</span>   * @return this<a name="line.881"></a>
-<span class="sourceLineNo">882</span>   */<a name="line.882"></a>
-<span class="sourceLineNo">883</span>  public Scan setReversed(boolean reversed) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    this.reversed = reversed;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    return this;<a name="line.885"></a>
-<span class="sourceLineNo">886</span>  }<a name="line.886"></a>
-<span class="sourceLineNo">887</span><a name="line.887"></a>
-<span class="sourceLineNo">888</span>  /**<a name="line.888"></a>
-<span class="sourceLineNo">889</span>   * Get whether this scan is a reversed one.<a name="line.889"></a>
-<span class="sourceLineNo">890</span>   * @return true if backward scan, false if forward(default) scan<a name="line.890"></a>
-<span class="sourceLineNo">891</span>   */<a name="line.891"></a>
-<span class="sourceLineNo">892</span>  public boolean isReversed() {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    return reversed;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>  }<a name="line.894"></a>
-<span class="sourceLineNo">895</span><a name="line.895"></a>
-<span class="sourceLineNo">896</span>  /**<a name="line.896"></a>
-<span class="sourceLineNo">897</span>   * Setting whether the caller wants to see the partial results when server returns<a name="line.897"></a>
-<span class="sourceLineNo">898</span>   * less-than-expected cells. It is helpful while scanning a huge row to prevent OOM at client.<a name="line.898"></a>
-<span class="sourceLineNo">899</span>   * By default this value is false and the complete results will be assembled client side<a name="line.899"></a>
-<span class="sourceLineNo">900</span>   * before being delivered to the caller.<a name="line.900"></a>
-<span class="sourceLineNo">901</span>   * @param allowPartialResults<a name="line.901"></a>
-<span class="sourceLineNo">902</span>   * @return this<a name="line.902"></a>
-<span class="sourceLineNo">903</span>   * @see Result#mayHaveMoreCellsInRow()<a name="line.903"></a>
-<span class="sourceLineNo">904</span>   * @see #setBatch(int)<a name="line.904"></a>
-<span class="sourceLineNo">905</span>   */<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  public Scan setAllowPartialResults(final boolean allowPartialResults) {<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    this.allowPartialResults = allowPartialResults;<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    return this;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  }<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>  /**<a name="line.911"></a>
-<span class="sourceLineNo">912</span>   * @return true when the constructor of this scan understands that the results they will see may<a name="line.912"></a>
-<span class="sourceLineNo">913</span>   *         only represent a partial portion of a row. The entire row would be retrieved by<a name="line.913"></a>
-<span class="sourceLineNo">914</span>   *         subsequent calls to {@link ResultScanner#next()}<a name="line.914"></a>
-<span class="sourceLineNo">915</span>   */<a name="line.915"></a>
-<span class="sourceLineNo">916</span>  public boolean getAllowPartialResults() {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    return allowPartialResults;<a name="line.917"></a>
-<span class="sourceLineNo">918</span>  }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>  @Override<a name="line.920"></a>
-<span class="sourceLineNo">921</span>  public Scan setLoadColumnFamiliesOnDemand(boolean value) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>    return (Scan) super.setLoadColumnFamiliesOnDemand(value);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>  }<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>  /**<a name="line.925"></a>
-<span class="sourceLineNo">926</span>   * Compile the table and column family (i.e. schema) information<a name="line.926"></a>
-<span class="sourceLineNo">927</span>   * into a String. Useful for parsing and aggregation by debugging,<a name="line.927"></a>
-<span class="sourceLineNo">928</span>   * logging, and administration tools.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>   * @return Map<a name="line.929"></a>
-<span class="sourceLineNo">930</span>   */<a name="line.930"></a>
-<span class="sourceLineNo">931</span>  @Override<a name="line.931"></a>
-<span class="sourceLineNo">932</span>  public Map&lt;String, Object&gt; getFingerprint() {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    List&lt;String&gt; families = new ArrayList&lt;&gt;();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    if(this.familyMap.isEmpty()) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      map.put("families", "ALL");<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      return map;<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    } else {<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      map.put("families", families);<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    for (Map.Entry&lt;byte [], NavigableSet&lt;byte[]&gt;&gt; entry :<a name="line.941"></a>
-<span class="sourceLineNo">942</span>        this.familyMap.entrySet()) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      families.add(Bytes.toStringBinary(entry.getKey()));<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
-<span class="sourceLineNo">945</span>    return map;<a name="line.945"></a>
-<span class="sourceLineNo">946</span>  }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>  /**<a name="line.948"></a>
-<span class="sourceLineNo">949</span>   * Compile the details beyond the scope of getFingerprint (row, columns,<a name="line.949"></a>
-<span class="sourceLineNo">950</span>   * timestamps, etc.) into a Map along with the fingerprinted information.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>   * Useful for debugging, logging, and administration tools.<a name="line.951"></a>
-<span class="sourceLineNo">952</span>   * @param maxCols a limit on the number of columns output prior to truncation<a name="line.952"></a>
-<span class="sourceLineNo">953</span>   * @return Map<a name="line.953"></a>
-<span class="sourceLineNo">954</span>   */<a name="line.954"></a>
-<span class="sourceLineNo">955</span>  @Override<a name="line.955"></a>
-<span class="sourceLineNo">956</span>  public Map&lt;String, Object&gt; toMap(int maxCols) {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>    // start with the fingerpring map and build on top of it<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    Map&lt;String, Object&gt; map = getFingerprint();<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    // map from families to column list replaces fingerprint's list of families<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    Map&lt;String, List&lt;String&gt;&gt; familyColumns = new HashMap&lt;&gt;();<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    map.put("families", familyColumns);<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    // add scalar information first<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    map.put("startRow", Bytes.toStringBinary(this.startRow));<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    map.put("stopRow", Bytes.toStringBinary(this.stopRow));<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    map.put("maxVersions", this.maxVersions);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    map.put("batch", this.batch);<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    map.put("caching", this.caching);<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    map.put("maxResultSize", this.maxResultSize);<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    map.put("cacheBlocks", this.cacheBlocks);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    map.put("loadColumnFamiliesOnDemand", this.loadColumnFamiliesOnDemand);<a name="line.970"></a>
-<span class="sourceLineNo">971</span>    List&lt;Long&gt; timeRange = new ArrayList&lt;&gt;(2);<a name="line.971"></a>
-<span class="sourceLineNo">972</span>    timeRange.add(this.tr.getMin());<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    timeRange.add(this.tr.getMax());<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    map.put("timeRange", timeRange);<a name="line.974"></a>
-<span class="sourceLineNo">975</span>    int colCount = 0;<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    // iterate through affected families and list out up to maxCols columns<a name="line.976"></a>
-<span class="sourceLineNo">977</span>    for (Map.Entry&lt;byte [], NavigableSet&lt;byte[]&gt;&gt; entry :<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      this.familyMap.entrySet()) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      List&lt;String&gt; columns = new ArrayList&lt;&gt;();<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      familyColumns.put(Bytes.toStringBinary(entry.getKey()), columns);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      if(entry.getValue() == null) {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        colCount++;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>        --maxCols;<a name="line.983"></a>
-<span class="sourceLineNo">984</span>        columns.add("ALL");<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      } else {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        colCount += entry.getValue().size();<a name="line.986"></a>
-<span class="sourceLineNo">987</span>        if (maxCols &lt;= 0) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>          continue;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        }<a name="line.989"></a>
-<span class="sourceLineNo">990</span>        for (byte [] column : entry.getValue()) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>          if (--maxCols &lt;= 0) {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>            continue;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>          }<a name="line.993"></a>
-<span class="sourceLineNo">994</span>          columns.add(Bytes.toStringBinary(column));<a name="line.994"></a>
-<span class="sourceLineNo">995</span>        }<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    }<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    map.put("totalColumns", colCount);<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    if (this.filter != null) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>      map.put("filter", this.filter.toString());<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    // add the id if set<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    if (getId() != null) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      map.put("id", getId());<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    }<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    return map;<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>  }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>  /**<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>   * Enable/disable "raw" mode for this scan.<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   * If "raw" is enabled the scan will return all<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>   * delete marker and deleted rows that have not<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>   * been collected, yet.<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>   * This is mostly useful for Scan on column families<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>   * that have KEEP_DELETED_ROWS enabled.<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>   * It is an error to specify any column when "raw" is set.<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * @param raw True/False to enable/disable "raw" mode.<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   */<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>  public Scan setRaw(boolean raw) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>    setAttribute(RAW_ATTR, Bytes.toBytes(raw));<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    return this;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>  }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>  /**<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   * @return True if this Scan is in "raw" mode.<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   */<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  public boolean isRaw() {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    byte[] attr = getAttribute(RAW_ATTR);<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    return attr == null ? false : Bytes.toBoolean(attr);<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>  }<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span><a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>  /**<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>   * Set whether this scan is a small scan<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>   * &lt;p&gt;<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>   * Small scan should use pread and big scan can use seek + read seek + read is fast but can cause<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>   * two problem (1) resource contention (2) cause too much network io [89-fb] Using pread for<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>   * non-compaction read request https://issues.apache.org/jira/browse/HBASE-7266 On the other hand,<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>   * if setting it true, we would do openScanner,next,closeScanner in one RPC call. It means the<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>   * better performance for small scan. [HBASE-9488]. Generally, if the scan range is within one<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>   * data block(64KB), it could be considered as a small scan.<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>   * @param small<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use {@link #setLimit(int)} and<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>   *   {@link #setReadType(ReadType)} instead. And for the one rpc optimization, now we will also<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>   *   fetch data when openScanner, and if the number of rows reaches the limit then we will close<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>   *   the scanner automatically which means we will fall back to one rpc.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>   * @see #setLimit(int)<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>   * @see #setReadType(ReadType)<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17045"&gt;HBASE-17045&lt;/a&gt;<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>   */<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>  @Deprecated<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  public Scan setSmall(boolean small) {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    this.small = small;<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>    this.readType = ReadType.PREAD;<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    return this;<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>  }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>  /**<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>   * Get whether this scan is a small scan<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>   * @return true if small scan<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. See the comment of<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>   *   {@link #setSmall(boolean)}<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17045"&gt;HBASE-17045&lt;/a&gt;<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>   */<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>  @Deprecated<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>  public boolean isSmall() {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    return small;<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>  }<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>  @Override<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>  public Scan setAttribute(String name, byte[] value) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    return (Scan) super.setAttribute(name, value);<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>  }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>  @Override<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>  public Scan setId(String id) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    return (Scan) super.setId(id);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>  }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>  @Override<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>  public Scan setAuthorizations(Authorizations authorizations) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>    return (Scan) super.setAuthorizations(authorizations);<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>  }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span><a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>  @Override<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>  public Scan setACL(Map&lt;String, Permission&gt; perms) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>    return (Scan) super.setACL(perms);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>  }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span><a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>  @Override<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>  public Scan setACL(String user, Permission perms) {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>    return (Scan) super.setACL(user, perms);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>  }<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span><a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>  @Override<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  public Scan setConsistency(Consistency consistency) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    return (Scan) super.setConsistency(consistency);<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>  }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span><a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>  @Override<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>  public Scan setReplicaId(int Id) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    return (Scan) super.setReplicaId(Id);<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span><a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>  @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>  public Scan setIsolationLevel(IsolationLevel level) {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    return (Scan) super.setIsolationLevel(level);<a name="line.1106"></a>
+<span class="sourceLineNo">818</span>  public Scan setCacheBlocks(boolean cacheBlocks) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    this.cacheBlocks = cacheBlocks;<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    return this;<a name="line.820"></a>
+<span class="sourceLineNo">821</span>  }<a name="line.821"></a>
+<span class="sourceLineNo">822</span><a name="line.822"></a>
+<span class="sourceLineNo">823</span>  /**<a name="line.823"></a>
+<span class="sourceLineNo">824</span>   * Get whether blocks should be cached for this Scan.<a name="line.824"></a>
+<span class="sourceLineNo">825</span>   * @return true if default caching should be used, false if blocks should not<a name="line.825"></a>
+<span class="sourceLineNo">826</span>   * be cached<a name="line.826"></a>
+<span class="sourceLineNo">827</span>   */<a name="line.827"></a>
+<span class="sourceLineNo">828</span>  public boolean getCacheBlocks() {<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    return cacheBlocks;<a name="line.829"></a>
+<span class="sourceLineNo">830</span>  }<a name="line.830"></a>
+<span class="sourceLineNo">831</span><a name="line.831"></a>
+<span class="sourceLineNo">832</span>  /**<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   * Set whether this scan is a reversed one<a name="line.833"></a>
+<span class="sourceLineNo">834</span>   * &lt;p&gt;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>   * This is false by default which means forward(normal) scan.<a name="line.835"></a>
+<span class="sourceLineNo">836</span>   *<a name="line.836"></a>
+<span class="sourceLineNo">837</span>   * @param reversed if true, scan will be backward order<a name="line.837"></a>
+<span class="sourceLineNo">838</span>   * @return this<a name="line.838"></a>
+<span class="sourceLineNo">839</span>   */<a name="line.839"></a>
+<span class="sourceLineNo">840</span>  public Scan setReversed(boolean reversed) {<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    this.reversed = reversed;<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    return this;<a name="line.842"></a>
+<span class="sourceLineNo">843</span>  }<a name="line.843"></a>
+<span class="sourceLineNo">844</span><a name="line.844"></a>
+<span class="sourceLineNo">845</span>  /**<a name="line.845"></a>
+<span class="sourceLineNo">846</span>   * Get whether this scan is a reversed one.<a name="line.846"></a>
+<span class="sourceLineNo">847</span>   * @return true if backward scan, false if forward(default) scan<a name="line.847"></a>
+<span class="sourceLineNo">848</span>   */<a name="line.848"></a>
+<span class="sourceLineNo">849</span>  public boolean isReversed() {<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    return reversed;<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  }<a name="line.851"></a>
+<span class="sourceLineNo">852</span><a name="line.852"></a>
+<span class="sourceLineNo">853</span>  /**<a name="line.853"></a>
+<span class="sourceLineNo">854</span>   * Setting whether the caller wants to see the partial results when server returns<a name="line.854"></a>
+<span class="sourceLineNo">855</span>   * less-than-expected cells. It is helpful while scanning a huge row to prevent OOM at client.<a name="line.855"></a>
+<span class="sourceLineNo">856</span>   * By default this value is false and the complete results will be assembled client side<a name="line.856"></a>
+<span class="sourceLineNo">857</span>   * before being delivered to the caller.<a name="line.857"></a>
+<span class="sourceLineNo">858</span>   * @param allowPartialResults<a name="line.858"></a>
+<span class="sourceLineNo">859</span>   * @return this<a name="line.859"></a>
+<span class="sourceLineNo">860</span>   * @see Result#mayHaveMoreCellsInRow()<a name="line.860"></a>
+<span class="sourceLineNo">861</span>   * @see #setBatch(int)<a name="line.861"></a>
+<span class="sourceLineNo">862</span>   */<a name="line.862"></a>
+<span class="sourceLineNo">863</span>  public Scan setAllowPartialResults(final boolean allowPartialResults) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    this.allowPartialResults = allowPartialResults;<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    return this;<a name="line.865"></a>
+<span class="sourceLineNo">866</span>  }<a name="line.866"></a>
+<span class="sourceLineNo">867</span><a name="line.867"></a>
+<span class="sourceLineNo">868</span>  /**<a name="line.868"></a>
+<span class="sourceLineNo">869</span>   * @return true when the constructor of this scan understands that the results they will see may<a name="line.869"></a>
+<span class="sourceLineNo">870</span>   *         only represent a partial portion of a row. The entire row would be retrieved by<a name="line.870"></a>
+<span class="sourceLineNo">871</span>   *         subsequent calls to {@link ResultScanner#next()}<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   */<a name="line.872"></a>
+<span class="sourceLineNo">873</span>  public boolean getAllowPartialResults() {<a name="line.873"></a>
+<span class="sourceLineNo">874</span>    return allowPartialResults;<a name="line.874"></a>
+<span class="sourceLineNo">875</span>  }<a name="line.875"></a>
+<span class="sourceLineNo">876</span><a name="line.876"></a>
+<span class="sourceLineNo">877</span>  @Override<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  public Scan setLoadColumnFamiliesOnDemand(boolean value) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    return (Scan) super.setLoadColumnFamiliesOnDemand(value);<a name="line.879"></a>
+<span class="sourceLineNo">880</span>  }<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>  /**<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   * Compile the table and column family (i.e. schema) information<a name="line.883"></a>
+<span class="sourceLineNo">884</span>   * into a String. Useful for parsing and aggregation by debugging,<a name="line.884"></a>
+<span class="sourceLineNo">885</span>   * logging, and administration tools.<a name="line.885"></a>
+<span class="sourceLineNo">886</span>   * @return Map<a name="line.886"></a>
+<span class="sourceLineNo">887</span>   */<a name="line.887"></a>
+<span class="sourceLineNo">888</span>  @Override<a name="line.888"></a>
+<span class="sourceLineNo">889</span>  public Map&lt;String, Object&gt; getFingerprint() {<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    List&lt;String&gt; families = new ArrayList&lt;&gt;();<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    if(this.familyMap.isEmpty()) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      map.put("families", "ALL");<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      return map;<a name="line.894"></a>
+<span class="sourceLineNo">895</span>    } else {<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      map.put("families", families);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    }<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    for (Map.Entry&lt;byte [], NavigableSet&lt;byte[]&gt;&gt; entry :<a name="line.898"></a>
+<span class="sourceLineNo">899</span>        this.familyMap.entrySet()) {<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      families.add(Bytes.toStringBinary(entry.getKey()));<a name="line.900"></a>
+<span class="sourceLineNo">901</span>    }<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    return map;<a name="line.902"></a>
+<span class="sourceLineNo">903</span>  }<a name="line.903"></a>
+<span class="sourceLineNo">904</span><a name="line.904"></a>
+<span class="sourceLineNo">905</span>  /**<a name="line.905"></a>
+<span class="sourceLineNo">906</span>   * Compile the details beyond the scope of getFingerprint (row, columns,<a name="line.906"></a>
+<span class="sourceLineNo">907</span>   * timestamps, etc.) into a Map along with the fingerprinted information.<a name="line.907"></a>
+<span class="sourceLineNo">908</span>   * Useful for debugging, logging, and administration tools.<a name="line.908"></a>
+<span class="sourceLineNo">909</span>   * @param maxCols a limit on the number of columns output prior to truncation<a name="line.909"></a>
+<span class="sourceLineNo">910</span>   * @return Map<a name="line.910"></a>
+<span class="sourceLineNo">911</span>   */<a name="line.911"></a>
+<span class="sourceLineNo">912</span>  @Override<a name="line.912"></a>
+<span class="sourceLineNo">913</span>  public Map&lt;String, Object&gt; toMap(int maxCols) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    // start with the fingerpring map and build on top of it<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    Map&lt;String, Object&gt; map = getFingerprint();<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    // map from families to column list replaces fingerprint's list of families<a name="line.916"></a>
+<span class="sourceLineNo">917</span>    Map&lt;String, List&lt;String&gt;&gt; familyColumns = new HashMap&lt;&gt;();<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    map.put("families", familyColumns);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    // add scalar information first<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    map.put("startRow", Bytes.toStringBinary(this.startRow));<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    map.put("stopRow", Bytes.toStringBinary(this.stopRow));<a name="line.921"></a>
+<span class="sourceLineNo">922</span>    map.put("maxVersions", this.maxVersions);<a name="line.922"></a>
+<span class="sourceLineNo">923</span>    map.put("batch", this.batch);<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    map.put("caching", this.caching);<a name="line.924"></a>
+<span class="sourceLineNo">925</span>    map.put("maxResultSize", this.maxResultSize);<a name="line.925"></a>
+<span class="sourceLineNo">926</span>    map.put("cacheBlocks", this.cacheBlocks);<a name="line.926"></a>
+<span class="sourceLineNo">927</span>    map.put("loadColumnFamiliesOnDemand", this.loadColumnFamiliesOnDemand);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    List&lt;Long&gt; timeRange = new ArrayList&lt;&gt;(2);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>    timeRange.add(this.tr.getMin());<a name="line.929"></a>
+<span class="sourceLineNo">930</span>    timeRange.add(this.tr.getMax());<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    map.put("timeRange", timeRange);<a name="line.931"></a>
+<span class="sourceLineNo">932</span>    int colCount = 0;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>    // iterate through affected families and list out up to maxCols columns<a name="line.933"></a>
+<span class="sourceLineNo">934</span>    for (Map.Entry&lt;byte [], NavigableSet&lt;byte[]&gt;&gt; entry :<a name="line.934"></a>
+<span class="sourceLineNo">935</span>      this.familyMap.entrySet()) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>      List&lt;String&gt; columns = new ArrayList&lt;&gt;();<a name="line.936"></a>
+<span class="sourceLineNo">937</span>      familyColumns.put(Bytes.toStringBinary(entry.getKey()), columns);<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      if(entry.getValue() == null) {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>        colCount++;<a name="line.939"></a>
+<span class="sourceLineNo">940</span>        --maxCols;<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        columns.add("ALL");<a name="line.941"></a>
+<span class="sourceLineNo">942</span>      } else {<a name="line.942"></a>
+<span class="sourceLineNo">943</span>        colCount += entry.getValue().size();<a name="line.943"></a>
+<span class="sourceLineNo">944</span>        if (maxCols &lt;= 0) {<a name="line.944"></a>
+<span class="sourceLineNo">945</span>          continue;<a name="line.945"></a>
+<span class="sourceLineNo">946</span>        }<a name="line.946"></a>
+<span class="sourceLineNo">947</span>        for (byte [] column : entry.getValue()) {<a name="line.947"></a>
+<span class="sourceLineNo">948</span>          if (--maxCols &lt;= 0) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>            continue;<a name="line.949"></a>
+<span class="sourceLineNo">950</span>          }<a name="line.950"></a>
+<span class="sourceLineNo">951</span>          columns.add(Bytes.toStringBinary(column));<a name="line.951"></a>
+<span class="sourceLineNo">952</span>        }<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      }<a name="line.953"></a>
+<span class="sourceLineNo">954</span>    }<a name="line.954"></a>
+<span class="sourceLineNo">955</span>    map.put("totalColumns", colCount);<a name="line.955"></a>
+<span class="sourceLineNo">956</span>    if (this.filter != null) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>      map.put("filter", this.filter.toString());<a name="line.957"></a>
+<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
+<span class="sourceLineNo">959</span>    // add the id if set<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    if (getId() != null) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span>      map.put("id", getId());<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span>    return map;<a name="line.963"></a>
+<span class="sourceLineNo">964</span>  }<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>  /**<a name="line.966"></a>
+<span class="sourceLineNo">967</span>   * Enable/disable "raw" mode for this scan.<a name="line.967"></a>
+<span class="sourceLineNo">968</span>   * If "raw" is enabled the scan will return all<a name="line.968"></a>
+<span class="sourceLineNo">969</span>   * delete marker and deleted rows that have not<a name="line.969"></a>
+<span class="sourceLineNo">970</span>   * been collected, yet.<a name="line.970"></a>
+<span class="sourceLineNo">971</span>   * This is mostly useful for Scan on column families<a name="line.971"></a>
+<span class="sourceLineNo">972</span>   * that have KEEP_DELETED_ROWS enabled.<a name="line.972"></a>
+<span class="sourceLineNo">973</span>   * It is an error to specify any column when "raw" is set.<a name="line.973"></a>
+<span class="sourceLineNo">974</span>   * @param raw True/False to enable/disable "raw" mode.<a name="line.974"></a>
+<span class="sourceLineNo">975</span>   */<a name="line.975"></a>
+<span class="sourceLineNo">976</span>  public Scan setRaw(boolean raw) {<a name="line.976"></a>
+<span class="sourceLineNo">977</span>    setAttribute(RAW_ATTR, Bytes.toBytes(raw));<a name="line.977"></a>
+<span class="sourceLineNo">978</span>    return this;<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  }<a name="line.979"></a>
+<span class="sourceLineNo">980</span><a name="line.980"></a>
+<span class="sourceLineNo">981</span>  /**<a name="line.981"></a>
+<span class="sourceLineNo">982</span>   * @return True if this Scan is in "raw" mode.<a name="line.982"></a>
+<span class="sourceLineNo">983</span>   */<a name="line.983"></a>
+<span class="sourceLineNo">984</span>  public boolean isRaw() {<a name="line.984"></a>
+<span class="sourceLineNo">985</span>    byte[] attr = getAttribute(RAW_ATTR);<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    return attr == null ? false : Bytes.toBoolean(attr);<a name="line.986"></a>
+<span class="sourceLineNo">987</span>  }<a name="line.987"></a>
+<span class="sourceLineNo">988</span><a name="line.988"></a>
+<span class="sourceLineNo">989</span>  /**<a name="line.989"></a>
+<span class="sourceLineNo">990</span>   * Set whether this scan is a small scan<a name="line.990"></a>
+<span class="sourceLineNo">991</span>   * &lt;p&gt;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>   * Small scan should use pread and big scan can use seek + read seek + read is fast but can cause<a name="line.992"></a>
+<span class="sourceLineNo">993</span>   * two problem (1) resource contention (2) cause too much network io [89-fb] Using pread for<a name="line.993"></a>
+<span class="sourceLineNo">994</span>   * non-compaction read request https://issues.apache.org/jira/browse/HBASE-7266 On the other hand,<a name="line.994"></a>
+<span class="sourceLineNo">995</span>   * if setting it true, we would do openScanner,next,closeScanner in one RPC call. It means the<a name="line.995"></a>
+<span class="sourceLineNo">996</span>   * better performance for small scan. [HBASE-9488]. Generally, if the scan range is within one<a name="line.996"></a>
+<span class="sourceLineNo">997</span>   * data block(64KB), it could be considered as a small scan.<a name="line.997"></a>
+<span class="sourceLineNo">998</span>   * @param small<a name="line.998"></a>
+<span class="sourceLineNo">999</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use {@link #setLimit(int)} and<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>   *   {@link #setReadType(ReadType)} instead. And for the one rpc optimization, now we will also<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>   *   fetch data when openScanner, and if the number of rows reaches the limit then we will close<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>   *   the scanner automatically which means we will fall back to one rpc.<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>   * @see #setLimit(int)<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>   * @see #setReadType(ReadType)<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17045"&gt;HBASE-17045&lt;/a&gt;<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>   */<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>  @Deprecated<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>  public Scan setSmall(boolean small) {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    this.small = small;<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>    this.readType = ReadType.PREAD;<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    return this;<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>  }<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span><a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>  /**<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>   * Get whether this scan is a small scan<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>   * @return true if small scan<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. See the comment of<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>   *   {@link #setSmall(boolean)}<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-17045"&gt;HBASE-17045&lt;/a&gt;<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>   */<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>  @Deprecated<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>  public boolean isSmall() {<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    return small;<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>  }<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span><a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>  @Override<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>  public Scan setAttribute(String name, byte[] value) {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>    return (Scan) super.setAttribute(name, value);<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>  }<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span><a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>  @Override<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>  public Scan setId(String id) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    return (Scan) super.setId(id);<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>  }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>  @Override<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>  public Scan setAuthorizations(Authorizations authorizations) {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    return (Scan) super.setAuthorizations(authorizations);<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>  }<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span><a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>  @Override<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>  public Scan setACL(Map&lt;String, Permission&gt; perms) {<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>    return (Scan) super.setACL(perms);<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>  }<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span><a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>  @Override<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>  public Scan setACL(String user, Permission perms) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>    return (Scan) super.setACL(user, perms);<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>  }<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span><a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>  @Override<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>  public Scan setConsistency(Consistency consistency) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    return (Scan) super.setConsistency(consistency);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>  @Override<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>  public Scan setReplicaId(int Id) {<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    return (Scan) super.setReplicaId(Id);<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>  }<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span><a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  @Override<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>  public Scan setIsolationLevel(IsolationLevel level) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    return (Scan) super.setIsolationLevel(level);<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>  }<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span><a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>  @Override<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>  public Scan setPriority(int priority) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    return (Scan) super.setPriority(priority);<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>  }<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span><a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>  /**<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>   * Enable collection of {@link ScanMetrics}. For advanced users.<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>   * @param enabled Set to true to enable accumulating scan metrics<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>   */<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>  public Scan setScanMetricsEnabled(final boolean enabled) {<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    setAttribute(Scan.SCAN_ATTRIBUTES_METRICS_ENABLE, Bytes.toBytes(Boolean.valueOf(enabled)));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>    return this;<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>  }<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span><a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>  /**<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>   * @return True if collection of scan metrics is enabled. For advanced users.<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>   */<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>  public boolean isScanMetricsEnabled() {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    byte[] attr = getAttribute(Scan.SCAN_ATTRIBUTES_METRICS_ENABLE);<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    return attr == null ? false : Bytes.toBoolean(attr);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>  }<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span><a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>  public Boolean isAsyncPrefetch() {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>    return asyncPrefetch;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>  }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span><a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>  /**<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>   * @deprecated Since 3.0.0, will be removed in 4.0.0. After building sync client upon async<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>   *             client, the implementation is always 'async prefetch', so this flag is useless now.<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>   */<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>  @Deprecated<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>  public Scan setAsyncPrefetch(boolean asyncPrefetch) {<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    this.asyncPrefetch = asyncPrefetch;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    return this;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  }<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span><a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>  /**<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>   * @return the limit of rows for this scan<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>   */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>  public int getLimit() {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    return limit;<a name="line.1106"></a>
 <span class="sourceLineNo">1107</span>  }<a name="line.1107"></a>
 <span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  @Override<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  public Scan setPriority(int priority) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    return (Scan) super.setPriority(priority);<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>  /**<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>   * Enable collection of {@link ScanMetrics}. For advanced users.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>   * @param enabled Set to true to enable accumulating scan metrics<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>   */<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>  public Scan setScanMetricsEnabled(final boolean enabled) {<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    setAttribute(Scan.SCAN_ATTRIBUTES_METRICS_ENABLE, Bytes.toBytes(Boolean.valueOf(enabled)));<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    return this;<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>  }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span><a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  /**<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>   * @return True if collection of scan metrics is enabled. For advanced users.<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>   */<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>  public boolean isScanMetricsEnabled() {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    byte[] attr = getAttribute(Scan.SCAN_ATTRIBUTES_METRICS_ENABLE);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    return attr == null ? false : Bytes.toBoolean(attr);<a name="line.1128"></a>
+<span class="sourceLineNo">1109</span>  /**<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>   * Set the limit of rows for this scan. We will terminate the scan if the number of returned rows<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>   * reaches this value.<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>   * &lt;p&gt;<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>   * This condition will be tested at last, after all other conditions such as stopRow, filter, etc.<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>   * @param limit the limit of rows for this scan<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>   * @return this<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>   */<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>  public Scan setLimit(int limit) {<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    this.limit = limit;<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    return this;<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>  }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span><a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>  /**<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>   * Call this when you only want to get one row. It will set {@code limit} to {@code 1}, and also<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>   * set {@code readType} to {@link ReadType#PREAD}.<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>   * @return this<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>   */<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>  public Scan setOneRowLimit() {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    return setLimit(1).setReadType(ReadType.PREAD);<a name="line.1128"></a>
 <span class="sourceLineNo">1129</span>  }<a name="line.1129"></a>
 <span class="sourceLineNo">1130</span><a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>  public Boolean isAsyncPrefetch() {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    return asyncPrefetch;<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>  }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>  /**<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>   * @deprecated Since 3.0.0, will be removed in 4.0.0. After building sync client upon async<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>   *             client, the implementation is always 'async prefetch', so this flag is useless now.<a name="line.1137"></a>
+<span class="sourceLineNo">1131</span>  @InterfaceAudience.Public<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>  public enum ReadType {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    DEFAULT, STREAM, PREAD<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>  }<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span><a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>  /**<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>   * @return the read type for this scan<a name="line.1137"></a>
 <span class="sourceLineNo">1138</span>   */<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  @Deprecated<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>  public Scan setAsyncPrefetch(boolean asyncPrefetch) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    this.asyncPrefetch = asyncPrefetch;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>    return this;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  }<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span><a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>  /**<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>   * @return the limit of rows for this scan<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>   */<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>  public int getLimit() {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    return limit;<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>  }<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span><a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>  /**<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>   * Set the limit of rows for this scan. We will terminate the scan if the number of returned rows<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>   * reaches this value.<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>   * &lt;p&gt;<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>   * This condition will be tested at last, after all other conditions such as stopRow, filter, etc.<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>   * @param limit the limit of rows for this scan<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>   * @return this<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>   */<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>  public Scan setLimit(int limit) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    this.limit = limit;<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>    return this;<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>  }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span><a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>  /**<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>   * Call this when you only want to get one row. It will set {@code limit} to {@code 1}, and also<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>   * set {@code readType} to {@link ReadType#PREAD}.<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>   * @return this<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>   */<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  public Scan setOneRowLimit() {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    return setLimit(1).setReadType(ReadType.PREAD);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>  }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span><a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  @InterfaceAudience.Public<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>  public enum ReadType {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    DEFAULT, STREAM, PREAD<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>  }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>  /**<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>   * @return the read type for this scan<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>   */<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>  public ReadType getReadType() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    return readType;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>  }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>  /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>   * Set the read type for this scan.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>   * &lt;p&gt;<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>   * Notice that we may choose to use pread even if you specific {@link ReadType#STREAM} here. For<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>   * example, we will always use pread if this is a get scan.<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>   * @return this<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>   */<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>  public Scan setReadType(ReadType readType) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>    this.readType = readType;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    return this;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>  }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span><a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>  /**<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>   * Get the mvcc read point used to open a scanner.<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>   */<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>  long getMvccReadPoint() {<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    return mvccReadPoint;<a name="line.1202"></a>
+<span class="sourceLineNo">1139</span>  public ReadType getReadType() {<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    return readType;<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>  }<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span><a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>  /**<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>   * Set the read type for this scan.<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>   * &lt;p&gt;<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>   * Notice that we may choose to use pread even if you specific {@link ReadType#STREAM} here. For<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>   * example, we will always use pread if this is a get scan.<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   * @return this<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>   */<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>  public Scan setReadType(ReadType readType) {<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    this.readType = readType;<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    return this;<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>  }<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span><a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>  /**<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>   * Get the mvcc read point used to open a scanner.<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>   */<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>  long getMvccReadPoint() {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    return mvccReadPoint;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>  }<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span><a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>  /**<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>   * Set the mvcc read point used to open a scanner.<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>   */<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>  Scan setMvccReadPoint(long mvccReadPoint) {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>    this.mvccReadPoint = mvccReadPoint;<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    return this;<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span><a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>   * Set the mvcc read point to -1 which means do not use it.<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>   */<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>  Scan resetMvccReadPoint() {<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    return setMvccReadPoint(-1L);<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>  }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>  /**<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>   * When the server is slow or we scan a table with many deleted data or we use a sparse filter,<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>   * the server will response heartbeat to prevent timeout. However the scanner will return a Result<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>   * only when client can do it. So if there are many heartbeats, the blocking time on<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>   * ResultScanner#next() may be very long, which is not friendly to online services.<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>   *<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>   * Set this to true then you can get a special Result whose #isCursor() returns true and is not<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>   * contains any real data. It only tells you where the server has scanned. You can call next<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>   * to continue scanning or open a new scanner with this row key as start row whenever you want.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>   *<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>   * Users can get a cursor when and only when there is a response from the server but we can not<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>   * return a Result to users, for example, this response is a heartbeat or there are partial cells<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>   * but users do not allow partial result.<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>   *<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>   * Now the cursor is in row level which means the special Result will only contains a row key.<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>   * {@link Result#isCursor()}<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>   * {@link Result#getCursor()}<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>   * {@link Cursor}<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>   */<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>  public Scan setNeedCursorResult(boolean needCursorResult) {<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    this.needCursorResult = needCursorResult;<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    return this;<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>  }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span><a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>  public boolean isNeedCursorResult() {<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    return needCursorResult;<a name="line.1202"></a>
 <span class="sourceLineNo">1203</span>  }<a name="line.1203"></a>
 <span class="sourceLineNo">1204</span><a name="line.1204"></a>
 <span class="sourceLineNo">1205</span>  /**<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   * Set the mvcc read point used to open a scanner.<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>   */<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  Scan setMvccReadPoint(long mvccReadPoint) {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>    this.mvccReadPoint = mvccReadPoint;<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    return this;<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>  }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span><a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>  /**<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>   * Set the mvcc read point to -1 which means do not use it.<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>   */<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>  Scan resetMvccReadPoint() {<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    return setMvccReadPoint(-1L);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>  }<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>  /**<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   * When the server is slow or we scan a table with many deleted data or we use a sparse filter,<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>   * the server will response heartbeat to prevent timeout. However the scanner will return a Result<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>   * only when client can do it. So if there are many heartbeats, the blocking time on<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>   * ResultScanner#next() may be very long, which is not friendly to online services.<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>   *<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>   * Set this to true then you can get a special Result whose #isCursor() returns true and is not<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * contains any real data. It only tells you where the server has scanned. You can call next<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * to continue scanning or open a new scanner with this row key as start row whenever you want.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   *<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>   * Users can get a cursor when and only when there is a response from the server but we can not<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>   * return a Result to users, for example, this response is a heartbeat or there are partial cells<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>   * but users do not allow partial result.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>   *<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>   * Now the cursor is in row level which means the special Result will only contains a row key.<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>   * {@link Result#isCursor()}<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>   * {@link Result#getCursor()}<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>   * {@link Cursor}<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>   */<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  public Scan setNeedCursorResult(boolean needCursorResult) {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    this.needCursorResult = needCursorResult;<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    return this;<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>  }<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span><a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>  public boolean isNeedCursorResult() {<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    return needCursorResult;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>  }<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span><a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  /**<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>   * Create a new Scan with a cursor. It only set the position information like start row key.<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>   * The others (like cfs, stop row, limit) should still be filled in by the user.<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>   * {@link Result#isCursor()}<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>   * {@link Result#getCursor()}<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>   * {@link Cursor}<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>   */<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>  public static Scan createScanFromCursor(Cursor cursor) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    return new Scan().withStartRow(cursor.getRow());<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>  }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>}<a name="line.1258"></a>
+<span class="sourceLineNo">1206</span>   * Create a new Scan with a cursor. It only set the position information like start row key.<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>   * The others (like cfs, stop row, limit) should still be filled in by the user.<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>   * {@link Result#isCursor()}<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>   * {@link Result#getCursor()}<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>   * {@link Cursor}<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>   */<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>  public static Scan createScanFromCursor(Cursor cursor) {<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    return new Scan().withStartRow(cursor.getRow());<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>  }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>}<a name="line.1215"></a>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html b/apidocs/src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html
index 594ad61..d5289be 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.RowRange.html
@@ -34,724 +34,752 @@
 <span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.26"></a>
 <span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.HConstants;<a name="line.27"></a>
 <span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.PrivateCellUtil;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.29"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.client.ClientUtil;<a name="line.29"></a>
 <span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.exceptions.DeserializationException;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.FilterProtos;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.34"></a>
-<span class="sourceLineNo">035</span><a name="line.35"></a>
-<span class="sourceLineNo">036</span>/**<a name="line.36"></a>
-<span class="sourceLineNo">037</span> * Filter to support scan multiple row key ranges. It can construct the row key ranges from the<a name="line.37"></a>
-<span class="sourceLineNo">038</span> * passed list which can be accessed by each region server.<a name="line.38"></a>
-<span class="sourceLineNo">039</span> *<a name="line.39"></a>
-<span class="sourceLineNo">040</span> * HBase is quite efficient when scanning only one small row key range. If user needs to specify<a name="line.40"></a>
-<span class="sourceLineNo">041</span> * multiple row key ranges in one scan, the typical solutions are: 1. through FilterList which is a<a name="line.41"></a>
-<span class="sourceLineNo">042</span> * list of row key Filters, 2. using the SQL layer over HBase to join with two table, such as hive,<a name="line.42"></a>
-<span class="sourceLineNo">043</span> * phoenix etc. However, both solutions are inefficient. Both of them can't utilize the range info<a name="line.43"></a>
-<span class="sourceLineNo">044</span> * to perform fast forwarding during scan which is quite time consuming. If the number of ranges<a name="line.44"></a>
-<span class="sourceLineNo">045</span> * are quite big (e.g. millions), join is a proper solution though it is slow. However, there are<a name="line.45"></a>
-<span class="sourceLineNo">046</span> * cases that user wants to specify a small number of ranges to scan (e.g. &amp;lt;1000 ranges). Both<a name="line.46"></a>
-<span class="sourceLineNo">047</span> * solutions can't provide satisfactory performance in such case. MultiRowRangeFilter is to support<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * such usec ase (scan multiple row key ranges), which can construct the row key ranges from user<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * specified list and perform fast-forwarding during scan. Thus, the scan will be quite efficient.<a name="line.49"></a>
-<span class="sourceLineNo">050</span> */<a name="line.50"></a>
-<span class="sourceLineNo">051</span>@InterfaceAudience.Public<a name="line.51"></a>
-<span class="sourceLineNo">052</span>public class MultiRowRangeFilter extends FilterBase {<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private static final int ROW_BEFORE_FIRST_RANGE = -1;<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private final List&lt;RowRange&gt; rangeList;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>  private final RangeIteration ranges;<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>  private boolean done = false;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>  private int index;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private BasicRowRange range;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  private ReturnCode currentReturnCode;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  /**<a name="line.64"></a>
-<span class="sourceLineNo">065</span>   * @param list A list of &lt;code&gt;RowRange&lt;/code&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>   */<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  public MultiRowRangeFilter(List&lt;RowRange&gt; list) {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    // We don't use rangeList anywhere else, but keeping it lets us pay a little<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    // memory to avoid touching the serialization logic.<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    this.rangeList = Collections.unmodifiableList(sortAndMerge(list));<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    this.ranges = new RangeIteration(rangeList);<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  }<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>  public List&lt;RowRange&gt; getRowRanges() {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    // Used by hbase-rest<a name="line.75"></a>
-<span class="sourceLineNo">076</span>    return this.rangeList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  }<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  @Override<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  public boolean filterAllRemaining() {<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    return done;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  }<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>  @Override<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  public boolean filterRowKey(Cell firstRowCell) {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    if (filterAllRemaining()) return true;<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>    // N.b. We can only do this after we're iterating over records. If we try to do<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    // it before, the Scan (and this filter) may not yet be fully initialized. This is a<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    // wart on Filter and something that'd be nice to clean up (like CP's in HBase2.0)<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    if (!ranges.isInitialized()) {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      ranges.initialize(isReversed());<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>    // If it is the first time of running, calculate the current range index for<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    // the row key. If index is out of bound which happens when the start row<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    // user sets is after the largest stop row of the ranges, stop the scan.<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    // If row key is after the current range, find the next range and update index.<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    byte[] rowArr = firstRowCell.getRowArray();<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    int length = firstRowCell.getRowLength();<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    int offset = firstRowCell.getRowOffset();<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    if (!ranges.hasFoundFirstRange() || !range.contains(rowArr, offset, length)) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      byte[] rowkey = CellUtil.cloneRow(firstRowCell);<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      index = ranges.getNextRangeIndex(rowkey);<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      if (ranges.isIterationComplete(index)) {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>        done = true;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>        currentReturnCode = ReturnCode.NEXT_ROW;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>        return false;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      }<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      if(index != ROW_BEFORE_FIRST_RANGE) {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        range = ranges.get(index);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      } else {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>        range = ranges.get(0);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      }<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      if (ranges.isExclusive()) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>        ranges.resetExclusive();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        currentReturnCode = ReturnCode.NEXT_ROW;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        return false;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      }<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      if (!ranges.hasFoundFirstRange()) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>        if(index != ROW_BEFORE_FIRST_RANGE) {<a name="line.121"></a>
-<span class="sourceLineNo">122</span>          currentReturnCode = ReturnCode.INCLUDE;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>        } else {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>          currentReturnCode = ReturnCode.SEEK_NEXT_USING_HINT;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>        }<a name="line.125"></a>
-<span class="sourceLineNo">126</span>        ranges.setFoundFirstRange();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      } else {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>        if (range.contains(rowArr, offset, length)) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          currentReturnCode = ReturnCode.INCLUDE;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>        } else {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>          currentReturnCode = ReturnCode.SEEK_NEXT_USING_HINT;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>        }<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      }<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    } else {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      currentReturnCode = ReturnCode.INCLUDE;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    return false;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  @Override<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public ReturnCode filterCell(final Cell ignored) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    return currentReturnCode;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  public Cell getNextCellHint(Cell currentKV) {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    // skip to the next range's start row<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    // #getComparisonData lets us avoid the `if (reversed)` branch<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    byte[] comparisonData = range.getComparisonData();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    return PrivateCellUtil.createFirstOnRow(comparisonData, 0, (short) comparisonData.length);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * @return The filter serialized using pb<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   */<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  @Override<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  public byte[] toByteArray() {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    FilterProtos.MultiRowRangeFilter.Builder builder = FilterProtos.MultiRowRangeFilter<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        .newBuilder();<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    for (RowRange range : rangeList) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      if (range != null) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        FilterProtos.RowRange.Builder rangebuilder = FilterProtos.RowRange.newBuilder();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        if (range.startRow != null)<a name="line.163"></a>
-<span class="sourceLineNo">164</span>          rangebuilder.setStartRow(UnsafeByteOperations.unsafeWrap(range.startRow));<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        rangebuilder.setStartRowInclusive(range.startRowInclusive);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        if (range.stopRow != null)<a name="line.166"></a>
-<span class="sourceLineNo">167</span>          rangebuilder.setStopRow(UnsafeByteOperations.unsafeWrap(range.stopRow));<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        rangebuilder.setStopRowInclusive(range.stopRowInclusive);<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        builder.addRowRangeList(rangebuilder.build());<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      }<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    }<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    return builder.build().toByteArray();<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>  /**<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * @param pbBytes A pb serialized instance<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * @return An instance of MultiRowRangeFilter<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   * @throws org.apache.hadoop.hbase.exceptions.DeserializationException<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   */<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public static MultiRowRangeFilter parseFrom(final byte[] pbBytes)<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      throws DeserializationException {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    FilterProtos.MultiRowRangeFilter proto;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    try {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      proto = FilterProtos.MultiRowRangeFilter.parseFrom(pbBytes);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    } catch (InvalidProtocolBufferException e) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      throw new DeserializationException(e);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    int length = proto.getRowRangeListCount();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    List&lt;FilterProtos.RowRange&gt; rangeProtos = proto.getRowRangeListList();<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    List&lt;RowRange&gt; rangeList = new ArrayList&lt;&gt;(length);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    for (FilterProtos.RowRange rangeProto : rangeProtos) {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      RowRange range = new RowRange(rangeProto.hasStartRow() ? rangeProto.getStartRow()<a name="line.192"></a>
-<span class="sourceLineNo">193</span>          .toByteArray() : null, rangeProto.getStartRowInclusive(), rangeProto.hasStopRow() ?<a name="line.193"></a>
-<span class="sourceLineNo">194</span>              rangeProto.getStopRow().toByteArray() : null, rangeProto.getStopRowInclusive());<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      rangeList.add(range);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    }<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    return new MultiRowRangeFilter(rangeList);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  }<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  /**<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   * @param o the filter to compare<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * @return true if and only if the fields of the filter that are serialized are equal to the<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   *         corresponding fields in other. Used for testing.<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  @Override<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  boolean areSerializedFieldsEqual(Filter o) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    if (o == this)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      return true;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    if (!(o instanceof MultiRowRangeFilter))<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      return false;<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    MultiRowRangeFilter other = (MultiRowRangeFilter) o;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    if (this.rangeList.size() != other.rangeList.size())<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      return false;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    for (int i = 0; i &lt; rangeList.size(); ++i) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      RowRange thisRange = this.rangeList.get(i);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      RowRange otherRange = other.rangeList.get(i);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      if (!(Bytes.equals(thisRange.startRow, otherRange.startRow) &amp;&amp; Bytes.equals(<a name="line.218"></a>
-<span class="sourceLineNo">219</span>          thisRange.stopRow, otherRange.stopRow) &amp;&amp; (thisRange.startRowInclusive ==<a name="line.219"></a>
-<span class="sourceLineNo">220</span>          otherRange.startRowInclusive) &amp;&amp; (thisRange.stopRowInclusive ==<a name="line.220"></a>
-<span class="sourceLineNo">221</span>          otherRange.stopRowInclusive))) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        return false;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      }<a name="line.223"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.FilterProtos;<a name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>/**<a name="line.37"></a>
+<span class="sourceLineNo">038</span> * Filter to support scan multiple row key ranges. It can construct the row key ranges from the<a name="line.38"></a>
+<span class="sourceLineNo">039</span> * passed list which can be accessed by each region server.<a name="line.39"></a>
+<span class="sourceLineNo">040</span> *<a name="line.40"></a>
+<span class="sourceLineNo">041</span> * HBase is quite efficient when scanning only one small row key range. If user needs to specify<a name="line.41"></a>
+<span class="sourceLineNo">042</span> * multiple row key ranges in one scan, the typical solutions are: 1. through FilterList which is a<a name="line.42"></a>
+<span class="sourceLineNo">043</span> * list of row key Filters, 2. using the SQL layer over HBase to join with two table, such as hive,<a name="line.43"></a>
+<span class="sourceLineNo">044</span> * phoenix etc. However, both solutions are inefficient. Both of them can't utilize the range info<a name="line.44"></a>
+<span class="sourceLineNo">045</span> * to perform fast forwarding during scan which is quite time consuming. If the number of ranges<a name="line.45"></a>
+<span class="sourceLineNo">046</span> * are quite big (e.g. millions), join is a proper solution though it is slow. However, there are<a name="line.46"></a>
+<span class="sourceLineNo">047</span> * cases that user wants to specify a small number of ranges to scan (e.g. &amp;lt;1000 ranges). Both<a name="line.47"></a>
+<span class="sourceLineNo">048</span> * solutions can't provide satisfactory performance in such case. MultiRowRangeFilter is to support<a name="line.48"></a>
+<span class="sourceLineNo">049</span> * such usec ase (scan multiple row key ranges), which can construct the row key ranges from user<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * specified list and perform fast-forwarding during scan. Thus, the scan will be quite efficient.<a name="line.50"></a>
+<span class="sourceLineNo">051</span> */<a name="line.51"></a>
+<span class="sourceLineNo">052</span>@InterfaceAudience.Public<a name="line.52"></a>
+<span class="sourceLineNo">053</span>public class MultiRowRangeFilter extends FilterBase {<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>  private static final int ROW_BEFORE_FIRST_RANGE = -1;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private final List&lt;RowRange&gt; rangeList;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  private final RangeIteration ranges;<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>  private boolean done = false;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>  private int index;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private BasicRowRange range;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  private ReturnCode currentReturnCode;<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  /**<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * @param list A list of &lt;code&gt;RowRange&lt;/code&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   */<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  public MultiRowRangeFilter(List&lt;RowRange&gt; list) {<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    // We don't use rangeList anywhere else, but keeping it lets us pay a little<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    // memory to avoid touching the serialization logic.<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    this.rangeList = Collections.unmodifiableList(sortAndMerge(list));<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    this.ranges = new RangeIteration(rangeList);<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  }<a name="line.73"></a>
+<span class="sourceLineNo">074</span><a name="line.74"></a>
+<span class="sourceLineNo">075</span>  /**<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * Constructor for creating a &lt;code&gt;MultiRowRangeFilter&lt;/code&gt; from multiple rowkey prefixes.<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   *<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   * As &lt;code&gt;MultiRowRangeFilter&lt;/code&gt; javadoc says (See the solution 1 of the first statement),<a name="line.78"></a>
+<span class="sourceLineNo">079</span>   * if you try to create a filter list that scans row keys corresponding to given prefixes (e.g.,<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   * &lt;code&gt;FilterList&lt;/code&gt; composed of multiple &lt;code&gt;PrefixFilter&lt;/code&gt;s), this constructor<a name="line.80"></a>
+<span class="sourceLineNo">081</span>   * provides a way to avoid creating an inefficient one.<a name="line.81"></a>
+<span class="sourceLineNo">082</span>   *<a name="line.82"></a>
+<span class="sourceLineNo">083</span>   * @param rowKeyPrefixes the array of byte array<a name="line.83"></a>
+<span class="sourceLineNo">084</span>   */<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  public MultiRowRangeFilter(byte[][] rowKeyPrefixes) {<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    this(createRangeListFromRowKeyPrefixes(rowKeyPrefixes));<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  }<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  private static List&lt;RowRange&gt; createRangeListFromRowKeyPrefixes(byte[][] rowKeyPrefixes) {<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    if (rowKeyPrefixes == null) {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      throw new IllegalArgumentException("Invalid rowkey prefixes");<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>    List&lt;RowRange&gt; list = new ArrayList&lt;&gt;();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    for (byte[] rowKeyPrefix: rowKeyPrefixes) {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      byte[] stopRow = ClientUtil.calculateTheClosestNextRowKeyForPrefix(rowKeyPrefix);<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      list.add(new RowRange(rowKeyPrefix, true, stopRow, false));<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    }<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    return list;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  }<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>  public List&lt;RowRange&gt; getRowRanges() {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    // Used by hbase-rest<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    return this.rangeList;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  @Override<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public boolean filterAllRemaining() {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    return done;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  }<a name="line.110"></a>
+<span class="sourceLineNo">111</span><a name="line.111"></a>
+<span class="sourceLineNo">112</span>  @Override<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  public boolean filterRowKey(Cell firstRowCell) {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    if (filterAllRemaining()) return true;<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    // N.b. We can only do this after we're iterating over records. If we try to do<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    // it before, the Scan (and this filter) may not yet be fully initialized. This is a<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    // wart on Filter and something that'd be nice to clean up (like CP's in HBase2.0)<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    if (!ranges.isInitialized()) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      ranges.initialize(isReversed());<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    }<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>    // If it is the first time of running, calculate the current range index for<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    // the row key. If index is out of bound which happens when the start row<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    // user sets is after the largest stop row of the ranges, stop the scan.<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    // If row key is after the current range, find the next range and update index.<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    byte[] rowArr = firstRowCell.getRowArray();<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    int length = firstRowCell.getRowLength();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    int offset = firstRowCell.getRowOffset();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    if (!ranges.hasFoundFirstRange() || !range.contains(rowArr, offset, length)) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      byte[] rowkey = CellUtil.cloneRow(firstRowCell);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      index = ranges.getNextRangeIndex(rowkey);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      if (ranges.isIterationComplete(index)) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        done = true;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>        currentReturnCode = ReturnCode.NEXT_ROW;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>        return false;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      }<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      if(index != ROW_BEFORE_FIRST_RANGE) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        range = ranges.get(index);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      } else {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        range = ranges.get(0);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      }<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      if (ranges.isExclusive()) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        ranges.resetExclusive();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        currentReturnCode = ReturnCode.NEXT_ROW;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>        return false;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      }<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      if (!ranges.hasFoundFirstRange()) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>        if(index != ROW_BEFORE_FIRST_RANGE) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>          currentReturnCode = ReturnCode.INCLUDE;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        } else {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>          currentReturnCode = ReturnCode.SEEK_NEXT_USING_HINT;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        }<a name="line.153"></a>
+<span class="sourceLineNo">154</span>        ranges.setFoundFirstRange();<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      } else {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>        if (range.contains(rowArr, offset, length)) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          currentReturnCode = ReturnCode.INCLUDE;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        } else {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>          currentReturnCode = ReturnCode.SEEK_NEXT_USING_HINT;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        }<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      }<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    } else {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      currentReturnCode = ReturnCode.INCLUDE;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    return false;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span><a name="line.167"></a>
+<span class="sourceLineNo">168</span>  @Override<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public ReturnCode filterCell(final Cell ignored) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    return currentReturnCode;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public Cell getNextCellHint(Cell currentKV) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    // skip to the next range's start row<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    // #getComparisonData lets us avoid the `if (reversed)` branch<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    byte[] comparisonData = range.getComparisonData();<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    return PrivateCellUtil.createFirstOnRow(comparisonData, 0, (short) comparisonData.length);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span>  /**<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @return The filter serialized using pb<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   */<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  @Override<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  public byte[] toByteArray() {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    FilterProtos.MultiRowRangeFilter.Builder builder = FilterProtos.MultiRowRangeFilter<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        .newBuilder();<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    for (RowRange range : rangeList) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      if (range != null) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        FilterProtos.RowRange.Builder rangebuilder = FilterProtos.RowRange.newBuilder();<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        if (range.startRow != null)<a name="line.191"></a>
+<span class="sourceLineNo">192</span>          rangebuilder.setStartRow(UnsafeByteOperations.unsafeWrap(range.startRow));<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        rangebuilder.setStartRowInclusive(range.startRowInclusive);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        if (range.stopRow != null)<a name="line.194"></a>
+<span class="sourceLineNo">195</span>          rangebuilder.setStopRow(UnsafeByteOperations.unsafeWrap(range.stopRow));<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        rangebuilder.setStopRowInclusive(range.stopRowInclusive);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        builder.addRowRangeList(rangebuilder.build());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    }<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    return builder.build().toByteArray();<a name="line.200"></a>
+<span class="sourceLineNo">201</span>  }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>  /**<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   * @param pbBytes A pb serialized instance<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   * @return An instance of MultiRowRangeFilter<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   * @throws org.apache.hadoop.hbase.exceptions.DeserializationException<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   */<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  public static MultiRowRangeFilter parseFrom(final byte[] pbBytes)<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      throws DeserializationException {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    FilterProtos.MultiRowRangeFilter proto;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    try {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      proto = FilterProtos.MultiRowRangeFilter.parseFrom(pbBytes);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    } catch (InvalidProtocolBufferException e) {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      throw new DeserializationException(e);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    int length = proto.getRowRangeListCount();<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    List&lt;FilterProtos.RowRange&gt; rangeProtos = proto.getRowRangeListList();<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    List&lt;RowRange&gt; rangeList = new ArrayList&lt;&gt;(length);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    for (FilterProtos.RowRange rangeProto : rangeProtos) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      RowRange range = new RowRange(rangeProto.hasStartRow() ? rangeProto.getStartRow()<a name="line.220"></a>
+<span class="sourceLineNo">221</span>          .toByteArray() : null, rangeProto.getStartRowInclusive(), rangeProto.hasStopRow() ?<a name="line.221"></a>
+<span class="sourceLineNo">222</span>              rangeProto.getStopRow().toByteArray() : null, rangeProto.getStopRowInclusive());<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      rangeList.add(range);<a name="line.223"></a>
 <span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    return true;<a name="line.225"></a>
+<span class="sourceLineNo">225</span>    return new MultiRowRangeFilter(rangeList);<a name="line.225"></a>
 <span class="sourceLineNo">226</span>  }<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
 <span class="sourceLineNo">228</span>  /**<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * sort the ranges and if the ranges with overlap, then merge them.<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   *<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   * @param ranges the list of ranges to sort and merge.<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * @return the ranges after sort and merge.<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   */<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  public static List&lt;RowRange&gt; sortAndMerge(List&lt;RowRange&gt; ranges) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    if (ranges.isEmpty()) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      throw new IllegalArgumentException("No ranges found.");<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    List&lt;RowRange&gt; invalidRanges = new ArrayList&lt;&gt;();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    List&lt;RowRange&gt; newRanges = new ArrayList&lt;&gt;(ranges.size());<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    Collections.sort(ranges);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    if(ranges.get(0).isValid()) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      if (ranges.size() == 1) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        newRanges.add(ranges.get(0));<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      }<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    } else {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      invalidRanges.add(ranges.get(0));<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>    byte[] lastStartRow = ranges.get(0).startRow;<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    boolean lastStartRowInclusive = ranges.get(0).startRowInclusive;<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    byte[] lastStopRow = ranges.get(0).stopRow;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    boolean lastStopRowInclusive = ranges.get(0).stopRowInclusive;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    int i = 1;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    for (; i &lt; ranges.size(); i++) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      RowRange range = ranges.get(i);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      if (!range.isValid()) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        invalidRanges.add(range);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      if(Bytes.equals(lastStopRow, HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>            lastStopRowInclusive));<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        break;<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      }<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      // with overlap in the ranges<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      if ((Bytes.compareTo(lastStopRow, range.startRow) &gt; 0) ||<a name="line.265"></a>
-<span class="sourceLineNo">266</span>          (Bytes.compareTo(lastStopRow, range.startRow) == 0 &amp;&amp; !(lastStopRowInclusive == false &amp;&amp;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>          range.isStartRowInclusive() == false))) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        if(Bytes.equals(range.stopRow, HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>          newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, range.stopRow,<a name="line.269"></a>
-<span class="sourceLineNo">270</span>              range.stopRowInclusive));<a name="line.270"></a>
-<span class="sourceLineNo">271</span>          break;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>        }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>        // if first range contains second range, ignore the second range<a name="line.273"></a>
-<span class="sourceLineNo">274</span>        if (Bytes.compareTo(lastStopRow, range.stopRow) &gt;= 0) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>          if((Bytes.compareTo(lastStopRow, range.stopRow) == 0)) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>            if(lastStopRowInclusive == true || range.stopRowInclusive == true) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>              lastStopRowInclusive = true;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>            }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>          }<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          if ((i + 1) == ranges.size()) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>            newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.281"></a>
-<span class="sourceLineNo">282</span>                lastStopRowInclusive));<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          }<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        } else {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>          lastStopRow = range.stopRow;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          lastStopRowInclusive = range.stopRowInclusive;<a name="line.286"></a>
-<span class="sourceLineNo">287</span>          if ((i + 1) &lt; ranges.size()) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>            i++;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>            range = ranges.get(i);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>            if (!range.isValid()) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>              invalidRanges.add(range);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          } else {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.294"></a>
-<span class="sourceLineNo">295</span>                lastStopRowInclusive));<a name="line.295"></a>
-<span class="sourceLineNo">296</span>            break;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          while ((Bytes.compareTo(lastStopRow, range.startRow) &gt; 0) ||<a name="line.298"></a>
-<span class="sourceLineNo">299</span>              (Bytes.compareTo(lastStopRow, range.startRow) == 0 &amp;&amp;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              (lastStopRowInclusive == true || range.startRowInclusive==true))) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            if(Bytes.equals(range.stopRow, HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>              break;<a name="line.302"></a>
-<span class="sourceLineNo">303</span>            }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            // if this first range contain second range, ignore the second range<a name="line.304"></a>
-<span class="sourceLineNo">305</span>            if (Bytes.compareTo(lastStopRow, range.stopRow) &gt;= 0) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>              if(lastStopRowInclusive == true || range.stopRowInclusive == true) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>                lastStopRowInclusive = true;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>              }<a name="line.308"></a>
-<span class="sourceLineNo">309</span>              i++;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>              if (i &lt; ranges.size()) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>                range = ranges.get(i);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>                if (!range.isValid()) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>                  invalidRanges.add(range);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>                }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>              } else {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>                break;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>              }<a name="line.317"></a>
-<span class="sourceLineNo">318</span>            } else {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>              lastStopRow = range.stopRow;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>              lastStopRowInclusive = range.stopRowInclusive;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>              i++;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>              if (i &lt; ranges.size()) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>                range = ranges.get(i);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>                if (!range.isValid()) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>                  invalidRanges.add(range);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>                }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>              } else {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>                break;<a name="line.328"></a>
-<span class="sourceLineNo">329</span>              }<a name="line.329"></a>
-<span class="sourceLineNo">330</span>            }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          if(Bytes.equals(range.stopRow, HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            if((Bytes.compareTo(lastStopRow, range.startRow) &lt; 0) ||<a name="line.333"></a>
-<span class="sourceLineNo">334</span>                (Bytes.compareTo(lastStopRow, range.startRow) == 0 &amp;&amp;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>                lastStopRowInclusive == false &amp;&amp; range.startRowInclusive == false)) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>              newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.336"></a>
-<span class="sourceLineNo">337</span>                  lastStopRowInclusive));<a name="line.337"></a>
-<span class="sourceLineNo">338</span>              newRanges.add(range);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>            } else {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, range.stopRow,<a name="line.340"></a>
-<span class="sourceLineNo">341</span>                  range.stopRowInclusive));<a name="line.341"></a>
-<span class="sourceLineNo">342</span>              break;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>            }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>          newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.345"></a>
-<span class="sourceLineNo">346</span>              lastStopRowInclusive));<a name="line.346"></a>
-<span class="sourceLineNo">347</span>          if ((i + 1) == ranges.size()) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            newRanges.add(range);<a name="line.348"></a>
-<span class="sourceLineNo">349</span>          }<a name="line.349"></a>
-<span class="sourceLineNo">350</span>          lastStartRow = range.startRow;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>          lastStartRowInclusive = range.startRowInclusive;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          lastStopRow = range.stopRow;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          lastStopRowInclusive = range.stopRowInclusive;<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      } else {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.356"></a>
-<span class="sourceLineNo">357</span>            lastStopRowInclusive));<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        if ((i + 1) == ranges.size()) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>          newRanges.add(range);<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        }<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        lastStartRow = range.startRow;<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        lastStartRowInclusive = range.startRowInclusive;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        lastStopRow = range.stopRow;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        lastStopRowInclusive = range.stopRowInclusive;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    // check the remaining ranges<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    for(int j=i; j &lt; ranges.size(); j++) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if(!ranges.get(j).isValid()) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        invalidRanges.add(ranges.get(j));<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    // if invalid range exists, throw the exception<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    if (invalidRanges.size() != 0) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      throwExceptionForInvalidRanges(invalidRanges, true);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    // If no valid ranges found, throw the exception<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    if(newRanges.isEmpty()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      throw new IllegalArgumentException("No valid ranges found.");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    return newRanges;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  }<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private static void throwExceptionForInvalidRanges(List&lt;RowRange&gt; invalidRanges,<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      boolean details) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    StringBuilder sb = new StringBuilder();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    sb.append(invalidRanges.size()).append(" invaild ranges.\n");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (details) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      for (RowRange range : invalidRanges) {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        sb.append(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>            "Invalid range: start row =&gt; " + Bytes.toString(range.startRow) + ", stop row =&gt; "<a name="line.391"></a>
-<span class="sourceLineNo">392</span>                + Bytes.toString(range.stopRow)).append('\n');<a name="line.392"></a>
+<span class="sourceLineNo">229</span>   * @param o the filter to compare<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * @return true if and only if the fields of the filter that are serialized are equal to the<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   *         corresponding fields in other. Used for testing.<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   */<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  @Override<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  boolean areSerializedFieldsEqual(Filter o) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    if (o == this)<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      return true;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    if (!(o instanceof MultiRowRangeFilter))<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      return false;<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>    MultiRowRangeFilter other = (MultiRowRangeFilter) o;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    if (this.rangeList.size() != other.rangeList.size())<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      return false;<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    for (int i = 0; i &lt; rangeList.size(); ++i) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      RowRange thisRange = this.rangeList.get(i);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      RowRange otherRange = other.rangeList.get(i);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      if (!(Bytes.equals(thisRange.startRow, otherRange.startRow) &amp;&amp; Bytes.equals(<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          thisRange.stopRow, otherRange.stopRow) &amp;&amp; (thisRange.startRowInclusive ==<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          otherRange.startRowInclusive) &amp;&amp; (thisRange.stopRowInclusive ==<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          otherRange.stopRowInclusive))) {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        return false;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      }<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return true;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * sort the ranges and if the ranges with overlap, then merge them.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   *<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @param ranges the list of ranges to sort and merge.<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   * @return the ranges after sort and merge.<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   */<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  public static List&lt;RowRange&gt; sortAndMerge(List&lt;RowRange&gt; ranges) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    if (ranges.isEmpty()) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      throw new IllegalArgumentException("No ranges found.");<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    List&lt;RowRange&gt; invalidRanges = new ArrayList&lt;&gt;();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    List&lt;RowRange&gt; newRanges = new ArrayList&lt;&gt;(ranges.size());<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    Collections.sort(ranges);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    if(ranges.get(0).isValid()) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      if (ranges.size() == 1) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        newRanges.add(ranges.get(0));<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    } else {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      invalidRanges.add(ranges.get(0));<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>    byte[] lastStartRow = ranges.get(0).startRow;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    boolean lastStartRowInclusive = ranges.get(0).startRowInclusive;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    byte[] lastStopRow = ranges.get(0).stopRow;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    boolean lastStopRowInclusive = ranges.get(0).stopRowInclusive;<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    int i = 1;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    for (; i &lt; ranges.size(); i++) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      RowRange range = ranges.get(i);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      if (!range.isValid()) {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        invalidRanges.add(range);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      if(Bytes.equals(lastStopRow, HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>            lastStopRowInclusive));<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        break;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      }<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // with overlap in the ranges<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      if ((Bytes.compareTo(lastStopRow, range.startRow) &gt; 0) ||<a name="line.293"></a>
+<span class="sourceLineNo">294</span>          (Bytes.compareTo(lastStopRow, range.startRow) == 0 &amp;&amp; !(lastStopRowInclusive == false &amp;&amp;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          range.isStartRowInclusive() == false))) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        if(Bytes.equals(range.stopRow, HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, range.stopRow,<a name="line.297"></a>
+<span class="sourceLineNo">298</span>              range.stopRowInclusive));<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          break;<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        // if first range contains second range, ignore the second range<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        if (Bytes.compareTo(lastStopRow, range.stopRow) &gt;= 0) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>          if((Bytes.compareTo(lastStopRow, range.stopRow) == 0)) {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>            if(lastStopRowInclusive == true || range.stopRowInclusive == true) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>              lastStopRowInclusive = true;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>            }<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>          if ((i + 1) == ranges.size()) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>            newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.309"></a>
+<span class="sourceLineNo">310</span>                lastStopRowInclusive));<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          }<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        } else {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>          lastStopRow = range.stopRow;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          lastStopRowInclusive = range.stopRowInclusive;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          if ((i + 1) &lt; ranges.size()) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>            i++;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>            range = ranges.get(i);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>            if (!range.isValid()) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>              invalidRanges.add(range);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>            }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          } else {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>            newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.322"></a>
+<span class="sourceLineNo">323</span>                lastStopRowInclusive));<a name="line.323"></a>
+<span class="sourceLineNo">324</span>            break;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>          }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>          while ((Bytes.compareTo(lastStopRow, range.startRow) &gt; 0) ||<a name="line.326"></a>
+<span class="sourceLineNo">327</span>              (Bytes.compareTo(lastStopRow, range.startRow) == 0 &amp;&amp;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>              (lastStopRowInclusive == true || range.startRowInclusive==true))) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>            if(Bytes.equals(range.stopRow, HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>              break;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>            }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>            // if this first range contain second range, ignore the second range<a name="line.332"></a>
+<span class="sourceLineNo">333</span>            if (Bytes.compareTo(lastStopRow, range.stopRow) &gt;= 0) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>              if(lastStopRowInclusive == true || range.stopRowInclusive == true) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>                lastStopRowInclusive = true;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>              }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>              i++;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>              if (i &lt; ranges.size()) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>                range = ranges.get(i);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>                if (!range.isValid()) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>                  invalidRanges.add(range);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>                }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>              } else {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>                break;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>              }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            } else {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>              lastStopRow = range.stopRow;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>              lastStopRowInclusive = range.stopRowInclusive;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>              i++;<a name="line.349"></a>
+<span class="sourceLineNo">350</span>              if (i &lt; ranges.size()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>                range = ranges.get(i);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>                if (!range.isValid()) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>                  invalidRanges.add(range);<a name="line.353"></a>
+<span class="sourceLineNo">354</span>                }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              } else {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>                break;<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              }<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>          }<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          if(Bytes.equals(range.stopRow, HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>            if((Bytes.compareTo(lastStopRow, range.startRow) &lt; 0) ||<a name="line.361"></a>
+<span class="sourceLineNo">362</span>                (Bytes.compareTo(lastStopRow, range.startRow) == 0 &amp;&amp;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>                lastStopRowInclusive == false &amp;&amp; range.startRowInclusive == false)) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>              newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.364"></a>
+<span class="sourceLineNo">365</span>                  lastStopRowInclusive));<a name="line.365"></a>
+<span class="sourceLineNo">366</span>              newRanges.add(range);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>            } else {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>              newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, range.stopRow,<a name="line.368"></a>
+<span class="sourceLineNo">369</span>                  range.stopRowInclusive));<a name="line.369"></a>
+<span class="sourceLineNo">370</span>              break;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            }<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>          newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.373"></a>
+<span class="sourceLineNo">374</span>              lastStopRowInclusive));<a name="line.374"></a>
+<span class="sourceLineNo">375</span>          if ((i + 1) == ranges.size()) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>            newRanges.add(range);<a name="line.376"></a>
+<span class="sourceLineNo">377</span>          }<a name="line.377"></a>
+<span class="sourceLineNo">378</span>          lastStartRow = range.startRow;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>          lastStartRowInclusive = range.startRowInclusive;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>          lastStopRow = range.stopRow;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          lastStopRowInclusive = range.stopRowInclusive;<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        }<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      } else {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.384"></a>
+<span class="sourceLineNo">385</span>            lastStopRowInclusive));<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if ((i + 1) == ranges.size()) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          newRanges.add(range);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>        lastStartRow = range.startRow;<a name="line.389"></a>
+<span class="sourceLineNo">390</span>        lastStartRowInclusive = range.startRowInclusive;<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        lastStopRow = range.stopRow;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        lastStopRowInclusive = range.stopRowInclusive;<a name="line.392"></a>
 <span class="sourceLineNo">393</span>      }<a name="line.393"></a>
 <span class="sourceLineNo">394</span>    }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    throw new IllegalArgumentException(sb.toString());<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  }<a name="line.396"></a>
-<span class="sourceLineNo">397</span><a name="line.397"></a>
-<span class="sourceLineNo">398</span>  private static abstract class BasicRowRange implements Comparable&lt;BasicRowRange&gt; {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    protected byte[] startRow;<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    protected boolean startRowInclusive = true;<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    protected byte[] stopRow;<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    protected boolean stopRowInclusive = false;<a name="line.402"></a>
-<span class="sourceLineNo">403</span><a name="line.403"></a>
-<span class="sourceLineNo">404</span>    public BasicRowRange() {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    /**<a name="line.406"></a>
-<span class="sourceLineNo">407</span>     * If the startRow is empty or null, set it to HConstants.EMPTY_BYTE_ARRAY, means begin at the<a name="line.407"></a>
-<span class="sourceLineNo">408</span>     * start row of the table. If the stopRow is empty or null, set it to<a name="line.408"></a>
-<span class="sourceLineNo">409</span>     * HConstants.EMPTY_BYTE_ARRAY, means end of the last row of table.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>     */<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    public BasicRowRange(String startRow, boolean startRowInclusive, String stopRow,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        boolean stopRowInclusive) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      this((startRow == null || startRow.isEmpty()) ? HConstants.EMPTY_BYTE_ARRAY :<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        Bytes.toBytes(startRow), startRowInclusive,<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        (stopRow == null || stopRow.isEmpty()) ? HConstants.EMPTY_BYTE_ARRAY :<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        Bytes.toBytes(stopRow), stopRowInclusive);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    }<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    public BasicRowRange(byte[] startRow,  boolean startRowInclusive, byte[] stopRow,<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        boolean stopRowInclusive) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      this.startRow = (startRow == null) ? HConstants.EMPTY_BYTE_ARRAY : startRow;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      this.startRowInclusive = startRowInclusive;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      this.stopRow = (stopRow == null) ? HConstants.EMPTY_BYTE_ARRAY :stopRow;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      this.stopRowInclusive = stopRowInclusive;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    }<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>    public byte[] getStartRow() {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      return startRow;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>    public byte[] getStopRow() {<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      return stopRow;<a name="line.432"></a>
+<span class="sourceLineNo">395</span>    // check the remaining ranges<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    for(int j=i; j &lt; ranges.size(); j++) {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      if(!ranges.get(j).isValid()) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>        invalidRanges.add(ranges.get(j));<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    }<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // if invalid range exists, throw the exception<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if (invalidRanges.size() != 0) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      throwExceptionForInvalidRanges(invalidRanges, true);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    // If no valid ranges found, throw the exception<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    if(newRanges.isEmpty()) {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      throw new IllegalArgumentException("No valid ranges found.");<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    return newRanges;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  }<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>  private static void throwExceptionForInvalidRanges(List&lt;RowRange&gt; invalidRanges,<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      boolean details) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    StringBuilder sb = new StringBuilder();<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    sb.append(invalidRanges.size()).append(" invaild ranges.\n");<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (details) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      for (RowRange range : invalidRanges) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        sb.append(<a name="line.418"></a>
+<span class="sourceLineNo">419</span>            "Invalid range: start row =&gt; " + Bytes.toString(range.startRow) + ", stop row =&gt; "<a name="line.419"></a>
+<span class="sourceLineNo">420</span>                + Bytes.toString(range.stopRow)).append('\n');<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    throw new IllegalArgumentException(sb.toString());<a name="line.423"></a>
+<span class="sourceLineNo">424</span>  }<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>  private static abstract class BasicRowRange implements Comparable&lt;BasicRowRange&gt; {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    protected byte[] startRow;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    protected boolean startRowInclusive = true;<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    protected byte[] stopRow;<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    protected boolean stopRowInclusive = false;<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>    public BasicRowRange() {<a name="line.432"></a>
 <span class="sourceLineNo">433</span>    }<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>    /**<a name="line.435"></a>
-<span class="sourceLineNo">436</span>     * @return if start row is inclusive.<a name="line.436"></a>
-<span class="sourceLineNo">437</span>     */<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    public boolean isStartRowInclusive() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      return startRowInclusive;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>    /**<a name="line.442"></a>
-<span class="sourceLineNo">443</span>     * @return if stop row is inclusive.<a name="line.443"></a>
-<span class="sourceLineNo">444</span>     */<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    public boolean isStopRowInclusive() {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      return stopRowInclusive;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>    public boolean contains(byte[] row) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      return contains(row, 0, row.length);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>    public boolean contains(byte[] buffer, int offset, int length) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      if(startRowInclusive) {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        if(stopRowInclusive) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>          return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) &gt;= 0<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              &amp;&amp; (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) ||<a name="line.457"></a>
-<span class="sourceLineNo">458</span>                  Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) &lt;= 0);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        } else {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) &gt;= 0<a name="line.460"></a>
-<span class="sourceLineNo">461</span>              &amp;&amp; (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) ||<a name="line.461"></a>
-<span class="sourceLineNo">462</span>                  Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) &lt; 0);<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      } else {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        if(stopRowInclusive) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) &gt; 0<a name="line.466"></a>
-<span class="sourceLineNo">467</span>              &amp;&amp; (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) ||<a name="line.467"></a>
-<span class="sourceLineNo">468</span>                  Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) &lt;= 0);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        } else {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) &gt; 0<a name="line.470"></a>
-<span class="sourceLineNo">471</span>              &amp;&amp; (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) ||<a name="line.471"></a>
-<span class="sourceLineNo">472</span>                  Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) &lt; 0);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">434</span>    /**<a name="line.434"></a>
+<span class="sourceLineNo">435</span>     * If the startRow is empty or null, set it to HConstants.EMPTY_BYTE_ARRAY, means begin at the<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     * start row of the table. If the stopRow is empty or null, set it to<a name="line.436"></a>
+<span class="sourceLineNo">437</span>     * HConstants.EMPTY_BYTE_ARRAY, means end of the last row of table.<a name="line.437"></a>
+<span class="sourceLineNo">438</span>     */<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    public BasicRowRange(String startRow, boolean startRowInclusive, String stopRow,<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        boolean stopRowInclusive) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      this((startRow == null || startRow.isEmpty()) ? HConstants.EMPTY_BYTE_ARRAY :<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        Bytes.toBytes(startRow), startRowInclusive,<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        (stopRow == null || stopRow.isEmpty()) ? HConstants.EMPTY_BYTE_ARRAY :<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        Bytes.toBytes(stopRow), stopRowInclusive);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>    public BasicRowRange(byte[] startRow,  boolean startRowInclusive, byte[] stopRow,<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        boolean stopRowInclusive) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      this.startRow = (startRow == null) ? HConstants.EMPTY_BYTE_ARRAY : startRow;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      this.startRowInclusive = startRowInclusive;<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.stopRow = (stopRow == null) ? HConstants.EMPTY_BYTE_ARRAY :stopRow;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      this.stopRowInclusive = stopRowInclusive;<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>    public byte[] getStartRow() {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      return startRow;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>    public byte[] getStopRow() {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      return stopRow;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>    /**<a name="line.463"></a>
+<span class="sourceLineNo">464</span>     * @return if start row is inclusive.<a name="line.464"></a>
+<span class="sourceLineNo">465</span>     */<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    public boolean isStartRowInclusive() {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      return startRowInclusive;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    }<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
+<span class="sourceLineNo">471</span>     * @return if stop row is inclusive.<a name="line.471"></a>
+<span class="sourceLineNo">472</span>     */<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    public boolean isStopRowInclusive() {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      return stopRowInclusive;<a name="line.474"></a>
 <span class="sourceLineNo">475</span>    }<a name="line.475"></a>
 <span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>    public boolean isValid() {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      return Bytes.equals(startRow, HConstants.EMPTY_BYTE_ARRAY)<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          || Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY)<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          || Bytes.compareTo(startRow, stopRow) &lt; 0<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          || (Bytes.compareTo(startRow, stopRow) == 0 &amp;&amp; stopRowInclusive == true);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>    @Override<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    public boolean equals(Object obj){<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      if (!(obj instanceof BasicRowRange)) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        return false;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      }<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      if (this == obj) {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        return true;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      }<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      BasicRowRange rr = (BasicRowRange) obj;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      return Bytes.equals(this.stopRow, rr.getStopRow()) &amp;&amp;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          Bytes.equals(this.startRow, this.getStartRow()) &amp;&amp;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          this.startRowInclusive == rr.isStartRowInclusive() &amp;&amp;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          this.stopRowInclusive == rr.isStopRowInclusive();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>    @Override<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    public int hashCode() {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      return Objects.hash(Bytes.hashCode(this.stopRow),<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          Bytes.hashCode(this.startRow),<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          this.startRowInclusive,<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          this.stopRowInclusive);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>    /**<a name="line.507"></a>
-<span class="sourceLineNo">508</span>     * Returns the data to be used to compare {@code this} to another object.<a name="line.508"></a>
-<span class="sourceLineNo">509</span>     */<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    public abstract byte[] getComparisonData();<a name="line.510"></a>
+<span class="sourceLineNo">477</span>    public boolean contains(byte[] row) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      return contains(row, 0, row.length);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
+<span class="sourceLineNo">480</span><a name="line.480"></a>
+<span class="sourceLineNo">481</span>    public boolean contains(byte[] buffer, int offset, int length) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      if(startRowInclusive) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>        if(stopRowInclusive) {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>          return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) &gt;= 0<a name="line.484"></a>
+<span class="sourceLineNo">485</span>              &amp;&amp; (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) ||<a name="line.485"></a>
+<span class="sourceLineNo">486</span>                  Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) &lt;= 0);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        } else {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>          return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) &gt;= 0<a name="line.488"></a>
+<span class="sourceLineNo">489</span>              &amp;&amp; (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) ||<a name="line.489"></a>
+<span class="sourceLineNo">490</span>                  Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) &lt; 0);<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        }<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      } else {<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        if(stopRowInclusive) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>          return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) &gt; 0<a name="line.494"></a>
+<span class="sourceLineNo">495</span>              &amp;&amp; (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) ||<a name="line.495"></a>
+<span class="sourceLineNo">496</span>                  Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) &lt;= 0);<a name="line.496"></a>
+<span class="sourceLineNo">497</span>        } else {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>          return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) &gt; 0<a name="line.498"></a>
+<span class="sourceLineNo">499</span>              &amp;&amp; (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) ||<a name="line.499"></a>
+<span class="sourceLineNo">500</span>                  Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) &lt; 0);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        }<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      }<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    }<a name="line.503"></a>
+<span class="sourceLineNo">504</span><a name="line.504"></a>
+<span class="sourceLineNo">505</span>    public boolean isValid() {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      return Bytes.equals(startRow, HConstants.EMPTY_BYTE_ARRAY)<a name="line.506"></a>
+<span class="sourceLineNo">507</span>          || Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY)<a name="line.507"></a>
+<span class="sourceLineNo">508</span>          || Bytes.compareTo(startRow, stopRow) &lt; 0<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          || (Bytes.compareTo(startRow, stopRow) == 0 &amp;&amp; stopRowInclusive == true);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    }<a name="line.510"></a>
 <span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    /**<a name="line.512"></a>
-<span class="sourceLineNo">513</span>     * Returns whether the bounding row used for binary-search is inclusive or not.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>     *<a name="line.514"></a>
-<span class="sourceLineNo">515</span>     * For forward scans, we would check the starRow, but we would check the stopRow for<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * the reverse scan case.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     */<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    public abstract boolean isSearchRowInclusive();<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    @Override<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    public int compareTo(BasicRowRange other) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      byte[] left;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      byte[] right;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      if (isAscendingOrder()) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>        left = this.getComparisonData();<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        right = other.getComparisonData();<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      } else {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        left = other.getComparisonData();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        right = this.getComparisonData();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      return Bytes.compareTo(left, right);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    }<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    public abstract boolean isAscendingOrder();<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>  /**<a name="line.537"></a>
-<span class="sourceLineNo">538</span>   * Internal RowRange that reverses the sort-order to handle reverse scans.<a name="line.538"></a>
-<span class="sourceLineNo">539</span>   */<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  @InterfaceAudience.Private<a name="line.540"></a>
-<span class="sourceLineNo">541</span>  private static class ReversedRowRange extends BasicRowRange {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    public ReversedRowRange(byte[] startRow,  boolean startRowInclusive, byte[] stopRow,<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        boolean stopRowInclusive) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      super(startRow, startRowInclusive, stopRow, stopRowInclusive);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    }<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>    @Override<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    public byte[] getComparisonData() {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      return this.stopRow;<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>    @Override<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    public boolean isSearchRowInclusive() {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      return this.stopRowInclusive;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>    @Override<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    public boolean isAscendingOrder() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      return false;<a name="line.559"></a>
+<span class="sourceLineNo">512</span>    @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    public boolean equals(Object obj){<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      if (!(obj instanceof BasicRowRange)) {<a name="line.514"></a>
+<span class="sourceLineNo">515</span>        return false;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      }<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      if (this == obj) {<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        return true;<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      }<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      BasicRowRange rr = (BasicRowRange) obj;<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      return Bytes.equals(this.stopRow, rr.getStopRow()) &amp;&amp;<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          Bytes.equals(this.startRow, this.getStartRow()) &amp;&amp;<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          this.startRowInclusive == rr.isStartRowInclusive() &amp;&amp;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          this.stopRowInclusive == rr.isStopRowInclusive();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    @Override<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    public int hashCode() {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      return Objects.hash(Bytes.hashCode(this.stopRow),<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Bytes.hashCode(this.startRow),<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          this.startRowInclusive,<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          this.stopRowInclusive);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    /**<a name="line.535"></a>
+<span class="sourceLineNo">536</span>     * Returns the data to be used to compare {@code this} to another object.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>     */<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    public abstract byte[] getComparisonData();<a name="line.538"></a>
+<span class="sourceLineNo">539</span><a name="line.539"></a>
+<span class="sourceLineNo">540</span>    /**<a name="line.540"></a>
+<span class="sourceLineNo">541</span>     * Returns whether the bounding row used for binary-search is inclusive or not.<a name="line.541"></a>
+<span class="sourceLineNo">542</span>     *<a name="line.542"></a>
+<span class="sourceLineNo">543</span>     * For forward scans, we would check the starRow, but we would check the stopRow for<a name="line.543"></a>
+<span class="sourceLineNo">544</span>     * the reverse scan case.<a name="line.544"></a>
+<span class="sourceLineNo">545</span>     */<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    public abstract boolean isSearchRowInclusive();<a name="line.546"></a>
+<span class="sourceLineNo">547</span><a name="line.547"></a>
+<span class="sourceLineNo">548</span>    @Override<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    public int compareTo(BasicRowRange other) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      byte[] left;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      byte[] right;<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      if (isAscendingOrder()) {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        left = this.getComparisonData();<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        right = other.getComparisonData();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      } else {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>        left = other.getComparisonData();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>        right = this.getComparisonData();<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      }<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      return Bytes.compareTo(left, right);<a name="line.559"></a>
 <span class="sourceLineNo">560</span>    }<a name="line.560"></a>
-<span class="sourceLineNo">561</span>  }<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>  @InterfaceAudience.Public<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  public static class RowRange extends BasicRowRange {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    public RowRange() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    /**<a name="line.567"></a>
-<span class="sourceLineNo">568</span>     * If the startRow is empty or null, set it to HConstants.EMPTY_BYTE_ARRAY, means begin at the<a name="line.568"></a>
-<span class="sourceLineNo">569</span>     * start row of the table. If the stopRow is empty or null, set it to<a name="line.569"></a>
-<span class="sourceLineNo">570</span>     * HConstants.EMPTY_BYTE_ARRAY, means end of the last row of table.<a name="line.570"></a>
-<span class="sourceLineNo">571</span>     */<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    public RowRange(String startRow, boolean startRowInclusive, String stopRow,<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        boolean stopRowInclusive) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      super(startRow, startRowInclusive, stopRow, stopRowInclusive);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    }<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    public RowRange(byte[] startRow,  boolean startRowInclusive, byte[] stopRow,<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        boolean stopRowInclusive) {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      super(startRow, startRowInclusive, stopRow, stopRowInclusive);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    }<a name="line.580"></a>
-<span class="sourceLineNo">581</span><a name="line.581"></a>
-<span class="sourceLineNo">582</span>    @Override<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    public byte[] getComparisonData() {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      return startRow;<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    }<a name="line.585"></a>
-<span class="sourceLineNo">586</span><a name="line.586"></a>
-<span class="sourceLineNo">587</span>    @Override<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    public boolean isSearchRowInclusive() {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      return startRowInclusive;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>    @Override<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    public boolean isAscendingOrder() {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      return true;<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>  }<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>  /**<a name="line.598"></a>
-<span class="sourceLineNo">599</span>   * Abstraction over the ranges of rows to return from this filter, regardless of forward or<a name="line.599"></a>
-<span class="sourceLineNo">600</span>   * reverse scans being used. This Filter can use this class, agnostic of iteration direction,<a name="line.600"></a>
-<span class="sourceLineNo">601</span>   * as the same algorithm can be applied in both cases.<a name="line.601"></a>
-<span class="sourceLineNo">602</span>   */<a name="line.602"></a>
-<span class="sourceLineNo">603</span>  @InterfaceAudience.Private<a name="line.603"></a>
-<span class="sourceLineNo">604</span>  private static class RangeIteration {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    private boolean exclusive = false;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    private boolean initialized = false;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    private boolean foundFirstRange = false;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    private boolean reversed = false;<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    private final List&lt;RowRange&gt; sortedAndMergedRanges;<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    private List&lt;? extends BasicRowRange&gt; ranges;<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>    public RangeIteration(List&lt;RowRange&gt; sortedAndMergedRanges) {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      this.sortedAndMergedRanges = sortedAndMergedRanges;<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    void initialize(boolean reversed) {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>      // Avoid double initialization<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      assert !this.initialized;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      this.reversed = reversed;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>      if (reversed) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        // If we are doing a reverse scan, we can reverse the ranges (both the elements in<a name="line.621"></a>
-<span class="sourceLineNo">622</span>        // the list as well as their start/stop key), and use the same algorithm.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        this.ranges = flipAndReverseRanges(sortedAndMergedRanges);<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      } else {<a name="line.624"></a>
-<span class="sourceLineNo">625</span>        this.ranges = sortedAndMergedRanges;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      this.initialized = true;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    /**<a name="line.630"></a>
-<span class="sourceLineNo">631</span>     * Rebuilds the sorted ranges (by startKey) into an equivalent sorted list of ranges, only by<a name="line.631"></a>
-<span class="sourceLineNo">632</span>     * stopKey instead. Descending order and the ReversedRowRange compareTo implementation make<a name="line.632"></a>
-<span class="sourceLineNo">633</span>     * sure that we can use Collections.binarySearch().<a name="line.633"></a>
-<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    static List&lt;ReversedRowRange&gt; flipAndReverseRanges(List&lt;RowRange&gt; ranges) {<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      List&lt;ReversedRowRange&gt; flippedRanges = new ArrayList&lt;&gt;(ranges.size());<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      for (int i = ranges.size() - 1; i &gt;= 0; i--) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        RowRange origRange = ranges.get(i);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>        ReversedRowRange newRowRange = new ReversedRowRange(<a name="line.639"></a>
-<span class="sourceLineNo">640</span>            origRange.startRow, origRange.startRowInclusive, origRange.stopRow,<a name="line.640"></a>
-<span class="sourceLineNo">641</span>            origRange.isStopRowInclusive());<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        flippedRanges.add(newRowRange);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      return flippedRanges;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    }<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    /**<a name="line.647"></a>
-<span class="sourceLineNo">648</span>     * Calculates the position where the given rowkey fits in the ranges list.<a name="line.648"></a>
-<span class="sourceLineNo">649</span>     *<a name="line.649"></a>
-<span class="sourceLineNo">650</span>     * @param rowKey the row key to calculate<a name="line.650"></a>
-<span class="sourceLineNo">651</span>     * @return index the position of the row key<a name="line.651"></a>
-<span class="sourceLineNo">652</span>     */<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    public int getNextRangeIndex(byte[] rowKey) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      BasicRowRange temp;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      if (reversed) {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        temp = new ReversedRowRange(null, true, rowKey, true);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      } else {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        temp = new RowRange(rowKey, true, null, true);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      }<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      // Because we make sure that `ranges` has the correct natural ordering (given it containing<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      // RowRange or ReverseRowRange objects). This keeps us from having to have two different<a name="line.661"></a>
-<span class="sourceLineNo">662</span>      // implementations below.<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      final int index = Collections.binarySearch(ranges, temp);<a name="line.663"></a>
-<span class="sourceLineNo">664</span>      if (index &lt; 0) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        int insertionPosition = -index - 1;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        // check if the row key in the range before the insertion position<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        if (insertionPosition != 0 &amp;&amp; ranges.get(insertionPosition - 1).contains(rowKey)) {<a name="line.667"></a>
-<span class="sourceLineNo">668</span>          return insertionPosition - 1;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        // check if the row key is before the first range<a name="line.670"></a>
-<span class="sourceLineNo">671</span>        if (insertionPosition == 0 &amp;&amp; !ranges.get(insertionPosition).contains(rowKey)) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>          return ROW_BEFORE_FIRST_RANGE;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>        }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>        if (!foundFirstRange) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>          foundFirstRange = true;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>        }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        return insertionPosition;<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      }<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      // the row key equals one of the start keys, and the the range exclude the start key<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      if(ranges.get(index).isSearchRowInclusive() == false) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        exclusive = true;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      }<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      return index;<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    }<a name="line.684"></a>
-<span class="sourceLineNo">685</span><a name="line.685"></a>
-<span class="sourceLineNo">686</span>    /**<a name="line.686"></a>
-<span class="sourceLineNo">687</span>     * Sets {@link #foundFirstRange} to {@code true}, indicating that we found a matching row range.<a name="line.687"></a>
-<span class="sourceLineNo">688</span>     */<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    public void setFoundFirstRange() {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      this.foundFirstRange = true;<a name="line.690"></a>
-<span class="sourceLineNo">691</span>    }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>    /**<a name="line.693"></a>
-<span class="sourceLineNo">694</span>     * Gets the RowRange at the given offset.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>     */<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    @SuppressWarnings("unchecked")<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    public &lt;T extends BasicRowRange&gt; T get(int i) {<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      return (T) ranges.get(i);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>    /**<a name="line.701"></a>
-<span class="sourceLineNo">702</span>     * Returns true if the first matching row range was found.<a name="line.702"></a>
-<span class="sourceLineNo">703</span>     */<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    public boolean hasFoundFirstRange() {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      return foundFirstRange;<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    }<a name="line.706"></a>
-<span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    /**<a name="line.708"></a>
-<span class="sourceLineNo">709</span>     * Returns true if the current range's key is exclusive<a name="line.709"></a>
-<span class="sourceLineNo">710</span>     */<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    public boolean isExclusive() {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      return exclusive;<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    }<a name="line.713"></a>
-<span class="sourceLineNo">714</span><a name="line.714"></a>
-<span class="sourceLineNo">715</span>    /**<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     * Resets the exclusive flag.<a name="line.716"></a>
-<span class="sourceLineNo">717</span>     */<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    public void resetExclusive() {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      exclusive = false;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    /**<a name="line.722"></a>
-<span class="sourceLineNo">723</span>     * Returns true if this class has been initialized by calling {@link #initialize(boolean)}.<a name="line.723"></a>
-<span class="sourceLineNo">724</span>     */<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    public boolean isInitialized() {<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      return initialized;<a name="line.726"></a>
+<span class="sourceLineNo">561</span><a name="line.561"></a>
+<span class="sourceLineNo">562</span>    public abstract boolean isAscendingOrder();<a name="line.562"></a>
+<span class="sourceLineNo">563</span>  }<a name="line.563"></a>
+<span class="sourceLineNo">564</span><a name="line.564"></a>
+<span class="sourceLineNo">565</span>  /**<a name="line.565"></a>
+<span class="sourceLineNo">566</span>   * Internal RowRange that reverses the sort-order to handle reverse scans.<a name="line.566"></a>
+<span class="sourceLineNo">567</span>   */<a name="line.567"></a>
+<span class="sourceLineNo">568</span>  @InterfaceAudience.Private<a name="line.568"></a>
+<span class="sourceLineNo">569</span>  private static class ReversedRowRange extends BasicRowRange {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    public ReversedRowRange(byte[] startRow,  boolean startRowInclusive, byte[] stopRow,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>        boolean stopRowInclusive) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      super(startRow, startRowInclusive, stopRow, stopRowInclusive);<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    }<a name="line.573"></a>
+<span class="sourceLineNo">574</span><a name="line.574"></a>
+<span class="sourceLineNo">575</span>    @Override<a name="line.575"></a>
+<span class="sourceLineNo">576</span>    public byte[] getComparisonData() {<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      return this.stopRow;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span><a name="line.579"></a>
+<span class="sourceLineNo">580</span>    @Override<a name="line.580"></a>
+<span class="sourceLineNo">581</span>    public boolean isSearchRowInclusive() {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      return this.stopRowInclusive;<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>    @Override<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    public boolean isAscendingOrder() {<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      return false;<a name="line.587"></a>
+<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
+<span class="sourceLineNo">589</span>  }<a name="line.589"></a>
+<span class="sourceLineNo">590</span><a name="line.590"></a>
+<span class="sourceLineNo">591</span>  @InterfaceAudience.Public<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  public static class RowRange extends BasicRowRange {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    public RowRange() {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    }<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    /**<a name="line.595"></a>
+<span class="sourceLineNo">596</span>     * If the startRow is empty or null, set it to HConstants.EMPTY_BYTE_ARRAY, means begin at the<a name="line.596"></a>
+<span class="sourceLineNo">597</span>     * start row of the table. If the stopRow is empty or null, set it to<a name="line.597"></a>
+<span class="sourceLineNo">598</span>     * HConstants.EMPTY_BYTE_ARRAY, means end of the last row of table.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>     */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    public RowRange(String startRow, boolean startRowInclusive, String stopRow,<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        boolean stopRowInclusive) {<a name="line.601"></a>
+<span class="sourceLineNo">602</span>      super(startRow, startRowInclusive, stopRow, stopRowInclusive);<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    }<a name="line.603"></a>
+<span class="sourceLineNo">604</span><a name="line.604"></a>
+<span class="sourceLineNo">605</span>    public RowRange(byte[] startRow,  boolean startRowInclusive, byte[] stopRow,<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        boolean stopRowInclusive) {<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      super(startRow, startRowInclusive, stopRow, stopRowInclusive);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span><a name="line.609"></a>
+<span class="sourceLineNo">610</span>    @Override<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    public byte[] getComparisonData() {<a name="line.611"></a>
+<span class="sourceLineNo">612</span>      return startRow;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>    @Override<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    public boolean isSearchRowInclusive() {<a name="line.616"></a>
+<span class="sourceLineNo">617</span>      return startRowInclusive;<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    }<a name="line.618"></a>
+<span class="sourceLineNo">619</span><a name="line.619"></a>
+<span class="sourceLineNo">620</span>    @Override<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    public boolean isAscendingOrder() {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      return true;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span>  }<a name="line.624"></a>
+<span class="sourceLineNo">625</span><a name="line.625"></a>
+<span class="sourceLineNo">626</span>  /**<a name="line.626"></a>
+<span class="sourceLineNo">627</span>   * Abstraction over the ranges of rows to return from this filter, regardless of forward or<a name="line.627"></a>
+<span class="sourceLineNo">628</span>   * reverse scans being used. This Filter can use this class, agnostic of iteration direction,<a name="line.628"></a>
+<span class="sourceLineNo">629</span>   * as the same algorithm can be applied in both cases.<a name="line.629"></a>
+<span class="sourceLineNo">630</span>   */<a name="line.630"></a>
+<span class="sourceLineNo">631</span>  @InterfaceAudience.Private<a name="line.631"></a>
+<span class="sourceLineNo">632</span>  private static class RangeIteration {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>    private boolean exclusive = false;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    private boolean initialized = false;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    private boolean foundFirstRange = false;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    private boolean reversed = false;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    private final List&lt;RowRange&gt; sortedAndMergedRanges;<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    private List&lt;? extends BasicRowRange&gt; ranges;<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    public RangeIteration(List&lt;RowRange&gt; sortedAndMergedRanges) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>      this.sortedAndMergedRanges = sortedAndMergedRanges;<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>    void initialize(boolean reversed) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      // Avoid double initialization<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      assert !this.initialized;<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      this.reversed = reversed;<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      if (reversed) {<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        // If we are doing a reverse scan, we can reverse the ranges (both the elements in<a name="line.649"></a>
+<span class="sourceLineNo">650</span>        // the list as well as their start/stop key), and use the same algorithm.<a name="line.650"></a>
+<span class="sourceLineNo">651</span>        this.ranges = flipAndReverseRanges(sortedAndMergedRanges);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      } else {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        this.ranges = sortedAndMergedRanges;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      this.initialized = true;<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    }<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>    /**<a name="line.658"></a>
+<span class="sourceLineNo">659</span>     * Rebuilds the sorted ranges (by startKey) into an equivalent sorted list of ranges, only by<a name="line.659"></a>
+<span class="sourceLineNo">660</span>     * stopKey instead. Descending order and the ReversedRowRange compareTo implementation make<a name="line.660"></a>
+<span class="sourceLineNo">661</span>     * sure that we can use Collections.binarySearch().<a name="line.661"></a>
+<span class="sourceLineNo">662</span>     */<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    static List&lt;ReversedRowRange&gt; flipAndReverseRanges(List&lt;RowRange&gt; ranges) {<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      List&lt;ReversedRowRange&gt; flippedRanges = new ArrayList&lt;&gt;(ranges.size());<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      for (int i = ranges.size() - 1; i &gt;= 0; i--) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>        RowRange origRange = ranges.get(i);<a name="line.666"></a>
+<span class="sourceLineNo">667</span>        ReversedRowRange newRowRange = new ReversedRowRange(<a name="line.667"></a>
+<span class="sourceLineNo">668</span>            origRange.startRow, origRange.startRowInclusive, origRange.stopRow,<a name="line.668"></a>
+<span class="sourceLineNo">669</span>            origRange.isStopRowInclusive());<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        flippedRanges.add(newRowRange);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      }<a name="line.671"></a>
+<span class="sourceLineNo">672</span>      return flippedRanges;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    }<a name="line.673"></a>
+<span class="sourceLineNo">674</span><a name="line.674"></a>
+<span class="sourceLineNo">675</span>    /**<a name="line.675"></a>
+<span class="sourceLineNo">676</span>     * Calculates the position where the given rowkey fits in the ranges list.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>     *<a name="line.677"></a>
+<span class="sourceLineNo">678</span>     * @param rowKey the row key to calculate<a name="line.678"></a>
+<span class="sourceLineNo">679</span>     * @return index the position of the row key<a name="line.679"></a>
+<span class="sourceLineNo">680</span>     */<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    public int getNextRangeIndex(byte[] rowKey) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      BasicRowRange temp;<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      if (reversed) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        temp = new ReversedRowRange(null, true, rowKey, true);<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      } else {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        temp = new RowRange(rowKey, true, null, true);<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      // Because we make sure that `ranges` has the correct natural ordering (given it containing<a name="line.688"></a>
+<span class="sourceLineNo">689</span>      // RowRange or ReverseRowRange objects). This keeps us from having to have two different<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      // implementations below.<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      final int index = Collections.binarySearch(ranges, temp);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      if (index &lt; 0) {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>        int insertionPosition = -index - 1;<a name="line.693"></a>
+<span class="sourceLineNo">694</span>        // check if the row key in the range before the insertion position<a name="line.694"></a>
+<span class="sourceLineNo">695</span>        if (insertionPosition != 0 &amp;&amp; ranges.get(insertionPosition - 1).contains(rowKey)) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>          return insertionPosition - 1;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>        }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>        // check if the row key is before the first range<a name="line.698"></a>
+<span class="sourceLineNo">699</span>        if (insertionPosition == 0 &amp;&amp; !ranges.get(insertionPosition).contains(rowKey)) {<a name="line.699"></a>
+<span class="sourceLineNo">700</span>          return ROW_BEFORE_FIRST_RANGE;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>        }<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        if (!foundFirstRange) {<a name="line.702"></a>
+<span class="sourceLineNo">703</span>          foundFirstRange = true;<a name="line.703"></a>
+<span class="sourceLineNo">704</span>        }<a name="line.704"></a>
+<span class="sourceLineNo">705</span>        return insertionPosition;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      }<a name="line.706"></a>
+<span class="sourceLineNo">707</span>      // the row key equals one of the start keys, and the the range exclude the start key<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      if(ranges.get(index).isSearchRowInclusive() == false) {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        exclusive = true;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>      }<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      return index;<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
+<span class="sourceLineNo">713</span><a name="line.713"></a>
+<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
+<span class="sourceLineNo">715</span>     * Sets {@link #foundFirstRange} to {@code true}, indicating that we found a matching row range.<a name="line.715"></a>
+<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    public void setFoundFirstRange() {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      this.foundFirstRange = true;<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    }<a name="line.719"></a>
+<span class="sourceLineNo">720</span><a name="line.720"></a>
+<span class="sourceLineNo">721</span>    /**<a name="line.721"></a>
+<span class="sourceLineNo">722</span>     * Gets the RowRange at the given offset.<a name="line.722"></a>
+<span class="sourceLineNo">723</span>     */<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    @SuppressWarnings("unchecked")<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    public &lt;T extends BasicRowRange&gt; T get(int i) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      return (T) ranges.get(i);<a name="line.726"></a>
 <span class="sourceLineNo">727</span>    }<a name="line.727"></a>
 <span class="sourceLineNo">728</span><a name="line.728"></a>
 <span class="sourceLineNo">729</span>    /**<a name="line.729"></a>
-<span class="sourceLineNo">730</span>     * Returns true if we exhausted searching all row ranges.<a name="line.730"></a>
+<span class="sourceLineNo">730</span>     * Returns true if the first matching row range was found.<a name="line.730"></a>
 <span class="sourceLineNo">731</span>     */<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    public boolean isIterationComplete(int index) {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      return index &gt;= ranges.size();<a name="line.733"></a>
+<span class="sourceLineNo">732</span>    public boolean hasFoundFirstRange() {<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      return foundFirstRange;<a name="line.733"></a>
 <span class="sourceLineNo">734</span>    }<a name="line.734"></a>
-<span class="sourceLineNo">735</span>  }<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>  @Override<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  public boolean equals(Object obj) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>  @Override<a name="line.742"></a>
-<span class="sourceLineNo">743</span>  public int hashCode() {<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    return Objects.hash(this.ranges);<a name="line.744"></a>
-<span class="sourceLineNo">745</span>  }<a name="line.745"></a>
-<span class="sourceLineNo">746</span>}<a name="line.746"></a>
+<span class="sourceLineNo">735</span><a name="line.735"></a>
+<span class="sourceLineNo">736</span>    /**<a name="line.736"></a>
+<span class="sourceLineNo">737</span>     * Returns true if the current range's key is exclusive<a name="line.737"></a>
+<span class="sourceLineNo">738</span>     */<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    public boolean isExclusive() {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      return exclusive;<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
+<span class="sourceLineNo">742</span><a name="line.742"></a>
+<span class="sourceLineNo">743</span>    /**<a name="line.743"></a>
+<span class="sourceLineNo">744</span>     * Resets the exclusive flag.<a name="line.744"></a>
+<span class="sourceLineNo">745</span>     */<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    public void resetExclusive() {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      exclusive = false;<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>    /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>     * Returns true if this class has been initialized by calling {@link #initialize(boolean)}.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>     */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    public boolean isInitialized() {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>      return initialized;<a name="line.754"></a>
+<span class="sourceLineNo">755</span>    }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    /**<a name="line.757"></a>
+<span class="sourceLineNo">758</span>     * Returns true if we exhausted searching all row ranges.<a name="line.758"></a>
+<span class="sourceLineNo">759</span>     */<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    public boolean isIterationComplete(int index) {<a name="line.760"></a>
+<span class="sourceLineNo">761</span>      return index &gt;= ranges.size();<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    }<a name="line.762"></a>
+<span class="sourceLineNo">763</span>  }<a name="line.763"></a>
+<span class="sourceLineNo">764</span><a name="line.764"></a>
+<span class="sourceLineNo">765</span>  @Override<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  public boolean equals(Object obj) {<a name="line.766"></a>
+<span class="sourceLineNo">767</span>    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);<a name="line.767"></a>
+<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
+<span class="sourceLineNo">769</span><a name="line.769"></a>
+<span class="sourceLineNo">770</span>  @Override<a name="line.770"></a>
+<span class="sourceLineNo">771</span>  public int hashCode() {<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    return Objects.hash(this.ranges);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>  }<a name="line.773"></a>
+<span class="sourceLineNo">774</span>}<a name="line.774"></a>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html b/apidocs/src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html
index 594ad61..d5289be 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html
@@ -34,724 +34,752 @@
 <span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.26"></a>
 <span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.HConstants;<a name="line.27"></a>
 <span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.PrivateCellUtil;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.29"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.client.ClientUtil;<a name="line.29"></a>
 <span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.exceptions.DeserializationException;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.FilterProtos;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.34"></a>
-<span class="sourceLineNo">035</span><a name="line.35"></a>
-<span class="sourceLineNo">036</span>/**<a name="line.36"></a>
-<span class="sourceLineNo">037</span> * Filter to support scan multiple row key ranges. It can construct the row key ranges from the<a name="line.37"></a>
-<span class="sourceLineNo">038</span> * passed list which can be accessed by each region server.<a name="line.38"></a>
-<span class="sourceLineNo">039</span> *<a name="line.39"></a>
-<span class="sourceLineNo">040</span> * HBase is quite efficient when scanning only one small row key range. If user needs to specify<a name="line.40"></a>
-<span class="sourceLineNo">041</span> * multiple row key ranges in one scan, the typical solutions are: 1. through FilterList which is a<a name="line.41"></a>
-<span class="sourceLineNo">042</span> * list of row key Filters, 2. using the SQL layer over HBase to join with two table, such as hive,<a name="line.42"></a>
-<span class="sourceLineNo">043</span> * phoenix etc. However, both solutions are inefficient. Both of them can't utilize the range info<a name="line.43"></a>
-<span class="sourceLineNo">044</span> * to perform fast forwarding during scan which is quite time consuming. If the number of ranges<a name="line.44"></a>
-<span class="sourceLineNo">045</span> * are quite big (e.g. millions), join is a proper solution though it is slow. However, there are<a name="line.45"></a>
-<span class="sourceLineNo">046</span> * cases that user wants to specify a small number of ranges to scan (e.g. &amp;lt;1000 ranges). Both<a name="line.46"></a>
-<span class="sourceLineNo">047</span> * solutions can't provide satisfactory performance in such case. MultiRowRangeFilter is to support<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * such usec ase (scan multiple row key ranges), which can construct the row key ranges from user<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * specified list and perform fast-forwarding during scan. Thus, the scan will be quite efficient.<a name="line.49"></a>
-<span class="sourceLineNo">050</span> */<a name="line.50"></a>
-<span class="sourceLineNo">051</span>@InterfaceAudience.Public<a name="line.51"></a>
-<span class="sourceLineNo">052</span>public class MultiRowRangeFilter extends FilterBase {<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private static final int ROW_BEFORE_FIRST_RANGE = -1;<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private final List&lt;RowRange&gt; rangeList;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>  private final RangeIteration ranges;<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>  private boolean done = false;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>  private int index;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private BasicRowRange range;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  private ReturnCode currentReturnCode;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  /**<a name="line.64"></a>
-<span class="sourceLineNo">065</span>   * @param list A list of &lt;code&gt;RowRange&lt;/code&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>   */<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  public MultiRowRangeFilter(List&lt;RowRange&gt; list) {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    // We don't use rangeList anywhere else, but keeping it lets us pay a little<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    // memory to avoid touching the serialization logic.<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    this.rangeList = Collections.unmodifiableList(sortAndMerge(list));<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    this.ranges = new RangeIteration(rangeList);<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  }<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>  public List&lt;RowRange&gt; getRowRanges() {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    // Used by hbase-rest<a name="line.75"></a>
-<span class="sourceLineNo">076</span>    return this.rangeList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  }<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  @Override<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  public boolean filterAllRemaining() {<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    return done;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  }<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>  @Override<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  public boolean filterRowKey(Cell firstRowCell) {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    if (filterAllRemaining()) return true;<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>    // N.b. We can only do this after we're iterating over records. If we try to do<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    // it before, the Scan (and this filter) may not yet be fully initialized. This is a<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    // wart on Filter and something that'd be nice to clean up (like CP's in HBase2.0)<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    if (!ranges.isInitialized()) {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      ranges.initialize(isReversed());<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>    // If it is the first time of running, calculate the current range index for<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    // the row key. If index is out of bound which happens when the start row<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    // user sets is after the largest stop row of the ranges, stop the scan.<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    // If row key is after the current range, find the next range and update index.<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    byte[] rowArr = firstRowCell.getRowArray();<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    int length = firstRowCell.getRowLength();<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    int offset = firstRowCell.getRowOffset();<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    if (!ranges.hasFoundFirstRange() || !range.contains(rowArr, offset, length)) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      byte[] rowkey = CellUtil.cloneRow(firstRowCell);<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      index = ranges.getNextRangeIndex(rowkey);<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      if (ranges.isIterationComplete(index)) {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>        done = true;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>        currentReturnCode = ReturnCode.NEXT_ROW;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>        return false;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      }<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      if(index != ROW_BEFORE_FIRST_RANGE) {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        range = ranges.get(index);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      } else {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>        range = ranges.get(0);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      }<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      if (ranges.isExclusive()) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>        ranges.resetExclusive();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        currentReturnCode = ReturnCode.NEXT_ROW;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        return false;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      }<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      if (!ranges.hasFoundFirstRange()) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>        if(index != ROW_BEFORE_FIRST_RANGE) {<a name="line.121"></a>
-<span class="sourceLineNo">122</span>          currentReturnCode = ReturnCode.INCLUDE;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>        } else {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>          currentReturnCode = ReturnCode.SEEK_NEXT_USING_HINT;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>        }<a name="line.125"></a>
-<span class="sourceLineNo">126</span>        ranges.setFoundFirstRange();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      } else {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>        if (range.contains(rowArr, offset, length)) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          currentReturnCode = ReturnCode.INCLUDE;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>        } else {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>          currentReturnCode = ReturnCode.SEEK_NEXT_USING_HINT;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>        }<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      }<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    } else {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      currentReturnCode = ReturnCode.INCLUDE;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    return false;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  @Override<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public ReturnCode filterCell(final Cell ignored) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    return currentReturnCode;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  public Cell getNextCellHint(Cell currentKV) {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    // skip to the next range's start row<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    // #getComparisonData lets us avoid the `if (reversed)` branch<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    byte[] comparisonData = range.getComparisonData();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    return PrivateCellUtil.createFirstOnRow(comparisonData, 0, (short) comparisonData.length);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * @return The filter serialized using pb<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   */<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  @Override<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  public byte[] toByteArray() {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    FilterProtos.MultiRowRangeFilter.Builder builder = FilterProtos.MultiRowRangeFilter<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        .newBuilder();<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    for (RowRange range : rangeList) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      if (range != null) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        FilterProtos.RowRange.Builder rangebuilder = FilterProtos.RowRange.newBuilder();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        if (range.startRow != null)<a name="line.163"></a>
-<span class="sourceLineNo">164</span>          rangebuilder.setStartRow(UnsafeByteOperations.unsafeWrap(range.startRow));<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        rangebuilder.setStartRowInclusive(range.startRowInclusive);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        if (range.stopRow != null)<a name="line.166"></a>
-<span class="sourceLineNo">167</span>          rangebuilder.setStopRow(UnsafeByteOperations.unsafeWrap(range.stopRow));<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        rangebuilder.setStopRowInclusive(range.stopRowInclusive);<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        builder.addRowRangeList(rangebuilder.build());<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      }<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    }<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    return builder.build().toByteArray();<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>  /**<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * @param pbBytes A pb serialized instance<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * @return An instance of MultiRowRangeFilter<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   * @throws org.apache.hadoop.hbase.exceptions.DeserializationException<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   */<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  public static MultiRowRangeFilter parseFrom(final byte[] pbBytes)<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      throws DeserializationException {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    FilterProtos.MultiRowRangeFilter proto;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    try {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      proto = FilterProtos.MultiRowRangeFilter.parseFrom(pbBytes);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    } catch (InvalidProtocolBufferException e) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      throw new DeserializationException(e);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    int length = proto.getRowRangeListCount();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    List&lt;FilterProtos.RowRange&gt; rangeProtos = proto.getRowRangeListList();<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    List&lt;RowRange&gt; rangeList = new ArrayList&lt;&gt;(length);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    for (FilterProtos.RowRange rangeProto : rangeProtos) {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      RowRange range = new RowRange(rangeProto.hasStartRow() ? rangeProto.getStartRow()<a name="line.192"></a>
-<span class="sourceLineNo">193</span>          .toByteArray() : null, rangeProto.getStartRowInclusive(), rangeProto.hasStopRow() ?<a name="line.193"></a>
-<span class="sourceLineNo">194</span>              rangeProto.getStopRow().toByteArray() : null, rangeProto.getStopRowInclusive());<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      rangeList.add(range);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    }<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    return new MultiRowRangeFilter(rangeList);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  }<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  /**<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   * @param o the filter to compare<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * @return true if and only if the fields of the filter that are serialized are equal to the<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   *         corresponding fields in other. Used for testing.<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  @Override<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  boolean areSerializedFieldsEqual(Filter o) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    if (o == this)<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      return true;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    if (!(o instanceof MultiRowRangeFilter))<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      return false;<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    MultiRowRangeFilter other = (MultiRowRangeFilter) o;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    if (this.rangeList.size() != other.rangeList.size())<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      return false;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    for (int i = 0; i &lt; rangeList.size(); ++i) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      RowRange thisRange = this.rangeList.get(i);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      RowRange otherRange = other.rangeList.get(i);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      if (!(Bytes.equals(thisRange.startRow, otherRange.startRow) &amp;&amp; Bytes.equals(<a name="line.218"></a>
-<span class="sourceLineNo">219</span>          thisRange.stopRow, otherRange.stopRow) &amp;&amp; (thisRange.startRowInclusive ==<a name="line.219"></a>
-<span class="sourceLineNo">220</span>          otherRange.startRowInclusive) &amp;&amp; (thisRange.stopRowInclusive ==<a name="line.220"></a>
-<span class="sourceLineNo">221</span>          otherRange.stopRowInclusive))) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        return false;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      }<a name="line.223"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.FilterProtos;<a name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>/**<a name="line.37"></a>
+<span class="sourceLineNo">038</span> * Filter to support scan multiple row key ranges. It can construct the row key ranges from the<a name="line.38"></a>
+<span class="sourceLineNo">039</span> * passed list which can be accessed by each region server.<a name="line.39"></a>
+<span class="sourceLineNo">040</span> *<a name="line.40"></a>
+<span class="sourceLineNo">041</span> * HBase is quite efficient when scanning only one small row key range. If user needs to specify<a name="line.41"></a>
+<span class="sourceLineNo">042</span> * multiple row key ranges in one scan, the typical solutions are: 1. through FilterList which is a<a name="line.42"></a>
+<span class="sourceLineNo">043</span> * list of row key Filters, 2. using the SQL layer over HBase to join with two table, such as hive,<a name="line.43"></a>
+<span class="sourceLineNo">044</span> * phoenix etc. However, both solutions are inefficient. Both of them can't utilize the range info<a name="line.44"></a>
+<span class="sourceLineNo">045</span> * to perform fast forwarding during scan which is quite time consuming. If the number of ranges<a name="line.45"></a>
+<span class="sourceLineNo">046</span> * are quite big (e.g. millions), join is a proper solution though it is slow. However, there are<a name="line.46"></a>
+<span class="sourceLineNo">047</span> * cases that user wants to specify a small number of ranges to scan (e.g. &amp;lt;1000 ranges). Both<a name="line.47"></a>
+<span class="sourceLineNo">048</span> * solutions can't provide satisfactory performance in such case. MultiRowRangeFilter is to support<a name="line.48"></a>
+<span class="sourceLineNo">049</span> * such usec ase (scan multiple row key ranges), which can construct the row key ranges from user<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * specified list and perform fast-forwarding during scan. Thus, the scan will be quite efficient.<a name="line.50"></a>
+<span class="sourceLineNo">051</span> */<a name="line.51"></a>
+<span class="sourceLineNo">052</span>@InterfaceAudience.Public<a name="line.52"></a>
+<span class="sourceLineNo">053</span>public class MultiRowRangeFilter extends FilterBase {<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>  private static final int ROW_BEFORE_FIRST_RANGE = -1;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private final List&lt;RowRange&gt; rangeList;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  private final RangeIteration ranges;<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>  private boolean done = false;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>  private int index;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private BasicRowRange range;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  private ReturnCode currentReturnCode;<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  /**<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * @param list A list of &lt;code&gt;RowRange&lt;/code&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   */<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  public MultiRowRangeFilter(List&lt;RowRange&gt; list) {<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    // We don't use rangeList anywhere else, but keeping it lets us pay a little<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    // memory to avoid touching the serialization logic.<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    this.rangeList = Collections.unmodifiableList(sortAndMerge(list));<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    this.ranges = new RangeIteration(rangeList);<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  }<a name="line.73"></a>
+<span class="sourceLineNo">074</span><a name="line.74"></a>
+<span class="sourceLineNo">075</span>  /**<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * Constructor for creating a &lt;code&gt;MultiRowRangeFilter&lt;/code&gt; from multiple rowkey prefixes.<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   *<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   * As &lt;code&gt;MultiRowRangeFilter&lt;/code&gt; javadoc says (See the solution 1 of the first statement),<a name="line.78"></a>
+<span class="sourceLineNo">079</span>   * if you try to create a filter list that scans row keys corresponding to given prefixes (e.g.,<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   * &lt;code&gt;FilterList&lt;/code&gt; composed of multiple &lt;code&gt;PrefixFilter&lt;/code&gt;s), this constructor<a name="line.80"></a>
+<span class="sourceLineNo">081</span>   * provides a way to avoid creating an inefficient one.<a name="line.81"></a>
+<span class="sourceLineNo">082</span>   *<a name="line.82"></a>
+<span class="sourceLineNo">083</span>   * @param rowKeyPrefixes the array of byte array<a name="line.83"></a>
+<span class="sourceLineNo">084</span>   */<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  public MultiRowRangeFilter(byte[][] rowKeyPrefixes) {<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    this(createRangeListFromRowKeyPrefixes(rowKeyPrefixes));<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  }<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  private static List&lt;RowRange&gt; createRangeListFromRowKeyPrefixes(byte[][] rowKeyPrefixes) {<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    if (rowKeyPrefixes == null) {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      throw new IllegalArgumentException("Invalid rowkey prefixes");<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>    List&lt;RowRange&gt; list = new ArrayList&lt;&gt;();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    for (byte[] rowKeyPrefix: rowKeyPrefixes) {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      byte[] stopRow = ClientUtil.calculateTheClosestNextRowKeyForPrefix(rowKeyPrefix);<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      list.add(new RowRange(rowKeyPrefix, true, stopRow, false));<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    }<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    return list;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  }<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>  public List&lt;RowRange&gt; getRowRanges() {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    // Used by hbase-rest<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    return this.rangeList;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  @Override<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public boolean filterAllRemaining() {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    return done;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  }<a name="line.110"></a>
+<span class="sourceLineNo">111</span><a name="line.111"></a>
+<span class="sourceLineNo">112</span>  @Override<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  public boolean filterRowKey(Cell firstRowCell) {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    if (filterAllRemaining()) return true;<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    // N.b. We can only do this after we're iterating over records. If we try to do<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    // it before, the Scan (and this filter) may not yet be fully initialized. This is a<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    // wart on Filter and something that'd be nice to clean up (like CP's in HBase2.0)<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    if (!ranges.isInitialized()) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      ranges.initialize(isReversed());<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    }<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>    // If it is the first time of running, calculate the current range index for<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    // the row key. If index is out of bound which happens when the start row<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    // user sets is after the largest stop row of the ranges, stop the scan.<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    // If row key is after the current range, find the next range and update index.<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    byte[] rowArr = firstRowCell.getRowArray();<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    int length = firstRowCell.getRowLength();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    int offset = firstRowCell.getRowOffset();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    if (!ranges.hasFoundFirstRange() || !range.contains(rowArr, offset, length)) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      byte[] rowkey = CellUtil.cloneRow(firstRowCell);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      index = ranges.getNextRangeIndex(rowkey);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      if (ranges.isIterationComplete(index)) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        done = true;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>        currentReturnCode = ReturnCode.NEXT_ROW;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>        return false;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      }<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      if(index != ROW_BEFORE_FIRST_RANGE) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        range = ranges.get(index);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      } else {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        range = ranges.get(0);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      }<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      if (ranges.isExclusive()) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        ranges.resetExclusive();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        currentReturnCode = ReturnCode.NEXT_ROW;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>        return false;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      }<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      if (!ranges.hasFoundFirstRange()) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>        if(index != ROW_BEFORE_FIRST_RANGE) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>          currentReturnCode = ReturnCode.INCLUDE;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        } else {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>          currentReturnCode = ReturnCode.SEEK_NEXT_USING_HINT;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        }<a name="line.153"></a>
+<span class="sourceLineNo">154</span>        ranges.setFoundFirstRange();<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      } else {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>        if (range.contains(rowArr, offset, length)) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          currentReturnCode = ReturnCode.INCLUDE;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        } else {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>          currentReturnCode = ReturnCode.SEEK_NEXT_USING_HINT;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        }<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      }<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    } else {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      currentReturnCode = ReturnCode.INCLUDE;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    return false;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span><a name="line.167"></a>
+<span class="sourceLineNo">168</span>  @Override<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public ReturnCode filterCell(final Cell ignored) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    return currentReturnCode;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  @Override<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public Cell getNextCellHint(Cell currentKV) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    // skip to the next range's start row<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    // #getComparisonData lets us avoid the `if (reversed)` branch<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    byte[] comparisonData = range.getComparisonData();<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    return PrivateCellUtil.createFirstOnRow(comparisonData, 0, (short) comparisonData.length);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span>  /**<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @return The filter serialized using pb<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   */<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  @Override<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  public byte[] toByteArray() {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    FilterProtos.MultiRowRangeFilter.Builder builder = FilterProtos.MultiRowRangeFilter<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        .newBuilder();<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    for (RowRange range : rangeList) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      if (range != null) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        FilterProtos.RowRange.Builder rangebuilder = FilterProtos.RowRange.newBuilder();<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        if (range.startRow != null)<a name="line.191"></a>
+<span class="sourceLineNo">192</span>          rangebuilder.setStartRow(UnsafeByteOperations.unsafeWrap(range.startRow));<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        rangebuilder.setStartRowInclusive(range.startRowInclusive);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        if (range.stopRow != null)<a name="line.194"></a>
+<span class="sourceLineNo">195</span>          rangebuilder.setStopRow(UnsafeByteOperations.unsafeWrap(range.stopRow));<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        rangebuilder.setStopRowInclusive(range.stopRowInclusive);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        builder.addRowRangeList(rangebuilder.build());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    }<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    return builder.build().toByteArray();<a name="line.200"></a>
+<span class="sourceLineNo">201</span>  }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>  /**<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   * @param pbBytes A pb serialized instance<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   * @return An instance of MultiRowRangeFilter<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   * @throws org.apache.hadoop.hbase.exceptions.DeserializationException<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   */<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  public static MultiRowRangeFilter parseFrom(final byte[] pbBytes)<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      throws DeserializationException {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    FilterProtos.MultiRowRangeFilter proto;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    try {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      proto = FilterProtos.MultiRowRangeFilter.parseFrom(pbBytes);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    } catch (InvalidProtocolBufferException e) {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      throw new DeserializationException(e);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    int length = proto.getRowRangeListCount();<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    List&lt;FilterProtos.RowRange&gt; rangeProtos = proto.getRowRangeListList();<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    List&lt;RowRange&gt; rangeList = new ArrayList&lt;&gt;(length);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    for (FilterProtos.RowRange rangeProto : rangeProtos) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      RowRange range = new RowRange(rangeProto.hasStartRow() ? rangeProto.getStartRow()<a name="line.220"></a>
+<span class="sourceLineNo">221</span>          .toByteArray() : null, rangeProto.getStartRowInclusive(), rangeProto.hasStopRow() ?<a name="line.221"></a>
+<span class="sourceLineNo">222</span>              rangeProto.getStopRow().toByteArray() : null, rangeProto.getStopRowInclusive());<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      rangeList.add(range);<a name="line.223"></a>
 <span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    return true;<a name="line.225"></a>
+<span class="sourceLineNo">225</span>    return new MultiRowRangeFilter(rangeList);<a name="line.225"></a>
 <span class="sourceLineNo">226</span>  }<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
 <span class="sourceLineNo">228</span>  /**<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * sort the ranges and if the ranges with overlap, then merge them.<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   *<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   * @param ranges the list of ranges to sort and merge.<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * @return the ranges after sort and merge.<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   */<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  public static List&lt;RowRange&gt; sortAndMerge(List&lt;RowRange&gt; ranges) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    if (ranges.isEmpty()) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      throw new IllegalArgumentException("No ranges found.");<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    List&lt;RowRange&gt; invalidRanges = new ArrayList&lt;&gt;();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    List&lt;RowRange&gt; newRanges = new ArrayList&lt;&gt;(ranges.size());<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    Collections.sort(ranges);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    if(ranges.get(0).isValid()) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      if (ranges.size() == 1) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        newRanges.add(ranges.get(0));<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      }<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    } else {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      invalidRanges.add(ranges.get(0));<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>    byte[] lastStartRow = ranges.get(0).startRow;<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    boolean lastStartRowInclusive = ranges.get(0).startRowInclusive;<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    byte[] lastStopRow = ranges.get(0).stopRow;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    boolean lastStopRowInclusive = ranges.get(0).stopRowInclusive;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    int i = 1;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    for (; i &lt; ranges.size(); i++) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      RowRange range = ranges.get(i);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      if (!range.isValid()) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        invalidRanges.add(range);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      if(Bytes.equals(lastStopRow, HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>            lastStopRowInclusive));<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        break;<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      }<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      // with overlap in the ranges<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      if ((Bytes.compareTo(lastStopRow, range.startRow) &gt; 0) ||<a name="line.265"></a>
-<span class="sourceLineNo">266</span>          (Bytes.compareTo(lastStopRow, range.startRow) == 0 &amp;&amp; !(lastStopRowInclusive == false &amp;&amp;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>          range.isStartRowInclusive() == false))) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        if(Bytes.equals(range.stopRow, HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>          newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, range.stopRow,<a name="line.269"></a>
-<span class="sourceLineNo">270</span>              range.stopRowInclusive));<a name="line.270"></a>
-<span class="sourceLineNo">271</span>          break;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>        }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>        // if first range contains second range, ignore the second range<a name="line.273"></a>
-<span class="sourceLineNo">274</span>        if (Bytes.compareTo(lastStopRow, range.stopRow) &gt;= 0) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>          if((Bytes.compareTo(lastStopRow, range.stopRow) == 0)) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>            if(lastStopRowInclusive == true || range.stopRowInclusive == true) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>              lastStopRowInclusive = true;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>            }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>          }<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          if ((i + 1) == ranges.size()) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>            newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.281"></a>
-<span class="sourceLineNo">282</span>                lastStopRowInclusive));<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          }<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        } else {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>          lastStopRow = range.stopRow;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          lastStopRowInclusive = range.stopRowInclusive;<a name="line.286"></a>
-<span class="sourceLineNo">287</span>          if ((i + 1) &lt; ranges.size()) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>            i++;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>            range = ranges.get(i);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>            if (!range.isValid()) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>              invalidRanges.add(range);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          } else {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.294"></a>
-<span class="sourceLineNo">295</span>                lastStopRowInclusive));<a name="line.295"></a>
-<span class="sourceLineNo">296</span>            break;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          while ((Bytes.compareTo(lastStopRow, range.startRow) &gt; 0) ||<a name="line.298"></a>
-<span class="sourceLineNo">299</span>              (Bytes.compareTo(lastStopRow, range.startRow) == 0 &amp;&amp;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              (lastStopRowInclusive == true || range.startRowInclusive==true))) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            if(Bytes.equals(range.stopRow, HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>              break;<a name="line.302"></a>
-<span class="sourceLineNo">303</span>            }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            // if this first range contain second range, ignore the second range<a name="line.304"></a>
-<span class="sourceLineNo">305</span>            if (Bytes.compareTo(lastStopRow, range.stopRow) &gt;= 0) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>              if(lastStopRowInclusive == true || range.stopRowInclusive == true) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>                lastStopRowInclusive = true;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>              }<a name="line.308"></a>
-<span class="sourceLineNo">309</span>              i++;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>              if (i &lt; ranges.size()) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>                range = ranges.get(i);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>                if (!range.isValid()) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>                  invalidRanges.add(range);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>                }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>              } else {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>                break;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>              }<a name="line.317"></a>
-<span class="sourceLineNo">318</span>            } else {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>              lastStopRow = range.stopRow;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>              lastStopRowInclusive = range.stopRowInclusive;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>              i++;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>              if (i &lt; ranges.size()) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>                range = ranges.get(i);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>                if (!range.isValid()) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>                  invalidRanges.add(range);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>                }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>              } else {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>                break;<a name="line.328"></a>
-<span class="sourceLineNo">329</span>              }<a name="line.329"></a>
-<span class="sourceLineNo">330</span>            }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          if(Bytes.equals(range.stopRow, HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>            if((Bytes.compareTo(lastStopRow, range.startRow) &lt; 0) ||<a name="line.333"></a>
-<span class="sourceLineNo">334</span>                (Bytes.compareTo(lastStopRow, range.startRow) == 0 &amp;&amp;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>                lastStopRowInclusive == false &amp;&amp; range.startRowInclusive == false)) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>              newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.336"></a>
-<span class="sourceLineNo">337</span>                  lastStopRowInclusive));<a name="line.337"></a>
-<span class="sourceLineNo">338</span>              newRanges.add(range);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>            } else {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, range.stopRow,<a name="line.340"></a>
-<span class="sourceLineNo">341</span>                  range.stopRowInclusive));<a name="line.341"></a>
-<span class="sourceLineNo">342</span>              break;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>            }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>          newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.345"></a>
-<span class="sourceLineNo">346</span>              lastStopRowInclusive));<a name="line.346"></a>
-<span class="sourceLineNo">347</span>          if ((i + 1) == ranges.size()) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            newRanges.add(range);<a name="line.348"></a>
-<span class="sourceLineNo">349</span>          }<a name="line.349"></a>
-<span class="sourceLineNo">350</span>          lastStartRow = range.startRow;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>          lastStartRowInclusive = range.startRowInclusive;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          lastStopRow = range.stopRow;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          lastStopRowInclusive = range.stopRowInclusive;<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      } else {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.356"></a>
-<span class="sourceLineNo">357</span>            lastStopRowInclusive));<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        if ((i + 1) == ranges.size()) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>          newRanges.add(range);<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        }<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        lastStartRow = range.startRow;<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        lastStartRowInclusive = range.startRowInclusive;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        lastStopRow = range.stopRow;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        lastStopRowInclusive = range.stopRowInclusive;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    // check the remaining ranges<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    for(int j=i; j &lt; ranges.size(); j++) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if(!ranges.get(j).isValid()) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        invalidRanges.add(ranges.get(j));<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    // if invalid range exists, throw the exception<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    if (invalidRanges.size() != 0) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      throwExceptionForInvalidRanges(invalidRanges, true);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    // If no valid ranges found, throw the exception<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    if(newRanges.isEmpty()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      throw new IllegalArgumentException("No valid ranges found.");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    return newRanges;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  }<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private static void throwExceptionForInvalidRanges(List&lt;RowRange&gt; invalidRanges,<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      boolean details) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    StringBuilder sb = new StringBuilder();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    sb.append(invalidRanges.size()).append(" invaild ranges.\n");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (details) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      for (RowRange range : invalidRanges) {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        sb.append(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>            "Invalid range: start row =&gt; " + Bytes.toString(range.startRow) + ", stop row =&gt; "<a name="line.391"></a>
-<span class="sourceLineNo">392</span>                + Bytes.toString(range.stopRow)).append('\n');<a name="line.392"></a>
+<span class="sourceLineNo">229</span>   * @param o the filter to compare<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * @return true if and only if the fields of the filter that are serialized are equal to the<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   *         corresponding fields in other. Used for testing.<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   */<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  @Override<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  boolean areSerializedFieldsEqual(Filter o) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    if (o == this)<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      return true;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    if (!(o instanceof MultiRowRangeFilter))<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      return false;<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>    MultiRowRangeFilter other = (MultiRowRangeFilter) o;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    if (this.rangeList.size() != other.rangeList.size())<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      return false;<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    for (int i = 0; i &lt; rangeList.size(); ++i) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      RowRange thisRange = this.rangeList.get(i);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      RowRange otherRange = other.rangeList.get(i);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      if (!(Bytes.equals(thisRange.startRow, otherRange.startRow) &amp;&amp; Bytes.equals(<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          thisRange.stopRow, otherRange.stopRow) &amp;&amp; (thisRange.startRowInclusive ==<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          otherRange.startRowInclusive) &amp;&amp; (thisRange.stopRowInclusive ==<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          otherRange.stopRowInclusive))) {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        return false;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      }<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return true;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * sort the ranges and if the ranges with overlap, then merge them.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   *<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @param ranges the list of ranges to sort and merge.<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   * @return the ranges after sort and merge.<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   */<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  public static List&lt;RowRange&gt; sortAndMerge(List&lt;RowRange&gt; ranges) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    if (ranges.isEmpty()) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      throw new IllegalArgumentException("No ranges found.");<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    List&lt;RowRange&gt; invalidRanges = new ArrayList&lt;&gt;();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    List&lt;RowRange&gt; newRanges = new ArrayList&lt;&gt;(ranges.size());<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    Collections.sort(ranges);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    if(ranges.get(0).isValid()) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      if (ranges.size() == 1) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        newRanges.add(ranges.get(0));<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    } else {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      invalidRanges.add(ranges.get(0));<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>    byte[] lastStartRow = ranges.get(0).startRow;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    boolean lastStartRowInclusive = ranges.get(0).startRowInclusive;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    byte[] lastStopRow = ranges.get(0).stopRow;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    boolean lastStopRowInclusive = ranges.get(0).stopRowInclusive;<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    int i = 1;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    for (; i &lt; ranges.size(); i++) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      RowRange range = ranges.get(i);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      if (!range.isValid()) {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        invalidRanges.add(range);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      if(Bytes.equals(lastStopRow, HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>            lastStopRowInclusive));<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        break;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      }<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      // with overlap in the ranges<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      if ((Bytes.compareTo(lastStopRow, range.startRow) &gt; 0) ||<a name="line.293"></a>
+<span class="sourceLineNo">294</span>          (Bytes.compareTo(lastStopRow, range.startRow) == 0 &amp;&amp; !(lastStopRowInclusive == false &amp;&amp;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          range.isStartRowInclusive() == false))) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        if(Bytes.equals(range.stopRow, HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, range.stopRow,<a name="line.297"></a>
+<span class="sourceLineNo">298</span>              range.stopRowInclusive));<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          break;<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        // if first range contains second range, ignore the second range<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        if (Bytes.compareTo(lastStopRow, range.stopRow) &gt;= 0) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>          if((Bytes.compareTo(lastStopRow, range.stopRow) == 0)) {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>            if(lastStopRowInclusive == true || range.stopRowInclusive == true) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>              lastStopRowInclusive = true;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>            }<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>          if ((i + 1) == ranges.size()) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>            newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.309"></a>
+<span class="sourceLineNo">310</span>                lastStopRowInclusive));<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          }<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        } else {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>          lastStopRow = range.stopRow;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          lastStopRowInclusive = range.stopRowInclusive;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          if ((i + 1) &lt; ranges.size()) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>            i++;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>            range = ranges.get(i);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>            if (!range.isValid()) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>              invalidRanges.add(range);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>            }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          } else {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>            newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.322"></a>
+<span class="sourceLineNo">323</span>                lastStopRowInclusive));<a name="line.323"></a>
+<span class="sourceLineNo">324</span>            break;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>          }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>          while ((Bytes.compareTo(lastStopRow, range.startRow) &gt; 0) ||<a name="line.326"></a>
+<span class="sourceLineNo">327</span>              (Bytes.compareTo(lastStopRow, range.startRow) == 0 &amp;&amp;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>              (lastStopRowInclusive == true || range.startRowInclusive==true))) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>            if(Bytes.equals(range.stopRow, HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>              break;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>            }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>            // if this first range contain second range, ignore the second range<a name="line.332"></a>
+<span class="sourceLineNo">333</span>            if (Bytes.compareTo(lastStopRow, range.stopRow) &gt;= 0) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>              if(lastStopRowInclusive == true || range.stopRowInclusive == true) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>                lastStopRowInclusive = true;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>              }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>              i++;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>              if (i &lt; ranges.size()) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>                range = ranges.get(i);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>                if (!range.isValid()) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>                  invalidRanges.add(range);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>                }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>              } else {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>                break;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>              }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            } else {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>              lastStopRow = range.stopRow;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>              lastStopRowInclusive = range.stopRowInclusive;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>              i++;<a name="line.349"></a>
+<span class="sourceLineNo">350</span>              if (i &lt; ranges.size()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>                range = ranges.get(i);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>                if (!range.isValid()) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>                  invalidRanges.add(range);<a name="line.353"></a>
+<span class="sourceLineNo">354</span>                }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              } else {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>                break;<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              }<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>          }<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          if(Bytes.equals(range.stopRow, HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>            if((Bytes.compareTo(lastStopRow, range.startRow) &lt; 0) ||<a name="line.361"></a>
+<span class="sourceLineNo">362</span>                (Bytes.compareTo(lastStopRow, range.startRow) == 0 &amp;&amp;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>                lastStopRowInclusive == false &amp;&amp; range.startRowInclusive == false)) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>              newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.364"></a>
+<span class="sourceLineNo">365</span>                  lastStopRowInclusive));<a name="line.365"></a>
+<span class="sourceLineNo">366</span>              newRanges.add(range);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>            } else {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>              newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, range.stopRow,<a name="line.368"></a>
+<span class="sourceLineNo">369</span>                  range.stopRowInclusive));<a name="line.369"></a>
+<span class="sourceLineNo">370</span>              break;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            }<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>          newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.373"></a>
+<span class="sourceLineNo">374</span>              lastStopRowInclusive));<a name="line.374"></a>
+<span class="sourceLineNo">375</span>          if ((i + 1) == ranges.size()) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>            newRanges.add(range);<a name="line.376"></a>
+<span class="sourceLineNo">377</span>          }<a name="line.377"></a>
+<span class="sourceLineNo">378</span>          lastStartRow = range.startRow;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>          lastStartRowInclusive = range.startRowInclusive;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>          lastStopRow = range.stopRow;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          lastStopRowInclusive = range.stopRowInclusive;<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        }<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      } else {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        newRanges.add(new RowRange(lastStartRow, lastStartRowInclusive, lastStopRow,<a name="line.384"></a>
+<span class="sourceLineNo">385</span>            lastStopRowInclusive));<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if ((i + 1) == ranges.size()) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          newRanges.add(range);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>        lastStartRow = range.startRow;<a name="line.389"></a>
+<span class="sourceLineNo">390</span>        lastStartRowInclusive = range.startRowInclusive;<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        lastStopRow = range.stopRow;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        lastStopRowInclusive = range.stopRowInclusive;<a name="line.392"></a>
 <span class="sourceLineNo">393</span>      }<a name="line.393"></a>
 <span class="sourceLineNo">394</span>    }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    throw new IllegalArgumentException(sb.toString());<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  }<a name="line.396"></a>
-<span class="sourceLineNo">397</span><a name="line.397"></a>
-<span class="sourceLineNo">398</span>  private static abstract class BasicRowRange implements Comparable&lt;BasicRowRange&gt; {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    protected byte[] startRow;<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    protected boolean startRowInclusive = true;<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    protected byte[] stopRow;<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    protected boolean stopRowInclusive = false;<a name="line.402"></a>
-<span class="sourceLineNo">403</span><a name="line.403"></a>
-<span class="sourceLineNo">404</span>    public BasicRowRange() {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    /**<a name="line.406"></a>
-<span class="sourceLineNo">407</span>     * If the startRow is empty or null, set it to HConstants.EMPTY_BYTE_ARRAY, means begin at the<a name="line.407"></a>
-<span class="sourceLineNo">408</span>     * start row of the table. If the stopRow is empty or null, set it to<a name="line.408"></a>
-<span class="sourceLineNo">409</span>     * HConstants.EMPTY_BYTE_ARRAY, means end of the last row of table.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>     */<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    public BasicRowRange(String startRow, boolean startRowInclusive, String stopRow,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        boolean stopRowInclusive) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      this((startRow == null || startRow.isEmpty()) ? HConstants.EMPTY_BYTE_ARRAY :<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        Bytes.toBytes(startRow), startRowInclusive,<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        (stopRow == null || stopRow.isEmpty()) ? HConstants.EMPTY_BYTE_ARRAY :<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        Bytes.toBytes(stopRow), stopRowInclusive);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    }<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    public BasicRowRange(byte[] startRow,  boolean startRowInclusive, byte[] stopRow,<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        boolean stopRowInclusive) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      this.startRow = (startRow == null) ? HConstants.EMPTY_BYTE_ARRAY : startRow;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      this.startRowInclusive = startRowInclusive;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      this.stopRow = (stopRow == null) ? HConstants.EMPTY_BYTE_ARRAY :stopRow;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      this.stopRowInclusive = stopRowInclusive;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    }<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>    public byte[] getStartRow() {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      return startRow;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>    public byte[] getStopRow() {<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      return stopRow;<a name="line.432"></a>
+<span class="sourceLineNo">395</span>    // check the remaining ranges<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    for(int j=i; j &lt; ranges.size(); j++) {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      if(!ranges.get(j).isValid()) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>        invalidRanges.add(ranges.get(j));<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    }<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // if invalid range exists, throw the exception<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if (invalidRanges.size() != 0) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      throwExceptionForInvalidRanges(invalidRanges, true);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    // If no valid ranges found, throw the exception<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    if(newRanges.isEmpty()) {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      throw new IllegalArgumentException("No valid ranges found.");<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    return newRanges;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  }<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>  private static void throwExceptionForInvalidRanges(List&lt;RowRange&gt; invalidRanges,<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      boolean details) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    StringBuilder sb = new StringBuilder();<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    sb.append(invalidRanges.size()).append(" invaild ranges.\n");<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (details) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      for (RowRange range : invalidRanges) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        sb.append(<a name="line.418"></a>
+<span class="sourceLineNo">419</span>            "Invalid range: start row =&gt; " + Bytes.toString(range.startRow) + ", stop row =&gt; "<a name="line.419"></a>
+<span class="sourceLineNo">420</span>                + Bytes.toString(range.stopRow)).append('\n');<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    throw new IllegalArgumentException(sb.toString());<a name="line.423"></a>
+<span class="sourceLineNo">424</span>  }<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>  private static abstract class BasicRowRange implements Comparable&lt;BasicRowRange&gt; {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    protected byte[] startRow;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    protected boolean startRowInclusive = true;<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    protected byte[] stopRow;<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    protected boolean stopRowInclusive = false;<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>    public BasicRowRange() {<a name="line.432"></a>
 <span class="sourceLineNo">433</span>    }<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>    /**<a name="line.435"></a>
-<span class="sourceLineNo">436</span>     * @return if start row is inclusive.<a name="line.436"></a>
-<span class="sourceLineNo">437</span>     */<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    public boolean isStartRowInclusive() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      return startRowInclusive;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>    /**<a name="line.442"></a>
-<span class="sourceLineNo">443</span>     * @return if stop row is inclusive.<a name="line.443"></a>
-<span class="sourceLineNo">444</span>     */<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    public boolean isStopRowInclusive() {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      return stopRowInclusive;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>    public boolean contains(byte[] row) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      return contains(row, 0, row.length);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>    public boolean contains(byte[] buffer, int offset, int length) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      if(startRowInclusive) {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        if(stopRowInclusive) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>          return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) &gt;= 0<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              &amp;&amp; (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) ||<a name="line.457"></a>
-<span class="sourceLineNo">458</span>                  Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) &lt;= 0);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        } else {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) &gt;= 0<a name="line.460"></a>
-<span class="sourceLineNo">461</span>              &amp;&amp; (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) ||<a name="line.461"></a>
-<span class="sourceLineNo">462</span>                  Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) &lt; 0);<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      } else {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        if(stopRowInclusive) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) &gt; 0<a name="line.466"></a>
-<span class="sourceLineNo">467</span>              &amp;&amp; (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) ||<a name="line.467"></a>
-<span class="sourceLineNo">468</span>                  Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) &lt;= 0);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        } else {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) &gt; 0<a name="line.470"></a>
-<span class="sourceLineNo">471</span>              &amp;&amp; (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) ||<a name="line.471"></a>
-<span class="sourceLineNo">472</span>                  Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) &lt; 0);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">434</span>    /**<a name="line.434"></a>
+<span class="sourceLineNo">435</span>     * If the startRow is empty or null, set it to HConstants.EMPTY_BYTE_ARRAY, means begin at the<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     * start row of the table. If the stopRow is empty or null, set it to<a name="line.436"></a>
+<span class="sourceLineNo">437</span>     * HConstants.EMPTY_BYTE_ARRAY, means end of the last row of table.<a name="line.437"></a>
+<span class="sourceLineNo">438</span>     */<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    public BasicRowRange(String startRow, boolean startRowInclusive, String stopRow,<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        boolean stopRowInclusive) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      this((startRow == null || startRow.isEmpty()) ? HConstants.EMPTY_BYTE_ARRAY :<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        Bytes.toBytes(startRow), startRowInclusive,<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        (stopRow == null || stopRow.isEmpty()) ? HConstants.EMPTY_BYTE_ARRAY :<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        Bytes.toBytes(stopRow), stopRowInclusive);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>    public BasicRowRange(byte[] startRow,  boolean startRowInclusive, byte[] stopRow,<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        boolean stopRowInclusive) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      this.startRow = (startRow == null) ? HConstants.EMPTY_BYTE_ARRAY : startRow;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      this.startRowInclusive = startRowInclusive;<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.stopRow = (stopRow == null) ? HConstants.EMPTY_BYTE_ARRAY :stopRow;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      this.stopRowInclusive = stopRowInclusive;<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>    public byte[] getStartRow() {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      return startRow;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>    public byte[] getStopRow() {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      return stopRow;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>    /**<a name="line.463"></a>
+<span class="sourceLineNo">464</span>     * @return if start row is inclusive.<a name="line.464"></a>
+<span class="sourceLineNo">465</span>     */<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    public boolean isStartRowInclusive() {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      return startRowInclusive;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    }<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
+<span class="sourceLineNo">471</span>     * @return if stop row is inclusive.<a name="line.471"></a>
+<span class="sourceLineNo">472</span>     */<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    public boolean isStopRowInclusive() {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      return stopRowInclusive;<a name="line.474"></a>
 <span class="sourceLineNo">475</span>    }<a name="line.475"></a>
 <span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>    public boolean isValid() {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      return Bytes.equals(startRow, HConstants.EMPTY_BYTE_ARRAY)<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          || Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY)<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          || Bytes.compareTo(startRow, stopRow) &lt; 0<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          || (Bytes.compareTo(startRow, stopRow) == 0 &amp;&amp; stopRowInclusive == true);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>    @Override<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    public boolean equals(Object obj){<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      if (!(obj instanceof BasicRowRange)) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        return false;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      }<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      if (this == obj) {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        return true;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      }<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      BasicRowRange rr = (BasicRowRange) obj;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      return Bytes.equals(this.stopRow, rr.getStopRow()) &amp;&amp;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          Bytes.equals(this.startRow, this.getStartRow()) &amp;&amp;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          this.startRowInclusive == rr.isStartRowInclusive() &amp;&amp;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          this.stopRowInclusive == rr.isStopRowInclusive();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>    @Override<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    public int hashCode() {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      return Objects.hash(Bytes.hashCode(this.stopRow),<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          Bytes.hashCode(this.startRow),<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          this.startRowInclusive,<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          this.stopRowInclusive);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>    /**<a name="line.507"></a>
-<span class="sourceLineNo">508</span>     * Returns the data to be used to compare {@code this} to another object.<a name="line.508"></a>
-<span class="sourceLineNo">509</span>     */<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    public abstract byte[] getComparisonData();<a name="line.510"></a>
+<span class="sourceLineNo">477</span>    public boolean contains(byte[] row) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      return contains(row, 0, row.length);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
+<span class="sourceLineNo">480</span><a name="line.480"></a>
+<span class="sourceLineNo">481</span>    public boolean contains(byte[] buffer, int offset, int length) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      if(startRowInclusive) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>        if(stopRowInclusive) {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>          return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) &gt;= 0<a name="line.484"></a>
+<span class="sourceLineNo">485</span>              &amp;&amp; (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) ||<a name="line.485"></a>
+<span class="sourceLineNo">486</span>                  Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) &lt;= 0);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        } else {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>          return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) &gt;= 0<a name="line.488"></a>
+<span class="sourceLineNo">489</span>              &amp;&amp; (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) ||<a name="line.489"></a>
+<span class="sourceLineNo">490</span>                  Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) &lt; 0);<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        }<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      } else {<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        if(stopRowInclusive) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>          return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) &gt; 0<a name="line.494"></a>
+<span class="sourceLineNo">495</span>              &amp;&amp; (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) ||<a name="line.495"></a>
+<span class="sourceLineNo">496</span>                  Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) &lt;= 0);<a name="line.496"></a>
+<span class="sourceLineNo">497</span>        } else {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>          return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) &gt; 0<a name="line.498"></a>
+<span class="sourceLineNo">499</span>              &amp;&amp; (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) ||<a name="line.499"></a>
+<span class="sourceLineNo">500</span>                  Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) &lt; 0);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        }<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      }<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    }<a name="line.503"></a>
+<span class="sourceLineNo">504</span><a name="line.504"></a>
+<span class="sourceLineNo">505</span>    public boolean isValid() {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      return Bytes.equals(startRow, HConstants.EMPTY_BYTE_ARRAY)<a name="line.506"></a>
+<span class="sourceLineNo">507</span>          || Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY)<a name="line.507"></a>
+<span class="sourceLineNo">508</span>          || Bytes.compareTo(startRow, stopRow) &lt; 0<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          || (Bytes.compareTo(startRow, stopRow) == 0 &amp;&amp; stopRowInclusive == true);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    }<a name="line.510"></a>
 <span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    /**<a name="line.512"></a>
-<span class="sourceLineNo">513</span>     * Returns whether the bounding row used for binary-search is inclusive or not.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>     *<a name="line.514"></a>
-<span class="sourceLineNo">515</span>     * For forward scans, we would check the starRow, but we would check the stopRow for<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * the reverse scan case.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     */<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    public abstract boolean isSearchRowInclusive();<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    @Override<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    public int compareTo(BasicRowRange other) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      byte[] left;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      byte[] right;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      if (isAscendingOrder()) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>        left = this.getComparisonData();<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        right = other.getComparisonData();<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      } else {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        left = other.getComparisonData();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        right = this.getComparisonData();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      return Bytes.compareTo(left, right);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    }<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    public abstract boolean isAscendingOrder();<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>  /**<a name="line.537"></a>
-<span class="sourceLineNo">538</span>   * Internal RowRange that reverses the sort-order to handle reverse scans.<a name="line.538"></a>
-<span class="sourceLineNo">539</span>   */<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  @InterfaceAudience.Private<a name="line.540"></a>
-<span class="sourceLineNo">541</span>  private static class ReversedRowRange extends BasicRowRange {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    public ReversedRowRange(byte[] startRow,  boolean startRowInclusive, byte[] stopRow,<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        boolean stopRowInclusive) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      super(startRow, startRowInclusive, stopRow, stopRowInclusive);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    }<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>    @Override<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    public byte[] getComparisonData() {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      return this.stopRow;<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    }<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>    @Override<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    public boolean isSearchRowInclusive() {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      return this.stopRowInclusive;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>    @Override<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    public boolean isAscendingOrder() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      return false;<a name="line.559"></a>
+<span class="sourceLineNo">512</span>    @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    public boolean equals(Object obj){<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      if (!(obj instanceof BasicRowRange)) {<a name="line.514"></a>
+<span class="sourceLineNo">515</span>        return false;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      }<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      if (this == obj) {<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        return true;<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      }<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      BasicRowRange rr = (BasicRowRange) obj;<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      return Bytes.equals(this.stopRow, rr.getStopRow()) &amp;&amp;<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          Bytes.equals(this.startRow, this.getStartRow()) &amp;&amp;<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          this.startRowInclusive == rr.isStartRowInclusive() &amp;&amp;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          this.stopRowInclusive == rr.isStopRowInclusive();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    @Override<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    public int hashCode() {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      return Objects.hash(Bytes.hashCode(this.stopRow),<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Bytes.hashCode(this.startRow),<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          this.startRowInclusive,<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          this.stopRowInclusive);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    /**<a name="line.535"></a>
+<span class="sourceLineNo">536</span>     * Returns the data to be used to compare {@code this} to another object.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>     */<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    public abstract byte[] getComparisonData();<a name="line.538"></a>
+<span class="sourceLineNo">539</span><a name="line.539"></a>
+<span class="sourceLineNo">540</span>    /**<a name="line.540"></a>
+<span class="sourceLineNo">541</span>     * Returns whether the bounding row used for binary-search is inclusive or not.<a name="line.541"></a>
+<span class="sourceLineNo">542</span>     *<a name="line.542"></a>
+<span class="sourceLineNo">543</span>     * For forward scans, we would check the starRow, but we would check the stopRow for<a name="line.543"></a>
+<span class="sourceLineNo">544</span>     * the reverse scan case.<a name="line.544"></a>
+<span class="sourceLineNo">545</span>     */<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    public abstract boolean isSearchRowInclusive();<a name="line.546"></a>
+<span class="sourceLineNo">547</span><a name="line.547"></a>
+<span class="sourceLineNo">548</span>    @Override<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    public int compareTo(BasicRowRange other) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      byte[] left;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      byte[] right;<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      if (isAscendingOrder()) {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        left = this.getComparisonData();<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        right = other.getComparisonData();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      } else {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>        left = other.getComparisonData();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>        right = this.getComparisonData();<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      }<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      return Bytes.compareTo(left, right);<a name="line.559"></a>
 <span class="sourceLineNo">560</span>    }<a name="line.560"></a>
-<span class="sourceLineNo">561</span>  }<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>  @InterfaceAudience.Public<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  public static class RowRange extends BasicRowRange {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    public RowRange() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    /**<a name="line.567"></a>
-<span class="sourceLineNo">568</span>     * If the startRow is empty or null, set it to HConstants.EMPTY_BYTE_ARRAY, means begin at the<a name="line.568"></a>
-<span class="sourceLineNo">569</span>     * start row of the table. If the stopRow is empty or null, set it to<a name="line.569"></a>
-<span class="sourceLineNo">570</span>     * HConstants.EMPTY_BYTE_ARRAY, means end of the last row of table.<a name="line.570"></a>
-<span class="sourceLineNo">571</span>     */<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    public RowRange(String startRow, boolean startRowInclusive, String stopRow,<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        boolean stopRowInclusive) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      super(startRow, startRowInclusive, stopRow, stopRowInclusive);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    }<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    public RowRange(byte[] startRow,  boolean startRowInclusive, byte[] stopRow,<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        boolean stopRowInclusive) {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      super(startRow, startRowInclusive, stopRow, stopRowInclusive);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    }<a name="line.580"></a>
-<span class="sourceLineNo">581</span><a name="line.581"></a>
-<span class="sourceLineNo">582</span>    @Override<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    public byte[] getComparisonData() {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      return startRow;<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    }<a name="line.585"></a>
-<span class="sourceLineNo">586</span><a name="line.586"></a>
-<span class="sourceLineNo">587</span>    @Override<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    public boolean isSearchRowInclusive() {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      return startRowInclusive;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>    @Override<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    public boolean isAscendingOrder() {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      return true;<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>  }<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>  /**<a name="line.598"></a>
-<span class="sourceLineNo">599</span>   * Abstraction over the ranges of rows to return from this filter, regardless of forward or<a name="line.599"></a>
-<span class="sourceLineNo">600</span>   * reverse scans being used. This Filter can use this class, agnostic of iteration direction,<a name="line.600"></a>
-<span class="sourceLineNo">601</span>   * as the same algorithm can be applied in both cases.<a name="line.601"></a>
-<span class="sourceLineNo">602</span>   */<a name="line.602"></a>
-<span class="sourceLineNo">603</span>  @InterfaceAudience.Private<a name="line.603"></a>
-<span class="sourceLineNo">604</span>  private static class RangeIteration {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    private boolean exclusive = false;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    private boolean initialized = false;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    private boolean foundFirstRange = false;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    private boolean reversed = false;<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    private final List&lt;RowRange&gt; sortedAndMergedRanges;<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    private List&lt;? extends BasicRowRange&gt; ranges;<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>    public RangeIteration(List&lt;RowRange&gt; sortedAndMergedRanges) {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      this.sortedAndMergedRanges = sortedAndMergedRanges;<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    void initialize(boolean reversed) {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>      // Avoid double initialization<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      assert !this.initialized;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      this.reversed = reversed;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>      if (reversed) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        // If we are doing a reverse scan, we can reverse the ranges (both the elements in<a name="line.621"></a>
-<span class="sourceLineNo">622</span>        // the list as well as their start/stop key), and use the same algorithm.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        this.ranges = flipAndReverseRanges(sortedAndMergedRanges);<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      } else {<a name="line.624"></a>
-<span class="sourceLineNo">625</span>        this.ranges = sortedAndMergedRanges;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      this.initialized = true;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    /**<a name="line.630"></a>
-<span class="sourceLineNo">631</span>     * Rebuilds the sorted ranges (by startKey) into an equivalent sorted list of ranges, only by<a name="line.631"></a>
-<span class="sourceLineNo">632</span>     * stopKey instead. Descending order and the ReversedRowRange compareTo implementation make<a name="line.632"></a>
-<span class="sourceLineNo">633</span>     * sure that we can use Collections.binarySearch().<a name="line.633"></a>
-<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    static List&lt;ReversedRowRange&gt; flipAndReverseRanges(List&lt;RowRange&gt; ranges) {<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      List&lt;ReversedRowRange&gt; flippedRanges = new ArrayList&lt;&gt;(ranges.size());<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      for (int i = ranges.size() - 1; i &gt;= 0; i--) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        RowRange origRange = ranges.get(i);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>        ReversedRowRange newRowRange = new ReversedRowRange(<a name="line.639"></a>
-<span class="sourceLineNo">640</span>            origRange.startRow, origRange.startRowInclusive, origRange.stopRow,<a name="line.640"></a>
-<span class="sourceLineNo">641</span>            origRange.isStopRowInclusive());<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        flippedRanges.add(newRowRange);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      return flippedRanges;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    }<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    /**<a name="line.647"></a>
-<span class="sourceLineNo">648</span>     * Calculates the position where the given rowkey fits in the ranges list.<a name="line.648"></a>
-<span class="sourceLineNo">649</span>     *<a name="line.649"></a>
-<span class="sourceLineNo">650</span>     * @param rowKey the row key to calculate<a name="line.650"></a>
-<span class="sourceLineNo">651</span>     * @return index the position of the row key<a name="line.651"></a>
-<span class="sourceLineNo">652</span>     */<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    public int getNextRangeIndex(byte[] rowKey) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      BasicRowRange temp;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      if (reversed) {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        temp = new ReversedRowRange(null, true, rowKey, true);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      } else {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        temp = new RowRange(rowKey, true, null, true);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      }<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      // Because we make sure that `ranges` has the correct natural ordering (given it containing<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      // RowRange or ReverseRowRange objects). This keeps us from having to have two different<a name="line.661"></a>
-<span class="sourceLineNo">662</span>      // implementations below.<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      final int index = Collections.binarySearch(ranges, temp);<a name="line.663"></a>
-<span class="sourceLineNo">664</span>      if (index &lt; 0) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        int insertionPosition = -index - 1;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        // check if the row key in the range before the insertion position<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        if (insertionPosition != 0 &amp;&amp; ranges.get(insertionPosition - 1).contains(rowKey)) {<a name="line.667"></a>
-<span class="sourceLineNo">668</span>          return insertionPosition - 1;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        // check if the row key is before the first range<a name="line.670"></a>
-<span class="sourceLineNo">671</span>        if (insertionPosition == 0 &amp;&amp; !ranges.get(insertionPosition).contains(rowKey)) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>          return ROW_BEFORE_FIRST_RANGE;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>        }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>        if (!foundFirstRange) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>          foundFirstRange = true;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>        }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        return insertionPosition;<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      }<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      // the row key equals one of the start keys, and the the range exclude the start key<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      if(ranges.get(index).isSearchRowInclusive() == false) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        exclusive = true;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      }<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      return index;<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    }<a name="line.684"></a>
-<span class="sourceLineNo">685</span><a name="line.685"></a>
-<span class="sourceLineNo">686</span>    /**<a name="line.686"></a>
-<span class="sourceLineNo">687</span>     * Sets {@link #foundFirstRange} to {@code true}, indicating that we found a matching row range.<a name="line.687"></a>
-<span class="sourceLineNo">688</span>     */<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    public void setFoundFirstRange() {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      this.foundFirstRange = true;<a name="line.690"></a>
-<span class="sourceLineNo">691</span>    }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>    /**<a name="line.693"></a>
-<span class="sourceLineNo">694</span>     * Gets the RowRange at the given offset.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>     */<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    @SuppressWarnings("unchecked")<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    public &lt;T extends BasicRowRange&gt; T get(int i) {<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      return (T) ranges.get(i);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>    /**<a name="line.701"></a>
-<span class="sourceLineNo">702</span>     * Returns true if the first matching row range was found.<a name="line.702"></a>
-<span class="sourceLineNo">703</span>     */<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    public boolean hasFoundFirstRange() {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      return foundFirstRange;<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    }<a name="line.706"></a>
-<span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    /**<a name="line.708"></a>
-<span class="sourceLineNo">709</span>     * Returns true if the current range's key is exclusive<a name="line.709"></a>
-<span class="sourceLineNo">710</span>     */<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    public boolean isExclusive() {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      return exclusive;<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    }<a name="line.713"></a>
-<span class="sourceLineNo">714</span><a name="line.714"></a>
-<span class="sourceLineNo">715</span>    /**<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     * Resets the exclusive flag.<a name="line.716"></a>
-<span class="sourceLineNo">717</span>     */<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    public void resetExclusive() {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      exclusive = false;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    /**<a name="line.722"></a>
-<span class="sourceLineNo">723</span>     * Returns true if this class has been initialized by calling {@link #initialize(boolean)}.<a name="line.723"></a>
-<span class="sourceLineNo">724</span>     */<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    public boolean isInitialized() {<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      return initialized;<a name="line.726"></a>
+<span class="sourceLineNo">561</span><a name="line.561"></a>
+<span class="sourceLineNo">562</span>    public abstract boolean isAscendingOrder();<a name="line.562"></a>
+<span class="sourceLineNo">563</span>  }<a name="line.563"></a>
+<span class="sourceLineNo">564</span><a name="line.564"></a>
+<span class="sourceLineNo">565</span>  /**<a name="line.565"></a>
+<span class="sourceLineNo">566</span>   * Internal RowRange that reverses the sort-order to handle reverse scans.<a name="line.566"></a>
+<span class="sourceLineNo">567</span>   */<a name="line.567"></a>
+<span class="sourceLineNo">568</span>  @InterfaceAudience.Private<a name="line.568"></a>
+<span class="sourceLineNo">569</span>  private static class ReversedRowRange extends BasicRowRange {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    public ReversedRowRange(byte[] startRow,  boolean startRowInclusive, byte[] stopRow,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>        boolean stopRowInclusive) {<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      super(startRow, startRowInclusive, stopRow, stopRowInclusive);<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    }<a name="line.573"></a>
+<span class="sourceLineNo">574</span><a name="line.574"></a>
+<span class="sourceLineNo">575</span>    @Override<a name="line.575"></a>
+<span class="sourceLineNo">576</span>    public byte[] getComparisonData() {<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      return this.stopRow;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
+<span class="sourceLineNo">579</span><a name="line.579"></a>
+<span class="sourceLineNo">580</span>    @Override<a name="line.580"></a>
+<span class="sourceLineNo">581</span>    public boolean isSearchRowInclusive() {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      return this.stopRowInclusive;<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>    @Override<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    public boolean isAscendingOrder() {<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      return false;<a name="line.587"></a>
+<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
+<span class="sourceLineNo">589</span>  }<a name="line.589"></a>
+<span class="sourceLineNo">590</span><a name="line.590"></a>
+<span class="sourceLineNo">591</span>  @InterfaceAudience.Public<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  public static class RowRange extends BasicRowRange {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    public RowRange() {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    }<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    /**<a name="line.595"></a>
+<span class="sourceLineNo">596</span>     * If the startRow is empty or null, set it to HConstants.EMPTY_BYTE_ARRAY, means begin at the<a name="line.596"></a>
+<span class="sourceLineNo">597</span>     * start row of the table. If the stopRow is empty or null, set it to<a name="line.597"></a>
+<span class="sourceLineNo">598</span>     * HConstants.EMPTY_BYTE_ARRAY, means end of the last row of table.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>     */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    public RowRange(String startRow, boolean startRowInclusive, String stopRow,<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        boolean stopRowInclusive) {<a name="line.601"></a>
+<span class="sourceLineNo">602</span>      super(startRow, startRowInclusive, stopRow, stopRowInclusive);<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    }<a name="line.603"></a>
+<span class="sourceLineNo">604</span><a name="line.604"></a>
+<span class="sourceLineNo">605</span>    public RowRange(byte[] startRow,  boolean startRowInclusive, byte[] stopRow,<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        boolean stopRowInclusive) {<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      super(startRow, startRowInclusive, stopRow, stopRowInclusive);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span><a name="line.609"></a>
+<span class="sourceLineNo">610</span>    @Override<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    public byte[] getComparisonData() {<a name="line.611"></a>
+<span class="sourceLineNo">612</span>      return startRow;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
+<span class="sourceLineNo">614</span><a name="line.614"></a>
+<span class="sourceLineNo">615</span>    @Override<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    public boolean isSearchRowInclusive() {<a name="line.616"></a>
+<span class="sourceLineNo">617</span>      return startRowInclusive;<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    }<a name="line.618"></a>
+<span class="sourceLineNo">619</span><a name="line.619"></a>
+<span class="sourceLineNo">620</span>    @Override<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    public boolean isAscendingOrder() {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      return true;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span>  }<a name="line.624"></a>
+<span class="sourceLineNo">625</span><a name="line.625"></a>
+<span class="sourceLineNo">626</span>  /**<a name="line.626"></a>
+<span class="sourceLineNo">627</span>   * Abstraction over the ranges of rows to return from this filter, regardless of forward or<a name="line.627"></a>
+<span class="sourceLineNo">628</span>   * reverse scans being used. This Filter can use this class, agnostic of iteration direction,<a name="line.628"></a>
+<span class="sourceLineNo">629</span>   * as the same algorithm can be applied in both cases.<a name="line.629"></a>
+<span class="sourceLineNo">630</span>   */<a name="line.630"></a>
+<span class="sourceLineNo">631</span>  @InterfaceAudience.Private<a name="line.631"></a>
+<span class="sourceLineNo">632</span>  private static class RangeIteration {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>    private boolean exclusive = false;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    private boolean initialized = false;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    private boolean foundFirstRange = false;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    private boolean reversed = false;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    private final List&lt;RowRange&gt; sortedAndMergedRanges;<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    private List&lt;? extends BasicRowRange&gt; ranges;<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    public RangeIteration(List&lt;RowRange&gt; sortedAndMergedRanges) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>      this.sortedAndMergedRanges = sortedAndMergedRanges;<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>    void initialize(boolean reversed) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      // Avoid double initialization<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      assert !this.initialized;<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      this.reversed = reversed;<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      if (reversed) {<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        // If we are doing a reverse scan, we can reverse the ranges (both the elements in<a name="line.649"></a>
+<span class="sourceLineNo">650</span>        // the list as well as their start/stop key), and use the same algorithm.<a name="line.650"></a>
+<span class="sourceLineNo">651</span>        this.ranges = flipAndReverseRanges(sortedAndMergedRanges);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      } else {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        this.ranges = sortedAndMergedRanges;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      this.initialized = true;<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    }<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>    /**<a name="line.658"></a>
+<span class="sourceLineNo">659</span>     * Rebuilds the sorted ranges (by startKey) into an equivalent sorted list of ranges, only by<a name="line.659"></a>
+<span class="sourceLineNo">660</span>     * stopKey instead. Descending order and the ReversedRowRange compareTo implementation make<a name="line.660"></a>
+<span class="sourceLineNo">661</span>     * sure that we can use Collections.binarySearch().<a name="line.661"></a>
+<span class="sourceLineNo">662</span>     */<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    static List&lt;ReversedRowRange&gt; flipAndReverseRanges(List&lt;RowRange&gt; ranges) {<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      List&lt;ReversedRowRange&gt; flippedRanges = new ArrayList&lt;&gt;(ranges.size());<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      for (int i = ranges.size() - 1; i &gt;= 0; i--) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>        RowRange origRange = ranges.get(i);<a name="line.666"></a>
+<span class="sourceLineNo">667</span>        ReversedRowRange newRowRange = new ReversedRowRange(<a name="line.667"></a>
+<span class="sourceLineNo">668</span>            origRange.startRow, origRange.startRowInclusive, origRange.stopRow,<a name="line.668"></a>
+<span class="sourceLineNo">669</span>            origRange.isStopRowInclusive());<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        flippedRanges.add(newRowRange);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      }<a name="line.671"></a>
+<span class="sourceLineNo">672</span>      return flippedRanges;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    }<a name="line.673"></a>
+<span class="sourceLineNo">674</span><a name="line.674"></a>
+<span class="sourceLineNo">675</span>    /**<a name="line.675"></a>
+<span class="sourceLineNo">676</span>     * Calculates the position where the given rowkey fits in the ranges list.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>     *<a name="line.677"></a>
+<span class="sourceLineNo">678</span>     * @param rowKey the row key to calculate<a name="line.678"></a>
+<span class="sourceLineNo">679</span>     * @return index the position of the row key<a name="line.679"></a>
+<span class="sourceLineNo">680</span>     */<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    public int getNextRangeIndex(byte[] rowKey) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      BasicRowRange temp;<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      if (reversed) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        temp = new ReversedRowRange(null, true, rowKey, true);<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      } else {<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        temp = new RowRange(rowKey, true, null, true);<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      // Because we make sure that `ranges` has the correct natural ordering (given it containing<a name="line.688"></a>
+<span class="sourceLineNo">689</span>      // RowRange or ReverseRowRange objects). This keeps us from having to have two different<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      // implementations below.<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      final int index = Collections.binarySearch(ranges, temp);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      if (index &lt; 0) {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>        int insertionPosition = -index - 1;<a name="line.693"></a>
+<span class="sourceLineNo">694</span>        // check if the row key in the range before the insertion position<a name="line.694"></a>
+<span class="sourceLineNo">695</span>        if (insertionPosition != 0 &amp;&amp; ranges.get(insertionPosition - 1).contains(rowKey)) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>          return insertionPosition - 1;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>        }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>        // check if the row key is before the first range<a name="line.698"></a>
+<span class="sourceLineNo">699</span>        if (insertionPosition == 0 &amp;&amp; !ranges.get(insertionPosition).contains(rowKey)) {<a name="line.699"></a>
+<span class="sourceLineNo">700</span>          return ROW_BEFORE_FIRST_RANGE;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>        }<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        if (!foundFirstRange) {<a name="line.702"></a>
+<span class="sourceLineNo">703</span>          foundFirstRange = true;<a name="line.703"></a>
+<span class="sourceLineNo">704</span>        }<a name="line.704"></a>
+<span class="sourceLineNo">705</span>        return insertionPosition;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      }<a name="line.706"></a>
+<span class="sourceLineNo">707</span>      // the row key equals one of the start keys, and the the range exclude the start key<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      if(ranges.get(index).isSearchRowInclusive() == false) {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        exclusive = true;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>      }<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      return index;<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
+<span class="sourceLineNo">713</span><a name="line.713"></a>
+<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
+<span class="sourceLineNo">715</span>     * Sets {@link #foundFirstRange} to {@code true}, indicating that we found a matching row range.<a name="line.715"></a>
+<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    public void setFoundFirstRange() {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      this.foundFirstRange = true;<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    }<a name="line.719"></a>
+<span class="sourceLineNo">720</span><a name="line.720"></a>
+<span class="sourceLineNo">721</span>    /**<a name="line.721"></a>
+<span class="sourceLineNo">722</span>     * Gets the RowRange at the given offset.<a name="line.722"></a>
+<span class="sourceLineNo">723</span>     */<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    @SuppressWarnings("unchecked")<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    public &lt;T extends BasicRowRange&gt; T get(int i) {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      return (T) ranges.get(i);<a name="line.726"></a>
 <span class="sourceLineNo">727</span>    }<a name="line.727"></a>
 <span class="sourceLineNo">728</span><a name="line.728"></a>
 <span class="sourceLineNo">729</span>    /**<a name="line.729"></a>
-<span class="sourceLineNo">730</span>     * Returns true if we exhausted searching all row ranges.<a name="line.730"></a>
+<span class="sourceLineNo">730</span>     * Returns true if the first matching row range was found.<a name="line.730"></a>
 <span class="sourceLineNo">731</span>     */<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    public boolean isIterationComplete(int index) {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      return index &gt;= ranges.size();<a name="line.733"></a>
+<span class="sourceLineNo">732</span>    public boolean hasFoundFirstRange() {<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      return foundFirstRange;<a name="line.733"></a>
 <span class="sourceLineNo">734</span>    }<a name="line.734"></a>
-<span class="sourceLineNo">735</span>  }<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>  @Override<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  public boolean equals(Object obj) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>  @Override<a name="line.742"></a>
-<span class="sourceLineNo">743</span>  public int hashCode() {<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    return Objects.hash(this.ranges);<a name="line.744"></a>
-<span class="sourceLineNo">745</span>  }<a name="line.745"></a>
-<span class="sourceLineNo">746</span>}<a name="line.746"></a>
+<span class="sourceLineNo">735</span><a name="line.735"></a>
+<span class="sourceLineNo">736</span>    /**<a name="line.736"></a>
+<span class="sourceLineNo">737</span>     * Returns true if the current range's key is exclusive<a name="line.737"></a>
+<span class="sourceLineNo">738</span>     */<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    public boolean isExclusive() {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      return exclusive;<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
+<span class="sourceLineNo">742</span><a name="line.742"></a>
+<span class="sourceLineNo">743</span>    /**<a name="line.743"></a>
+<span class="sourceLineNo">744</span>     * Resets the exclusive flag.<a name="line.744"></a>
+<span class="sourceLineNo">745</span>     */<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    public void resetExclusive() {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      exclusive = false;<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>    /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>     * Returns true if this class has been initialized by calling {@link #initialize(boolean)}.<a name="line.751"></a>
+<span class="sourceLineNo">752</span>     */<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    public boolean isInitialized() {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>      return initialized;<a name="line.754"></a>
+<span class="sourceLineNo">755</span>    }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>    /**<a name="line.757"></a>
+<span class="sourceLineNo">758</span>     * Returns true if we exhausted searching all row ranges.<a name="line.758"></a>
+<span class="sourceLineNo">759</span>     */<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    public boolean isIterationComplete(int index) {<a name="line.760"></a>
+<span class="sourceLineNo">761</span>      return index &gt;= ranges.size();<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    }<a name="line.762"></a>
+<span class="sourceLineNo">763</span>  }<a name="line.763"></a>
+<span class="sourceLineNo">764</span><a name="line.764"></a>
+<span class="sourceLineNo">765</span>  @Override<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  public boolean equals(Object obj) {<a name="line.766"></a>
+<span class="sourceLineNo">767</span>    return obj instanceof Filter &amp;&amp; areSerializedFieldsEqual((Filter) obj);<a name="line.767"></a>
+<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
+<span class="sourceLineNo">769</span><a name="line.769"></a>
+<span class="sourceLineNo">770</span>  @Override<a name="line.770"></a>
+<span class="sourceLineNo">771</span>  public int hashCode() {<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    return Objects.hash(this.ranges);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>  }<a name="line.773"></a>
+<span class="sourceLineNo">774</span>}<a name="line.774"></a>
 
 
 
diff --git a/book.html b/book.html
index 91edc52..e676f4f 100644
--- a/book.html
+++ b/book.html
@@ -42874,7 +42874,7 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2019-08-15 14:29:44 UTC
+Last updated 2019-08-16 14:29:51 UTC
 </div>
 </div>
 </body>
diff --git a/bulk-loads.html b/bulk-loads.html
index 0d2914b..f5ba704 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -155,7 +155,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 6b26cbb..9631a9a 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -152,7 +152,7 @@
 <td>3937</td>
 <td>0</td>
 <td>0</td>
-<td>11738</td></tr></table></div>
+<td>11735</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -875,7 +875,7 @@
 <td><a href="#org.apache.hadoop.hbase.client.ClientUtil.java">org/apache/hadoop/hbase/client/ClientUtil.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>2</td></tr>
+<td>1</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ColumnCountOnRowFilter.java">org/apache/hadoop/hbase/client/ColumnCountOnRowFilter.java</a></td>
 <td>0</td>
@@ -1945,7 +1945,7 @@
 <td><a href="#org.apache.hadoop.hbase.filter.MultiRowRangeFilter.java">org/apache/hadoop/hbase/filter/MultiRowRangeFilter.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>9</td></tr>
+<td>7</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.MultipleColumnPrefixFilter.java">org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.java</a></td>
 <td>0</td>
@@ -8241,7 +8241,7 @@
 <li>sortStaticImportsAlphabetically: <tt>&quot;true&quot;</tt></li>
 <li>groups: <tt>&quot;*,org.apache.hbase.thirdparty,org.apache.hadoop.hbase.shaded&quot;</tt></li>
 <li>option: <tt>&quot;top&quot;</tt></li></ul></td>
-<td>869</td>
+<td>866</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -18330,26 +18330,20 @@
 <th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
-<td>21</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
-<td>23</td></tr></table></div>
+<td>25</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ColumnCountOnRowFilter.java">org/apache/hadoop/hbase/client/ColumnCountOnRowFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -18358,85 +18352,85 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ColumnFamilyDescriptor.java">org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.compress.Compression' import.</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>47</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 4, expected level should be 6.</td>
 <td>48</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>49</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 4, expected level should be 6.</td>
 <td>50</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>52</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 4, expected level should be 6.</td>
 <td>53</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>54</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 4, expected level should be 6.</td>
 <td>55</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>56</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block rcurly' has incorrect indentation level 2, expected level should be 4.</td>
 <td>57</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>198</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -18445,313 +18439,313 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder.java">org/apache/hadoop/hbase/client/ColumnFamilyDescriptorBuilder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class ColumnFamilyDescriptorBuilder should be declared as final.</td>
 <td>48</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>65</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>77</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>80</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>92</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>95</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>98</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>101</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>111</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>146</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 121).</td>
 <td>167</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>179</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>275</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>325</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>327</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>355</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>515</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>605</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>606</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>623</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>661</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>771</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>811</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>818</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>859</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>874</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>877</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>889</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>927</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>940</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>954</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>973</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>986</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>999</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>1012</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>1025</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1030</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>1039</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1044</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>1137</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>1150</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1180</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1183</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>1186</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1217</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1234</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1249</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1264</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>1314</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1328</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -18760,19 +18754,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.CompactType.java">org/apache/hadoop/hbase/client/CompactType.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
@@ -18781,13 +18775,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.CompleteScanResultCache.java">org/apache/hadoop/hbase/client/CompleteScanResultCache.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -18796,13 +18790,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ConnectionFactory.java">org/apache/hadoop/hbase/client/ConnectionFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -18811,37 +18805,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Delete.java">org/apache/hadoop/hbase/client/Delete.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>109</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>110</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>126</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>127</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -18850,67 +18844,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Get.java">org/apache/hadoop/hbase/client/Get.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.filter.Filter' import.</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>95</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>135</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>136</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>137</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>146</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>202</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>296</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>306</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -18919,19 +18913,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.HBaseHbck.java">org/apache/hadoop/hbase/client/HBaseHbck.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.Map.</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -18940,19 +18934,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.HConnectionTestingUtility.java">org/apache/hadoop/hbase/client/HConnectionTestingUtility.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -18961,25 +18955,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Hbck.java">org/apache/hadoop/hbase/client/Hbck.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.Map.</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.TableName.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -18988,13 +18982,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Increment.java">org/apache/hadoop/hbase/client/Increment.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -19003,19 +18997,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.MetricsConnection.java">org/apache/hadoop/hbase/client/MetricsConnection.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.concurrent.ConcurrentHashMap' import.</td>
 <td>31</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -19024,25 +19018,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.MultiAction.java">org/apache/hadoop/hbase/client/MultiAction.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>66</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>67</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -19051,19 +19045,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.MultiResponse.java">org/apache/hadoop/hbase/client/MultiResponse.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -19072,145 +19066,145 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Mutation.java">org/apache/hadoop/hbase/client/Mutation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>171</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>172</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>173</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>174</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>284</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>397</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>407</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>411</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>418</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>430</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>434</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>441</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>443</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>445</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>446</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>544</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
... 108859 lines suppressed ...