예제 #1
0
 /// <summary>
 /// Provide the <see cref="DocIdSet"/> to be cached, using the <see cref="DocIdSet"/> provided
 /// by the wrapped Filter.
 /// <para/>This implementation returns the given <see cref="DocIdSet"/>,
 /// if <see cref="DocIdSet.IsCacheable"/> returns <c>true</c>, else it calls
 /// <see cref="CacheImpl(DocIdSetIterator, AtomicReader)"/>
 /// <para/>Note: this method returns <see cref="EMPTY_DOCIDSET"/> if the given <paramref name="docIdSet"/>
 /// is <c>null</c> or if <see cref="DocIdSet.GetIterator()"/> return <c>null</c>. The empty
 /// instance is use as a placeholder in the cache instead of the <c>null</c> value.
 /// </summary>
 protected virtual DocIdSet DocIdSetToCache(DocIdSet docIdSet, AtomicReader reader)
 {
     if (docIdSet == null)
     {
         // this is better than returning null, as the nonnull result can be cached
         return(EMPTY_DOCIDSET);
     }
     else if (docIdSet.IsCacheable)
     {
         return(docIdSet);
     }
     else
     {
         DocIdSetIterator it = docIdSet.GetIterator();
         // null is allowed to be returned by iterator(),
         // in this case we wrap with the sentinel set,
         // which is cacheable.
         if (it == null)
         {
             return(EMPTY_DOCIDSET);
         }
         else
         {
             return(CacheImpl(it, reader));
         }
     }
 }
예제 #2
0
            public override Scorer GetScorer(AtomicReaderContext context, IBits acceptDocs)
            {
                DocIdSetIterator disi;

                if (outerInstance.m_filter != null)
                {
                    Debug.Assert(outerInstance.m_query == null);
                    DocIdSet dis = outerInstance.m_filter.GetDocIdSet(context, acceptDocs);
                    if (dis == null)
                    {
                        return(null);
                    }
                    disi = dis.GetIterator();
                }
                else
                {
                    Debug.Assert(outerInstance.m_query != null && innerWeight != null);
                    disi = innerWeight.GetScorer(context, acceptDocs);
                }

                if (disi == null)
                {
                    return(null);
                }
                return(new ConstantScorer(outerInstance, disi, this, queryWeight));
            }
예제 #3
0
            public override Scorer FilteredScorer(AtomicReaderContext context, Weight weight, DocIdSet docIdSet)
            {
                DocIdSetIterator filterIter = docIdSet.GetIterator();

                if (filterIter == null)
                {
                    // this means the filter does not accept any documents.
                    return(null);
                }
                // we pass null as acceptDocs, as our filter has already respected acceptDocs, no need to do twice
                Scorer scorer = weight.GetScorer(context, null);

                if (scorer == null)
                {
                    return(null);
                }

                if (scorerFirst)
                {
                    return(new LeapFrogScorer(weight, scorer, filterIter, scorer));
                }
                else
                {
                    return(new LeapFrogScorer(weight, filterIter, scorer, scorer));
                }
            }
예제 #4
0
            public override Scorer FilteredScorer(AtomicReaderContext context, Weight weight, DocIdSet docIdSet)
            {
                DocIdSetIterator filterIter = docIdSet.GetIterator();

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

                int firstFilterDoc = filterIter.NextDoc();

                if (firstFilterDoc == DocIdSetIterator.NO_MORE_DOCS)
                {
                    return(null);
                }

                IBits filterAcceptDocs = docIdSet.Bits;
                // force if RA is requested
                bool useRandomAccess = filterAcceptDocs != null && UseRandomAccess(filterAcceptDocs, firstFilterDoc);

                if (useRandomAccess)
                {
                    // if we are using random access, we return the inner scorer, just with other acceptDocs
                    return(weight.GetScorer(context, filterAcceptDocs));
                }
                else
                {
                    if (Debugging.AssertsEnabled)
                    {
                        Debugging.Assert(firstFilterDoc > -1);
                    }
                    // we are gonna advance() this scorer, so we set inorder=true/toplevel=false
                    // we pass null as acceptDocs, as our filter has already respected acceptDocs, no need to do twice
                    Scorer scorer = weight.GetScorer(context, null);
                    // TODO once we have way to figure out if we use RA or LeapFrog we can remove this scorer
                    return((scorer == null) ? null : new PrimaryAdvancedLeapFrogScorer(weight, firstFilterDoc, filterIter, scorer));
                }
            }
예제 #5
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);
                }
            }