use crate::Candidate;
use crate::index::Indexes;
use crate::query::QuerySpec;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CandidateRequirement {
Complete,
PotentialMatches,
}
pub struct QueryPlanner<'a> {
spec: QuerySpec<'a>,
}
impl<'a> QueryPlanner<'a> {
#[must_use]
pub const fn new(spec: QuerySpec<'a>) -> Self {
Self { spec }
}
pub fn candidates(
&self,
indexes: &Indexes,
requirement: CandidateRequirement,
base: impl FnOnce() -> crate::Result<Vec<Candidate>>,
) -> crate::Result<Vec<Candidate>> {
match requirement {
CandidateRequirement::Complete => {
if indexes.is_empty() {
base()
} else {
Ok(indexes.complete_candidates())
}
}
CandidateRequirement::PotentialMatches => {
if indexes.is_empty() {
return base();
}
indexes.candidates(&self.spec).map_or_else(base, Ok)
}
}
}
}