graphic_walker_parser/parser/model/
workflow.rs1use std::{collections::HashMap, f64};
2
3use serde_derive::{Deserialize, Serialize};
4
5#[derive(Clone, Debug, Serialize, Deserialize)]
6#[serde(tag = "type")]
7pub enum Workflow {
8 #[serde(rename = "view")]
9 View { query: Vec<Query> },
10 #[serde(rename = "filter")]
11 Filter { filters: Vec<Filter> },
12 #[serde(rename = "transform")]
13 Transform { transform: Vec<Transform> },
14 #[serde(rename = "sort")]
15 Sort { by: Vec<String>, sort: Sort },
16}
17
18#[derive(Clone, Debug, Serialize, Deserialize)]
19#[serde(tag = "op")]
20pub enum Query {
21 #[serde(rename = "raw")]
22 Raw { fields: Vec<String> },
23 #[serde(rename = "aggregate")]
24 #[serde(rename_all = "camelCase")]
25 Aggregate {
26 #[serde(default)]
27 group_by: Vec<String>,
28 #[serde(default)]
29 measures: Vec<Measure>,
30 },
31}
32
33#[derive(Clone, Debug, Serialize, Deserialize)]
34pub struct Filter {
35 #[serde(default)]
36 pub fid: String,
37 #[serde(default)]
38 pub key: String,
39 pub rule: Rule,
40}
41
42#[derive(Clone, Debug, Serialize, Deserialize)]
43pub struct Transform {
44 pub expression: Expression,
45}
46
47#[derive(Clone, Debug, Serialize, Deserialize)]
48pub struct Expression {
49 pub op: TransformOp,
50 #[serde(rename = "as")]
51 pub as_field_key: String,
52 pub num: Option<i64>,
53 pub params: Option<Vec<ExpParameter>>,
54}
55
56#[derive(Clone, Debug, Serialize, Deserialize)]
57pub enum TransformOp {
58 #[serde(rename = "one")]
59 One,
60 #[serde(rename = "bin")]
61 Bin,
62 #[serde(rename = "binCount")]
63 BinCount,
64 #[serde(rename = "log2")]
65 Log2,
66 #[serde(rename = "log10")]
67 Log10,
68 #[serde(rename = "log")]
69 Log,
70 #[serde(rename = "dateTimeDrill")]
71 DateTimeDrill,
72 #[serde(rename = "dateTimeFeature")]
73 DateTimeFeature,
74 #[serde(rename = "expr")]
75 Expr,
76 #[serde(rename = "paint")]
77 Paint,
78}
79
80#[derive(Clone, Debug, Serialize, Deserialize)]
81pub struct ExpParameter {
82 #[serde(rename = "type")]
83 pub r#type: String,
84 pub value: ValueParam,
85}
86
87#[derive(Clone, Debug, Serialize, Deserialize)]
88#[serde(untagged)]
89pub enum ValueParam {
90 Map(MapParameter),
91 String(String),
92}
93
94#[derive(Debug, Clone, Serialize, Deserialize)]
95#[serde(rename_all = "camelCase")]
96pub struct MapParameter {
97 pub x: String,
98 pub y: String,
99 pub domain_x: Vec<f64>,
100 pub domain_y: Vec<f64>,
101 pub map: String,
102 pub dict: HashMap<String, Dict>,
103 pub mapwidth: i64,
104}
105
106#[derive(Debug, Clone, Serialize, Deserialize)]
107pub struct Dict {
108 pub name: String,
109}
110
111#[derive(Clone, Debug, Serialize, Deserialize)]
112pub struct Rule {
113 #[serde(rename = "type")]
114 pub rule_type: RuleType,
115 pub value: Vec<JsonValue>,
116}
117
118#[derive(Clone, Debug, Serialize, Deserialize)]
119pub enum RuleType {
120 #[serde(rename = "range")]
121 Range,
122 #[serde(rename = "one of")]
123 OneOf,
124 #[serde(rename = "temporal range")]
125 Temporal,
126 #[serde(rename = "not in")]
127 NotIn,
128}
129
130#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq)]
131pub enum Sort {
132 #[serde(rename = "ascending")]
133 Asc,
134 #[serde(rename = "descending")]
135 Desc,
136 #[serde(rename = "")]
137 #[default]
138 None,
139}
140
141#[derive(Clone, Debug, Serialize, Deserialize)]
142#[serde(rename_all = "camelCase")]
143pub struct Measure {
144 pub field: String,
145 pub agg: Agg,
146 pub as_field_key: String,
147 pub format: Option<String>,
148}
149
150#[derive(Clone, Debug, Serialize, Deserialize)]
151pub enum Agg {
152 #[serde(rename = "sum")]
153 Sum,
154 #[serde(rename = "count")]
155 Count,
156 #[serde(rename = "min")]
157 Min,
158 #[serde(rename = "max")]
159 Max,
160 #[serde(rename = "median")]
161 Median,
162 #[serde(rename = "variance")]
163 Variance,
164 #[serde(rename = "stdev")]
165 StdDev,
166 #[serde(rename = "mean")]
167 Mean,
168 #[serde(rename = "distinctCount")]
169 DistinctCount,
170 #[serde(rename = "")]
171 None,
172}
173
174#[derive(Debug, Serialize, Deserialize)]
176#[serde(untagged)]
177pub enum JsonValue {
178 Int(i64),
179 Float64(f64),
180 String(String),
181}
182
183impl Clone for JsonValue {
184 fn clone(&self) -> Self {
185 match self {
186 JsonValue::Int(i) => JsonValue::Int(*i),
187 JsonValue::String(s) => JsonValue::String(s.clone()),
188 JsonValue::Float64(f) => JsonValue::Float64(*f),
189 }
190 }
191}