1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
4pub struct Query {
5 pub clauses: Vec<Clause>,
6}
7
8#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
9pub enum Clause {
10 Match(MatchClause),
11 Create(CreateClause),
12 Merge(MergeClause),
13 Unwind(UnwindClause),
14 Call(CallClause),
15 Return(ReturnClause),
16 Where(WhereClause),
17 With(WithClause),
18 Set(SetClause),
19 Delete(DeleteClause),
20 Union(UnionClause),
21 }
23
24#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
25pub struct MatchClause {
26 pub optional: bool,
27 pub pattern: Pattern,
28}
29
30#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
31pub struct CreateClause {
32 pub pattern: Pattern,
33}
34
35#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
36pub struct MergeClause {
37 pub pattern: Pattern,
38}
39
40#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
41pub struct UnwindClause {
42 pub expression: Expression,
43 pub alias: String,
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
47pub struct CallClause {
48 pub query: Query,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
52pub struct UnionClause {
53 pub all: bool,
54 pub query: Query,
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
58pub struct ReturnClause {
59 pub distinct: bool,
60 pub items: Vec<ReturnItem>,
61 pub order_by: Option<OrderByClause>,
62 pub limit: Option<u32>,
63 pub skip: Option<u32>,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
67pub struct ReturnItem {
68 pub expression: Expression,
69 pub alias: Option<String>,
70}
71
72#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
73pub struct WhereClause {
74 pub expression: Expression,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
78pub struct WithClause {
79 pub distinct: bool,
80 pub items: Vec<ReturnItem>,
81 pub where_clause: Option<WhereClause>,
82 pub order_by: Option<OrderByClause>,
83 pub limit: Option<u32>,
84 pub skip: Option<u32>,
85}
86
87#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
88pub struct OrderByClause {
89 pub items: Vec<OrderByItem>,
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
93pub struct OrderByItem {
94 pub expression: Expression,
95 pub direction: Direction,
96}
97
98#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
99pub enum Direction {
100 Ascending,
101 Descending,
102}
103
104#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
105pub struct SetClause {
106 pub items: Vec<SetItem>,
107}
108
109#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
110pub struct SetItem {
111 pub property: PropertyAccess,
112 pub value: Expression,
113}
114
115#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
116pub struct DeleteClause {
117 pub detach: bool,
118 pub expressions: Vec<Expression>,
119}
120
121#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
122pub struct Pattern {
123 pub elements: Vec<PathElement>,
124}
125
126#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
127pub enum PathElement {
128 Node(NodePattern),
129 Relationship(RelationshipPattern),
130}
131
132#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
133pub struct NodePattern {
134 pub variable: Option<String>,
135 pub labels: Vec<String>,
136 pub properties: Option<PropertyMap>,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
140pub struct RelationshipPattern {
141 pub variable: Option<String>,
142 pub types: Vec<String>,
143 pub direction: RelationshipDirection,
144 pub properties: Option<PropertyMap>,
145 pub variable_length: Option<VariableLength>,
146}
147
148#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
149pub enum RelationshipDirection {
150 LeftToRight,
151 RightToLeft,
152 Undirected,
153}
154
155#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
156pub struct VariableLength {
157 pub min: Option<u32>,
158 pub max: Option<u32>,
159}
160
161#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
162pub struct PropertyMap {
163 pub properties: Vec<PropertyPair>,
164}
165
166#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
167pub struct PropertyPair {
168 pub key: String,
169 pub value: Expression,
170}
171
172#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
173pub enum Expression {
174 Literal(Literal),
175 Variable(String),
176 PropertyAccess(PropertyAccess),
177 Binary(Box<BinaryExpression>),
178 Unary(Box<UnaryExpression>),
179 FunctionCall(FunctionCall),
180 Case(Box<CaseExpression>),
181 Exists(Box<ExistsExpression>),
182 List(Vec<Expression>),
183 ListComprehension(Box<ListComprehension>),
184 Map(PropertyMap),
185 Parameter(String), }
187
188#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
189pub enum ExistsExpression {
190 Pattern(Pattern),
191 Subquery(Query),
192}
193
194#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
195pub struct ListComprehension {
196 pub variable: String,
197 pub list: Expression,
198 pub where_expression: Option<Expression>,
199 pub map_expression: Option<Expression>,
200}
201
202#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
203pub struct CaseExpression {
204 pub alternatives: Vec<CaseAlternative>,
205 pub else_expression: Option<Expression>,
206}
207
208#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
209pub struct CaseAlternative {
210 pub when: Expression,
211 pub then: Expression,
212}
213
214#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
215pub enum Literal {
216 String(String),
217 Integer(i64),
218 Float(f64),
219 Boolean(bool),
220 Null,
221}
222
223#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
224pub struct PropertyAccess {
225 pub variable: String,
226 pub property: String,
227}
228
229#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
230pub struct BinaryExpression {
231 pub operator: BinaryOperator,
232 pub left: Expression,
233 pub right: Expression,
234}
235
236#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
237pub enum BinaryOperator {
238 Equal,
239 NotEqual,
240 LessThan,
241 LessThanOrEqual,
242 GreaterThan,
243 GreaterThanOrEqual,
244 And,
245 Or,
246 Xor,
247 In,
248 NotIn,
249 StartsWith,
250 EndsWith,
251 Contains,
252 Add,
253 Subtract,
254 Multiply,
255 Divide,
256 Modulo,
257}
258
259#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
260pub struct UnaryExpression {
261 pub operator: UnaryOperator,
262 pub argument: Expression,
263}
264
265#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
266pub enum UnaryOperator {
267 Not,
268 Negate,
269}
270
271#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
272pub struct FunctionCall {
273 pub name: String,
274 pub arguments: Vec<Expression>,
275}