final KijiDataRequest.Column columnRequest,
final HBaseColumnName hbaseColumnName,
final KijiColumnFilter.Context filterContext
) throws IOException {
final KijiColumnName kijiColumnName = columnRequest.getColumnName();
// Builds an HBase filter for the specified column:
// (HBase-family = Kiji-locality-group)
// AND (HBase-qualifier = Kiji-family:qualifier / prefixed by Kiji-family:)
// AND (ColumnPaginationFilter(limit=1)) // when paging or if max-versions is 1
// AND (custom user filter)
// AND (FirstKeyOnlyFilter) // only when paging
//
// Note:
// We cannot use KeyOnlyFilter as this filter uses Filter.transform() which applies
// unconditionally on all the KeyValue in the HBase Result.
final FilterList filter = new FilterList(FilterList.Operator.MUST_PASS_ALL);
// Only let cells from the locality-group (ie. HBase family) the column belongs to, ie:
// HBase-family = Kiji-locality-group
filter.addFilter(SchemaPlatformBridge.get().createFamilyFilter(
CompareFilter.CompareOp.EQUAL,
hbaseColumnName.getFamily()));
if (kijiColumnName.isFullyQualified()) {
// Only let cells from the fully-qualified column ie.:
// HBase-qualifier = Kiji-family:qualifier
filter.addFilter(SchemaPlatformBridge.get().createQualifierFilter(
CompareFilter.CompareOp.EQUAL,
hbaseColumnName.getQualifier()));
} else {
// Only let cells from the map-type family ie.:
// HBase-qualifier starts with "Kiji-family:"
filter.addFilter(new ColumnPrefixFilter(hbaseColumnName.getQualifier()));
}
if (columnRequest.isPagingEnabled()
|| (kijiColumnName.isFullyQualified() && (columnRequest.getMaxVersions() == 1))) {
// For fully qualified columns where maxVersions = 1, we can use the
// ColumnPaginationFilter to restrict the number of versions returned to at most 1.
//
// Other columns' maxVersions will be filtered client-side in HBaseKijiRowData.
//