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/// let request = storage_kit::database::query::NearestRequest {
13/// query: storage_kit::database::query::ScopedQuery::new(
14/// storage_kit::database::StorageLocator::new("documents"),
15/// storage_kit::database::query::VectorQueryOptions { vector_field: Some("vector".into()), ..Default::default() },
16/// ),
17/// vector: storage_kit::database::data::DenseVector::F32(vec![0.1, 0.2, 0.3]),
18/// };
19/// assert_eq!(request.query.options.vector_field.as_deref(), Some("vector"));
20/// ```
21#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
22pub struct NearestRequest {
23 /// Shared query scope and vector options.
24 pub query: ScopedQuery<VectorQueryOptions>,
25 /// Dense vector used as the search seed.
26 pub vector: DenseVector,
27}
28
29impl ApplyDefaultLocator for NearestRequest {
30 fn apply_default_locator(mut self, default: &StorageLocator) -> Self {
31 self.query = self.query.apply_default_locator(default);
32 self
33 }
34}
35
36impl NearestRequest {
37 /// Creates a nearest-neighbor request with default vector parameters.
38 ///
39 /// # Examples
40 ///
41 /// ```
42 /// let request = storage_kit::database::query::NearestRequest::new(
43 /// storage_kit::database::StorageLocator::new("documents"),
44 /// storage_kit::database::data::DenseVector::F32(vec![0.1, 0.2]),
45 /// );
46 /// assert_eq!(
47 /// request.query.options.params.limit,
48 /// storage_kit::database::query::VectorSearchParams::default().limit
49 /// );
50 /// ```
51 #[must_use]
52 pub fn new(locator: StorageLocator, vector: DenseVector) -> Self {
53 Self {
54 query: ScopedQuery::vector(locator),
55 vector,
56 }
57 }
58}