package proj.zoie.api.impl;
import java.io.IOException;
import proj.zoie.api.DocIDMapper;
import proj.zoie.api.DocIDMapperFactory;
import proj.zoie.api.ZoieMultiReader;
import proj.zoie.api.ZoieSegmentReader;
public class DefaultDocIDMapperFactory implements DocIDMapperFactory {
@Override
public DocIDMapper getDocIDMapper(final ZoieSegmentReader<?> reader) throws IOException {
// Don't use getLiveDocs of ZoieSegmentReader, since ZoieSegmentReader take into account
// pending delete doc
return new DocIDMapperImpl(reader.getUIDArray());
}
@Override
public DocIDMapper getDocIDMapper(final ZoieMultiReader<?> reader) throws IOException {
final ZoieSegmentReader<?>[] zoieSegmentReaders = reader.getSubReaders();
final DocIDMapper[] mappers = new DocIDMapper[zoieSegmentReaders.length];
for (int i = 0; i < zoieSegmentReaders.length; ++i) {
// reuse DocIDMapper since ZoieSegmentReader may be reused
if (zoieSegmentReaders[i].getDocIDMapper() != null) {
mappers[i] = zoieSegmentReaders[i].getDocIDMapper();
} else {
mappers[i] = getDocIDMapper(zoieSegmentReaders[i]);
zoieSegmentReaders[i].setDocIDMapper(mappers[i]);
}
}
return new DocIDMapper() {
@Override
public int getDocID(long uid) {
int docid;
for (int i = mappers.length - 1; i >= 0; --i) {
docid = mappers[i].getDocID(uid);
if (docid != DocIDMapper.NOT_FOUND) {
return docid + reader.getSubReaderBase(i);
}
}
return DocIDMapper.NOT_FOUND;
}
};
}
}