Advance() public abstract method

Advances to the first beyond the current whose document number is greater than or equal to target, and returns the document number itself. Exhausts the iterator and returns #NO_MORE_DOCS if target is greater than the highest document number in the set.

The behavior of this method is undefined when called with target <= current, or after the iterator has exhausted. Both cases may result in unpredicted behavior.

When target > current it behaves as if written:

 int advance(int target) { int doc; while ((doc = nextDoc()) < target) { } return doc; } 
Some implementations are considerably more efficient than that.

NOTE: this method may be called with #NO_MORE_DOCS for efficiency by some Scorers. If your implementation cannot efficiently determine that it should exhaust, it is recommended that you check for that value in each call to this method.

@since 2.9

public abstract Advance ( int target ) : int
target int
return int
Beispiel #1
0
        /// <summary>Advance to non excluded doc.
        /// <br/>On entry:
        /// <ul>
        /// <li>reqScorer != null, </li>
        /// <li>exclScorer != null, </li>
        /// <li>reqScorer was advanced once via next() or skipTo()
        /// and reqScorer.doc() may still be excluded.</li>
        /// </ul>
        /// Advances reqScorer a non excluded required doc, if any.
        /// </summary>
        /// <returns> true iff there is a non excluded required doc.
        /// </returns>
        private int ToNonExcluded()
        {
            int exclDoc = exclDisi.DocID();
            int reqDoc  = reqScorer.DocID();            // may be excluded

            do
            {
                if (reqDoc < exclDoc)
                {
                    return(reqDoc);                    // reqScorer advanced to before exclScorer, ie. not excluded
                }
                else if (reqDoc > exclDoc)
                {
                    exclDoc = exclDisi.Advance(reqDoc);
                    if (exclDoc == NO_MORE_DOCS)
                    {
                        exclDisi = null;                         // exhausted, no more exclusions
                        return(reqDoc);
                    }
                    if (exclDoc > reqDoc)
                    {
                        return(reqDoc);                        // not excluded
                    }
                }
            }while ((reqDoc = reqScorer.NextDoc()) != NO_MORE_DOCS);
            reqScorer = null;             // exhausted, nothing left
            return(NO_MORE_DOCS);
        }
        public virtual void  AssertContainsDocId(System.String msg, DocIdSet docIdSet, int docId)
        {
            DocIdSetIterator it = docIdSet.Iterator(null);

            Assert.IsTrue(it.Advance(docId, null) != DocIdSetIterator.NO_MORE_DOCS, msg);
            Assert.IsTrue(it.DocID() == docId, msg);
        }
Beispiel #3
0
            public override Explanation Explain(IndexReader ir, int i)
            {
                Explanation inner = weight.Explain(ir, i);

                if (Enclosing_Instance.GetBoost() != 1)
                {
                    Explanation preBoost = inner;
                    inner = new Explanation(inner.GetValue() * Enclosing_Instance.GetBoost(), "product of:");
                    inner.AddDetail(new Explanation(Enclosing_Instance.GetBoost(), "boost"));
                    inner.AddDetail(preBoost);
                }
                Filter           f                = Enclosing_Instance.filter;
                DocIdSet         docIdSet         = f.GetDocIdSet(ir);
                DocIdSetIterator docIdSetIterator = docIdSet == null?DocIdSet.EMPTY_DOCIDSET.Iterator() : docIdSet.Iterator();

                if (docIdSetIterator == null)
                {
                    docIdSetIterator = DocIdSet.EMPTY_DOCIDSET.Iterator();
                }
                if (docIdSetIterator.Advance(i) == i)
                {
                    return(inner);
                }
                else
                {
                    Explanation result = new Explanation(0.0f, "failure to match filter: " + f.ToString());
                    result.AddDetail(inner);
                    return(result);
                }
            }
Beispiel #4
0
        private void  SearchWithFilter(IndexReader reader, Weight weight, Filter filter, Collector collector, IState state)
        {
            System.Diagnostics.Debug.Assert(filter != null);

            Scorer scorer = weight.Scorer(reader, true, false, state);

            if (scorer == null)
            {
                return;
            }

            int docID = scorer.DocID();

            System.Diagnostics.Debug.Assert(docID == -1 || docID == DocIdSetIterator.NO_MORE_DOCS);

            // CHECKME: use ConjunctionScorer here?
            DocIdSet filterDocIdSet = filter.GetDocIdSet(reader, state);

            if (filterDocIdSet == null)
            {
                // this means the filter does not accept any documents.
                return;
            }

            DocIdSetIterator filterIter = filterDocIdSet.Iterator(state);

            if (filterIter == null)
            {
                // this means the filter does not accept any documents.
                return;
            }
            int filterDoc = filterIter.NextDoc(state);
            int scorerDoc = scorer.Advance(filterDoc, state);

            collector.SetScorer(scorer);
            while (true)
            {
                if (scorerDoc == filterDoc)
                {
                    // Check if scorer has exhausted, only before collecting.
                    if (scorerDoc == DocIdSetIterator.NO_MORE_DOCS)
                    {
                        break;
                    }
                    collector.Collect(scorerDoc, state);
                    filterDoc = filterIter.NextDoc(state);
                    scorerDoc = scorer.Advance(filterDoc, state);
                }
                else if (scorerDoc > filterDoc)
                {
                    filterDoc = filterIter.Advance(scorerDoc, state);
                }
                else
                {
                    scorerDoc = scorer.Advance(filterDoc, state);
                }
            }
        }
Beispiel #5
0
 private int AdvanceToNextCommonDoc()
 {
     for (; ;)
     {
         if (m_secondaryDoc < m_primaryDoc)
         {
             m_secondaryDoc = secondary.Advance(m_primaryDoc);
         }
         else if (m_secondaryDoc == m_primaryDoc)
         {
             return(m_primaryDoc);
         }
         else
         {
             m_primaryDoc = primary.Advance(m_secondaryDoc);
         }
     }
 }
Beispiel #6
0
 internal int AdvanceToNextCommonDoc()
 {
     for (; ;)
     {
         if (SecondaryDoc < PrimaryDoc)
         {
             SecondaryDoc = Secondary.Advance(PrimaryDoc);
         }
         else if (SecondaryDoc == PrimaryDoc)
         {
             return(PrimaryDoc);
         }
         else
         {
             PrimaryDoc = Primary.Advance(SecondaryDoc);
         }
     }
 }
Beispiel #7
0
        public virtual void  TestFilteredDocIdSet()
        {
            int      maxdoc   = 10;
            DocIdSet innerSet = new AnonymousClassDocIdSet_Renamed_Class(maxdoc, this);


            DocIdSet filteredSet = new AnonymousClassFilteredDocIdSet(this, innerSet);

            DocIdSetIterator iter = filteredSet.Iterator(null);

            System.Collections.ArrayList list = new System.Collections.ArrayList();
            int doc = iter.Advance(3, null);

            if (doc != DocIdSetIterator.NO_MORE_DOCS)
            {
                list.Add((System.Int32)doc);
                while ((doc = iter.NextDoc(null)) != DocIdSetIterator.NO_MORE_DOCS)
                {
                    list.Add((System.Int32)doc);
                }
            }

            int[] docs = new int[list.Count];
            int   c    = 0;

            System.Collections.IEnumerator intIter = list.GetEnumerator();
            while (intIter.MoveNext())
            {
                docs[c++] = ((System.Int32)intIter.Current);
            }
            int[] answer = new int[] { 4, 6, 8 };
            bool  same   = CollectionsHelper.Equals(answer, docs);

            if (!same)
            {
                System.Console.Out.WriteLine("answer: " + _TestUtil.ArrayToString(answer));
                System.Console.Out.WriteLine("gotten: " + _TestUtil.ArrayToString(docs));
                Assert.Fail();
            }
        }
Beispiel #8
0
            public override Explanation Explain(AtomicReaderContext ir, int i)
            {
                Explanation      inner            = weight.Explain(ir, i);
                Filter           f                = outerInstance.filter;
                DocIdSet         docIdSet         = f.GetDocIdSet(ir, ir.AtomicReader.LiveDocs);
                DocIdSetIterator docIdSetIterator = docIdSet == null?DocIdSetIterator.GetEmpty() : docIdSet.GetIterator();

                if (docIdSetIterator == null)
                {
                    docIdSetIterator = DocIdSetIterator.GetEmpty();
                }
                if (docIdSetIterator.Advance(i) == i)
                {
                    return(inner);
                }
                else
                {
                    Explanation result = new Explanation(0.0f, "failure to match filter: " + f.ToString());
                    result.AddDetail(inner);
                    return(result);
                }
            }
Beispiel #9
0
        public virtual void TestFilteredDocIdSet()
        {
            const int maxdoc   = 10;
            DocIdSet  innerSet = new DocIdSetAnonymousClass(this, maxdoc);

            DocIdSet filteredSet = new FilteredDocIdSetAnonymousClass(this, innerSet);

            DocIdSetIterator iter = filteredSet.GetIterator();
            IList <int>      list = new JCG.List <int>();
            int doc = iter.Advance(3);

            if (doc != DocIdSetIterator.NO_MORE_DOCS)
            {
                list.Add(Convert.ToInt32(doc));
                while ((doc = iter.NextDoc()) != DocIdSetIterator.NO_MORE_DOCS)
                {
                    list.Add(Convert.ToInt32(doc));
                }
            }

            int[] docs = new int[list.Count];
            int   c    = 0;

            using IEnumerator <int> intIter = list.GetEnumerator();
            while (intIter.MoveNext())
            {
                docs[c++] = intIter.Current;
            }
            int[] answer = new int[] { 4, 6, 8 };
            bool  same   = Arrays.Equals(answer, docs);

            if (!same)
            {
                Console.WriteLine("answer: " + Arrays.ToString(answer));
                Console.WriteLine("gotten: " + Arrays.ToString(docs));
                Assert.Fail();
            }
        }
 public override int Advance(int target)
 {
     doc = m_innerIter.Advance(target);
     if (doc != NO_MORE_DOCS)
     {
         if (Match(doc))
         {
             return(doc);
         }
         else
         {
             while ((doc = m_innerIter.NextDoc()) != NO_MORE_DOCS)
             {
                 if (Match(doc))
                 {
                     return(doc);
                 }
             }
             return(doc);
         }
     }
     return(doc);
 }
 public override int Advance(int target, IState state)
 {
     doc = internalInnerIter.Advance(target, state);
     if (doc != NO_MORE_DOCS)
     {
         if (Match(doc))
         {
             return(doc);
         }
         else
         {
             while ((doc = internalInnerIter.NextDoc(state)) != NO_MORE_DOCS)
             {
                 if (Match(doc))
                 {
                     return(doc);
                 }
             }
             return(doc);
         }
     }
     return(doc);
 }
 public override int Advance(int target)
 {
     return(docIdSetIterator.Advance(target));
 }
Beispiel #13
0
 public override int Advance(int target, IState state)
 {
     return(docIdSetIterator.Advance(target, state));
 }
Beispiel #14
0
 public override bool SkipTo(int target)
 {
     return(docIdSetIterator.Advance(target) != NO_MORE_DOCS);
 }