Skip to main content

ossify/ops/vector_bucket/vectors/
delete_vectors.rs

1//! DeleteVectors: batch-delete vectors by key.
2//!
3//! Official document: <https://www.alibabacloud.com/help/en/oss/developer-reference/deletevectors>
4
5use std::future::Future;
6
7use http::Method;
8use serde::Serialize;
9
10use crate::body::JSONBody;
11use crate::error::Result;
12use crate::response::EmptyResponseProcessor;
13use crate::ser::OnlyKeyField;
14use crate::{Client, Ops, Prepared, Request};
15
16#[derive(Debug, Clone, Default, Serialize)]
17pub struct DeleteVectorsParams {
18    #[serde(rename = "deleteVectors")]
19    delete_vectors: OnlyKeyField,
20}
21
22#[derive(Debug, Clone, Serialize)]
23pub struct DeleteVectorsRequest {
24    #[serde(rename = "indexName")]
25    pub index_name: String,
26    /// 1–500 unique keys. Keys that don't exist are silently skipped.
27    pub keys: Vec<String>,
28}
29
30pub struct DeleteVectors {
31    pub request: DeleteVectorsRequest,
32}
33
34impl Ops for DeleteVectors {
35    type Response = EmptyResponseProcessor;
36    type Body = JSONBody<DeleteVectorsRequest>;
37    type Query = DeleteVectorsParams;
38
39    fn prepare(self) -> Result<Prepared<DeleteVectorsParams, DeleteVectorsRequest>> {
40        Ok(Prepared {
41            method: Method::POST,
42            query: Some(DeleteVectorsParams::default()),
43            body: Some(self.request),
44            ..Default::default()
45        })
46    }
47}
48
49pub trait DeleteVectorsOps {
50    /// Batch-delete up to 500 vectors by key. Missing keys are silently
51    /// skipped. The operation is not atomic — a 5xx response can leave
52    /// partial deletions.
53    ///
54    /// Official document: <https://www.alibabacloud.com/help/en/oss/developer-reference/deletevectors>
55    fn delete_vectors(&self, request: DeleteVectorsRequest) -> impl Future<Output = Result<()>>;
56}
57
58impl DeleteVectorsOps for Client {
59    async fn delete_vectors(&self, request: DeleteVectorsRequest) -> Result<()> {
60        self.request(DeleteVectors { request }).await
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use super::*;
67
68    #[test]
69    fn params_serialize() {
70        assert_eq!(crate::ser::to_string(&DeleteVectorsParams::default()).unwrap(), "deleteVectors");
71    }
72
73    #[test]
74    fn body_serialize() {
75        let req = DeleteVectorsRequest {
76            index_name: "idx1".into(),
77            keys: vec!["a".into(), "b".into(), "c".into()],
78        };
79        let s = serde_json::to_string(&req).unwrap();
80        assert!(s.contains("\"indexName\":\"idx1\""));
81        assert!(s.contains("\"keys\":[\"a\",\"b\",\"c\"]"));
82    }
83}