pub mod ast;
pub mod boolean;
pub mod boost;
pub mod boosting;
pub mod constant_score;
pub mod convert;
pub mod dis_max;
pub mod exists;
pub mod function_score;
pub mod fuzzy;
pub mod match_query;
pub mod multi_term;
pub mod nested;
pub mod parser;
pub mod phrase;
pub mod prefix;
pub mod range;
pub mod regex_automaton;
pub mod regexp;
pub mod script_score;
pub mod span;
pub mod term;
pub mod wildcard;
use crate::core::{Result, ScoreMode, Scorer};
use crate::search::searcher::Searcher;
use crate::segment::reader::SegmentReader;
pub(crate) trait Query: Send + Sync {
fn bind(&self, searcher: &Searcher, score_mode: ScoreMode) -> Result<Box<dyn BoundQuery>>;
}
pub(crate) trait BoundQuery: Send + Sync {
fn scorer_supplier(&self, reader: &SegmentReader) -> Result<Option<Box<dyn ScorerSupplier>>>;
fn is_match_all(&self) -> bool {
false
}
fn bulk_score(
&self,
_reader: &SegmentReader,
_collector: &mut crate::search::collector::TopDocsCollector,
_segment_id: crate::core::SegmentId,
) -> Result<Option<u64>> {
Ok(None)
}
fn explain(
&self,
reader: &SegmentReader,
doc: crate::core::DocId,
) -> Result<crate::search::Explanation> {
let supplier = match self.scorer_supplier(reader)? {
Some(s) => s,
None => {
return Ok(crate::search::Explanation::no_match(
"no matching docs in segment".into(),
));
}
};
let mut scorer = supplier.scorer()?;
let found = scorer.advance(doc);
if found != doc {
return Ok(crate::search::Explanation::no_match(format!(
"doc {} not matched",
doc.as_u32()
)));
}
let score = scorer.score();
Ok(crate::search::Explanation::leaf(
score,
format!("score(doc={})", doc.as_u32()),
))
}
}
pub trait ScorerSupplier: Send {
fn cost(&self) -> u64;
fn scorer(self: Box<Self>) -> Result<Box<dyn Scorer>>;
}
pub(crate) trait SpanQuery: Query {
fn bind_span(
&self,
searcher: &Searcher,
score_mode: ScoreMode,
) -> Result<Box<dyn BoundSpanQuery>>;
}
pub(crate) trait BoundSpanQuery: BoundQuery {
fn span_scorer_supplier(
&self,
reader: &SegmentReader,
max_end: u32,
) -> Result<Option<Box<dyn ScorerSupplier>>>;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn query_is_object_safe() {
fn _takes_query(_q: &dyn Query) {}
}
#[test]
fn bound_query_is_object_safe() {
fn _takes_bound_query(_w: &dyn BoundQuery) {}
}
#[test]
fn scorer_supplier_is_object_safe() {
fn _takes_ss(_ss: Box<dyn ScorerSupplier>) {}
}
}