Index: src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (revision 1449500) +++ src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (working copy) @@ -98,6 +98,7 @@ import org.apache.hadoop.hbase.client.coprocessor.ExecResult; import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp; import org.apache.hadoop.hbase.filter.Filter; +import org.apache.hadoop.hbase.filter.FilterBase; import org.apache.hadoop.hbase.filter.IncompatibleFilterException; import org.apache.hadoop.hbase.filter.WritableByteArrayComparable; import org.apache.hadoop.hbase.io.HeapSize; @@ -3573,7 +3574,7 @@ Store store = stores.get(entry.getKey()); KeyValueScanner scanner = store.getScanner(scan, entry.getValue()); if (this.filter == null || !scan.doLoadColumnFamiliesOnDemand() - || this.filter.isFamilyEssential(entry.getKey())) { + || FilterBase.isFamilyEssential(this.filter, entry.getKey())) { scanners.add(scanner); } else { joinedScanners.add(scanner); Index: src/main/java/org/apache/hadoop/hbase/filter/SkipFilter.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/filter/SkipFilter.java (revision 1449500) +++ src/main/java/org/apache/hadoop/hbase/filter/SkipFilter.java (working copy) @@ -105,7 +105,7 @@ } public boolean isFamilyEssential(byte[] name) { - return filter.isFamilyEssential(name); + return FilterBase.isFamilyEssential(this.filter, name); } @Override Index: src/main/java/org/apache/hadoop/hbase/filter/FilterBase.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/filter/FilterBase.java (revision 1449500) +++ src/main/java/org/apache/hadoop/hbase/filter/FilterBase.java (working copy) @@ -131,14 +131,29 @@ } /** + * Check that given column family is essential for filter to check row. Most + * filters always return true here. But some could have more sophisticated + * logic which could significantly reduce scanning process by not even + * touching columns until we are 100% sure that it's data is needed in result. + * * By default, we require all scan's column families to be present. Our * subclasses may be more precise. - * - * @inheritDoc */ public boolean isFamilyEssential(byte[] name) { return true; } + + /** + * Check that given column family is essential for filter to check row. + * This accommodates Filter implementation which didn't have this capability + * + * @param filter + * @param name column family name + * @return whether column family is essential + */ + public static boolean isFamilyEssential(Filter filter, byte[] name) { + return !(filter instanceof FilterBase) || ((FilterBase) filter).isFamilyEssential(name); + } /** * Given the filter's arguments it constructs the filter Index: src/main/java/org/apache/hadoop/hbase/filter/FilterList.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/filter/FilterList.java (revision 1449500) +++ src/main/java/org/apache/hadoop/hbase/filter/FilterList.java (working copy) @@ -316,10 +316,9 @@ return keyHint; } - @Override public boolean isFamilyEssential(byte[] name) { for (Filter filter : filters) { - if (filter.isFamilyEssential(name)) { + if (FilterBase.isFamilyEssential(filter, name)) { return true; } } Index: src/main/java/org/apache/hadoop/hbase/filter/Filter.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/filter/Filter.java (revision 1449500) +++ src/main/java/org/apache/hadoop/hbase/filter/Filter.java (working copy) @@ -167,12 +167,4 @@ * not sure which key to seek to next. */ public KeyValue getNextKeyHint(final KeyValue currentKV); - - /** - * Check that given column family is essential for filter to check row. Most - * filters always return true here. But some could have more sophisticated - * logic which could significantly reduce scanning process by not even - * touching columns until we are 100% sure that it's data is needed in result. - */ - public boolean isFamilyEssential(byte[] name); } Index: src/main/java/org/apache/hadoop/hbase/filter/WhileMatchFilter.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/filter/WhileMatchFilter.java (revision 1449500) +++ src/main/java/org/apache/hadoop/hbase/filter/WhileMatchFilter.java (working copy) @@ -106,7 +106,7 @@ } public boolean isFamilyEssential(byte[] name) { - return filter.isFamilyEssential(name); + return FilterBase.isFamilyEssential(this.filter, name); } @Override