Example #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)");
             }
         }
     }
 }
 private CompositeReaderContext(CompositeReaderContext parent, CompositeReader reader, int ordInParent, int docbaseInParent, IList <IndexReaderContext> children, IList <AtomicReaderContext> leaves)
     : base(parent, ordInParent, docbaseInParent)
 {
     this.children = Collections.UnmodifiableList(children);
     this.leaves   = leaves;
     this.reader   = reader;
 }
Example #3
0
 private CompositeReaderContext(CompositeReaderContext parent, CompositeReader reader, int ordInParent, int docbaseInParent, IList <IndexReaderContext> children, IList <AtomicReaderContext> leaves)
     : base(parent, ordInParent, docbaseInParent)
 {
     this.children = children.AsReadOnly();
     this.leaves   = leaves;
     this.reader   = reader;
 }
 private SlowCompositeReaderWrapper(CompositeReader reader)
     : base()
 {
     @in      = reader;
     fields   = MultiFields.GetFields(@in);
     liveDocs = MultiFields.GetLiveDocs(@in);
     @in.RegisterParentReader(this);
 }
        /// <summary>
        /// This method is sugar for getting an <see cref="AtomicReader"/> from
        /// an <see cref="IndexReader"/> of any kind. If the reader is already atomic,
        /// it is returned unchanged, otherwise wrapped by this class.
        /// </summary>
        public static AtomicReader Wrap(IndexReader reader)
        {
            CompositeReader compositeReader = reader as CompositeReader;

            if (compositeReader != null)
            {
                return(new SlowCompositeReaderWrapper(compositeReader));
            }
            else
            {
                Debug.Assert(reader is AtomicReader);
                return((AtomicReader)reader);
            }
        }
            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);
                }
            }
Example #7
0
        private static IndexReader[] PrepareSubReaders(CompositeReader[] readers, CompositeReader[] storedFieldsReaders)
        {
            if (readers.Length == 0)
            {
                if (storedFieldsReaders.Length > 0)
                {
                    throw new ArgumentException("There must be at least one main reader if storedFieldsReaders are used.");
                }
                // LUCENENET: Optimized empty string array creation
                return(Arrays.Empty <IndexReader>());
            }
            else
            {
                IList <IndexReader> firstSubReaders = readers[0].GetSequentialSubReaders();

                // check compatibility:
                int    maxDoc = readers[0].MaxDoc, noSubs = firstSubReaders.Count;
                int[]  childMaxDoc = new int[noSubs];
                bool[] childAtomic = new bool[noSubs];
                for (int i = 0; i < noSubs; i++)
                {
                    IndexReader r = firstSubReaders[i];
                    childMaxDoc[i] = r.MaxDoc;
                    childAtomic[i] = r is AtomicReader;
                }
                Validate(readers, maxDoc, childMaxDoc, childAtomic);
                Validate(storedFieldsReaders, maxDoc, childMaxDoc, childAtomic);

                // hierarchically build the same subreader structure as the first CompositeReader with Parallel*Readers:
                IndexReader[] subReaders = new IndexReader[noSubs];
                for (int i = 0; i < subReaders.Length; i++)
                {
                    if (firstSubReaders[i] is AtomicReader)
                    {
                        AtomicReader[] atomicSubs = new AtomicReader[readers.Length];
                        for (int j = 0; j < readers.Length; j++)
                        {
                            atomicSubs[j] = (AtomicReader)readers[j].GetSequentialSubReaders()[i];
                        }
                        AtomicReader[] storedSubs = new AtomicReader[storedFieldsReaders.Length];
                        for (int j = 0; j < storedFieldsReaders.Length; j++)
                        {
                            storedSubs[j] = (AtomicReader)storedFieldsReaders[j].GetSequentialSubReaders()[i];
                        }
                        // We pass true for closeSubs and we prevent closing of subreaders in doClose():
                        // By this the synthetic throw-away readers used here are completely invisible to ref-counting
                        subReaders[i] = new ParallelAtomicReaderAnonymousClass(atomicSubs, storedSubs);
                    }
                    else
                    {
                        if (Debugging.AssertsEnabled)
                        {
                            Debugging.Assert(firstSubReaders[i] is CompositeReader);
                        }
                        CompositeReader[] compositeSubs = new CompositeReader[readers.Length];
                        for (int j = 0; j < readers.Length; j++)
                        {
                            compositeSubs[j] = (CompositeReader)readers[j].GetSequentialSubReaders()[i];
                        }
                        CompositeReader[] storedSubs = new CompositeReader[storedFieldsReaders.Length];
                        for (int j = 0; j < storedFieldsReaders.Length; j++)
                        {
                            storedSubs[j] = (CompositeReader)storedFieldsReaders[j].GetSequentialSubReaders()[i];
                        }
                        // We pass true for closeSubs and we prevent closing of subreaders in doClose():
                        // By this the synthetic throw-away readers used here are completely invisible to ref-counting
                        subReaders[i] = new ParallelCompositeReaderAnonymousClass(compositeSubs, storedSubs);
                    }
                }
                return(subReaders);
            }
        }
 public Builder(CompositeReader reader)
 {
     this.reader = reader;
 }
 /// <summary>
 /// Creates a <see cref="CompositeReaderContext"/> for top-level readers with parent set to <c>null</c>
 /// </summary>
 internal CompositeReaderContext(CompositeReader reader, IList <IndexReaderContext> children, IList <AtomicReaderContext> leaves)
     : this(null, reader, 0, 0, children, leaves)
 {
 }
 /// <summary>
 /// Creates a <see cref="CompositeReaderContext"/> for intermediate readers that aren't
 /// not top-level readers in the current context
 /// </summary>
 internal CompositeReaderContext(CompositeReaderContext parent, CompositeReader reader, int ordInParent, int docbaseInParent, IList <IndexReaderContext> children)
     : this(parent, reader, ordInParent, docbaseInParent, children, null)
 {
 }
 internal static CompositeReaderContext Create(CompositeReader reader)
 {
     return((new Builder(reader)).Build());
 }