1use crate::span::Span;
9
10#[derive(Clone, Debug, PartialEq, Eq, Hash)]
12#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13pub struct Node<T> {
14 pub kind: T,
16 pub span: Span,
18}
19
20impl<T> Node<T> {
21 #[must_use]
23 pub const fn new(kind: T, span: Span) -> Self {
24 Self { kind, span }
25 }
26
27 #[must_use]
29 pub fn map<U>(self, map: impl FnOnce(T) -> U) -> Node<U> {
30 Node::new(map(self.kind), self.span)
31 }
32
33 #[must_use]
35 pub const fn as_ref(&self) -> Node<&T> {
36 Node::new(&self.kind, self.span)
37 }
38}
39
40#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
45#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
46pub struct Program {
47 pub statements: Vec<Statement>,
49 pub span: Span,
51}
52
53impl Program {
54 #[must_use]
56 pub const fn new(statements: Vec<Statement>, span: Span) -> Self {
57 Self { statements, span }
58 }
59
60 #[must_use]
62 pub fn is_empty(&self) -> bool {
63 self.statements.is_empty()
64 }
65}
66
67pub type Statement = Node<StatementKind>;
69
70#[non_exhaustive]
72#[derive(Clone, Debug, PartialEq, Eq, Hash)]
73#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
74pub enum StatementKind {
75 Query(QueryStatement),
77 Error(ErrorNode),
79}
80
81#[derive(Clone, Debug, PartialEq, Eq, Hash)]
83#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
84pub struct QueryStatement {
85 pub mode: Option<Node<ExecutionMode>>,
87 pub query: Query,
89 pub terminator: Option<Span>,
91}
92
93#[non_exhaustive]
95#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
96#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
97pub enum ExecutionMode {
98 Explain,
99 Profile,
100}
101
102pub type Query = Node<QueryKind>;
104
105#[non_exhaustive]
107#[derive(Clone, Debug, PartialEq, Eq, Hash)]
108#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
109pub enum QueryKind {
110 Regular(RegularQuery),
112 Error(ErrorNode),
114}
115
116#[derive(Clone, Debug, PartialEq, Eq, Hash)]
118#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
119pub struct RegularQuery {
120 pub head: SingleQuery,
122 pub unions: Vec<UnionBranch>,
124}
125
126#[derive(Clone, Debug, PartialEq, Eq, Hash)]
128#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
129pub struct UnionBranch {
130 pub operator: Node<UnionOperator>,
132 pub query: SingleQuery,
134}
135
136#[non_exhaustive]
138#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
139#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
140pub enum UnionOperator {
141 Default,
143 All,
145 Distinct,
147}
148
149#[non_exhaustive]
155#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
156#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
157pub enum SetQuantifier {
158 All,
159 Distinct,
160}
161
162pub type SingleQuery = Node<SingleQueryKind>;
164
165#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
167#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
168pub struct SingleQueryKind {
169 pub clauses: Vec<Clause>,
171}
172
173pub type Clause = Node<ClauseKind>;
175
176#[non_exhaustive]
178#[derive(Clone, Debug, PartialEq, Eq, Hash)]
179#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
180pub enum ClauseKind {
181 Use(UseClause),
182 Match(MatchClause),
183 Unwind(UnwindClause),
184 Let(LetClause),
185 Create(CreateClause),
186 Insert(InsertClause),
187 Merge(MergeClause),
188 Delete(DeleteClause),
189 Set(SetClause),
190 Remove(RemoveClause),
191 Foreach(ForeachClause),
192 LoadCsv(LoadCsvClause),
193 Call(CallClause),
194 With(WithClause),
195 Return(ReturnClause),
196 Select(ProjectionClause),
197 Next(ProjectionClause),
198 Filter(FilterClause),
199 Finish,
200 Error(ErrorNode),
202}
203
204#[derive(Clone, Debug, PartialEq, Eq, Hash)]
206#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
207pub struct UseClause {
208 pub graph: Expr,
209}
210
211#[derive(Clone, Debug, PartialEq, Eq, Hash)]
213#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
214pub struct MatchClause {
215 pub optional: bool,
216 pub mode: Option<Node<PathMode>>,
217 pub pattern: Pattern,
218 pub hints: Vec<MatchHint>,
219 pub where_clause: Option<Expr>,
220}
221
222pub type MatchHint = Node<MatchHintKind>;
224
225#[non_exhaustive]
227#[derive(Clone, Debug, PartialEq, Eq, Hash)]
228#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
229pub enum MatchHintKind {
230 Index {
231 variable: Name,
232 label: Name,
233 properties: Vec<Name>,
234 seek: bool,
235 },
236 Scan {
237 variable: Name,
238 label: Name,
239 },
240 Join {
241 variables: Vec<Name>,
242 },
243}
244
245#[derive(Clone, Debug, PartialEq, Eq, Hash)]
247#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
248pub struct UnwindClause {
249 pub expression: Expr,
250 pub variable: Name,
251}
252
253#[derive(Clone, Debug, PartialEq, Eq, Hash)]
255#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
256pub struct LetClause {
257 pub bindings: Vec<Binding>,
258}
259
260#[derive(Clone, Debug, PartialEq, Eq, Hash)]
262#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
263pub struct Binding {
264 pub variable: Name,
265 pub expression: Expr,
266 pub span: Span,
267}
268
269#[derive(Clone, Debug, PartialEq, Eq, Hash)]
271#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
272pub struct CreateClause {
273 pub pattern: Pattern,
274}
275
276#[derive(Clone, Debug, PartialEq, Eq, Hash)]
278#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
279pub struct InsertClause {
280 pub pattern: Pattern,
281}
282
283#[derive(Clone, Debug, PartialEq, Eq, Hash)]
285#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
286pub struct MergeClause {
287 pub pattern: PatternPart,
288 pub actions: Vec<MergeAction>,
289}
290
291#[derive(Clone, Debug, PartialEq, Eq, Hash)]
293#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
294pub struct MergeAction {
295 pub trigger: Node<MergeTrigger>,
296 pub set: SetClause,
297 pub span: Span,
298}
299
300#[non_exhaustive]
302#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
303#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
304pub enum MergeTrigger {
305 Match,
306 Create,
307}
308
309#[derive(Clone, Debug, PartialEq, Eq, Hash)]
311#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
312pub struct DeleteClause {
313 pub mode: Node<DeleteMode>,
314 pub expressions: Vec<Expr>,
315}
316
317#[non_exhaustive]
319#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
320#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
321pub enum DeleteMode {
322 Normal,
323 Detach,
324 Nodetach,
325}
326
327#[derive(Clone, Debug, PartialEq, Eq, Hash)]
329#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
330pub struct SetClause {
331 pub items: Vec<SetItem>,
332}
333
334pub type SetItem = Node<SetItemKind>;
336
337#[non_exhaustive]
339#[derive(Clone, Debug, PartialEq, Eq, Hash)]
340#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
341pub enum SetItemKind {
342 Property {
343 target: Expr,
344 value: Expr,
345 },
346 ReplaceProperties {
347 target: Name,
348 value: Expr,
349 },
350 MergeProperties {
351 target: Name,
352 value: Expr,
353 },
354 Labels {
355 target: Name,
356 labels: LabelExpression,
357 },
358}
359
360#[derive(Clone, Debug, PartialEq, Eq, Hash)]
362#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
363pub struct RemoveClause {
364 pub items: Vec<RemoveItem>,
365}
366
367pub type RemoveItem = Node<RemoveItemKind>;
369
370#[non_exhaustive]
372#[derive(Clone, Debug, PartialEq, Eq, Hash)]
373#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
374pub enum RemoveItemKind {
375 Property(Expr),
376 Labels {
377 target: Name,
378 labels: LabelExpression,
379 },
380}
381
382#[derive(Clone, Debug, PartialEq, Eq, Hash)]
384#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
385pub struct ForeachClause {
386 pub variable: Name,
387 pub list: Expr,
388 pub clauses: Vec<Clause>,
389}
390
391#[derive(Clone, Debug, PartialEq, Eq, Hash)]
393#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
394pub struct LoadCsvClause {
395 pub with_headers: bool,
396 pub source: Expr,
397 pub variable: Name,
398 pub field_terminator: Option<Node<StringLiteral>>,
399}
400
401#[derive(Clone, Debug, PartialEq, Eq, Hash)]
403#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
404pub struct CallClause {
405 pub optional: bool,
406 pub target: CallTarget,
407 pub yield_clause: Option<YieldClause>,
408}
409
410#[non_exhaustive]
412#[derive(Clone, Debug, PartialEq, Eq, Hash)]
413#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
414pub enum CallTarget {
415 Procedure {
416 name: QualifiedName,
417 arguments: Option<Vec<Expr>>,
418 },
419 Subquery {
420 scope: Option<SubqueryScope>,
421 query: Box<Query>,
422 in_transactions: Option<Box<InTransactions>>,
423 },
424}
425
426#[derive(Clone, Debug, PartialEq, Eq, Hash)]
428#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
429pub struct SubqueryScope {
430 pub import_all: bool,
431 pub variables: Vec<Name>,
432 pub span: Span,
433}
434
435#[derive(Clone, Debug, PartialEq, Eq, Hash)]
437#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
438pub struct InTransactions {
439 pub rows: Option<Expr>,
440 pub on_error: Option<Node<TransactionErrorBehavior>>,
441 pub report_status_as: Option<Name>,
442 pub span: Span,
443}
444
445#[non_exhaustive]
447#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
448#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
449pub enum TransactionErrorBehavior {
450 Continue,
451 Break,
452 Fail,
453}
454
455#[derive(Clone, Debug, PartialEq, Eq, Hash)]
457#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
458pub struct YieldClause {
459 pub all: bool,
460 pub items: Vec<ProjectionItem>,
461 pub where_clause: Option<Expr>,
462 pub span: Span,
463}
464
465#[derive(Clone, Debug, PartialEq, Eq, Hash)]
467#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
468pub struct WithClause {
469 pub projection: ProjectionClause,
470 pub where_clause: Option<Expr>,
471}
472
473#[derive(Clone, Debug, PartialEq, Eq, Hash)]
475#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
476pub struct ReturnClause {
477 pub projection: ProjectionClause,
478}
479
480#[derive(Clone, Debug, PartialEq, Eq, Hash)]
482#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
483pub struct ProjectionClause {
484 pub quantifier: Option<Node<SetQuantifier>>,
486 pub items: Vec<ProjectionItem>,
487 pub order_by: Option<OrderBy>,
488 pub offset: Option<Expr>,
489 pub skip: Option<Expr>,
490 pub limit: Option<Expr>,
491 pub span: Span,
492}
493
494pub type ProjectionItem = Node<ProjectionItemKind>;
496
497#[non_exhaustive]
499#[derive(Clone, Debug, PartialEq, Eq, Hash)]
500#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
501pub enum ProjectionItemKind {
502 Wildcard,
503 Expression {
504 expression: Expr,
505 alias: Option<Name>,
506 },
507}
508
509#[derive(Clone, Debug, PartialEq, Eq, Hash)]
511#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
512pub struct OrderBy {
513 pub items: Vec<SortItem>,
514 pub span: Span,
515}
516
517#[derive(Clone, Debug, PartialEq, Eq, Hash)]
519#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
520pub struct SortItem {
521 pub expression: Expr,
522 pub direction: Option<Node<SortDirection>>,
523 pub nulls: Option<Node<NullOrder>>,
524 pub span: Span,
525}
526
527#[non_exhaustive]
529#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
530#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
531pub enum SortDirection {
532 Ascending,
533 Descending,
534}
535
536#[non_exhaustive]
538#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
539#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
540pub enum NullOrder {
541 First,
542 Last,
543}
544
545#[derive(Clone, Debug, PartialEq, Eq, Hash)]
547#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
548pub struct FilterClause {
549 pub predicate: Expr,
550}
551
552#[derive(Clone, Debug, PartialEq, Eq, Hash)]
554#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
555pub struct Pattern {
556 pub parts: Vec<PatternPart>,
557 pub span: Span,
558}
559
560pub type PatternPart = Node<PatternPartKind>;
562
563#[derive(Clone, Debug, PartialEq, Eq, Hash)]
565#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
566pub struct PatternPartKind {
567 pub binding: Option<Name>,
568 pub selector: Option<Node<PathSelector>>,
569 pub path: PathPattern,
570}
571
572pub type PathPattern = Node<PathPatternKind>;
574
575#[derive(Clone, Debug, PartialEq, Eq, Hash)]
577#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
578pub struct PathPatternKind {
579 pub factors: Vec<PathFactor>,
580}
581
582pub type PathFactor = Node<PathFactorKind>;
584
585#[non_exhaustive]
587#[derive(Clone, Debug, PartialEq, Eq, Hash)]
588#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
589pub enum PathFactorKind {
590 Node(NodePattern),
591 QuantifiedNode {
593 pattern: NodePattern,
594 quantifier: Quantifier,
595 },
596 Relationship(RelationshipPattern),
597 Parenthesized {
598 pattern: Box<PathPattern>,
599 where_clause: Option<Box<Expr>>,
600 quantifier: Option<Quantifier>,
601 },
602 Subpath {
604 binding: Name,
605 pattern: Box<PathPattern>,
606 where_clause: Option<Box<Expr>>,
607 quantifier: Option<Quantifier>,
608 },
609 LegacyShortest {
611 all: bool,
612 pattern: Box<PathPattern>,
613 },
614 Error(ErrorNode),
615}
616
617#[derive(Clone, Debug, PartialEq, Eq, Hash)]
619#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
620pub struct NodePattern {
621 pub variable: Option<Name>,
622 pub labels: Option<LabelExpression>,
623 pub properties: Option<Box<Expr>>,
624 pub where_clause: Option<Box<Expr>>,
625}
626
627#[derive(Clone, Debug, PartialEq, Eq, Hash)]
629#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
630pub struct RelationshipPattern {
631 pub direction: Node<RelationshipDirection>,
632 pub variable: Option<Name>,
633 pub labels: Option<LabelExpression>,
634 pub legacy_quantifier: Option<Quantifier>,
636 pub graph_quantifier: Option<Quantifier>,
638 pub properties: Option<Box<Expr>>,
639 pub where_clause: Option<Box<Expr>>,
640}
641
642#[non_exhaustive]
644#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
645#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
646pub enum RelationshipDirection {
647 Left,
648 Right,
649 Undirected,
650 Both,
651}
652
653#[derive(Clone, Debug, PartialEq, Eq, Hash)]
655#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
656pub struct Quantifier {
657 pub kind: QuantifierKind,
658 pub span: Span,
659}
660
661#[non_exhaustive]
663#[derive(Clone, Debug, PartialEq, Eq, Hash)]
664#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
665pub enum QuantifierKind {
666 ZeroOrMore,
667 OneOrMore,
668 Optional,
669 Fixed(String),
670 Range {
671 lower: Option<String>,
672 upper: Option<String>,
673 },
674}
675
676#[non_exhaustive]
678#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
679#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
680pub enum PathMode {
681 Walk,
682 Trail,
683 Simple,
684 Acyclic,
685}
686
687#[non_exhaustive]
689#[derive(Clone, Debug, PartialEq, Eq, Hash)]
690#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
691pub enum PathSelector {
692 All,
693 Any { count: Option<String> },
694 AnyShortest,
695 AllShortest,
696 Shortest { count: Option<String>, groups: bool },
697}
698
699pub type LabelExpression = Node<LabelExpressionKind>;
701
702#[non_exhaustive]
704#[derive(Clone, Debug, PartialEq, Eq, Hash)]
705#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
706pub enum LabelExpressionKind {
707 Name(Name),
708 Wildcard,
709 Not(Box<LabelExpression>),
710 And(Vec<LabelExpression>),
711 Or(Vec<LabelExpression>),
712 Parenthesized(Box<LabelExpression>),
713 Error(ErrorNode),
714}
715
716pub type Expr = Node<ExprKind>;
718
719#[non_exhaustive]
721#[derive(Clone, Debug, PartialEq, Eq, Hash)]
722#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
723pub enum ExprKind {
724 Literal(Literal),
725 Variable(Name),
726 Parameter(Parameter),
727 Wildcard,
728 List(Vec<Expr>),
729 Map(Vec<MapEntry>),
730 MapProjection(MapProjection),
731 Unary {
732 operator: Node<UnaryOperator>,
733 operand: Box<Expr>,
734 },
735 Binary {
736 left: Box<Expr>,
737 operator: Node<BinaryOperator>,
738 right: Box<Expr>,
739 },
740 Is {
741 expression: Box<Expr>,
742 negated: bool,
743 predicate: IsPredicate,
744 },
745 Property {
746 expression: Box<Expr>,
747 key: Name,
748 },
749 DynamicProperty {
750 expression: Box<Expr>,
751 key: Box<Expr>,
752 },
753 Index {
754 expression: Box<Expr>,
755 index: Box<Expr>,
756 },
757 Slice {
758 expression: Box<Expr>,
759 lower: Option<Box<Expr>>,
760 upper: Option<Box<Expr>>,
761 },
762 Function(FunctionInvocation),
763 Case(CaseExpression),
764 ListComprehension(ListComprehension),
765 PatternComprehension(PatternComprehension),
766 Reduce(ReduceExpression),
767 QuantifiedPredicate(QuantifiedPredicate),
768 Subquery(SubqueryExpression),
769 Pattern(Pattern),
770 Parenthesized(Box<Expr>),
771 Error(ErrorNode),
772}
773
774#[non_exhaustive]
776#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
777#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
778pub enum UnaryOperator {
779 Plus,
780 Minus,
781 Not,
782}
783
784#[non_exhaustive]
786#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
787#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
788pub enum BinaryOperator {
789 Or,
790 Xor,
791 And,
792 Equal,
793 NotEqual,
794 Less,
795 LessEqual,
796 Greater,
797 GreaterEqual,
798 RegexMatch,
799 In,
800 StartsWith,
801 EndsWith,
802 Contains,
803 Add,
804 Subtract,
805 Multiply,
806 Divide,
807 Remainder,
808 Power,
809 Concat,
810}
811
812#[non_exhaustive]
814#[derive(Clone, Debug, PartialEq, Eq, Hash)]
815#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
816pub enum IsPredicate {
817 Null,
818 Typed(TypeRef),
819 Normalized(Option<Node<NormalizationForm>>),
820 Label(LabelExpression),
821}
822
823#[non_exhaustive]
825#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
826#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
827pub enum NormalizationForm {
828 Nfc,
829 Nfd,
830 Nfkc,
831 Nfkd,
832}
833
834#[derive(Clone, Debug, PartialEq, Eq, Hash)]
836#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
837pub struct FunctionInvocation {
838 pub name: QualifiedName,
839 pub quantifier: Option<Node<SetQuantifier>>,
841 pub arguments: Vec<Expr>,
842}
843
844#[derive(Clone, Debug, PartialEq, Eq, Hash)]
846#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
847pub struct CaseExpression {
848 pub operand: Option<Box<Expr>>,
849 pub alternatives: Vec<CaseAlternative>,
850 pub else_expression: Option<Box<Expr>>,
851}
852
853#[derive(Clone, Debug, PartialEq, Eq, Hash)]
855#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
856pub struct CaseAlternative {
857 pub when: Vec<Expr>,
859 pub then: Expr,
860 pub span: Span,
861}
862
863#[derive(Clone, Debug, PartialEq, Eq, Hash)]
865#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
866pub struct ListComprehension {
867 pub variable: Name,
868 pub list: Box<Expr>,
869 pub predicate: Option<Box<Expr>>,
870 pub projection: Option<Box<Expr>>,
871}
872
873#[derive(Clone, Debug, PartialEq, Eq, Hash)]
875#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
876pub struct PatternComprehension {
877 pub binding: Option<Name>,
878 pub pattern: Pattern,
879 pub predicate: Option<Box<Expr>>,
880 pub projection: Box<Expr>,
881}
882
883#[derive(Clone, Debug, PartialEq, Eq, Hash)]
885#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
886pub struct ReduceExpression {
887 pub accumulator: Name,
888 pub initial: Box<Expr>,
889 pub variable: Name,
890 pub list: Box<Expr>,
891 pub expression: Box<Expr>,
892}
893
894#[derive(Clone, Debug, PartialEq, Eq, Hash)]
896#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
897pub struct QuantifiedPredicate {
898 pub kind: Node<QuantifiedPredicateKind>,
899 pub variable: Name,
900 pub list: Box<Expr>,
901 pub predicate: Box<Expr>,
902}
903
904#[non_exhaustive]
906#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
907#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
908pub enum QuantifiedPredicateKind {
909 All,
910 Any,
911 None,
912 Single,
913}
914
915#[derive(Clone, Debug, PartialEq, Eq, Hash)]
917#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
918pub struct SubqueryExpression {
919 pub kind: Node<SubqueryExpressionKind>,
920 pub query: Box<Query>,
921}
922
923#[non_exhaustive]
925#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
926#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
927pub enum SubqueryExpressionKind {
928 Exists,
929 Count,
930 Collect,
931}
932
933#[derive(Clone, Debug, PartialEq, Eq, Hash)]
935#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
936pub struct MapEntry {
937 pub key: Name,
938 pub value: Expr,
939 pub span: Span,
940}
941
942#[derive(Clone, Debug, PartialEq, Eq, Hash)]
944#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
945pub struct MapProjection {
946 pub base: Box<Expr>,
947 pub items: Vec<MapProjectionItem>,
948}
949
950pub type MapProjectionItem = Node<MapProjectionItemKind>;
952
953#[non_exhaustive]
955#[derive(Clone, Debug, PartialEq, Eq, Hash)]
956#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
957pub enum MapProjectionItemKind {
958 Property(Name),
959 AllProperties,
960 Variable(Name),
961 Entry(MapEntry),
962}
963
964pub type Literal = Node<LiteralKind>;
966
967#[non_exhaustive]
969#[derive(Clone, Debug, PartialEq, Eq, Hash)]
970#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
971pub enum LiteralKind {
972 Null,
973 Boolean(bool),
974 Integer(IntegerLiteral),
975 Float(FloatLiteral),
976 String(StringLiteral),
977}
978
979#[derive(Clone, Debug, PartialEq, Eq, Hash)]
981#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
982pub struct IntegerLiteral {
983 pub text: String,
985 pub radix: IntegerRadix,
986}
987
988#[non_exhaustive]
990#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
991#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
992pub enum IntegerRadix {
993 Decimal,
994 Hexadecimal,
995 Octal,
996}
997
998#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1000#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1001pub struct FloatLiteral {
1002 pub text: String,
1003}
1004
1005#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1007#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1008pub struct StringLiteral {
1009 pub value: String,
1010 pub quote: QuoteStyle,
1011}
1012
1013#[non_exhaustive]
1015#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
1016#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1017pub enum QuoteStyle {
1018 Single,
1019 Double,
1020}
1021
1022#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1024#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1025pub struct Parameter {
1026 pub name: ParameterName,
1027}
1028
1029#[non_exhaustive]
1031#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1032#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1033pub enum ParameterName {
1034 Named(String),
1035 Positional(String),
1036}
1037
1038#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1040#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1041pub struct Identifier {
1042 pub text: String,
1044 pub escaped: bool,
1046}
1047
1048impl Identifier {
1049 #[must_use]
1051 pub fn new(text: impl Into<String>, escaped: bool) -> Self {
1052 Self {
1053 text: text.into(),
1054 escaped,
1055 }
1056 }
1057}
1058
1059pub type Name = Node<Identifier>;
1061
1062#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1064#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1065pub struct QualifiedName {
1066 pub parts: Vec<Name>,
1067 pub span: Span,
1068}
1069
1070pub type TypeRef = Node<TypeRefKind>;
1072
1073#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1075#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1076pub struct TypeRefKind {
1077 pub value: ValueType,
1078 pub nullable: Option<bool>,
1079}
1080
1081#[non_exhaustive]
1083#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1084#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1085pub enum ValueType {
1086 Nothing,
1087 Null,
1088 Boolean,
1089 String,
1090 Integer,
1091 Float,
1092 Decimal,
1093 Number,
1094 Date,
1095 LocalTime,
1096 ZonedTime,
1097 LocalDateTime,
1098 ZonedDateTime,
1099 Duration,
1100 Point,
1101 Node,
1102 Relationship,
1103 Map,
1104 Path,
1105 List(Box<TypeRef>),
1106 Any,
1107 Named(QualifiedName),
1108}
1109
1110#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
1112#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1113pub struct ErrorNode;