Skip to main content

nervusdb_core/query/
ast.rs

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    // Remove can be added later
22}
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), // $param
186}
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}