termDocs = reader.termPositions();
payload = new byte[1];
} else {
termDocs = reader.termDocs();
}
TermEnum termEnum = reader.terms(new Term(field, prefix));
char[] tmp = new char[16];
try {
if (termEnum.term() == null) {
throw new RuntimeException("no terms in field " + field);
}
do {
Term term = termEnum.term();
if (term.field() != field || !term.text().startsWith(prefix)) {
break;
}
// make sure term is compacted
String text = term.text();
int len = text.length() - prefix.length();
if (tmp.length < len) {
// grow tmp
tmp = new char[len];
}
text.getChars(prefix.length(), text.length(), tmp, 0);
String value = new String(tmp, 0, len);
termDocs.seek(termEnum);
while (termDocs.next()) {
type = PropertyType.UNDEFINED;
if (hasPayloads) {
TermPositions termPos = (TermPositions) termDocs;
termPos.nextPosition();
if (termPos.isPayloadAvailable()) {
payload = termPos.getPayload(payload, 0);
type = PropertyMetaData.fromByteArray(payload).getPropertyType();
}
}
setValues++;
retArray[termDocs.doc()] = getValue(value, type);
}
} while (termEnum.next());
} finally {
termDocs.close();
termEnum.close();
}
}
ValueIndex value = new ValueIndex(retArray, setValues);
store(reader, field, prefix, comparator, value);
return value;