ValueFilter is being evaluated before performing the column match
-----------------------------------------------------------------
Key: HBASE-3562
URL: https://issues.apache.org/jira/browse/HBASE-3562
Project: HBase
Issue Type: Bug
Components: filters
Affects Versions: 0.90.0
Reporter: Evert Arckens
When performing a Get operation where a both a column is specified and a
ValueFilter, the ValueFilter is evaluated before making the column match as is
indicated in the javadoc of Get.setFilter() : " {@link
Filter#filterKeyValue(KeyValue)} is called AFTER all tests for ttl, column
match, deletes and max versions have been run. "
The is shown in the little test below, which uses a TestComparator extending a
WritableByteArrayComparable.
public void testFilter() throws Exception {
byte[] cf = Bytes.toBytes("cf");
byte[] row = Bytes.toBytes("row");
byte[] col1 = Bytes.toBytes("col1");
byte[] col2 = Bytes.toBytes("col2");
Put put = new Put(row);
put.add(cf, col1, new byte[]{(byte)1});
put.add(cf, col2, new byte[]{(byte)2});
table.put(put);
Get get = new Get(row);
get.addColumn(cf, col2); // We only want to retrieve col2
TestComparator testComparator = new TestComparator();
Filter filter = new ValueFilter(CompareOp.EQUAL, testComparator);
get.setFilter(filter);
Result result = table.get(get);
}
public class TestComparator extends WritableByteArrayComparable {
/**
* Nullary constructor, for Writable
*/
public TestComparator() {
super();
}
@Override
public int compareTo(byte[] theirValue) {
if (theirValue[0] == (byte)1) {
// If the column match was done before evaluating the filter, we
should never get here.
throw new RuntimeException("I only expect (byte)2 in col2, not
(byte)1 from col1");
}
if (theirValue[0] == (byte)2) {
return 0;
}
else return 1;
}
}
When only one column should be retrieved, this can be worked around by using a
SingleColumnValueFilter instead of the ValueFilter.
--
This message is automatically generated by JIRA.
-
For more information on JIRA, see: http://www.atlassian.com/software/jira