Index: src/main/java/org/apache/hadoop/hbase/filter/NullComparator.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/filter/NullComparator.java (revision 1186996) +++ src/main/java/org/apache/hadoop/hbase/filter/NullComparator.java (working copy) @@ -36,4 +36,8 @@ return value != null ? 1 : 0; } + @Override + public int compareTo(byte[] value, int offset, int length) { + throw new UnsupportedOperationException(); + } } Index: src/main/java/org/apache/hadoop/hbase/filter/BinaryComparator.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/filter/BinaryComparator.java (revision 1186996) +++ src/main/java/org/apache/hadoop/hbase/filter/BinaryComparator.java (working copy) @@ -20,6 +20,8 @@ package org.apache.hadoop.hbase.filter; +import org.apache.hadoop.hbase.util.Bytes; + /** * A binary comparator which lexicographically compares against the specified * byte array using {@link org.apache.hadoop.hbase.util.Bytes#compareTo(byte[], byte[])}. @@ -37,4 +39,8 @@ super(value); } + @Override + public int compareTo(byte [] value, int offset, int length) { + return Bytes.compareTo(this.value, 0, this.value.length, value, offset, length); + } } Index: src/main/java/org/apache/hadoop/hbase/filter/RegexStringComparator.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/filter/RegexStringComparator.java (revision 1186996) +++ src/main/java/org/apache/hadoop/hbase/filter/RegexStringComparator.java (working copy) @@ -90,10 +90,11 @@ } @Override - public int compareTo(byte[] value) { + public int compareTo(byte[] value, int offset, int length) { // Use find() for subsequence match instead of matches() (full sequence // match) to adhere to the principle of least surprise. - return pattern.matcher(new String(value, charset)).find() ? 0 : 1; + return pattern.matcher(new String(value, offset, length, charset)).find() ? 0 + : 1; } @Override Index: src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java (revision 1186996) +++ src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java (working copy) @@ -20,13 +20,11 @@ package org.apache.hadoop.hbase.filter; -import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.io.HbaseObjectWritable; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; -import java.util.Arrays; import java.util.ArrayList; import com.google.common.base.Preconditions; @@ -105,9 +103,7 @@ if (compareOp == CompareOp.NO_OP) { return true; } - int compareResult = - comparator.compareTo(Arrays.copyOfRange(data, offset, - offset + length)); + int compareResult = comparator.compareTo(data, offset, length); switch (compareOp) { case LESS: return compareResult <= 0; Index: src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java (revision 1186996) +++ src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java (working copy) @@ -174,10 +174,7 @@ private boolean filterColumnValue(final byte [] data, final int offset, final int length) { - // TODO: Can this filter take a rawcomparator so don't have to make this - // byte array copy? - int compareResult = - this.comparator.compareTo(Arrays.copyOfRange(data, offset, offset + length)); + int compareResult = this.comparator.compareTo(data, offset, length); switch (this.compareOp) { case LESS: return compareResult <= 0; Index: src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java (revision 1186996) +++ src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java (working copy) @@ -74,8 +74,8 @@ } @Override - public int compareTo(byte[] value) { - if (value.length != this.value.length) { + public int compareTo(byte[] value, int offset, int length) { + if (length != this.value.length) { return 1; } int b = 0; @@ -83,13 +83,13 @@ for (int i = value.length - 1; i >= 0 && b == 0; i--) { switch (bitOperator) { case AND: - b = (this.value[i] & value[i]) & 0xff; + b = (this.value[i] & value[i+offset]) & 0xff; break; case OR: - b = (this.value[i] | value[i]) & 0xff; + b = (this.value[i] | value[i+offset]) & 0xff; break; case XOR: - b = (this.value[i] ^ value[i]) & 0xff; + b = (this.value[i] ^ value[i+offset]) & 0xff; break; } } Index: src/main/java/org/apache/hadoop/hbase/filter/SubstringComparator.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/filter/SubstringComparator.java (revision 1186996) +++ src/main/java/org/apache/hadoop/hbase/filter/SubstringComparator.java (working copy) @@ -64,8 +64,9 @@ } @Override - public int compareTo(byte[] value) { - return Bytes.toString(value).toLowerCase().contains(substr) ? 0 : 1; + public int compareTo(byte[] value, int offset, int length) { + return Bytes.toString(value, offset, length).toLowerCase().contains(substr) ? 0 + : 1; } @Override Index: src/main/java/org/apache/hadoop/hbase/filter/WritableByteArrayComparable.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/filter/WritableByteArrayComparable.java (revision 1186996) +++ src/main/java/org/apache/hadoop/hbase/filter/WritableByteArrayComparable.java (working copy) @@ -60,7 +60,17 @@ @Override public int compareTo(byte [] value) { - return Bytes.compareTo(this.value, value); + return compareTo(value, 0, value.length); } + /** + * Special compareTo method for subclasses, to avoid + * copying byte[] unnecessarily. + * @param value byte[] to compare + * @param offset offset into value + * @param length number of bytes to compare + * @return a negative integer, zero, or a positive integer as this object + * is less than, equal to, or greater than the specified object. + */ + public abstract int compareTo(byte [] value, int offset, int length); } Index: src/main/java/org/apache/hadoop/hbase/filter/BinaryPrefixComparator.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/filter/BinaryPrefixComparator.java (revision 1186996) +++ src/main/java/org/apache/hadoop/hbase/filter/BinaryPrefixComparator.java (working copy) @@ -41,13 +41,8 @@ } @Override - public int compareTo(byte [] value) { - if (this.value.length <= value.length) { - return Bytes.compareTo(this.value, 0, this.value.length, value, 0, - this.value.length); - } else { - return Bytes.compareTo(this.value, value); - } + public int compareTo(byte [] value, int offset, int length) { + return Bytes.compareTo(this.value, 0, this.value.length, value, offset, + this.value.length <= length ? this.value.length : length); } - }