storage_kit/core/query/vector.rs
1use serde::{Deserialize, Serialize};
2
3use crate::core::ApplyDefaultLocator;
4use crate::{DenseVector, StorageLocator};
5
6use super::{ScopedQuery, VectorQueryOptions};
7/// Request to perform nearest-neighbor vector search.
8///
9/// # Examples
10///
11/// ```
12/// use storage_kit::database::StorageLocator;
13/// use storage_kit::database::query::{DenseVector, NearestRequest};
14/// let mut request = NearestRequest::new(
15/// StorageLocator::new("documents"), DenseVector::F32(vec![0.1, 0.2, 0.3]),
16/// );
17/// request.query.options.vector_field = Some("embedding".into());
18/// assert_eq!(request.query.options.vector_field.as_deref(), Some("embedding"));
19/// ```
20#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
21pub struct NearestRequest {
22 /// Shared query scope and vector options.
23 pub query: ScopedQuery<VectorQueryOptions>,
24 /// Dense vector used as the search seed.
25 pub vector: DenseVector,
26}
27
28impl ApplyDefaultLocator for NearestRequest {
29 fn apply_default_locator(mut self, default: &StorageLocator) -> Self {
30 self.query = self.query.apply_default_locator(default);
31 self
32 }
33}
34
35impl NearestRequest {
36 /// Creates a nearest-neighbor request with default vector parameters.
37 ///
38 /// See [`NearestRequest`] for construction and field selection.
39 #[must_use]
40 pub fn new(locator: StorageLocator, vector: DenseVector) -> Self {
41 Self {
42 query: ScopedQuery::vector(locator),
43 vector,
44 }
45 }
46}