예제 #1
0
            public override bool SkipTo(int target)
            {
                if (moreInclude) // skip include
                {
                    moreInclude = includeSpans.SkipTo(target);
                }

                if (!moreInclude)
                {
                    return(false);
                }

                if (moreExclude && includeSpans.Doc > excludeSpans.Doc) // skip exclude
                {
                    moreExclude = excludeSpans.SkipTo(includeSpans.Doc);
                }

                while (moreExclude && includeSpans.Doc == excludeSpans.Doc && excludeSpans.End <= includeSpans.Start - outerInstance.pre) // while exclude is before
                {
                    moreExclude = excludeSpans.MoveNext();                                                                                // increment exclude
                }

                if (!moreExclude || includeSpans.Doc != excludeSpans.Doc || includeSpans.End + outerInstance.post <= excludeSpans.Start) // if no intersection
                {
                    return(true);                                                                                                        // we found a match
                }

                return(MoveNext()); // scan to next match
            }
예제 #2
0
            public override bool SkipTo(int target)
            {
                if (queue == null)
                {
                    return(InitSpanQueue(target));
                }

                bool skipCalled = false;

                while (queue.Count != 0 && Top.Doc < target)
                {
                    if (Top.SkipTo(target))
                    {
                        queue.UpdateTop();
                    }
                    else
                    {
                        queue.Pop();
                    }
                    skipCalled = true;
                }

                if (skipCalled)
                {
                    return(queue.Count != 0);
                }
                return(MoveNext());
            }
예제 #3
0
 private bool InitSpanQueue(int target)
 {
     queue = new SpanQueue(outerInstance, outerInstance.clauses.Count);
     foreach (var clause in outerInstance.clauses)
     {
         Spans spans = clause.GetSpans(context, acceptDocs, termContexts);
         cost += spans.GetCost();
         if (((target == -1) && spans.Next()) || ((target != -1) && spans.SkipTo(target)))
         {
             queue.Add(spans);
         }
     }
     return(queue.Count != 0);
 }
예제 #4
0
 public override int Advance(int target)
 {
     if (!m_more)
     {
         return(m_doc = NO_MORE_DOCS);
     }
     if (m_spans.Doc < target) // setFreqCurrentDoc() leaves spans.doc() ahead
     {
         m_more = m_spans.SkipTo(target);
     }
     if (!SetFreqCurrentDoc())
     {
         m_doc = NO_MORE_DOCS;
     }
     return(m_doc);
 }
예제 #5
0
 public override bool SkipTo(int target)
 {
     return(Adjust(spans.SkipTo(target)));
 }