use crate::error::SearchError;
use crate::vector::{MAX_ROUTING_PROBES as VECTOR_MAX_ROUTING_PROBES, ROUTING_PROBES};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum FilterSearchPolicy {
Traversal,
#[default]
ExactFallback,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SearchPolicy {
pub expansion: usize,
pub routing_probes: usize,
}
impl SearchPolicy {
pub const MAX_ROUTING_PROBES: usize = VECTOR_MAX_ROUTING_PROBES;
#[must_use]
pub const fn new(expansion: usize) -> Self {
Self {
expansion,
routing_probes: ROUTING_PROBES,
}
}
#[must_use]
pub const fn high_recall(expansion: usize) -> Self {
Self {
expansion,
routing_probes: 12,
}
}
#[must_use]
pub const fn with_routing_probes(mut self, routing_probes: usize) -> Self {
self.routing_probes = routing_probes;
self
}
pub(crate) fn validate(self) -> Result<Self, SearchError> {
if self.expansion == 0 {
return Err(SearchError::InvalidConfig(
"search policy expansion must be greater than zero",
));
}
if self.routing_probes == 0 || self.routing_probes > Self::MAX_ROUTING_PROBES {
return Err(SearchError::InvalidConfig(
"search policy routing_probes must be between 1 and 470",
));
}
Ok(self)
}
}