/// <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)); } } }
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)); }
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)); } }
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)); } }
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); } }