private SolrIndexReader[] getLeaves(int numLeaves) { // fast path for a normal multiReader if (subReaders==null || numLeaves == subReaders.length) return subReaders; SolrIndexReader[] leaves = new SolrIndexReader[numLeaves]; leafOffsets = new int[numLeaves]; int i=0; int b = 0; for (SolrIndexReader sir : subReaders) { SolrIndexReader subLeaves[] = sir.leafReaders; if (subLeaves == null) { leafOffsets[i] = b; b += sir.maxDoc(); leaves[i++] = sir; } else { for (SolrIndexReader subLeaf : subLeaves) { leafOffsets[i] = b; b += subLeaf.maxDoc(); leaves[i++] = subLeaf; } } } assert(i == numLeaves && b == maxDoc()); return leaves; }
/** Recursively wrap an IndexReader in SolrIndexReader instances. * @param in the reader to wrap * @param parent the parent, if any (null if none) * @param base the docid offset in the parent (0 if top level) */ public SolrIndexReader(IndexReader in, SolrIndexReader parent, int base) { super(in); assert(!(in instanceof SolrIndexReader)); this.parent = parent; this.base = base; IndexReader subs[] = in.getSequentialSubReaders(); if (subs != null) { subReaders = new SolrIndexReader[subs.length]; int numLeaves = subs.length; leafOffsets = new int[numLeaves]; int b=0; for (int i=0; i<subReaders.length; i++) { SolrIndexReader sir = subReaders[i] = new SolrIndexReader(subs[i], this, b); leafOffsets[i] = b; b += sir.maxDoc(); IndexReader subLeaves[] = sir.leafReaders; numLeaves += subLeaves.length - 1; // subtract 1 for the parent } leafReaders = getLeaves(numLeaves); } else { subReaders = null; leafReaders = new SolrIndexReader[]{this}; leafOffsets = zeroIntArray; } }
public NamedList getStatistics() { NamedList lst = new SimpleOrderedMap(); lst.add("searcherName", name); lst.add("caching", cachingEnabled); lst.add("numDocs", reader.numDocs()); lst.add("maxDoc", reader.maxDoc()); lst.add("reader", reader.toString()); lst.add("readerDir", reader.directory()); lst.add("indexVersion", reader.getVersion()); lst.add("openedAt", new Date(openTime)); if (registerTime!=0) lst.add("registeredAt", new Date(registerTime)); lst.add("warmupTime", warmupTime); return lst; }
protected DocList sortDocSet(DocSet set, Sort sort, int nDocs) throws IOException { // bit of a hack to tell if a set is sorted - do it better in the futute. boolean inOrder = set instanceof BitDocSet || set instanceof SortedIntDocSet; TopDocsCollector topCollector = TopFieldCollector.create(sort, nDocs, false, false, false, inOrder); DocIterator iter = set.iterator(); int base=0; int end=0; int readerIndex = -1; SolrIndexReader r=null; while(iter.hasNext()) { int doc = iter.nextDoc(); while (doc>=end) { r = reader.getLeafReaders()[++readerIndex]; base = reader.getLeafOffsets()[readerIndex]; end = base + r.maxDoc(); topCollector.setNextReader(r, base); // we should never need to set the scorer given the settings for the collector } topCollector.collect(doc-base); } TopDocs topDocs = topCollector.topDocs(0, nDocs); int nDocsReturned = topDocs.scoreDocs.length; int[] ids = new int[nDocsReturned]; for (int i=0; i<nDocsReturned; i++) { ScoreDoc scoreDoc = topDocs.scoreDocs[i]; ids[i] = scoreDoc.doc; } return new DocSlice(0,nDocsReturned,ids,null,topDocs.totalHits,0.0f); }