1use nitrite::filter::Filter;
15
16use crate::filter::VectorNearestFilter;
17
18pub fn vector_field(field: impl Into<String>) -> VectorFluentFilter {
20 VectorFluentFilter { field: field.into() }
21}
22
23pub struct VectorFluentFilter {
25 field: String,
26}
27
28impl VectorFluentFilter {
29 pub fn nearest(self, query: Vec<f32>, k: usize) -> VectorNearestBuilder {
31 VectorNearestBuilder {
32 filter: VectorNearestFilter::new(self.field, query, k),
33 }
34 }
35}
36
37pub struct VectorNearestBuilder {
39 filter: VectorNearestFilter,
40}
41
42impl VectorNearestBuilder {
43 pub fn ef(mut self, ef: usize) -> Self {
45 self.filter = self.filter.with_ef(ef);
46 self
47 }
48
49 pub fn min_score(mut self, min_score: f32) -> Self {
51 self.filter = self.filter.with_min_score(min_score);
52 self
53 }
54
55 pub fn build(self) -> Filter {
57 Filter::new(self.filter)
58 }
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64
65 #[test]
66 fn builds_filter_with_field() {
67 let filter = vector_field("embedding").nearest(vec![1.0, 2.0], 5).build();
68 let s = format!("{filter}");
69 assert!(s.contains("embedding"));
70 assert!(s.contains("nearest"));
71 }
72
73 #[test]
74 fn builder_chains_ef_and_min_score() {
75 let filter = vector_field("emb")
76 .nearest(vec![0.0, 1.0], 3)
77 .ef(64)
78 .min_score(0.5)
79 .build();
80 assert!(format!("{filter}").contains("emb"));
81 }
82}