1use crate::{
2 AdvancedFilter, EqIdentity, Identity, IntoPatch, IntoPatchItem, Partition, Patch, Range,
3 SetCursor, UpdateList, UpdateMap, UpdateSet, UpdateSetNull, UpsertOptions, WithPartition,
4};
5
6use serde::{Deserialize, Serialize};
7use serde_with::skip_serializing_none;
8use std::collections::HashMap;
9
10use super::common::CoreSortItem;
11
12#[derive(Serialize, Deserialize, Debug, Clone, Copy, Default)]
13#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
14pub enum SequenceValueType {
16 #[default]
17 Double,
19 String,
21 Long,
23}
24
25#[skip_serializing_none]
26#[derive(Serialize, Deserialize, Debug, Clone, Default)]
27#[serde(rename_all = "camelCase")]
28pub struct SequenceColumn {
30 pub name: Option<String>,
32 pub external_id: String,
34 pub description: Option<String>,
36 pub value_type: SequenceValueType,
38 pub metadata: Option<HashMap<String, String>>,
42 #[serde(skip_serializing)]
43 pub created_time: Option<i64>,
45 #[serde(skip_serializing)]
46 pub last_updated_time: Option<i64>,
48}
49
50#[skip_serializing_none]
51#[derive(Serialize, Deserialize, Debug, Default, Clone)]
52#[serde(rename_all = "camelCase")]
53pub struct Sequence {
55 pub id: i64,
57 pub external_id: Option<String>,
59 pub name: Option<String>,
61 pub description: Option<String>,
63 pub asset_id: Option<i64>,
65 pub metadata: Option<HashMap<String, String>>,
69 pub columns: Vec<SequenceColumn>,
71 pub created_time: i64,
73 pub last_updated_time: i64,
75 pub data_set_id: Option<i64>,
77}
78
79#[skip_serializing_none]
80#[derive(Serialize, Deserialize, Debug, Default, Clone)]
81#[serde(rename_all = "camelCase")]
82pub struct AddSequence {
84 pub external_id: Option<String>,
86 pub name: Option<String>,
88 pub description: Option<String>,
90 pub asset_id: Option<i64>,
92 pub metadata: Option<HashMap<String, String>>,
96 pub columns: Vec<SequenceColumn>,
98 pub data_set_id: Option<i64>,
100}
101
102impl From<Sequence> for AddSequence {
103 fn from(sequence: Sequence) -> Self {
104 AddSequence {
105 external_id: sequence.external_id,
106 name: sequence.name,
107 description: sequence.description,
108 asset_id: sequence.asset_id,
109 metadata: sequence.metadata,
110 columns: sequence.columns,
111 data_set_id: sequence.data_set_id,
112 }
113 }
114}
115
116impl EqIdentity for AddSequence {
117 fn eq(&self, id: &Identity) -> bool {
118 match id {
119 Identity::Id { id: _ } => false,
120 Identity::ExternalId { external_id } => self.external_id.as_ref() == Some(external_id),
121 }
122 }
123}
124
125#[skip_serializing_none]
126#[derive(Serialize, Deserialize, Debug, Default, Clone)]
127#[serde(rename_all = "camelCase")]
128pub struct UpdateSequenceColumns {
130 pub modify: Option<Vec<Patch<PatchSequenceColumn>>>,
132 pub add: Option<Vec<SequenceColumn>>,
134 pub remove: Option<Vec<String>>,
136}
137
138impl From<UpdateList<SequenceColumn, String>> for UpdateSequenceColumns {
139 fn from(upd: UpdateList<SequenceColumn, String>) -> Self {
140 match upd {
141 UpdateList::AddRemove { add, remove } => Self {
142 modify: None,
143 add,
144 remove,
145 },
146 UpdateList::Set { set } => Self {
147 add: Some(set),
148 modify: None,
149 remove: None,
150 },
151 }
152 }
153}
154
155#[skip_serializing_none]
156#[derive(Serialize, Deserialize, Debug, Default, Clone)]
157#[serde(rename_all = "camelCase")]
158pub struct PatchSequenceColumn {
160 pub description: Option<UpdateSetNull<String>>,
162 pub external_id: Option<UpdateSet<String>>,
164 pub name: Option<UpdateSetNull<String>>,
166 pub metadata: Option<UpdateMap<String, String>>,
170}
171
172#[skip_serializing_none]
173#[derive(Serialize, Deserialize, Debug, Default, Clone)]
174#[serde(rename_all = "camelCase")]
175pub struct PatchSequence {
177 pub name: Option<UpdateSetNull<String>>,
179 pub description: Option<UpdateSetNull<String>>,
181 pub asset_id: Option<UpdateSetNull<i64>>,
183 pub external_id: Option<UpdateSetNull<String>>,
185 pub metadata: Option<UpdateMap<String, String>>,
189 pub data_set_id: Option<UpdateSetNull<i64>>,
191 pub columns: Option<UpdateSequenceColumns>,
193}
194
195impl IntoPatch<Patch<PatchSequence>> for Sequence {
196 fn patch(self, options: &UpsertOptions) -> Patch<PatchSequence> {
197 Patch::<PatchSequence> {
198 id: to_idt!(self),
199 update: PatchSequence {
200 name: self.name.patch(options),
201 description: self.description.patch(options),
202 asset_id: self.asset_id.patch(options),
203 external_id: self.external_id.patch(options),
204 metadata: self.metadata.patch(options),
205 data_set_id: self.data_set_id.patch(options),
206 columns: None,
207 },
208 }
209 }
210}
211
212impl IntoPatch<PatchSequence> for AddSequence {
213 fn patch(self, options: &UpsertOptions) -> PatchSequence {
214 PatchSequence {
215 name: self.name.patch(options),
216 description: self.description.patch(options),
217 asset_id: self.asset_id.patch(options),
218 external_id: self.external_id.patch(options),
219 metadata: self.metadata.patch(options),
220 data_set_id: self.data_set_id.patch(options),
221 columns: None,
222 }
223 }
224}
225
226impl From<Sequence> for Patch<PatchSequence> {
227 fn from(sequence: Sequence) -> Self {
228 IntoPatch::<Patch<PatchSequence>>::patch(sequence, &Default::default())
229 }
230}
231
232#[skip_serializing_none]
233#[derive(Serialize, Deserialize, Debug, Default, Clone)]
234#[serde(rename_all = "camelCase")]
235pub struct SequenceFilter {
237 pub name: Option<String>,
239 pub external_id_prefix: Option<String>,
241 pub metadata: Option<HashMap<String, String>>,
243 pub asset_ids: Option<Vec<i64>>,
245 pub root_asset_ids: Option<Vec<i64>>,
248 pub asset_subtree_ids: Option<Vec<Identity>>,
251 pub created_time: Option<Range<i64>>,
253 pub last_updated_time: Option<Range<i64>>,
255 pub data_set_ids: Option<Vec<Identity>>,
257}
258
259#[skip_serializing_none]
260#[derive(Serialize, Deserialize, Debug, Default, Clone)]
261#[serde(rename_all = "camelCase")]
262pub struct SequenceFilterRequest {
264 pub filter: Option<SequenceFilter>,
266 pub advanced_filter: Option<AdvancedFilter>,
268 pub limit: Option<i32>,
270 pub cursor: Option<String>,
272 pub partition: Option<Partition>,
274 pub sort: Option<Vec<CoreSortItem>>,
276}
277
278impl SetCursor for SequenceFilterRequest {
279 fn set_cursor(&mut self, cursor: Option<String>) {
280 self.cursor = cursor;
281 }
282}
283
284impl WithPartition for SequenceFilterRequest {
285 fn with_partition(&self, partition: Partition) -> Self {
286 let mut copy = self.clone();
287 copy.partition = Some(partition);
288 copy
289 }
290}
291
292#[skip_serializing_none]
293#[derive(Serialize, Deserialize, Debug, Default, Clone)]
294#[serde(rename_all = "camelCase")]
295pub struct SequenceSearch {
297 pub name: Option<String>,
299 pub description: Option<String>,
301 pub query: Option<String>,
304}
305
306#[derive(Serialize, Deserialize, Debug)]
307#[serde(untagged)]
308pub enum SequenceRowValue {
310 String(String),
312 Long(i64),
314 Double(f64),
316 Null(()),
318}
319
320impl Default for SequenceRowValue {
321 fn default() -> Self {
322 SequenceRowValue::Null(())
323 }
324}
325
326#[derive(Serialize, Deserialize, Debug)]
327#[serde(rename_all = "camelCase")]
328pub struct SequenceRow {
330 pub row_number: i64,
332 pub values: Vec<SequenceRowValue>,
334}
335
336#[skip_serializing_none]
337#[derive(Serialize, Deserialize, Debug)]
338#[serde(rename_all = "camelCase")]
339pub struct BasicSequenceColumn {
341 pub external_id: String,
343 pub name: Option<String>,
345 pub value_type: SequenceValueType,
347}
348
349#[skip_serializing_none]
350#[derive(Serialize, Deserialize, Debug)]
351#[serde(rename_all = "camelCase")]
352pub struct RetrieveSequenceRowsResponse {
354 pub id: i64,
356 pub external_id: Option<String>,
358 pub columns: Vec<BasicSequenceColumn>,
360 pub rows: Vec<SequenceRow>,
362 pub next_cursor: Option<String>,
364}
365
366#[derive(Serialize, Deserialize, Debug)]
367#[serde(rename_all = "camelCase")]
368pub struct InsertSequenceRows {
370 pub columns: Vec<String>,
372 pub rows: Vec<SequenceRow>,
374 #[serde(flatten)]
375 pub id: Identity,
377}
378
379#[skip_serializing_none]
380#[derive(Serialize, Deserialize, Debug, Default, Clone)]
381#[serde(rename_all = "camelCase")]
382pub struct RetrieveSequenceRows {
384 pub start: Option<i64>,
386 pub end: Option<i64>,
388 pub limit: Option<i32>,
390 pub cursor: Option<String>,
392 pub columns: Option<Vec<String>>,
394 #[serde(flatten)]
395 pub id: Identity,
397}
398
399#[skip_serializing_none]
400#[derive(Serialize, Deserialize, Debug)]
401#[serde(rename_all = "camelCase")]
402pub struct RetrieveLastSequenceRow {
404 pub columns: Option<Vec<String>>,
406 pub before: Option<i64>,
408 #[serde(flatten)]
409 pub id: Identity,
411}
412
413#[derive(Serialize, Deserialize, Debug)]
414#[serde(rename_all = "camelCase")]
415pub struct DeleteSequenceRows {
417 pub rows: Vec<i64>,
419 #[serde(flatten)]
420 pub id: Identity,
422}