Skip to main content

qdrant_edge/shard/operations/
vector_ops.rs

1use std::collections::HashSet;
2
3use crate::segment::types::{Filter, PointIdType, VectorNameBuf};
4use serde::{Deserialize, Serialize};
5use strum::{EnumDiscriminants, EnumIter};
6
7use super::point_ops::{PointIdsList, VectorStructPersisted};
8
9#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, EnumDiscriminants, Hash)]
10#[strum_discriminants(derive(EnumIter))]
11#[serde(rename_all = "snake_case")]
12pub enum VectorOperations {
13    /// Update vectors
14    UpdateVectors(UpdateVectorsOp),
15    /// Delete vectors if exists
16    DeleteVectors(PointIdsList, Vec<VectorNameBuf>),
17    /// Delete vectors by given filter criteria
18    DeleteVectorsByFilter(Filter, Vec<VectorNameBuf>),
19}
20
21impl VectorOperations {
22    pub fn point_ids(&self) -> Option<Vec<PointIdType>> {
23        match self {
24            Self::UpdateVectors(op) => Some(op.points.iter().map(|point| point.id).collect()),
25            Self::DeleteVectors(points, _) => Some(points.points.clone()),
26            Self::DeleteVectorsByFilter(_, _) => None,
27        }
28    }
29
30    pub fn retain_point_ids<F>(&mut self, filter: F)
31    where
32        F: Fn(&PointIdType) -> bool,
33    {
34        match self {
35            Self::UpdateVectors(op) => op.points.retain(|point| filter(&point.id)),
36            Self::DeleteVectors(points, _) => points.points.retain(filter),
37            Self::DeleteVectorsByFilter(_, _) => (),
38        }
39    }
40
41    /// Drop named-vector references to names not in `valid`. See
42    /// [`super::CollectionUpdateOperations::retain_vector_names`].
43    pub fn retain_vector_names(&mut self, valid: &HashSet<VectorNameBuf>) {
44        match self {
45            Self::UpdateVectors(op) => {
46                for point in &mut op.points {
47                    point.vector.retain_vector_names(valid);
48                }
49            }
50            Self::DeleteVectors(_, names) | Self::DeleteVectorsByFilter(_, names) => {
51                names.retain(|name| valid.contains(name));
52            }
53        }
54    }
55}
56
57#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, Hash)]
58pub struct UpdateVectorsOp {
59    /// Points with named vectors
60    pub points: Vec<PointVectorsPersisted>,
61    /// Condition to check before updating vectors
62    #[serde(default, skip_serializing_if = "Option::is_none")]
63    pub update_filter: Option<Filter>,
64}
65
66#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, Hash)]
67pub struct PointVectorsPersisted {
68    /// Point id
69    pub id: PointIdType,
70    /// Vectors
71    pub vector: VectorStructPersisted,
72}