Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
        /// <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);
            }
        }
Esempio n. 3
0
        }                                                                                    // 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++
                    });
                }
            }
        }
Esempio n. 4
0
        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);
                }
            }
        }