Skip to main content

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}