Skip to main content

qdrant_edge/shard/operations/
vector_ops.rs

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