use nitrite::filter::Filter;
use crate::filter::VectorNearestFilter;
pub fn vector_field(field: impl Into<String>) -> VectorFluentFilter {
VectorFluentFilter { field: field.into() }
}
pub struct VectorFluentFilter {
field: String,
}
impl VectorFluentFilter {
pub fn nearest(self, query: Vec<f32>, k: usize) -> VectorNearestBuilder {
VectorNearestBuilder {
filter: VectorNearestFilter::new(self.field, query, k),
}
}
}
pub struct VectorNearestBuilder {
filter: VectorNearestFilter,
}
impl VectorNearestBuilder {
pub fn ef(mut self, ef: usize) -> Self {
self.filter = self.filter.with_ef(ef);
self
}
pub fn min_score(mut self, min_score: f32) -> Self {
self.filter = self.filter.with_min_score(min_score);
self
}
pub fn build(self) -> Filter {
Filter::new(self.filter)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn builds_filter_with_field() {
let filter = vector_field("embedding").nearest(vec![1.0, 2.0], 5).build();
let s = format!("{filter}");
assert!(s.contains("embedding"));
assert!(s.contains("nearest"));
}
#[test]
fn builder_chains_ef_and_min_score() {
let filter = vector_field("emb")
.nearest(vec![0.0, 1.0], 3)
.ef(64)
.min_score(0.5)
.build();
assert!(format!("{filter}").contains("emb"));
}
}