// The importance of this is because for Query.MAX_VALUE, we do a prefix scan so the operator should be
// CompareOp.LESS_OR_EQUAL
boolean upperBoundInclusive =
rangeCond != null && (rangeCond.isUpperBoundInclusive() || rangeCond.getToValue() == Query.MAX_VALUE);
CompareOp op = rangeCondSet && !upperBoundInclusive ? CompareOp.LESS : CompareOp.LESS_OR_EQUAL;
Filter toFilter = new RowFilter(op, new BinaryPrefixComparator(toKey));
FilterList filters = new FilterList(FilterList.Operator.MUST_PASS_ALL);
if (query.getIndexFilter() != null) {
filters.addFilter(new IndexFilterHbaseImpl(query.getIndexFilter(), definition));
}
if (rangeCondSet && !rangeCond.isLowerBoundInclusive()) {
// TODO: optimize the performance hit caused by the extra filter
// Once the greater filter on the fromKey returns true, it will remain true because
// row keys are sorted. The RowFilter will however keep doing the check again and again
// on each new row key. We need a new filter in HBase, something like the opposite of the
// WhileMatchFilter.
filters.addFilter(new RowFilter(CompareOp.GREATER, new BinaryPrefixComparator(fromKey)));
filters.addFilter(new WhileMatchFilter(toFilter));
} else {
filters.addFilter(new WhileMatchFilter(toFilter));
}