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)"); } } } }
public virtual void TestCloseInnerReader() { Directory dir1 = GetDir1(Random); CompositeReader ir1 = DirectoryReader.Open(dir1); Assert.AreEqual(1, ir1.GetSequentialSubReaders()[0].RefCount); // with overlapping ParallelCompositeReader pr = new ParallelCompositeReader(true, new CompositeReader[] { ir1 }, new CompositeReader[] { ir1 }); IndexReader psub = pr.GetSequentialSubReaders()[0]; Assert.AreEqual(1, psub.RefCount); ir1.Dispose(); Assert.AreEqual(1, psub.RefCount, "refCount of synthetic subreader should be unchanged"); try { psub.Document(0); Assert.Fail("Subreader should be already closed because inner reader was closed!"); } #pragma warning disable 168 catch (ObjectDisposedException e) #pragma warning restore 168 { // pass } try { pr.Document(0); Assert.Fail("ParallelCompositeReader should be already closed because inner reader was closed!"); } #pragma warning disable 168 catch (ObjectDisposedException e) #pragma warning restore 168 { // pass } // noop: pr.Dispose(); Assert.AreEqual(0, psub.RefCount); dir1.Dispose(); }
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); } }