if (rec.token >= prefix.get(i)) {
if (rec.token > prefix.get(i)) return null;
if (rec.tokenTable==null) {
Bytes pre = new SlicedBytes(prefix, 0, i+1);
pre = new ArrayBytes(pre.getBytes()); // optimize
RangeQueryNode ret = new BlueSteelPostingListQuery(pre, rec.segmentPush);
return FilteredRangeQueryNode.make(ret, prefix, term1, term2, isExclusive1, isExclusive2);
}
table = rec.tokenTable;
bos.write(rec.token);
break;
}
}
}
if (bos.size() > 0) {
prefix = new CompoundBytes(prefix, new ArrayBytes(bos.toByteArray())).flatten();
}
if (table == null) return null;
int top,bottom;
if (term1 == null) {
top = 0;
isExclusive1 = false;
} else if (term1.getLength() > 0) {
top = term1.get(0);
} else {
top = 0;
}
if (term2 == null) {
bottom = 255;
isExclusive2 = false;
} else if (term2.getLength() > 0) {
bottom = term2.get(0);
} else { //specified, but is empty (must be a very narrow range!)
bottom = 0;
}
Iterator<TokenRec> itr = table.getTokenRecs().iterator();
TokenRec rec;
do {
if (! itr.hasNext()) return null;
rec = itr.next();
} while((0xFF & rec.token) < top);
if (top==bottom) {
RangeQueryNode q = new BlueSteelPostingListQuery(prefix, rec.token, rec.segmentPush);
return FilteredRangeQueryNode.make(q, null, term1, term2, isExclusive1, isExclusive2);
}
List<RangeQueryNode> queries = new ArrayList<RangeQueryNode>();
if (rec.token == top) {
RangeQueryNode q = new BlueSteelPostingListQuery(prefix, rec.token, rec.segmentPush);
q = FilteredRangeQueryNode.make(q, null, term1, null, isExclusive1, false);
queries.add(q);
}
while(rec.token < bottom) {
queries.add(new BlueSteelPostingListQuery(prefix, rec.token, rec.segmentPush));
if (! itr.hasNext()) break;
rec = itr.next();
}
if (rec.token == bottom) {
RangeQueryNode q = new BlueSteelPostingListQuery(prefix, rec.token, rec.segmentPush);
q = FilteredRangeQueryNode.make(q, null, null, term2, false, isExclusive2);
queries.add(q);
}
return new OrderedOrQueryNode(queries, prefix, term1, term2, isExclusive1, isExclusive2);
}