rs_puff/
params.rs

1use serde::Serialize;
2use std::collections::HashMap;
3
4use crate::{DistanceMetric, Filter, RankBy, VectorEncoding};
5
6#[derive(Debug, Clone, Default, Serialize)]
7pub struct WriteParams {
8    #[serde(skip_serializing_if = "Option::is_none")]
9    pub upsert_rows: Option<Vec<HashMap<String, serde_json::Value>>>,
10
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub upsert_columns: Option<HashMap<String, Vec<serde_json::Value>>>,
13
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub patch_rows: Option<Vec<HashMap<String, serde_json::Value>>>,
16
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub patch_columns: Option<HashMap<String, Vec<serde_json::Value>>>,
19
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub deletes: Option<Vec<serde_json::Value>>,
22
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub delete_by_filter: Option<Filter>,
25
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub patch_by_filter: Option<PatchByFilter>,
28
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub upsert_condition: Option<Filter>,
31
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub patch_condition: Option<Filter>,
34
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub delete_condition: Option<Filter>,
37
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub distance_metric: Option<DistanceMetric>,
40
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub schema: Option<HashMap<String, serde_json::Value>>,
43
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub delete_by_filter_allow_partial: Option<bool>,
46
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub patch_by_filter_allow_partial: Option<bool>,
49
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub disable_backpressure: Option<bool>,
52
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub return_affected_ids: Option<bool>,
55
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub copy_from_namespace: Option<String>,
58}
59
60#[derive(Debug, Clone, Serialize)]
61pub struct PatchByFilter {
62    pub filters: Filter,
63    pub patch: HashMap<String, serde_json::Value>,
64}
65
66#[derive(Debug, Clone, Default, Serialize)]
67pub struct QueryParams {
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub rank_by: Option<RankBy>,
70
71    #[serde(skip_serializing_if = "Option::is_none")]
72    pub top_k: Option<u64>,
73
74    #[serde(skip_serializing_if = "Option::is_none")]
75    pub filters: Option<Filter>,
76
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub include_attributes: Option<IncludeAttributes>,
79
80    #[serde(skip_serializing_if = "Option::is_none")]
81    pub exclude_attributes: Option<Vec<String>>,
82
83    #[serde(skip_serializing_if = "Option::is_none")]
84    pub vector_encoding: Option<VectorEncoding>,
85
86    #[serde(skip_serializing_if = "Option::is_none")]
87    pub distance_metric: Option<DistanceMetric>,
88
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub consistency: Option<Consistency>,
91
92    #[serde(skip_serializing_if = "Option::is_none")]
93    pub aggregate_by: Option<HashMap<String, AggregateBy>>,
94
95    #[serde(skip_serializing_if = "Option::is_none")]
96    pub group_by: Option<Vec<String>>,
97}
98
99#[derive(Debug, Clone, Serialize)]
100#[serde(untagged)]
101pub enum IncludeAttributes {
102    All(bool),
103    List(Vec<String>),
104}
105
106#[derive(Debug, Clone, Serialize)]
107pub struct Consistency {
108    pub level: ConsistencyLevel,
109}
110
111#[derive(Debug, Clone, Copy, Serialize)]
112#[serde(rename_all = "snake_case")]
113pub enum ConsistencyLevel {
114    Strong,
115    Eventual,
116}
117
118#[derive(Debug, Clone)]
119pub enum AggregateBy {
120    Count,
121    Sum(String),
122}
123
124impl serde::Serialize for AggregateBy {
125    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
126    where
127        S: serde::Serializer,
128    {
129        use serde::ser::SerializeSeq;
130        match self {
131            AggregateBy::Count => {
132                let mut seq = serializer.serialize_seq(Some(1))?;
133                seq.serialize_element("Count")?;
134                seq.end()
135            }
136            AggregateBy::Sum(attr) => {
137                let mut seq = serializer.serialize_seq(Some(2))?;
138                seq.serialize_element("Sum")?;
139                seq.serialize_element(attr)?;
140                seq.end()
141            }
142        }
143    }
144}
145
146#[derive(Debug, Clone, Default, Serialize)]
147pub struct MultiQueryParams {
148    pub queries: Vec<QueryParams>,
149
150    #[serde(skip_serializing_if = "Option::is_none")]
151    pub vector_encoding: Option<VectorEncoding>,
152
153    #[serde(skip_serializing_if = "Option::is_none")]
154    pub consistency: Option<Consistency>,
155}