private static void Validate(CompositeReader[] readers, int maxDoc, int[] childMaxDoc, bool[] childAtomic) { for (int i = 0; i < readers.Length; i++) { CompositeReader reader = readers[i]; IList <IndexReader> subs = reader.GetSequentialSubReaders(); if (reader.MaxDoc != maxDoc) { throw new ArgumentException("All readers must have same MaxDoc: " + maxDoc + "!=" + reader.MaxDoc); } int noSubs = subs.Count; if (noSubs != childMaxDoc.Length) { throw new ArgumentException("All readers must have same number of subReaders"); } for (int subIDX = 0; subIDX < noSubs; subIDX++) { IndexReader r = subs[subIDX]; if (r.MaxDoc != childMaxDoc[subIDX]) { throw new ArgumentException("All readers must have same corresponding subReader maxDoc"); } if (!(childAtomic[subIDX] ? (r is AtomicReader) : (r is CompositeReader))) { throw new ArgumentException("All readers must have same corresponding subReader types (atomic or composite)"); } } } }
internal IndexReaderContext Build(CompositeReaderContext parent, IndexReader reader, int ord, int docBase) { var ar = reader as AtomicReader; if (ar != null) { var atomic = new AtomicReaderContext(parent, ar, ord, docBase, leaves.Count, leafDocBase); leaves.Add(atomic); leafDocBase += reader.MaxDoc; return(atomic); } else { CompositeReader cr = (CompositeReader)reader; var sequentialSubReaders = cr.GetSequentialSubReaders(); var children = new IndexReaderContext[sequentialSubReaders.Count]; CompositeReaderContext newParent; if (parent == null) { newParent = new CompositeReaderContext(cr, children, leaves); } else { newParent = new CompositeReaderContext(parent, cr, ord, docBase, children); } int newDocBase = 0; for (int i = 0, c = sequentialSubReaders.Count; i < c; i++) { IndexReader r = sequentialSubReaders[i]; children[i] = Build(newParent, r, i, newDocBase); newDocBase += r.MaxDoc; } if (Debugging.AssertsEnabled) { Debugging.Assert(newDocBase == cr.MaxDoc); } return(newParent); } }