Exemple #1
0
 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);
                }
            }