public Query rewrite(IndexReader reader) throws IOException {
BooleanQuery query = new BooleanQuery(true);
String testField = getField();
if (collator != null) {
TermEnum enumerator = reader.terms(new Term(testField, ""));
String lowerTermText = lowerTerm != null ? lowerTerm.text() : null;
String upperTermText = upperTerm != null ? upperTerm.text() : null;
try {
do {
Term term = enumerator.term();
if (term != null && term.field() == testField) { // interned comparison
if ((lowerTermText == null
|| (inclusive ? collator.compare(term.text(), lowerTermText) >= 0
: collator.compare(term.text(), lowerTermText) > 0))
&& (upperTermText == null
|| (inclusive ? collator.compare(term.text(), upperTermText) < = 0
: collator.compare(term.text(), upperTermText) < 0))) {
addTermToQuery(term, query);
}
}
}
while (enumerator.next());
}
finally {
enumerator.close();
}
}
else { // collator is null
TermEnum enumerator = reader.terms(lowerTerm);
try {
boolean checkLower = false;
if (!inclusive) // make adjustments to set to exclusive
checkLower = true;
do {
Term term = enumerator.term();
if (term != null && term.field() == testField) { // interned comparison
if (!checkLower || term.text().compareTo(lowerTerm.text()) > 0) {
checkLower = false;
if (upperTerm != null) {
int compare = upperTerm.text().compareTo(term.text());
/* if beyond the upper term, or is exclusive and
* this is equal to the upper term, break out */
if ((compare < 0) || (!inclusive && compare == 0))
break;
}
addTermToQuery(term, query); // Found a match
}
}
else {
break;
}
}
while (enumerator.next());
}
finally {
enumerator.close();
}
}
return query;
}
|