int notAdjustedPrimeDocId = Integer.parseInt(locationId.substring(indexOf + 1));
int readerIndex = BaseCompositeReaderUtil.readerIndex(indexReader, notAdjustedPrimeDocId);
int readerBase = BaseCompositeReaderUtil.readerBase(indexReader, readerIndex);
int primeDocId = notAdjustedPrimeDocId - readerBase;
IndexReader orgReader = sequentialSubReaders.get(readerIndex);
SegmentReader sReader = getSegmentReader(orgReader);
if (sReader != null) {
SegmentReader segmentReader = (SegmentReader) sReader;
Bits liveDocs = segmentReader.getLiveDocs();
OpenBitSet bitSet = PrimeDocCache.getPrimeDocBitSet(primeDocTerm, segmentReader);
int nextPrimeDoc = bitSet.nextSetBit(primeDocId + 1);
int numberOfDocsInRow;
if (nextPrimeDoc == -1) {
numberOfDocsInRow = segmentReader.maxDoc() - primeDocId;
} else {
numberOfDocsInRow = nextPrimeDoc - primeDocId;
}
OpenBitSet docsInRowSpanToFetch = getDocsToFetch(segmentReader, selector, primeDocId, numberOfDocsInRow,
liveDocs, filter, totalRecords);
int start = selector.getStartRecord();
int maxDocsToFetch = selector.getMaxRecordsToFetch();
int startingPosition = getStartingPosition(docsInRowSpanToFetch, start);
List<Document> docs = new ArrayList<Document>();
if (startingPosition < 0) {
// nothing to fetch
return docs;
}
int totalHeap = 0;
Tracer trace2 = Trace.trace("fetching docs from index");
int cursor = 0;
try {
for (cursor = startingPosition; cursor < numberOfDocsInRow; cursor++) {
if (maxDocsToFetch <= 0) {
return docs;
}
if (totalHeap >= maxHeap) {
LOG.warn("Max heap size exceeded for this request [{0}] max [{1}] for [{2}] and selector [{3}]",
totalHeap, maxHeap, context, selector);
return docs;
}
if (docsInRowSpanToFetch.fastGet(cursor)) {
maxDocsToFetch--;
int docID = primeDocId + cursor;
segmentReader.document(docID, fieldSelector);
Document document = fieldSelector.getDocument();
if (highlighter.shouldHighlight()) {
docs.add(highlighter.highlight(docID, document, segmentReader));
} else {
docs.add(document);