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}