/// <summary> /// The terms array must be newly created <see cref="TermsEnum"/>, ie /// <see cref="TermsEnum.MoveNext()"/> has not yet been called. /// </summary> public TermsEnum Reset(TermsEnumIndex[] termsEnumsIndex) { if (Debugging.AssertsEnabled) { Debugging.Assert(termsEnumsIndex.Length <= top.Length); } numSubs = 0; numTop = 0; termComp = null; queue.Clear(); for (int i = 0; i < termsEnumsIndex.Length; i++) { TermsEnumIndex termsEnumIndex = termsEnumsIndex[i]; if (Debugging.AssertsEnabled) { Debugging.Assert(termsEnumIndex != null); } // init our term comp if (termComp == null) { queue.termComp = termComp = termsEnumIndex.TermsEnum.Comparer; } else { // We cannot merge sub-readers that have // different TermComps IComparer <BytesRef> subTermComp = termsEnumIndex.TermsEnum.Comparer; if (subTermComp != null && !subTermComp.Equals(termComp)) { throw new InvalidOperationException("sub-readers have different BytesRef.Comparers: " + subTermComp + " vs " + termComp + "; cannot merge"); } } BytesRef term; if (termsEnumIndex.TermsEnum.MoveNext()) { term = termsEnumIndex.TermsEnum.Term; TermsEnumWithSlice entry = subs[termsEnumIndex.SubIndex]; entry.Reset(termsEnumIndex.TermsEnum, term); queue.Add(entry); currentSubs[numSubs++] = entry; } else { // field has no terms } } if (queue.Count == 0) { return(TermsEnum.EMPTY); } else { return(this); } }
/// <summary> /// The terms array must be newly created TermsEnum, ie /// <seealso cref="TermsEnum#next"/> has not yet been called. /// </summary> public TermsEnum Reset(TermsEnumIndex[] termsEnumsIndex) { Debug.Assert(termsEnumsIndex.Length <= Top.Length); NumSubs = 0; NumTop = 0; TermComp = null; Queue.Clear(); for (int i = 0; i < termsEnumsIndex.Length; i++) { TermsEnumIndex termsEnumIndex = termsEnumsIndex[i]; Debug.Assert(termsEnumIndex != null); // init our term comp if (TermComp == null) { Queue.TermComp = TermComp = termsEnumIndex.TermsEnum.Comparator; } else { // We cannot merge sub-readers that have // different TermComps IComparer <BytesRef> subTermComp = termsEnumIndex.TermsEnum.Comparator; if (subTermComp != null && !subTermComp.Equals(TermComp)) { throw new InvalidOperationException("sub-readers have different BytesRef.Comparators: " + subTermComp + " vs " + TermComp + "; cannot merge"); } } BytesRef term = termsEnumIndex.TermsEnum.Next(); if (term != null) { TermsEnumWithSlice entry = Subs[termsEnumIndex.SubIndex]; entry.Reset(termsEnumIndex.TermsEnum, term); Queue.Add(entry); CurrentSubs[NumSubs++] = entry; } else { // field has no terms } } if (Queue.Size() == 0) { return(TermsEnum.EMPTY); } else { return(this); } }
} // LUCENENET specific - added overload for better compatibity public MergedEnumerator(bool removeDuplicates, IList <IEnumerator <T> > enumerators) // LUCENENET specific - added overload for better compatibity { if (enumerators is null) { throw new ArgumentNullException(nameof(enumerators)); // LUCENENET specific - added guard clause } this.removeDuplicates = removeDuplicates; queue = new TermMergeQueue <T>(enumerators.Count); top = new SubEnumerator <T> [enumerators.Count]; int index = 0; foreach (IEnumerator <T> iter in enumerators) { // If hasNext if (iter.MoveNext()) { queue.Add(new SubEnumerator <T> { Current = iter.Current, Enumerator = iter, Index = index++ }); } } }
public MergedIterator(bool removeDuplicates, params IEnumerator <T>[] iterators) { this.removeDuplicates = removeDuplicates; queue = new TermMergeQueue <T>(iterators.Length); top = new SubIterator <T> [iterators.Length]; int index = 0; foreach (IEnumerator <T> iter in iterators) { // If hasNext if (iter.MoveNext()) { SubIterator <T> sub = new SubIterator <T>(); sub.Current = iter.Current; sub.Iterator = iter; sub.Index = index++; queue.Add(sub); } } }