Index: src/java/org/apache/hadoop/hbase/client/Get.java =================================================================== --- src/java/org/apache/hadoop/hbase/client/Get.java (revision 786649) +++ src/java/org/apache/hadoop/hbase/client/Get.java (working copy) @@ -29,6 +29,7 @@ import java.util.TreeSet; import org.apache.hadoop.hbase.KeyValue; +import org.apache.hadoop.hbase.filter.Filter; import org.apache.hadoop.hbase.filter.RowFilterInterface; import org.apache.hadoop.hbase.io.HbaseObjectWritable; import org.apache.hadoop.hbase.io.TimeRange; @@ -63,7 +64,7 @@ private byte [] row = null; private long lockId = -1L; private int maxVersions = 1; - private RowFilterInterface filter = null; + private Filter filter = null; private TimeRange tr = new TimeRange(); private Map> familyMap = new TreeMap>(Bytes.BYTES_COMPARATOR); @@ -206,7 +207,7 @@ * Apply the specified server-side filter when performing the Get. * @param filter filter to run on the server */ - public Get setFilter(RowFilterInterface filter) { + public Get setFilter(Filter filter) { this.filter = filter; return this; } @@ -254,6 +255,13 @@ } /** + * @return RowFilter + */ + public Filter getFilter() { + return filter; + } + + /** * Method for retrieving the keys in the familyMap * @return keys in the current familyMap */ @@ -342,8 +350,7 @@ this.maxVersions = in.readInt(); boolean hasFilter = in.readBoolean(); if(hasFilter) { - this.filter = - (RowFilterInterface)HbaseObjectWritable.readObject(in, null); + this.filter = (Filter)HbaseObjectWritable.readObject(in, null); } this.tr = new TimeRange(); tr.readFields(in); @@ -375,8 +382,7 @@ out.writeBoolean(false); } else { out.writeBoolean(true); - HbaseObjectWritable.writeObject(out, this.filter, - RowFilterInterface.class, null); + HbaseObjectWritable.writeObject(out, this.filter, Filter.class, null); } tr.write(out); out.writeInt(familyMap.size()); Index: src/java/org/apache/hadoop/hbase/regionserver/QueryMatcher.java =================================================================== --- src/java/org/apache/hadoop/hbase/regionserver/QueryMatcher.java (revision 786649) +++ src/java/org/apache/hadoop/hbase/regionserver/QueryMatcher.java (working copy) @@ -24,6 +24,8 @@ import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.KeyValue.KeyComparator; import org.apache.hadoop.hbase.client.Get; +import org.apache.hadoop.hbase.filter.Filter; +import org.apache.hadoop.hbase.filter.Filter.ReturnCode; import org.apache.hadoop.hbase.io.TimeRange; import org.apache.hadoop.hbase.util.Bytes; @@ -114,6 +116,9 @@ /** Oldest allowed version stamp for TTL enforcement */ protected long oldestStamp; + /** Server-side user specified filter */ + protected Filter filter; + /** * Constructs a QueryMatcher for a Get. * @param get @@ -132,6 +137,7 @@ this.rowComparator = rowComparator; this.deletes = new GetDeleteTracker(); this.startKey = KeyValue.createFirstOnRow(row); + this.filter = get.getFilter(); // Single branch to deal with two types of Gets (columns vs all in family) if(columns == null || columns.size() == 0) { this.columns = new WildcardColumnTracker(maxVersions); @@ -269,7 +275,22 @@ * If have moved past * If enough versions of everything, */ - return columns.checkColumn(bytes, columnOffset, columnLength); + MatchCode colChecker = + columns.checkColumn(bytes, columnOffset, columnLength); + + if(colChecker != MatchCode.INCLUDE || filter == null) { + return colChecker; + } + + ReturnCode filterResponse = filter.filterKeyValue(kv); + if (filterResponse == ReturnCode.INCLUDE) + return MatchCode.INCLUDE; + + if (filterResponse == ReturnCode.SKIP) + return MatchCode.SKIP; + + // filterResponse == ReturnCode.NEXT_ROW + return MatchCode.DONE; } // should be in KeyValue.