qdrant_edge/shard/operations/
vector_ops.rs1use 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 UpdateVectors(UpdateVectorsOp),
15 DeleteVectors(PointIdsList, Vec<VectorNameBuf>),
17 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 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 pub points: Vec<PointVectorsPersisted>,
61 #[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 pub id: PointIdType,
70 pub vector: VectorStructPersisted,
72}