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; }
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); } }
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()); }