diff --git a/src/collector/mod.rs b/src/collector/mod.rs index 4444ce6e0..b40f82921 100644 --- a/src/collector/mod.rs +++ b/src/collector/mod.rs @@ -106,7 +106,7 @@ mod tweak_score_top_collector; pub use self::tweak_score_top_collector::{ScoreSegmentTweaker, ScoreTweaker}; mod facet_collector; pub use self::facet_collector::{FacetCollector, FacetCounts}; -use crate::query::Weight; +use crate::query::{for_each_docset, for_each_scorer, Weight}; mod docset_collector; pub use self::docset_collector::DocSetCollector; @@ -173,28 +173,32 @@ pub trait Collector: Sync + Send { match (reader.alive_bitset(), self.requires_scoring()) { (Some(alive_bitset), true) => { - weight.for_each(reader, &mut |doc, score| { + let mut scorer = weight.scorer(reader, 1.0)?; + for_each_scorer(scorer.as_mut(), |doc, score| { if alive_bitset.is_alive(doc) { segment_collector.collect(doc, score); } - })?; + }); } (Some(alive_bitset), false) => { - weight.for_each_no_score(reader, &mut |doc| { + let mut docset = weight.scorer(reader, 1.0)?; + for_each_docset(docset.as_mut(), |doc| { if alive_bitset.is_alive(doc) { segment_collector.collect(doc, 0.0); } - })?; + }); } (None, true) => { - weight.for_each(reader, &mut |doc, score| { + let mut scorer = weight.scorer(reader, 1.0)?; + for_each_scorer(scorer.as_mut(), |doc, score| { segment_collector.collect(doc, score); - })?; + }); } (None, false) => { - weight.for_each_no_score(reader, &mut |doc| { + let mut docset = weight.scorer(reader, 1.0)?; + for_each_docset(docset.as_mut(), |doc| { segment_collector.collect(doc, 0.0); - })?; + }); } } diff --git a/src/query/mod.rs b/src/query/mod.rs index 152f703d6..4899a14a0 100644 --- a/src/query/mod.rs +++ b/src/query/mod.rs @@ -65,6 +65,7 @@ pub use self::union::Union; #[cfg(test)] pub use self::vec_docset::VecDocSet; pub use self::weight::Weight; +pub(crate) use self::weight::{for_each_docset, for_each_pruning_scorer, for_each_scorer}; #[cfg(test)] mod tests { diff --git a/src/query/weight.rs b/src/query/weight.rs index 19a12b39a..98adb7f81 100644 --- a/src/query/weight.rs +++ b/src/query/weight.rs @@ -5,9 +5,10 @@ use crate::{DocId, DocSet, Score, TERMINATED}; /// Iterates through all of the documents and scores matched by the DocSet /// `DocSet`. +#[inline] pub(crate) fn for_each_scorer( scorer: &mut TScorer, - callback: &mut dyn FnMut(DocId, Score), + mut callback: impl FnMut(DocId, Score), ) { let mut doc = scorer.doc(); while doc != TERMINATED { @@ -18,7 +19,8 @@ pub(crate) fn for_each_scorer( /// Iterates through all of the documents matched by the DocSet /// `DocSet`. -pub(crate) fn for_each_docset(docset: &mut T, callback: &mut dyn FnMut(DocId)) { +#[inline] +pub(crate) fn for_each_docset(docset: &mut T, mut callback: impl FnMut(DocId)) { let mut doc = docset.doc(); while doc != TERMINATED { callback(doc); @@ -36,6 +38,7 @@ pub(crate) fn for_each_docset(docset: &mut T, callback: &mut /// /// More importantly, it makes it possible for scorers to implement /// important optimization (e.g. BlockWAND for union). +#[inline] pub(crate) fn for_each_pruning_scorer( scorer: &mut TScorer, mut threshold: Score,