HBSE-18945 Make a IA.LimitedPrivate interface for CellComparator (Ram)

Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/70f4c5da
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/70f4c5da
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/70f4c5da

Branch: refs/heads/HBASE-18410
Commit: 70f4c5da475a221b28e3516a23f35fc6098d4044
Parents: 9f61f8b
Author: Ramkrishna <ramkrishna.s.vasude...@intel.com>
Authored: Tue Oct 17 23:17:07 2017 +0530
Committer: Ramkrishna <ramkrishna.s.vasude...@intel.com>
Committed: Tue Oct 17 23:17:07 2017 +0530

----------------------------------------------------------------------
 .../hbase/backup/impl/BackupSystemTable.java    |  15 +-
 .../hadoop/hbase/client/ConnectionUtils.java    |   5 +-
 .../org/apache/hadoop/hbase/client/Put.java     |   1 -
 .../org/apache/hadoop/hbase/client/Result.java  |  11 +-
 .../hbase/filter/ColumnPaginationFilter.java    |   3 +-
 .../hadoop/hbase/filter/ColumnRangeFilter.java  |   5 +-
 .../hadoop/hbase/filter/CompareFilter.java      |  18 +-
 .../apache/hadoop/hbase/filter/FilterList.java  |   6 +-
 .../hadoop/hbase/filter/FuzzyRowFilter.java     |   4 +-
 .../hbase/filter/InclusiveStopFilter.java       |   4 +-
 .../hbase/filter/SingleColumnValueFilter.java   |   3 +-
 .../hbase/client/TestClientNoCluster.java       |   4 +-
 .../hadoop/hbase/client/TestOperation.java      |  10 +-
 .../hadoop/hbase/filter/TestComparators.java    |  38 +-
 .../hbase/shaded/protobuf/TestProtobufUtil.java |   4 +-
 .../org/apache/hadoop/hbase/CellComparator.java | 653 ++-----------------
 .../apache/hadoop/hbase/CellComparatorImpl.java | 381 +++++++++++
 .../java/org/apache/hadoop/hbase/CellUtil.java  | 306 ++++++++-
 .../java/org/apache/hadoop/hbase/KeyValue.java  |  21 +-
 .../io/encoding/BufferedDataBlockEncoder.java   |   5 +-
 .../hbase/io/encoding/DataBlockEncoder.java     |   3 +-
 .../hbase/io/encoding/RowIndexCodecV1.java      |   3 +-
 .../hbase/io/encoding/RowIndexEncoderV1.java    |   3 +-
 .../hbase/io/encoding/RowIndexSeekerV1.java     |   4 +-
 .../apache/hadoop/hbase/TestCellComparator.java |  28 +-
 .../org/apache/hadoop/hbase/TestKeyValue.java   |  48 +-
 .../hadoop/hbase/util/RedundantKVGenerator.java |   6 +-
 .../mapreduce/IntegrationTestImportTsv.java     |   6 +-
 .../hadoop/hbase/mapreduce/CellSortReducer.java |   4 +-
 .../hbase/mapreduce/HFileOutputFormat2.java     |   6 +-
 .../apache/hadoop/hbase/mapreduce/Import.java   |   4 +-
 .../hadoop/hbase/mapreduce/PutSortReducer.java  |   4 +-
 .../hadoop/hbase/mapreduce/SyncTable.java       |   9 +-
 .../hadoop/hbase/mapreduce/TextSortReducer.java |   4 +-
 .../hbase/codec/prefixtree/PrefixTreeCodec.java |   2 +-
 .../decode/PrefixTreeArrayScanner.java          |   3 +-
 .../codec/prefixtree/decode/PrefixTreeCell.java |   3 +-
 .../row/data/TestRowDataNumberStrings.java      |   4 +-
 .../hadoop/hbase/io/HalfStoreFileReader.java    |  13 +-
 .../hadoop/hbase/io/hfile/FixedFileTrailer.java |  15 +-
 .../org/apache/hadoop/hbase/io/hfile/HFile.java |   3 +-
 .../hadoop/hbase/io/hfile/HFileBlockIndex.java  |   3 +-
 .../hbase/io/hfile/HFilePrettyPrinter.java      |  10 +-
 .../hadoop/hbase/io/hfile/HFileReaderImpl.java  |  14 +-
 .../hadoop/hbase/io/hfile/HFileWriterImpl.java  |  11 +-
 .../org/apache/hadoop/hbase/mob/MobUtils.java   |   4 +-
 .../compactions/PartitionedMobCompactor.java    |   4 +-
 .../regionserver/CellArrayImmutableSegment.java |   1 +
 .../regionserver/CellChunkImmutableSegment.java |   3 +-
 .../hbase/regionserver/DefaultMemStore.java     |   3 +-
 .../hadoop/hbase/regionserver/HRegion.java      |  10 +-
 .../hadoop/hbase/regionserver/HStore.java       |   9 +-
 .../hbase/regionserver/ImmutableSegment.java    |   2 +-
 .../apache/hadoop/hbase/regionserver/Store.java |   5 +-
 .../hadoop/hbase/regionserver/StoreFile.java    |   4 +-
 .../hbase/regionserver/StoreFileReader.java     |   5 +-
 .../hbase/regionserver/StoreFileWriter.java     |   5 +-
 .../hadoop/hbase/regionserver/StoreScanner.java |   3 +-
 .../querymatcher/DeleteTracker.java             |   7 +
 .../querymatcher/ExplicitColumnTracker.java     |   5 +-
 .../querymatcher/NewVersionBehaviorTracker.java |  13 +-
 .../querymatcher/ScanDeleteTracker.java         |  12 +-
 .../querymatcher/ScanQueryMatcher.java          |  22 +-
 .../querymatcher/ScanWildcardColumnTracker.java |   4 +-
 .../hbase/regionserver/wal/FSWALEntry.java      |   4 +-
 .../visibility/VisibilityController.java        |   2 +-
 .../VisibilityNewVersionBehaivorTracker.java    |   9 +-
 .../visibility/VisibilityScanDeleteTracker.java |   7 +-
 .../hadoop/hbase/util/BloomFilterFactory.java   |   4 +-
 .../hbase/util/CollectionBackedScanner.java     |   5 +-
 .../hadoop/hbase/util/CompressionTest.java      |   4 +-
 .../hadoop/hbase/util/RowBloomContext.java      |   1 +
 .../hadoop/hbase/HBaseTestingUtility.java       |   2 +-
 .../hbase/HFilePerformanceEvaluation.java       |   2 +-
 .../apache/hadoop/hbase/MetaMockingUtil.java    |   2 +-
 ...estAvoidCellReferencesIntoShippedBlocks.java |   4 +-
 .../apache/hadoop/hbase/client/TestResult.java  |  18 +-
 .../hbase/filter/TestDependentColumnFilter.java |   4 +-
 .../apache/hadoop/hbase/filter/TestFilter.java  |  10 +-
 .../hadoop/hbase/filter/TestFilterList.java     |  39 +-
 .../TestSingleColumnValueExcludeFilter.java     |   6 +-
 .../hbase/io/TestHalfStoreFileReader.java       |   4 +-
 .../io/encoding/TestDataBlockEncoders.java      |  11 +-
 .../io/encoding/TestPrefixTreeEncoding.java     |  16 +-
 .../encoding/TestSeekToBlockWithEncoders.java   |   4 +-
 .../hadoop/hbase/io/hfile/TestCacheOnWrite.java |   4 +-
 .../hbase/io/hfile/TestFixedFileTrailer.java    |   6 +-
 .../apache/hadoop/hbase/io/hfile/TestHFile.java |  70 +-
 .../hadoop/hbase/io/hfile/TestHFileBlock.java   |   4 +-
 .../hbase/io/hfile/TestHFileBlockIndex.java     |  14 +-
 .../hadoop/hbase/io/hfile/TestHFileSeek.java    |   4 +-
 .../hbase/io/hfile/TestHFileWriterV3.java       |   3 +-
 .../hadoop/hbase/io/hfile/TestPrefetch.java     |   4 +-
 .../hadoop/hbase/io/hfile/TestReseekTo.java     |   4 +-
 .../hadoop/hbase/io/hfile/TestSeekTo.java       |   4 +-
 .../TestPartitionedMobCompactor.java            |   4 +-
 .../hadoop/hbase/protobuf/TestProtobufUtil.java |   4 +-
 .../hbase/regionserver/KeyValueScanFixture.java |   6 +-
 .../hbase/regionserver/TestCellFlatSet.java     |   8 +-
 .../hbase/regionserver/TestCellSkipListSet.java |   4 +-
 .../regionserver/TestCompactingMemStore.java    |  10 +-
 .../TestCompactingToCellFlatMapMemStore.java    |   4 +-
 .../regionserver/TestCompoundBloomFilter.java   |   4 +-
 .../hbase/regionserver/TestDefaultMemStore.java |  12 +-
 .../regionserver/TestDefaultStoreEngine.java    |   4 +-
 .../hbase/regionserver/TestHMobStore.java       |  14 +-
 .../hadoop/hbase/regionserver/TestHStore.java   |   9 +-
 .../hbase/regionserver/TestHStoreFile.java      |   6 +-
 .../hbase/regionserver/TestKeyValueHeap.java    |  12 +-
 .../regionserver/TestKeyValueScanFixture.java   |   4 +-
 .../regionserver/TestMobStoreCompaction.java    |   4 +-
 .../regionserver/TestMultiColumnScanner.java    |   4 +-
 .../hbase/regionserver/TestRecoveredEdits.java  |   6 +-
 .../regionserver/TestReversibleScanners.java    |   6 +-
 .../TestScannerHeartbeatMessages.java           |  15 +-
 .../regionserver/TestSeekOptimizations.java     |   9 +-
 .../hbase/regionserver/TestStoreScanner.java    |  21 +-
 .../regionserver/TestStripeStoreEngine.java     |   4 +-
 .../TestStripeStoreFileManager.java             |   4 +-
 .../compactions/TestDateTieredCompactor.java    |   6 +-
 .../compactions/TestStripeCompactionPolicy.java |   4 +-
 .../compactions/TestStripeCompactor.java        |   6 +-
 .../AbstractTestScanQueryMatcher.java           |   6 +-
 .../TestNewVersionBehaviorTracker.java          |  22 +-
 .../querymatcher/TestScanDeleteTracker.java     |   3 +-
 .../TestReplicationWALEntryFilters.java         |   4 +-
 .../hadoop/hbase/spark/HBaseContext.scala       |   2 +-
 127 files changed, 1278 insertions(+), 1059 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/70f4c5da/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/impl/BackupSystemTable.java
----------------------------------------------------------------------
diff --git 
a/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/impl/BackupSystemTable.java
 
b/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/impl/BackupSystemTable.java
index aaa50b1..de3ccc7 100644
--- 
a/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/impl/BackupSystemTable.java
+++ 
b/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/impl/BackupSystemTable.java
@@ -37,7 +37,6 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.CellComparator;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HColumnDescriptor;
@@ -255,7 +254,7 @@ public final class BackupSystemTable implements Closeable {
         res.advance();
         byte[] row = CellUtil.cloneRow(res.listCells().get(0));
         for (Cell cell : res.listCells()) {
-          if (CellComparator.compareQualifiers(cell, 
BackupSystemTable.PATH_COL, 0,
+          if (CellUtil.compareQualifiers(cell, BackupSystemTable.PATH_COL, 0,
             BackupSystemTable.PATH_COL.length) == 0) {
             map.put(row, Bytes.toString(CellUtil.cloneValue(cell)));
           }
@@ -284,13 +283,13 @@ public final class BackupSystemTable implements Closeable 
{
         byte[] fam = null;
         String path = null;
         for (Cell cell : res.listCells()) {
-          if (CellComparator.compareQualifiers(cell, 
BackupSystemTable.TBL_COL, 0,
+          if (CellUtil.compareQualifiers(cell, BackupSystemTable.TBL_COL, 0,
             BackupSystemTable.TBL_COL.length) == 0) {
             tbl = TableName.valueOf(CellUtil.cloneValue(cell));
-          } else if (CellComparator.compareQualifiers(cell, 
BackupSystemTable.FAM_COL, 0,
+          } else if (CellUtil.compareQualifiers(cell, 
BackupSystemTable.FAM_COL, 0,
             BackupSystemTable.FAM_COL.length) == 0) {
             fam = CellUtil.cloneValue(cell);
-          } else if (CellComparator.compareQualifiers(cell, 
BackupSystemTable.PATH_COL, 0,
+          } else if (CellUtil.compareQualifiers(cell, 
BackupSystemTable.PATH_COL, 0,
             BackupSystemTable.PATH_COL.length) == 0) {
             path = Bytes.toString(CellUtil.cloneValue(cell));
           }
@@ -436,13 +435,13 @@ public final class BackupSystemTable implements Closeable 
{
             rows.add(row);
             String rowStr = Bytes.toString(row);
             region = 
BackupSystemTable.getRegionNameFromOrigBulkLoadRow(rowStr);
-            if (CellComparator.compareQualifiers(cell, 
BackupSystemTable.FAM_COL, 0,
+            if (CellUtil.compareQualifiers(cell, BackupSystemTable.FAM_COL, 0,
               BackupSystemTable.FAM_COL.length) == 0) {
               fam = Bytes.toString(CellUtil.cloneValue(cell));
-            } else if (CellComparator.compareQualifiers(cell, 
BackupSystemTable.PATH_COL, 0,
+            } else if (CellUtil.compareQualifiers(cell, 
BackupSystemTable.PATH_COL, 0,
               BackupSystemTable.PATH_COL.length) == 0) {
               path = Bytes.toString(CellUtil.cloneValue(cell));
-            } else if (CellComparator.compareQualifiers(cell, 
BackupSystemTable.STATE_COL, 0,
+            } else if (CellUtil.compareQualifiers(cell, 
BackupSystemTable.STATE_COL, 0,
               BackupSystemTable.STATE_COL.length) == 0) {
               byte[] state = CellUtil.cloneValue(cell);
               if (Bytes.equals(BackupSystemTable.BL_PREPARE, state)) {

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f4c5da/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionUtils.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionUtils.java
 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionUtils.java
index 1ff64d5..9c7fd34 100644
--- 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionUtils.java
+++ 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionUtils.java
@@ -39,7 +39,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.CellComparator;
+import org.apache.hadoop.hbase.CellComparatorImpl;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HRegionInfo;
@@ -315,7 +315,8 @@ public final class ConnectionUtils {
       return result;
     }
     Cell[] rawCells = result.rawCells();
-    int index = Arrays.binarySearch(rawCells, keepCellsAfter, 
CellComparator::compareWithoutRow);
+    int index =
+        Arrays.binarySearch(rawCells, keepCellsAfter, 
CellComparatorImpl.COMPARATOR::compareWithoutRow);
     if (index < 0) {
       index = -index - 1;
     } else {

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f4c5da/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Put.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Put.java 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Put.java
index 8848404..9ee6555 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Put.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Put.java
@@ -29,7 +29,6 @@ import java.util.TreeMap;
 import java.util.UUID;
 
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.CellComparator;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.KeyValue;

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f4c5da/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Result.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Result.java 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Result.java
index 906caac..c238aee 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Result.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Result.java
@@ -35,6 +35,7 @@ import java.util.TreeMap;
 
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellComparator;
+import org.apache.hadoop.hbase.CellComparatorImpl;
 import org.apache.hadoop.hbase.CellScannable;
 import org.apache.hadoop.hbase.CellScanner;
 import org.apache.hadoop.hbase.CellUtil;
@@ -212,14 +213,14 @@ public class Result implements CellScannable, CellScanner 
{
    * Return the array of Cells backing this Result instance.
    *
    * The array is sorted from smallest -&gt; largest using the
-   * {@link CellComparator#COMPARATOR}.
+   * {@link CellComparator}.
    *
    * The array only contains what your Get or Scan specifies and no more.
    * For example if you request column "A" 1 version you will have at most 1
    * Cell in the array. If you request column "A" with 2 version you will
    * have at most 2 Cells, with the first one being the newer timestamp and
    * the second being the older timestamp (this is the sort order defined by
-   * {@link CellComparator#COMPARATOR}).  If columns don't exist, they won't be
+   * {@link CellComparator}).  If columns don't exist, they won't be
    * present in the result. Therefore if you ask for 1 version all columns,
    * it is safe to iterate over this array and expect to see 1 Cell for
    * each column and no more.
@@ -245,7 +246,7 @@ public class Result implements CellScannable, CellScanner {
 
   /**
    * Return the Cells for the specific column.  The Cells are sorted in
-   * the {@link CellComparator#COMPARATOR} order.  That implies the first 
entry in
+   * the {@link CellComparator} order.  That implies the first entry in
    * the list is the most recent column.  If the query (Scan or Get) only
    * requested 1 version the list will contain at most 1 entry.  If the column
    * did not exist in the result set (either the column does not exist
@@ -302,7 +303,7 @@ public class Result implements CellScannable, CellScanner {
             qualifierNotNull, 0, qualifierNotNull.length);
 
     // pos === ( -(insertion point) - 1)
-    int pos = Arrays.binarySearch(kvs, searchTerm, CellComparator.COMPARATOR);
+    int pos = Arrays.binarySearch(kvs, searchTerm, 
CellComparatorImpl.COMPARATOR);
     // never will exact match
     if (pos < 0) {
       pos = (pos+1) * -1;
@@ -347,7 +348,7 @@ public class Result implements CellScannable, CellScanner {
         qualifier, qoffset, qlength);
 
     // pos === ( -(insertion point) - 1)
-    int pos = Arrays.binarySearch(kvs, searchTerm, CellComparator.COMPARATOR);
+    int pos = Arrays.binarySearch(kvs, searchTerm, 
CellComparatorImpl.COMPARATOR);
     // never will exact match
     if (pos < 0) {
       pos = (pos+1) * -1;

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f4c5da/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ColumnPaginationFilter.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ColumnPaginationFilter.java
 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ColumnPaginationFilter.java
index 1565ddd..5faf85d 100644
--- 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ColumnPaginationFilter.java
+++ 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ColumnPaginationFilter.java
@@ -22,7 +22,6 @@ import java.io.IOException;
 import java.util.ArrayList;
 
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.CellComparator;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.yetus.audience.InterfaceAudience;
 import org.apache.hadoop.hbase.exceptions.DeserializationException;
@@ -120,7 +119,7 @@ public class ColumnPaginationFilter extends FilterBase {
       int cmp = 0;
       // Only compare if no KV's have been seen so far.
       if (count == 0) {
-        cmp = CellComparator.compareQualifiers(v, this.columnOffset, 0, 
this.columnOffset.length);
+        cmp = CellUtil.compareQualifiers(v, this.columnOffset, 0, 
this.columnOffset.length);
       }
       if (cmp < 0) {
         return ReturnCode.SEEK_NEXT_USING_HINT;

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f4c5da/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ColumnRangeFilter.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ColumnRangeFilter.java
 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ColumnRangeFilter.java
index 425600c..87057a9 100644
--- 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ColumnRangeFilter.java
+++ 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ColumnRangeFilter.java
@@ -25,7 +25,6 @@ import java.io.IOException;
 import java.util.ArrayList;
 
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.CellComparator;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.yetus.audience.InterfaceAudience;
 import org.apache.hadoop.hbase.exceptions.DeserializationException;
@@ -126,7 +125,7 @@ public class ColumnRangeFilter extends FilterBase {
     int cmpMin = 1;
 
     if (this.minColumn != null) {
-      cmpMin = CellComparator.compareQualifiers(kv, this.minColumn, 0, 
this.minColumn.length);
+      cmpMin = CellUtil.compareQualifiers(kv, this.minColumn, 0, 
this.minColumn.length);
     }
 
     if (cmpMin < 0) {
@@ -141,7 +140,7 @@ public class ColumnRangeFilter extends FilterBase {
       return ReturnCode.INCLUDE;
     }
 
-    int cmpMax = CellComparator.compareQualifiers(kv, this.maxColumn, 0, 
this.maxColumn.length);
+    int cmpMax = CellUtil.compareQualifiers(kv, this.maxColumn, 0, 
this.maxColumn.length);
 
     if (this.maxColumnInclusive && cmpMax <= 0 ||
         !this.maxColumnInclusive && cmpMax < 0) {

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f4c5da/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java
index c305ffc..8145f01 100644
--- 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java
+++ 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java
@@ -23,7 +23,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.CellComparator;
+import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.CompareOperator;
 import org.apache.yetus.audience.InterfaceAudience;
 import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
@@ -137,7 +137,7 @@ public abstract class CompareFilter extends FilterBase {
     if (compareOp == CompareOp.NO_OP) {
       return true;
     }
-    int compareResult = CellComparator.compareRow(cell, comparator);
+    int compareResult = CellUtil.compareRow(cell, comparator);
     return compare(compareOp, compareResult);
   }
 
@@ -146,7 +146,7 @@ public abstract class CompareFilter extends FilterBase {
     if (op == CompareOperator.NO_OP) {
       return true;
     }
-    int compareResult = CellComparator.compareRow(cell, comparator);
+    int compareResult = CellUtil.compareRow(cell, comparator);
     return compare(op, compareResult);
   }
 
@@ -160,7 +160,7 @@ public abstract class CompareFilter extends FilterBase {
     if (compareOp == CompareOp.NO_OP) {
       return true;
     }
-    int compareResult = CellComparator.compareFamily(cell, comparator);
+    int compareResult = CellUtil.compareFamily(cell, comparator);
     return compare(compareOp, compareResult);
   }
 
@@ -169,7 +169,7 @@ public abstract class CompareFilter extends FilterBase {
     if (op == CompareOperator.NO_OP) {
       return true;
     }
-    int compareResult = CellComparator.compareFamily(cell, comparator);
+    int compareResult = CellUtil.compareFamily(cell, comparator);
     return compare(op, compareResult);
   }
 
@@ -184,7 +184,7 @@ public abstract class CompareFilter extends FilterBase {
     if (compareOp == CompareOp.NO_OP) {
       return true;
     }
-    int compareResult = CellComparator.compareQualifier(cell, comparator);
+    int compareResult = CellUtil.compareQualifier(cell, comparator);
     return compare(compareOp, compareResult);
   }
 
@@ -194,7 +194,7 @@ public abstract class CompareFilter extends FilterBase {
     if (op == CompareOperator.NO_OP) {
       return true;
     }
-    int compareResult = CellComparator.compareQualifier(cell, comparator);
+    int compareResult = CellUtil.compareQualifier(cell, comparator);
     return compare(op, compareResult);
   }
 
@@ -209,7 +209,7 @@ public abstract class CompareFilter extends FilterBase {
     if (compareOp == CompareOp.NO_OP) {
       return true;
     }
-    int compareResult = CellComparator.compareValue(cell, comparator);
+    int compareResult = CellUtil.compareValue(cell, comparator);
     return compare(compareOp, compareResult);
   }
 
@@ -218,7 +218,7 @@ public abstract class CompareFilter extends FilterBase {
     if (op == CompareOperator.NO_OP) {
       return true;
     }
-    int compareResult = CellComparator.compareValue(cell, comparator);
+    int compareResult = CellUtil.compareValue(cell, comparator);
     return compare(op, compareResult);
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f4c5da/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FilterList.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FilterList.java 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FilterList.java
index e6791ab..2f11472 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FilterList.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FilterList.java
@@ -26,7 +26,7 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.CellComparator;
+import org.apache.hadoop.hbase.CellComparatorImpl;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.yetus.audience.InterfaceAudience;
 import org.apache.hadoop.hbase.exceptions.DeserializationException;
@@ -500,7 +500,7 @@ final public class FilterList extends FilterBase {
           keyHint = curKeyHint;
           continue;
         }
-        if (CellComparator.COMPARATOR.compare(keyHint, curKeyHint) < 0) {
+        if (CellComparatorImpl.COMPARATOR.compare(keyHint, curKeyHint) < 0) {
           keyHint = curKeyHint;
         }
       }
@@ -523,7 +523,7 @@ final public class FilterList extends FilterBase {
         keyHint = curKeyHint;
         continue;
       }
-      if (CellComparator.COMPARATOR.compare(keyHint, curKeyHint) > 0) {
+      if (CellComparatorImpl.COMPARATOR.compare(keyHint, curKeyHint) > 0) {
         keyHint = curKeyHint;
       }
     }

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f4c5da/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FuzzyRowFilter.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FuzzyRowFilter.java 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FuzzyRowFilter.java
index 24d4fab..244e8fb 100644
--- 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FuzzyRowFilter.java
+++ 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FuzzyRowFilter.java
@@ -24,7 +24,7 @@ import java.util.List;
 import java.util.PriorityQueue;
 
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.CellComparator;
+import org.apache.hadoop.hbase.CellComparatorImpl;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.yetus.audience.InterfaceAudience;
 import org.apache.hadoop.hbase.exceptions.DeserializationException;
@@ -235,7 +235,7 @@ public class FuzzyRowFilter extends FilterBase {
 
     boolean lessThan(Cell currentCell, byte[] nextRowKey) {
       int compareResult =
-          CellComparator.COMPARATOR.compareRows(currentCell, nextRowKey, 0, 
nextRowKey.length);
+          CellComparatorImpl.COMPARATOR.compareRows(currentCell, nextRowKey, 
0, nextRowKey.length);
       return (!isReversed() && compareResult < 0) || (isReversed() && 
compareResult > 0);
     }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f4c5da/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/InclusiveStopFilter.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/InclusiveStopFilter.java
 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/InclusiveStopFilter.java
index 3c94c2c..c467d17 100644
--- 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/InclusiveStopFilter.java
+++ 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/InclusiveStopFilter.java
@@ -22,7 +22,7 @@ package org.apache.hadoop.hbase.filter;
 import java.util.ArrayList;
 
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.CellComparator;
+import org.apache.hadoop.hbase.CellComparatorImpl;
 import org.apache.yetus.audience.InterfaceAudience;
 import org.apache.hadoop.hbase.exceptions.DeserializationException;
 import 
org.apache.hadoop.hbase.shaded.com.google.protobuf.InvalidProtocolBufferException;
@@ -60,7 +60,7 @@ public class InclusiveStopFilter extends FilterBase {
   public boolean filterRowKey(Cell firstRowCell) {
     // if stopRowKey is <= buffer, then true, filter row.
     if (filterAllRemaining()) return true;
-    int cmp = CellComparator.COMPARATOR.compareRows(firstRowCell, stopRowKey, 
0, stopRowKey.length);
+    int cmp = CellComparatorImpl.COMPARATOR.compareRows(firstRowCell, 
stopRowKey, 0, stopRowKey.length);
     done = reversed ? cmp < 0 : cmp > 0;
     return done;
   }

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f4c5da/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java
 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java
index a86b257..468af8c 100644
--- 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java
+++ 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java
@@ -23,7 +23,6 @@ import java.io.IOException;
 import java.util.ArrayList;
 
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.CellComparator;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.CompareOperator;
 import org.apache.yetus.audience.InterfaceAudience;
@@ -268,7 +267,7 @@ public class SingleColumnValueFilter extends FilterBase {
   }
 
   private boolean filterColumnValue(final Cell cell) {
-    int compareResult = CellComparator.compareValue(cell, this.comparator);
+    int compareResult = CellUtil.compareValue(cell, this.comparator);
     return CompareFilter.compare(this.op, compareResult);
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f4c5da/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientNoCluster.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientNoCluster.java
 
b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientNoCluster.java
index 0925974..0f11156 100644
--- 
a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientNoCluster.java
+++ 
b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientNoCluster.java
@@ -32,7 +32,7 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
-import org.apache.hadoop.hbase.CellComparator;
+import org.apache.hadoop.hbase.CellComparatorImpl;
 import org.apache.hadoop.hbase.DoNotRetryIOException;
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.commons.logging.Log;
@@ -677,7 +677,7 @@ public class TestClientNoCluster extends Configured 
implements Tool {
    * Comparator for meta row keys.
    */
   private static class MetaRowsComparator implements Comparator<byte []> {
-    private final CellComparator delegate = CellComparator.META_COMPARATOR;
+    private final CellComparatorImpl delegate = 
CellComparatorImpl.META_COMPARATOR;
     @Override
     public int compare(byte[] left, byte[] right) {
       return delegate.compareRows(new KeyValue.KeyOnlyKeyValue(left), right, 
0, right.length);

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f4c5da/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestOperation.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestOperation.java 
b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestOperation.java
index fa9c4ad..800de6d 100644
--- 
a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestOperation.java
+++ 
b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestOperation.java
@@ -29,7 +29,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.CellComparator;
+import org.apache.hadoop.hbase.CellComparatorImpl;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.KeyValue;
@@ -388,7 +388,7 @@ public class TestOperation {
     Assert.assertEquals(1984L, c.get(0).getTimestamp());
     Assert.assertArrayEquals(VALUE, CellUtil.cloneValue(c.get(0)));
     Assert.assertEquals(HConstants.LATEST_TIMESTAMP, p.getTimeStamp());
-    Assert.assertEquals(0, CellComparator.COMPARATOR.compare(c.get(0), new 
KeyValue(c.get(0))));
+    Assert.assertEquals(0, CellComparatorImpl.COMPARATOR.compare(c.get(0), new 
KeyValue(c.get(0))));
 
     p = new Put(ROW);
     p.addColumn(FAMILY, ByteBuffer.wrap(QUALIFIER), 2013L, null);
@@ -397,7 +397,7 @@ public class TestOperation {
     Assert.assertEquals(2013L, c.get(0).getTimestamp());
     Assert.assertArrayEquals(new byte[]{}, CellUtil.cloneValue(c.get(0)));
     Assert.assertEquals(HConstants.LATEST_TIMESTAMP, p.getTimeStamp());
-    Assert.assertEquals(0, CellComparator.COMPARATOR.compare(c.get(0), new 
KeyValue(c.get(0))));
+    Assert.assertEquals(0, CellComparatorImpl.COMPARATOR.compare(c.get(0), new 
KeyValue(c.get(0))));
 
     p = new Put(ByteBuffer.wrap(ROW));
     p.addColumn(FAMILY, ByteBuffer.wrap(QUALIFIER), 2001L, null);
@@ -407,7 +407,7 @@ public class TestOperation {
     Assert.assertArrayEquals(new byte[]{}, CellUtil.cloneValue(c.get(0)));
     Assert.assertArrayEquals(ROW, CellUtil.cloneRow(c.get(0)));
     Assert.assertEquals(HConstants.LATEST_TIMESTAMP, p.getTimeStamp());
-    Assert.assertEquals(0, CellComparator.COMPARATOR.compare(c.get(0), new 
KeyValue(c.get(0))));
+    Assert.assertEquals(0, CellComparatorImpl.COMPARATOR.compare(c.get(0), new 
KeyValue(c.get(0))));
 
     p = new Put(ByteBuffer.wrap(ROW), 1970L);
     p.addColumn(FAMILY, ByteBuffer.wrap(QUALIFIER), 2001L, null);
@@ -417,7 +417,7 @@ public class TestOperation {
     Assert.assertArrayEquals(new byte[]{}, CellUtil.cloneValue(c.get(0)));
     Assert.assertArrayEquals(ROW, CellUtil.cloneRow(c.get(0)));
     Assert.assertEquals(1970L, p.getTimeStamp());
-    Assert.assertEquals(0, CellComparator.COMPARATOR.compare(c.get(0), new 
KeyValue(c.get(0))));
+    Assert.assertEquals(0, CellComparatorImpl.COMPARATOR.compare(c.get(0), new 
KeyValue(c.get(0))));
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f4c5da/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestComparators.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestComparators.java
 
b/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestComparators.java
index 0c69ece..f640c5e 100644
--- 
a/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestComparators.java
+++ 
b/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestComparators.java
@@ -24,7 +24,7 @@ import java.nio.ByteBuffer;
 import org.apache.hadoop.hbase.ByteBufferKeyValue;
 
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.CellComparator;
+import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.testclassification.MiscTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
@@ -53,44 +53,44 @@ public class TestComparators {
     ByteBuffer buffer = ByteBuffer.wrap(kv.getBuffer());
     Cell bbCell = new ByteBufferKeyValue(buffer, 0, buffer.remaining());
     ByteArrayComparable comparable = new BinaryComparator(r1);
-    assertEquals(0, CellComparator.compareRow(bbCell, comparable));
-    assertEquals(0, CellComparator.compareRow(kv, comparable));
+    assertEquals(0, CellUtil.compareRow(bbCell, comparable));
+    assertEquals(0, CellUtil.compareRow(kv, comparable));
     kv = new KeyValue(r0, f, q1, v1);
     buffer = ByteBuffer.wrap(kv.getBuffer());
     bbCell = new ByteBufferKeyValue(buffer, 0, buffer.remaining());
-    assertTrue(CellComparator.compareRow(bbCell, comparable) > 0);
-    assertTrue(CellComparator.compareRow(kv, comparable) > 0);
+    assertTrue(CellUtil.compareRow(bbCell, comparable) > 0);
+    assertTrue(CellUtil.compareRow(kv, comparable) > 0);
     kv = new KeyValue(r2, f, q1, v1);
     buffer = ByteBuffer.wrap(kv.getBuffer());
     bbCell = new ByteBufferKeyValue(buffer, 0, buffer.remaining());
-    assertTrue(CellComparator.compareRow(bbCell, comparable) < 0);
-    assertTrue(CellComparator.compareRow(kv, comparable) < 0);
+    assertTrue(CellUtil.compareRow(bbCell, comparable) < 0);
+    assertTrue(CellUtil.compareRow(kv, comparable) < 0);
     // Qualifier compare
     comparable = new BinaryPrefixComparator(Bytes.toBytes("qual"));
-    assertEquals(0, CellComparator.compareQualifier(bbCell, comparable));
-    assertEquals(0, CellComparator.compareQualifier(kv, comparable));
+    assertEquals(0, CellUtil.compareQualifier(bbCell, comparable));
+    assertEquals(0, CellUtil.compareQualifier(kv, comparable));
     kv = new KeyValue(r2, f, q2, v1);
     buffer = ByteBuffer.wrap(kv.getBuffer());
     bbCell = new ByteBufferKeyValue(buffer, 0, buffer.remaining());
-    assertEquals(0, CellComparator.compareQualifier(bbCell, comparable));
-    assertEquals(0, CellComparator.compareQualifier(kv, comparable));
+    assertEquals(0, CellUtil.compareQualifier(bbCell, comparable));
+    assertEquals(0, CellUtil.compareQualifier(kv, comparable));
     kv = new KeyValue(r2, f, q3, v1);
     buffer = ByteBuffer.wrap(kv.getBuffer());
     bbCell = new ByteBufferKeyValue(buffer, 0, buffer.remaining());
-    assertTrue(CellComparator.compareQualifier(bbCell, comparable) < 0);
-    assertTrue(CellComparator.compareQualifier(kv, comparable) < 0);
+    assertTrue(CellUtil.compareQualifier(bbCell, comparable) < 0);
+    assertTrue(CellUtil.compareQualifier(kv, comparable) < 0);
     // Value compare
     comparable = new LongComparator(l1);
-    assertEquals(0, CellComparator.compareValue(bbCell, comparable));
-    assertEquals(0, CellComparator.compareValue(kv, comparable));
+    assertEquals(0, CellUtil.compareValue(bbCell, comparable));
+    assertEquals(0, CellUtil.compareValue(kv, comparable));
     kv = new KeyValue(r1, f, q1, v2);
     buffer = ByteBuffer.wrap(kv.getBuffer());
     bbCell = new ByteBufferKeyValue(buffer, 0, buffer.remaining());
-    assertTrue(CellComparator.compareValue(bbCell, comparable) < 0);
-    assertTrue(CellComparator.compareValue(kv, comparable) < 0);
+    assertTrue(CellUtil.compareValue(bbCell, comparable) < 0);
+    assertTrue(CellUtil.compareValue(kv, comparable) < 0);
     // Family compare
     comparable = new SubstringComparator("cf");
-    assertEquals(0, CellComparator.compareFamily(bbCell, comparable));
-    assertEquals(0, CellComparator.compareFamily(kv, comparable));
+    assertEquals(0, CellUtil.compareFamily(bbCell, comparable));
+    assertEquals(0, CellUtil.compareFamily(kv, comparable));
   }
 }

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f4c5da/hbase-client/src/test/java/org/apache/hadoop/hbase/shaded/protobuf/TestProtobufUtil.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/test/java/org/apache/hadoop/hbase/shaded/protobuf/TestProtobufUtil.java
 
b/hbase-client/src/test/java/org/apache/hadoop/hbase/shaded/protobuf/TestProtobufUtil.java
index 469c3ea..91b02e6 100644
--- 
a/hbase-client/src/test/java/org/apache/hadoop/hbase/shaded/protobuf/TestProtobufUtil.java
+++ 
b/hbase-client/src/test/java/org/apache/hadoop/hbase/shaded/protobuf/TestProtobufUtil.java
@@ -26,7 +26,7 @@ import java.nio.ByteBuffer;
 import org.apache.hadoop.hbase.ByteBufferKeyValue;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellBuilderType;
-import org.apache.hadoop.hbase.CellComparator;
+import org.apache.hadoop.hbase.CellComparatorImpl;
 import org.apache.hadoop.hbase.ExtendedCellBuilderFactory;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.client.Append;
@@ -261,7 +261,7 @@ public class TestProtobufUtil {
     ByteBufferKeyValue offheapKV = new ByteBufferKeyValue(dbb, 
kv1.getLength(), kv2.getLength());
     CellProtos.Cell cell = ProtobufUtil.toCell(offheapKV);
     Cell newOffheapKV = 
ProtobufUtil.toCell(ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY),
 cell);
-    assertTrue(CellComparator.COMPARATOR.compare(offheapKV, newOffheapKV) == 
0);
+    assertTrue(CellComparatorImpl.COMPARATOR.compare(offheapKV, newOffheapKV) 
== 0);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f4c5da/hbase-common/src/main/java/org/apache/hadoop/hbase/CellComparator.java
----------------------------------------------------------------------
diff --git 
a/hbase-common/src/main/java/org/apache/hadoop/hbase/CellComparator.java 
b/hbase-common/src/main/java/org/apache/hadoop/hbase/CellComparator.java
index 567b10c..a0f2fa4 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/CellComparator.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/CellComparator.java
@@ -15,630 +15,101 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.hadoop.hbase;
 
-import java.io.Serializable;
 import java.util.Comparator;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.hadoop.hbase.KeyValue.Type;
 import org.apache.yetus.audience.InterfaceAudience;
 import org.apache.yetus.audience.InterfaceStability;
-import org.apache.hadoop.hbase.filter.ByteArrayComparable;
-import org.apache.hadoop.hbase.util.ByteBufferUtils;
-import org.apache.hadoop.hbase.util.Bytes;
-
-import org.apache.hadoop.hbase.shaded.com.google.common.primitives.Longs;
-
 /**
- * Compare two HBase cells.  Do not use this method comparing 
<code>-ROOT-</code> or
- * <code>hbase:meta</code> cells.  Cells from these tables need a specialized 
comparator, one that
- * takes account of the special formatting of the row where we have commas to 
delimit table from
- * regionname, from row.  See KeyValue for how it has a special comparator to 
do hbase:meta cells
- * and yet another for -ROOT-.
- * While using this comparator for {{@link #compareRows(Cell, Cell)} et al, 
the hbase:meta cells
- * format should be taken into consideration, for which the instance of this 
comparator
- * should be used.  In all other cases the static APIs in this comparator 
would be enough
+ * Comparator for comparing cells and has some specialized methods that allows 
comparing individual
+ * cell components like row, family, qualifier and timestamp
  */
-@edu.umd.cs.findbugs.annotations.SuppressWarnings(
-    value="UNKNOWN",
-    justification="Findbugs doesn't like the way we are negating the result of 
a compare in below")
-@InterfaceAudience.Private
+@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.COPROC)
 @InterfaceStability.Evolving
-public class CellComparator implements Comparator<Cell>, Serializable {
-  static final Log LOG = LogFactory.getLog(CellComparator.class);
-  private static final long serialVersionUID = -8760041766259623329L;
+public interface CellComparator extends Comparator<Cell> {
 
   /**
-   * Comparator for plain key/values; i.e. non-catalog table key/values. Works 
on Key portion
-   * of KeyValue only.
-   */
-  public static final CellComparator COMPARATOR = new CellComparator();
-  /**
-   * A {@link CellComparator} for <code>hbase:meta</code> catalog table
-   * {@link KeyValue}s.
+   * Lexographically compares two cells. The key part of the cell is taken for 
comparison which
+   * includes row, family, qualifier, timestamp and type
+   * @param leftCell the left hand side cell
+   * @param rightCell the right hand side cell
+   * @return greater than 0 if leftCell is bigger, less than 0 if rightCell is 
bigger, 0 if both
+   *         cells are equal
    */
-  public static final CellComparator META_COMPARATOR = new 
MetaCellComparator();
-
   @Override
-  public int compare(Cell a, Cell b) {
-    return compare(a, b, false);
-  }
+  int compare(Cell leftCell, Cell rightCell);
 
   /**
-   * Compares only the key portion of a cell. It does not include the sequence 
id/mvcc of the
-   * cell 
-   * @param left
-   * @param right
-   * @return an int greater than 0 if left &gt; than right
-   *                lesser than 0 if left &lt; than right
-   *                equal to 0 if left is equal to right
+   * Lexographically compares the rows of two cells.
+   * @param leftCell the left hand side cell
+   * @param rightCell the right hand side cell
+   * @return greater than 0 if leftCell is bigger, less than 0 if rightCell is 
bigger, 0 if both
+   *         cells are equal
    */
-  public final int compareKeyIgnoresMvcc(Cell left, Cell right) {
-    return compare(left, right, true);
-  }
-
-  /**
-   * Used when a cell needs to be compared with a key byte[] such as cases of
-   * finding the index from the index block, bloom keys from the bloom blocks
-   * This byte[] is expected to be serialized in the KeyValue serialization 
format
-   * If the KeyValue (Cell's) serialization format changes this method cannot 
be used.
-   * @param left the cell to be compared
-   * @param key the serialized key part of a KeyValue
-   * @param offset the offset in the key byte[]
-   * @param length the length of the key byte[]
-   * @return an int greater than 0 if left is greater than right
-   *                lesser than 0 if left is lesser than right
-   *                equal to 0 if left is equal to right
-   */
-  public final int compare(Cell left, byte[] key, int offset, int length) {
-    // row
-    short rrowlength = Bytes.toShort(key, offset);
-    int c = compareRows(left, key, offset + Bytes.SIZEOF_SHORT, rrowlength);
-    if (c != 0) return c;
-
-    // Compare the rest of the two KVs without making any assumptions about
-    // the common prefix. This function will not compare rows anyway, so we
-    // don't need to tell it that the common prefix includes the row.
-    return compareWithoutRow(left, key, offset, length, rrowlength);
-  }
-
-  /**
-   * Compare cells.
-   * @param a
-   * @param b
-   * @param ignoreSequenceid True if we are to compare the key portion only 
and ignore
-   * the sequenceid. Set to false to compare key and consider sequenceid.
-   * @return 0 if equal, -1 if a &lt; b, and +1 if a &gt; b.
-   */
-  private final int compare(final Cell a, final Cell b, boolean 
ignoreSequenceid) {
-    // row
-    int c = compareRows(a, b);
-    if (c != 0) return c;
-
-    c = compareWithoutRow(a, b);
-    if(c != 0) return c;
-
-    if (!ignoreSequenceid) {
-      // Negate following comparisons so later edits show up first
-      // mvccVersion: later sorts first
-      return Longs.compare(b.getSequenceId(), a.getSequenceId());
-    } else {
-      return c;
-    }
-  }
-
-  /**
-   * Compares the family and qualifier part of the cell
-   * @param left the left cell
-   * @param right the right cell
-   * @return 0 if both cells are equal, 1 if left cell is bigger than right, 
-1 otherwise
-   */
-  public final static int compareColumns(final Cell left, final Cell right) {
-    int diff = compareFamilies(left, right);
-    if (diff != 0) {
-      return diff;
-    }
-    return compareQualifiers(left, right);
-  }
-
-  private final static int compareColumns(Cell left, byte[] right, int 
rfoffset, int rflength,
-      int rqoffset, int rqlength) {
-    int diff = compareFamilies(left, right, rfoffset, rflength);
-    if (diff != 0)
-      return diff;
-    return compareQualifiers(left, right, rqoffset, rqlength);
-  }
-
-  /**
-   * Compare the families of left and right cell
-   * @param left
-   * @param right
-   * @return 0 if both cells are equal, 1 if left cell is bigger than right, 
-1 otherwise
-   */
-  public final static int compareFamilies(Cell left, Cell right) {
-    if (left instanceof ByteBufferCell && right instanceof ByteBufferCell) {
-      return ByteBufferUtils.compareTo(((ByteBufferCell) 
left).getFamilyByteBuffer(),
-          ((ByteBufferCell) left).getFamilyPosition(), left.getFamilyLength(),
-          ((ByteBufferCell) right).getFamilyByteBuffer(),
-          ((ByteBufferCell) right).getFamilyPosition(), 
right.getFamilyLength());
-    }
-    if (left instanceof ByteBufferCell) {
-      return ByteBufferUtils.compareTo(((ByteBufferCell) 
left).getFamilyByteBuffer(),
-          ((ByteBufferCell) left).getFamilyPosition(), left.getFamilyLength(),
-          right.getFamilyArray(), right.getFamilyOffset(), 
right.getFamilyLength());
-    }
-    if (right instanceof ByteBufferCell) {
-      // Notice how we flip the order of the compare here. We used to negate 
the return value but
-      // see what FindBugs says
-      // 
http://findbugs.sourceforge.net/bugDescriptions.html#RV_NEGATING_RESULT_OF_COMPARETO
-      // It suggest flipping the order to get same effect and 'safer'.
-      return ByteBufferUtils.compareTo(
-          left.getFamilyArray(), left.getFamilyOffset(), 
left.getFamilyLength(),
-          ((ByteBufferCell)right).getFamilyByteBuffer(),
-          ((ByteBufferCell)right).getFamilyPosition(), 
right.getFamilyLength());
-    }
-    return Bytes.compareTo(left.getFamilyArray(), left.getFamilyOffset(), 
left.getFamilyLength(),
-        right.getFamilyArray(), right.getFamilyOffset(), 
right.getFamilyLength());
-  }
-
-  private final static int compareFamilies(Cell left, byte[] right, int 
roffset, int rlength) {
-    if (left instanceof ByteBufferCell) {
-      return ByteBufferUtils.compareTo(((ByteBufferCell) 
left).getFamilyByteBuffer(),
-          ((ByteBufferCell) left).getFamilyPosition(), left.getFamilyLength(), 
right,
-          roffset, rlength);
-    }
-    return Bytes.compareTo(left.getFamilyArray(), left.getFamilyOffset(), 
left.getFamilyLength(),
-        right, roffset, rlength);
-  }
-
-  /**
-   * Compare the qualifiers part of the left and right cells.
-   * @param left
-   * @param right
-   * @return 0 if both cells are equal, 1 if left cell is bigger than right, 
-1 otherwise
-   */
-  public final static int compareQualifiers(Cell left, Cell right) {
-    if (left instanceof ByteBufferCell && right instanceof ByteBufferCell) {
-      return ByteBufferUtils
-          .compareTo(((ByteBufferCell) left).getQualifierByteBuffer(),
-              ((ByteBufferCell) left).getQualifierPosition(),
-              left.getQualifierLength(), ((ByteBufferCell) 
right).getQualifierByteBuffer(),
-              ((ByteBufferCell) right).getQualifierPosition(),
-              right.getQualifierLength());
-    }
-    if (left instanceof ByteBufferCell) {
-      return ByteBufferUtils.compareTo(((ByteBufferCell) 
left).getQualifierByteBuffer(),
-          ((ByteBufferCell) left).getQualifierPosition(), 
left.getQualifierLength(),
-          right.getQualifierArray(), right.getQualifierOffset(), 
right.getQualifierLength());
-    }
-    if (right instanceof ByteBufferCell) {
-      // Notice how we flip the order of the compare here. We used to negate 
the return value but
-      // see what FindBugs says
-      // 
http://findbugs.sourceforge.net/bugDescriptions.html#RV_NEGATING_RESULT_OF_COMPARETO
-      // It suggest flipping the order to get same effect and 'safer'.
-      return ByteBufferUtils.compareTo(left.getQualifierArray(),
-          left.getQualifierOffset(), left.getQualifierLength(),
-          ((ByteBufferCell)right).getQualifierByteBuffer(),
-          ((ByteBufferCell)right).getQualifierPosition(), 
right.getQualifierLength());
-    }
-    return Bytes.compareTo(left.getQualifierArray(), left.getQualifierOffset(),
-        left.getQualifierLength(), right.getQualifierArray(), 
right.getQualifierOffset(),
-        right.getQualifierLength());
-  }
-
-  public final static int compareQualifiers(Cell left, byte[] right, int 
rOffset, int rLength) {
-    if (left instanceof ByteBufferCell) {
-      return ByteBufferUtils.compareTo(((ByteBufferCell) 
left).getQualifierByteBuffer(),
-          ((ByteBufferCell) left).getQualifierPosition(), 
left.getQualifierLength(),
-          right, rOffset, rLength);
-    }
-    return Bytes.compareTo(left.getQualifierArray(), left.getQualifierOffset(),
-        left.getQualifierLength(), right, rOffset, rLength);
-  }
-
-  /**
-   * Compare columnFamily, qualifier, timestamp, and key type (everything
-   * except the row). This method is used both in the normal comparator and
-   * the "same-prefix" comparator. Note that we are assuming that row portions
-   * of both KVs have already been parsed and found identical, and we don't
-   * validate that assumption here.
-   * @param commonPrefix
-   *          the length of the common prefix of the two key-values being
-   *          compared, including row length and row
-   */
-  private final int compareWithoutRow(Cell left,
-      byte[] right, int roffset, int rlength, short rowlength) {
-    /***
-     * KeyValue Format and commonLength:
-     * |_keyLen_|_valLen_|_rowLen_|_rowKey_|_famiLen_|_fami_|_Quali_|....
-     * ------------------|-------commonLength--------|--------------
-     */
-    int commonLength = KeyValue.ROW_LENGTH_SIZE + KeyValue.FAMILY_LENGTH_SIZE 
+ rowlength;
-
-    // commonLength + TIMESTAMP_TYPE_SIZE
-    int commonLengthWithTSAndType = KeyValue.TIMESTAMP_TYPE_SIZE + 
commonLength;
-    // ColumnFamily + Qualifier length.
-    int lcolumnlength = left.getFamilyLength() + left.getQualifierLength();
-    int rcolumnlength = rlength - commonLengthWithTSAndType;
-
-    byte ltype = left.getTypeByte();
-    byte rtype = right[roffset + (rlength - 1)];
-
-    // If the column is not specified, the "minimum" key type appears the
-    // latest in the sorted order, regardless of the timestamp. This is used
-    // for specifying the last key/value in a given row, because there is no
-    // "lexicographically last column" (it would be infinitely long). The
-    // "maximum" key type does not need this behavior.
-    if (lcolumnlength == 0 && ltype == Type.Minimum.getCode()) {
-      // left is "bigger", i.e. it appears later in the sorted order
-      return 1;
-    }
-    if (rcolumnlength == 0 && rtype == Type.Minimum.getCode()) {
-      return -1;
-    }
-
-    int rfamilyoffset = commonLength + roffset;
-
-    // Column family length.
-    int lfamilylength = left.getFamilyLength();
-    int rfamilylength = right[rfamilyoffset - 1];
-    // If left family size is not equal to right family size, we need not
-    // compare the qualifiers.
-    boolean sameFamilySize = (lfamilylength == rfamilylength);
-    if (!sameFamilySize) {
-      // comparing column family is enough.
-      return compareFamilies(left, right, rfamilyoffset, rfamilylength);
-    }
-    // Compare family & qualifier together.
-    // Families are same. Compare on qualifiers.
-    int comparison = compareColumns(left, right, rfamilyoffset, rfamilylength, 
rfamilyoffset
-        + rfamilylength, (rcolumnlength - rfamilylength));
-    if (comparison != 0) {
-      return comparison;
-    }
-
-    // //
-    // Next compare timestamps.
-    long rtimestamp = Bytes.toLong(right, roffset + (rlength - 
KeyValue.TIMESTAMP_TYPE_SIZE));
-    int compare = compareTimestamps(left.getTimestamp(), rtimestamp);
-    if (compare != 0) {
-      return compare;
-    }
-
-    // Compare types. Let the delete types sort ahead of puts; i.e. types
-    // of higher numbers sort before those of lesser numbers. Maximum (255)
-    // appears ahead of everything, and minimum (0) appears after
-    // everything.
-    return (0xff & rtype) - (0xff & ltype);
-  }
-
-  /**
-   * Compares the rows of the left and right cell.
-   * For the hbase:meta case this method is overridden such that it can handle 
hbase:meta cells.
-   * The caller should ensure using the appropriate comparator for hbase:meta.
-   * @param left
-   * @param right
-   * @return 0 if both cells are equal, 1 if left cell is bigger than right, 
-1 otherwise
-   */
-  public int compareRows(final Cell left, final Cell right) {
-    // left and right can be exactly the same at the beginning of a row
-    if (left == right) {
-      return 0;
-    }
-    if (left instanceof ByteBufferCell && right instanceof ByteBufferCell) {
-      return ByteBufferUtils.compareTo(((ByteBufferCell) 
left).getRowByteBuffer(),
-          ((ByteBufferCell) left).getRowPosition(), left.getRowLength(),
-          ((ByteBufferCell) right).getRowByteBuffer(),
-          ((ByteBufferCell) right).getRowPosition(), right.getRowLength());
-    }
-    if (left instanceof ByteBufferCell) {
-      return ByteBufferUtils.compareTo(((ByteBufferCell) 
left).getRowByteBuffer(),
-          ((ByteBufferCell) left).getRowPosition(), left.getRowLength(),
-          right.getRowArray(), right.getRowOffset(), right.getRowLength());
-    }
-    if (right instanceof ByteBufferCell) {
-      // Notice how we flip the order of the compare here. We used to negate 
the return value but
-      // see what FindBugs says
-      // 
http://findbugs.sourceforge.net/bugDescriptions.html#RV_NEGATING_RESULT_OF_COMPARETO
-      // It suggest flipping the order to get same effect and 'safer'.
-      return ByteBufferUtils.compareTo(left.getRowArray(), 
left.getRowOffset(), left.getRowLength(),
-          ((ByteBufferCell)right).getRowByteBuffer(),
-          ((ByteBufferCell)right).getRowPosition(), right.getRowLength());
-    }
-    return Bytes.compareTo(left.getRowArray(), left.getRowOffset(), 
left.getRowLength(),
-        right.getRowArray(), right.getRowOffset(), right.getRowLength());
-  }
+  int compareRows(Cell leftCell, Cell rightCell);
 
   /**
    * Compares the row part of the cell with a simple plain byte[] like the
-   * stopRow in Scan. This should be used with context where for hbase:meta
-   * cells the {{@link #META_COMPARATOR} should be used
-   *
-   * @param left
-   *          the cell to be compared
-   * @param right
-   *          the kv serialized byte[] to be compared with
-   * @param roffset
-   *          the offset in the byte[]
-   * @param rlength
-   *          the length in the byte[]
-   * @return 0 if both cell and the byte[] are equal, 1 if the cell is bigger
-   *         than byte[], -1 otherwise
-   */
-  public int compareRows(Cell left, byte[] right, int roffset, int rlength) {
-    if (left instanceof ByteBufferCell) {
-      return ByteBufferUtils.compareTo(((ByteBufferCell) 
left).getRowByteBuffer(),
-          ((ByteBufferCell) left).getRowPosition(), left.getRowLength(), right,
-          roffset, rlength);
-    }
-    return Bytes.compareTo(left.getRowArray(), left.getRowOffset(), 
left.getRowLength(), right,
-        roffset, rlength);
-  }
-
-  public static int compareWithoutRow(final Cell left, final Cell right) {
-    // If the column is not specified, the "minimum" key type appears the
-    // latest in the sorted order, regardless of the timestamp. This is used
-    // for specifying the last key/value in a given row, because there is no
-    // "lexicographically last column" (it would be infinitely long). The
-    // "maximum" key type does not need this behavior.
-    // Copied from KeyValue. This is bad in that we can't do memcmp w/ special 
rules like this.
-    int lFamLength = left.getFamilyLength();
-    int rFamLength = right.getFamilyLength();
-    int lQualLength = left.getQualifierLength();
-    int rQualLength = right.getQualifierLength();
-    if (lFamLength + lQualLength == 0
-          && left.getTypeByte() == Type.Minimum.getCode()) {
-      // left is "bigger", i.e. it appears later in the sorted order
-      return 1;
-    }
-    if (rFamLength + rQualLength == 0
-        && right.getTypeByte() == Type.Minimum.getCode()) {
-      return -1;
-    }
-    if (lFamLength != rFamLength) {
-      // comparing column family is enough.
-      return compareFamilies(left, right);
-    }
-    // Compare cf:qualifier
-    int diff = compareColumns(left, right);
-    if (diff != 0) return diff;
-
-    diff = compareTimestamps(left, right);
-    if (diff != 0) return diff;
-
-    // Compare types. Let the delete types sort ahead of puts; i.e. types
-    // of higher numbers sort before those of lesser numbers. Maximum (255)
-    // appears ahead of everything, and minimum (0) appears after
-    // everything.
-    return (0xff & right.getTypeByte()) - (0xff & left.getTypeByte());
-  }
-
-  /**
-   * Compares cell's timestamps in DESCENDING order.
-   * The below older timestamps sorting ahead of newer timestamps looks
-   * wrong but it is intentional. This way, newer timestamps are first
-   * found when we iterate over a memstore and newer versions are the
-   * first we trip over when reading from a store file.
-   * @return 1 if left's timestamp &lt; right's timestamp
-   *         -1 if left's timestamp &gt; right's timestamp
-   *         0 if both timestamps are equal
-   */
-  public static int compareTimestamps(final Cell left, final Cell right) {
-    return compareTimestamps(left.getTimestamp(), right.getTimestamp());
-  }
-
-  /**
-   * Used to compare two cells based on the column hint provided. This is 
specifically
-   * used when we need to optimize the seeks based on the next indexed key. 
This is an
-   * advanced usage API specifically needed for some optimizations.
-   * @param nextIndexedCell the next indexed cell 
-   * @param currentCell the cell to be compared
-   * @param foff the family offset of the currentCell
-   * @param flen the family length of the currentCell
-   * @param colHint the column hint provided - could be null
-   * @param coff the offset of the column hint if provided, if not offset of 
the currentCell's
-   * qualifier
-   * @param clen the length of the column hint if provided, if not length of 
the currentCell's
-   * qualifier
-   * @param ts the timestamp to be seeked
-   * @param type the type to be seeked
-   * @return an int based on the given column hint
-   * TODO : To be moved out of here because this is a special API used in scan
-   * optimization.
-   */
-  // compare a key against row/fam/qual/ts/type
-  public final int compareKeyBasedOnColHint(Cell nextIndexedCell, Cell 
currentCell, int foff,
-      int flen, byte[] colHint, int coff, int clen, long ts, byte type) {
-    int compare = compareRows(nextIndexedCell, currentCell);
-    if (compare != 0) {
-      return compare;
-    }
-    // If the column is not specified, the "minimum" key type appears the
-    // latest in the sorted order, regardless of the timestamp. This is used
-    // for specifying the last key/value in a given row, because there is no
-    // "lexicographically last column" (it would be infinitely long). The
-    // "maximum" key type does not need this behavior.
-    if (nextIndexedCell.getFamilyLength() + 
nextIndexedCell.getQualifierLength() == 0
-        && nextIndexedCell.getTypeByte() == Type.Minimum.getCode()) {
-      // left is "bigger", i.e. it appears later in the sorted order
-      return 1;
-    }
-    if (flen + clen == 0 && type == Type.Minimum.getCode()) {
-      return -1;
-    }
-
-    compare = compareFamilies(nextIndexedCell, currentCell);
-    if (compare != 0) {
-      return compare;
-    }
-    if (colHint == null) {
-      compare = compareQualifiers(nextIndexedCell, currentCell);
-    } else {
-      compare = compareQualifiers(nextIndexedCell, colHint, coff, clen);
-    }
-    if (compare != 0) {
-      return compare;
-    }
-    // Next compare timestamps.
-    compare = compareTimestamps(nextIndexedCell.getTimestamp(), ts);
-    if (compare != 0) {
-      return compare;
-    }
-
-    // Compare types. Let the delete types sort ahead of puts; i.e. types
-    // of higher numbers sort before those of lesser numbers. Maximum (255)
-    // appears ahead of everything, and minimum (0) appears after
-    // everything.
-    return (0xff & type) - (0xff & nextIndexedCell.getTypeByte());
-  }
-
-  /**
-   * Compares timestamps in DESCENDING order.
-   * The below older timestamps sorting ahead of newer timestamps looks
-   * wrong but it is intentional. This way, newer timestamps are first
-   * found when we iterate over a memstore and newer versions are the
-   * first we trip over when reading from a store file.
-   * @return 1 if left timestamp &lt; right timestamp
-   *         -1 if left timestamp &gt; right timestamp
-   *         0 if both timestamps are equal
+   * stopRow in Scan.
+   * @param cell the cell
+   * @param bytes the byte[] representing the row to be compared with
+   * @param offset the offset of the byte[]
+   * @param length the length of the byte[]
+   * @return greater than 0 if leftCell is bigger, less than 0 if rightCell is 
bigger, 0 if both
+   *         cells are equal
    */
-  public static int compareTimestamps(final long ltimestamp, final long 
rtimestamp) {
-    if (ltimestamp < rtimestamp) {
-      return 1;
-    } else if (ltimestamp > rtimestamp) {
-      return -1;
-    }
-    return 0;
-  }
+  int compareRows(Cell cell, byte[] bytes, int offset, int length);
 
   /**
-   * Compare cell's row against given comparator
-   * @param cell
-   * @param comparator
-   * @return result comparing cell's row
+   * Lexographically compares the two cells excluding the row part. It 
compares family, qualifier,
+   * timestamp and the type
+   * @param leftCell the left hand side cell
+   * @param rightCell the right hand side cell
+   * @return greater than 0 if leftCell is bigger, less than 0 if rightCell is 
bigger, 0 if both
+   *         cells are equal
    */
-  public static int compareRow(Cell cell, ByteArrayComparable comparator) {
-    if (cell instanceof ByteBufferCell) {
-      return comparator.compareTo(((ByteBufferCell) cell).getRowByteBuffer(),
-          ((ByteBufferCell) cell).getRowPosition(), cell.getRowLength());
-    }
-    return comparator.compareTo(cell.getRowArray(), cell.getRowOffset(), 
cell.getRowLength());
-  }
+  int compareWithoutRow(Cell leftCell, Cell rightCell);
 
   /**
-   * Compare cell's column family against given comparator
-   * @param cell
-   * @param comparator
-   * @return result comparing cell's column family
+   * Lexographically compares the families of the two cells
+   * @param leftCell the left hand side cell
+   * @param rightCell the right hand side cell
+   * @return greater than 0 if leftCell is bigger, less than 0 if rightCell is 
bigger, 0 if both
+   *         cells are equal
    */
-  public static int compareFamily(Cell cell, ByteArrayComparable comparator) {
-    if (cell instanceof ByteBufferCell) {
-      return comparator.compareTo(((ByteBufferCell) 
cell).getFamilyByteBuffer(),
-          ((ByteBufferCell) cell).getFamilyPosition(), cell.getFamilyLength());
-    }
-    return comparator.compareTo(cell.getFamilyArray(), cell.getFamilyOffset(),
-        cell.getFamilyLength());
-  }
+  int compareFamilies(Cell leftCell, Cell rightCell);
 
   /**
-   * Compare cell's qualifier against given comparator
-   * @param cell
-   * @param comparator
-   * @return result comparing cell's qualifier
+   * Lexographically compares the qualifiers of the two cells
+   * @param leftCell the left hand side cell
+   * @param rightCell the right hand side cell
+   * @return greater than 0 if leftCell is bigger, less than 0 if rightCell is 
bigger, 0 if both
+   *         cells are equal
    */
-  public static int compareQualifier(Cell cell, ByteArrayComparable 
comparator) {
-    if (cell instanceof ByteBufferCell) {
-      return comparator.compareTo(((ByteBufferCell) 
cell).getQualifierByteBuffer(),
-          ((ByteBufferCell) cell).getQualifierPosition(), 
cell.getQualifierLength());
-    }
-    return comparator.compareTo(cell.getQualifierArray(), 
cell.getQualifierOffset(),
-        cell.getQualifierLength());
-  }
+  int compareQualifiers(Cell leftCell, Cell rightCell);
 
   /**
-   * Compare cell's value against given comparator
-   * @param cell
-   * @param comparator
-   * @return result comparing cell's value
+   * Compares cell's timestamps in DESCENDING order. The below older 
timestamps sorting ahead of
+   * newer timestamps looks wrong but it is intentional. This way, newer 
timestamps are first found
+   * when we iterate over a memstore and newer versions are the first we trip 
over when reading from
+   * a store file.
+   * @param leftCell the left hand side cell
+   * @param rightCell the right hand side cell
+   * @return 1 if left's timestamp &lt; right's timestamp -1 if left's 
timestamp &gt; right's
+   *         timestamp 0 if both timestamps are equal
    */
-  public static int compareValue(Cell cell, ByteArrayComparable comparator) {
-    if (cell instanceof ByteBufferCell) {
-      return comparator.compareTo(((ByteBufferCell) cell).getValueByteBuffer(),
-          ((ByteBufferCell) cell).getValuePosition(), cell.getValueLength());
-    }
-    return comparator.compareTo(cell.getValueArray(), cell.getValueOffset(), 
cell.getValueLength());
-  }
+  int compareTimestamps(Cell leftCell, Cell rightCell);
 
   /**
-   * A {@link CellComparator} for <code>hbase:meta</code> catalog table
-   * {@link KeyValue}s.
+   * Compares cell's timestamps in DESCENDING order. The below older 
timestamps sorting ahead of
+   * newer timestamps looks wrong but it is intentional. This way, newer 
timestamps are first found
+   * when we iterate over a memstore and newer versions are the first we trip 
over when reading from
+   * a store file.
+   * @param leftCellts the left cell's timestamp
+   * @param rightCellts the right cell's timestamp
+   * @return 1 if left's timestamp &lt; right's timestamp -1 if left's 
timestamp &gt; right's
+   *         timestamp 0 if both timestamps are equal
    */
-  public static class MetaCellComparator extends CellComparator {
-
-    @Override
-    public int compareRows(final Cell left, final Cell right) {
-      return compareRows(left.getRowArray(), left.getRowOffset(), 
left.getRowLength(),
-          right.getRowArray(), right.getRowOffset(), right.getRowLength());
-    }
-
-    @Override
-    public int compareRows(Cell left, byte[] right, int roffset, int rlength) {
-      return compareRows(left.getRowArray(), left.getRowOffset(), 
left.getRowLength(), right,
-          roffset, rlength);
-    }
-
-    private int compareRows(byte[] left, int loffset, int llength, byte[] 
right, int roffset,
-        int rlength) {
-      int leftDelimiter = Bytes.searchDelimiterIndex(left, loffset, llength, 
HConstants.DELIMITER);
-      int rightDelimiter = Bytes
-          .searchDelimiterIndex(right, roffset, rlength, HConstants.DELIMITER);
-      // Compare up to the delimiter
-      int lpart = (leftDelimiter < 0 ? llength : leftDelimiter - loffset);
-      int rpart = (rightDelimiter < 0 ? rlength : rightDelimiter - roffset);
-      int result = Bytes.compareTo(left, loffset, lpart, right, roffset, 
rpart);
-      if (result != 0) {
-        return result;
-      } else {
-        if (leftDelimiter < 0 && rightDelimiter >= 0) {
-          return -1;
-        } else if (rightDelimiter < 0 && leftDelimiter >= 0) {
-          return 1;
-        } else if (leftDelimiter < 0 && rightDelimiter < 0) {
-          return 0;
-        }
-      }
-      // Compare middle bit of the row.
-      // Move past delimiter
-      leftDelimiter++;
-      rightDelimiter++;
-      int leftFarDelimiter = Bytes.searchDelimiterIndexInReverse(left, 
leftDelimiter, llength
-          - (leftDelimiter - loffset), HConstants.DELIMITER);
-      int rightFarDelimiter = Bytes.searchDelimiterIndexInReverse(right, 
rightDelimiter, rlength
-          - (rightDelimiter - roffset), HConstants.DELIMITER);
-      // Now compare middlesection of row.
-      lpart = (leftFarDelimiter < 0 ? llength + loffset : leftFarDelimiter) - 
leftDelimiter;
-      rpart = (rightFarDelimiter < 0 ? rlength + roffset : rightFarDelimiter) 
- rightDelimiter;
-      result = Bytes.compareTo(left, leftDelimiter, lpart, right, 
rightDelimiter, rpart);
-      if (result != 0) {
-        return result;
-      } else {
-        if (leftDelimiter < 0 && rightDelimiter >= 0) {
-          return -1;
-        } else if (rightDelimiter < 0 && leftDelimiter >= 0) {
-          return 1;
-        } else if (leftDelimiter < 0 && rightDelimiter < 0) {
-          return 0;
-        }
-      }
-      // Compare last part of row, the rowid.
-      leftFarDelimiter++;
-      rightFarDelimiter++;
-      result = Bytes.compareTo(left, leftFarDelimiter, llength - 
(leftFarDelimiter - loffset),
-          right, rightFarDelimiter, rlength - (rightFarDelimiter - roffset));
-      return result;
-    }
-  }
+  int compareTimestamps(long leftCellts, long rightCellts);
 }

Reply via email to