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>,
175}
176
177pub type Clause = Node<ClauseKind>;
179
180#[non_exhaustive]
182#[derive(Clone, Debug, PartialEq, Eq, Hash)]
183#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
184pub enum ClauseKind {
185 Use(UseClause),
186 Match(MatchClause),
187 Unwind(UnwindClause),
188 Let(LetClause),
189 Create(CreateClause),
190 Insert(InsertClause),
191 Merge(MergeClause),
192 Delete(DeleteClause),
193 Set(SetClause),
194 Remove(RemoveClause),
195 Foreach(ForeachClause),
196 LoadCsv(LoadCsvClause),
197 Call(CallClause),
198 With(WithClause),
199 Return(ReturnClause),
200 Select(ProjectionClause),
201 Next(ProjectionClause),
202 Filter(FilterClause),
203 Finish,
204 Error(ErrorNode),
206}
207
208#[derive(Clone, Debug, PartialEq, Eq, Hash)]
210#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
211pub struct UseClause {
212 pub graph: Expr,
213}
214
215#[derive(Clone, Debug, PartialEq, Eq, Hash)]
217#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
218pub struct MatchClause {
219 pub optional: bool,
220 pub mode: Option<Node<PathMode>>,
221 pub pattern: Pattern,
222 pub hints: Vec<MatchHint>,
223 pub where_clause: Option<Expr>,
224}
225
226pub type MatchHint = Node<MatchHintKind>;
228
229#[non_exhaustive]
231#[derive(Clone, Debug, PartialEq, Eq, Hash)]
232#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
233pub enum MatchHintKind {
234 Index {
235 variable: Name,
236 label: Name,
237 properties: Vec<Name>,
238 seek: bool,
239 },
240 Scan {
241 variable: Name,
242 label: Name,
243 },
244 Join {
245 variables: Vec<Name>,
246 },
247}
248
249#[derive(Clone, Debug, PartialEq, Eq, Hash)]
251#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
252pub struct UnwindClause {
253 pub expression: Expr,
254 pub variable: Name,
255}
256
257#[derive(Clone, Debug, PartialEq, Eq, Hash)]
259#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
260pub struct LetClause {
261 pub bindings: Vec<Binding>,
262}
263
264#[derive(Clone, Debug, PartialEq, Eq, Hash)]
266#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
267pub struct Binding {
268 pub variable: Name,
269 pub expression: Expr,
270 pub span: Span,
271}
272
273#[derive(Clone, Debug, PartialEq, Eq, Hash)]
275#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
276pub struct CreateClause {
277 pub pattern: Pattern,
278}
279
280#[derive(Clone, Debug, PartialEq, Eq, Hash)]
282#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
283pub struct InsertClause {
284 pub pattern: Pattern,
285}
286
287#[derive(Clone, Debug, PartialEq, Eq, Hash)]
289#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
290pub struct MergeClause {
291 pub pattern: PatternPart,
292 pub actions: Vec<MergeAction>,
293}
294
295#[derive(Clone, Debug, PartialEq, Eq, Hash)]
297#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
298pub struct MergeAction {
299 pub trigger: Node<MergeTrigger>,
300 pub set: SetClause,
301 pub span: Span,
302}
303
304#[non_exhaustive]
306#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
307#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
308pub enum MergeTrigger {
309 Match,
310 Create,
311}
312
313#[derive(Clone, Debug, PartialEq, Eq, Hash)]
315#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
316pub struct DeleteClause {
317 pub mode: Node<DeleteMode>,
318 pub expressions: Vec<Expr>,
319}
320
321#[non_exhaustive]
323#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
324#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
325pub enum DeleteMode {
326 Normal,
327 Detach,
328 Nodetach,
329}
330
331#[derive(Clone, Debug, PartialEq, Eq, Hash)]
333#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
334pub struct SetClause {
335 pub items: Vec<SetItem>,
336}
337
338pub type SetItem = Node<SetItemKind>;
340
341#[non_exhaustive]
343#[derive(Clone, Debug, PartialEq, Eq, Hash)]
344#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
345pub enum SetItemKind {
346 Property {
347 target: Expr,
348 value: Expr,
349 },
350 ReplaceProperties {
351 target: Name,
352 value: Expr,
353 },
354 MergeProperties {
355 target: Name,
356 value: Expr,
357 },
358 Labels {
359 target: Name,
360 labels: LabelExpression,
361 },
362}
363
364#[derive(Clone, Debug, PartialEq, Eq, Hash)]
366#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
367pub struct RemoveClause {
368 pub items: Vec<RemoveItem>,
369}
370
371pub type RemoveItem = Node<RemoveItemKind>;
373
374#[non_exhaustive]
376#[derive(Clone, Debug, PartialEq, Eq, Hash)]
377#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
378pub enum RemoveItemKind {
379 Property(Expr),
380 Labels {
381 target: Name,
382 labels: LabelExpression,
383 },
384}
385
386#[derive(Clone, Debug, PartialEq, Eq, Hash)]
388#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
389pub struct ForeachClause {
390 pub variable: Name,
391 pub list: Expr,
392 pub clauses: Vec<Clause>,
393}
394
395#[derive(Clone, Debug, PartialEq, Eq, Hash)]
397#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
398pub struct LoadCsvClause {
399 pub with_headers: bool,
400 pub source: Expr,
401 pub variable: Name,
402 pub field_terminator: Option<Node<StringLiteral>>,
403}
404
405#[derive(Clone, Debug, PartialEq, Eq, Hash)]
407#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
408pub struct CallClause {
409 pub optional: bool,
410 pub target: CallTarget,
411 pub yield_clause: Option<YieldClause>,
412}
413
414#[non_exhaustive]
416#[derive(Clone, Debug, PartialEq, Eq, Hash)]
417#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
418pub enum CallTarget {
419 Procedure {
420 name: QualifiedName,
421 arguments: Option<Vec<Expr>>,
422 },
423 Subquery {
424 scope: Option<SubqueryScope>,
425 query: Box<Query>,
426 in_transactions: Option<Box<InTransactions>>,
427 },
428}
429
430#[derive(Clone, Debug, PartialEq, Eq, Hash)]
432#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
433pub struct SubqueryScope {
434 pub import_all: bool,
435 pub variables: Vec<Name>,
436 pub span: Span,
437}
438
439#[derive(Clone, Debug, PartialEq, Eq, Hash)]
441#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
442pub struct InTransactions {
443 pub rows: Option<Expr>,
444 pub on_error: Option<Node<TransactionErrorBehavior>>,
445 pub report_status_as: Option<Name>,
446 pub span: Span,
447}
448
449#[non_exhaustive]
451#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
452#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
453pub enum TransactionErrorBehavior {
454 Continue,
455 Break,
456 Fail,
457}
458
459#[derive(Clone, Debug, PartialEq, Eq, Hash)]
461#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
462pub struct YieldClause {
463 pub all: bool,
464 pub items: Vec<ProjectionItem>,
465 pub where_clause: Option<Expr>,
466 pub span: Span,
467}
468
469#[derive(Clone, Debug, PartialEq, Eq, Hash)]
471#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
472pub struct WithClause {
473 pub projection: ProjectionClause,
474 pub where_clause: Option<Expr>,
475}
476
477#[derive(Clone, Debug, PartialEq, Eq, Hash)]
479#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
480pub struct ReturnClause {
481 pub projection: ProjectionClause,
482}
483
484#[derive(Clone, Debug, PartialEq, Eq, Hash)]
486#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
487pub struct ProjectionClause {
488 pub quantifier: Option<Node<SetQuantifier>>,
490 pub items: Vec<ProjectionItem>,
491 pub order_by: Option<OrderBy>,
492 pub offset: Option<Expr>,
493 pub skip: Option<Expr>,
494 pub limit: Option<Expr>,
495 pub span: Span,
496}
497
498pub type ProjectionItem = Node<ProjectionItemKind>;
500
501#[non_exhaustive]
503#[derive(Clone, Debug, PartialEq, Eq, Hash)]
504#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
505pub enum ProjectionItemKind {
506 Wildcard,
507 Expression {
508 expression: Expr,
509 alias: Option<Name>,
510 },
511}
512
513#[derive(Clone, Debug, PartialEq, Eq, Hash)]
515#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
516pub struct OrderBy {
517 pub items: Vec<SortItem>,
518 pub span: Span,
519}
520
521#[derive(Clone, Debug, PartialEq, Eq, Hash)]
523#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
524pub struct SortItem {
525 pub expression: Expr,
526 pub direction: Option<Node<SortDirection>>,
527 pub nulls: Option<Node<NullOrder>>,
528 pub span: Span,
529}
530
531#[non_exhaustive]
533#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
534#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
535pub enum SortDirection {
536 Ascending,
537 Descending,
538}
539
540#[non_exhaustive]
542#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
543#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
544pub enum NullOrder {
545 First,
546 Last,
547}
548
549#[derive(Clone, Debug, PartialEq, Eq, Hash)]
551#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
552pub struct FilterClause {
553 pub predicate: Expr,
554}
555
556#[derive(Clone, Debug, PartialEq, Eq, Hash)]
558#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
559pub struct Pattern {
560 pub parts: Vec<PatternPart>,
561 pub span: Span,
562}
563
564pub type PatternPart = Node<PatternPartKind>;
566
567#[derive(Clone, Debug, PartialEq, Eq, Hash)]
569#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
570pub struct PatternPartKind {
571 pub binding: Option<Name>,
572 pub selector: Option<Node<PathSelector>>,
573 pub path: PathPattern,
574}
575
576pub type PathPattern = Node<PathPatternKind>;
578
579#[derive(Clone, Debug, PartialEq, Eq, Hash)]
581#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
582pub struct PathPatternKind {
583 pub factors: Vec<PathFactor>,
584}
585
586pub type PathFactor = Node<PathFactorKind>;
588
589#[non_exhaustive]
591#[derive(Clone, Debug, PartialEq, Eq, Hash)]
592#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
593pub enum PathFactorKind {
594 Node(NodePattern),
595 QuantifiedNode {
597 pattern: NodePattern,
598 quantifier: Quantifier,
599 },
600 Relationship(RelationshipPattern),
601 Parenthesized {
602 pattern: Box<PathPattern>,
603 where_clause: Option<Box<Expr>>,
604 quantifier: Option<Quantifier>,
605 },
606 Subpath {
608 binding: Name,
609 pattern: Box<PathPattern>,
610 where_clause: Option<Box<Expr>>,
611 quantifier: Option<Quantifier>,
612 },
613 LegacyShortest {
615 all: bool,
616 pattern: Box<PathPattern>,
617 },
618 Error(ErrorNode),
619}
620
621#[derive(Clone, Debug, PartialEq, Eq, Hash)]
623#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
624pub struct NodePattern {
625 pub variable: Option<Name>,
626 pub labels: Option<LabelExpression>,
627 pub properties: Option<Box<Expr>>,
628 pub where_clause: Option<Box<Expr>>,
629}
630
631#[derive(Clone, Debug, PartialEq, Eq, Hash)]
633#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
634pub struct RelationshipPattern {
635 pub direction: Node<RelationshipDirection>,
636 pub variable: Option<Name>,
637 pub labels: Option<LabelExpression>,
638 pub legacy_quantifier: Option<Quantifier>,
640 pub graph_quantifier: Option<Quantifier>,
642 pub properties: Option<Box<Expr>>,
643 pub where_clause: Option<Box<Expr>>,
644}
645
646#[non_exhaustive]
648#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
649#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
650pub enum RelationshipDirection {
651 Left,
652 Right,
653 Undirected,
654 Both,
655}
656
657#[derive(Clone, Debug, PartialEq, Eq, Hash)]
659#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
660pub struct Quantifier {
661 pub kind: QuantifierKind,
662 pub span: Span,
663}
664
665#[non_exhaustive]
667#[derive(Clone, Debug, PartialEq, Eq, Hash)]
668#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
669pub enum QuantifierKind {
670 ZeroOrMore,
671 OneOrMore,
672 Optional,
673 Fixed(String),
674 Range {
675 lower: Option<String>,
676 upper: Option<String>,
677 },
678}
679
680#[non_exhaustive]
682#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
683#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
684pub enum PathMode {
685 Walk,
686 Trail,
687 Simple,
688 Acyclic,
689}
690
691#[non_exhaustive]
693#[derive(Clone, Debug, PartialEq, Eq, Hash)]
694#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
695pub enum PathSelector {
696 All,
697 Any { count: Option<String> },
698 AnyShortest,
699 AllShortest,
700 Shortest { count: Option<String>, groups: bool },
701}
702
703pub type LabelExpression = Node<LabelExpressionKind>;
705
706#[non_exhaustive]
708#[derive(Clone, Debug, PartialEq, Eq, Hash)]
709#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
710pub enum LabelExpressionKind {
711 Name(Name),
712 Wildcard,
713 Not(Box<LabelExpression>),
714 And(Vec<LabelExpression>),
715 Or(Vec<LabelExpression>),
716 Parenthesized(Box<LabelExpression>),
717 Error(ErrorNode),
718}
719
720pub type Expr = Node<ExprKind>;
722
723#[non_exhaustive]
725#[derive(Clone, Debug, PartialEq, Eq, Hash)]
726#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
727pub enum ExprKind {
728 Literal(Literal),
729 Variable(Name),
730 Parameter(Parameter),
731 Wildcard,
732 List(Vec<Expr>),
733 Map(Vec<MapEntry>),
734 MapProjection(MapProjection),
735 Unary {
736 operator: Node<UnaryOperator>,
737 operand: Box<Expr>,
738 },
739 Binary {
740 left: Box<Expr>,
741 operator: Node<BinaryOperator>,
742 right: Box<Expr>,
743 },
744 Is {
745 expression: Box<Expr>,
746 negated: bool,
747 predicate: IsPredicate,
748 },
749 Property {
750 expression: Box<Expr>,
751 key: Name,
752 },
753 DynamicProperty {
754 expression: Box<Expr>,
755 key: Box<Expr>,
756 },
757 Index {
758 expression: Box<Expr>,
759 index: Box<Expr>,
760 },
761 Slice {
762 expression: Box<Expr>,
763 lower: Option<Box<Expr>>,
764 upper: Option<Box<Expr>>,
765 },
766 Function(FunctionInvocation),
767 Case(CaseExpression),
768 ListComprehension(ListComprehension),
769 PatternComprehension(PatternComprehension),
770 Reduce(ReduceExpression),
771 QuantifiedPredicate(QuantifiedPredicate),
772 Subquery(SubqueryExpression),
773 Pattern(Pattern),
774 Parenthesized(Box<Expr>),
775 Error(ErrorNode),
777}
778
779#[non_exhaustive]
781#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
782#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
783pub enum UnaryOperator {
784 Plus,
785 Minus,
786 Not,
787}
788
789#[non_exhaustive]
791#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
792#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
793pub enum BinaryOperator {
794 Or,
795 Xor,
796 And,
797 Equal,
798 NotEqual,
799 Less,
800 LessEqual,
801 Greater,
802 GreaterEqual,
803 RegexMatch,
804 In,
805 StartsWith,
806 EndsWith,
807 Contains,
808 Add,
809 Subtract,
810 Multiply,
811 Divide,
812 Remainder,
813 Power,
814 Concat,
815}
816
817#[non_exhaustive]
819#[derive(Clone, Debug, PartialEq, Eq, Hash)]
820#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
821pub enum IsPredicate {
822 Null,
823 Typed(TypeRef),
824 Normalized(Option<Node<NormalizationForm>>),
825 Label(LabelExpression),
826}
827
828#[non_exhaustive]
830#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
831#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
832pub enum NormalizationForm {
833 Nfc,
834 Nfd,
835 Nfkc,
836 Nfkd,
837}
838
839#[derive(Clone, Debug, PartialEq, Eq, Hash)]
841#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
842pub struct FunctionInvocation {
843 pub name: QualifiedName,
844 pub quantifier: Option<Node<SetQuantifier>>,
846 pub arguments: Vec<Expr>,
847}
848
849#[derive(Clone, Debug, PartialEq, Eq, Hash)]
851#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
852pub struct CaseExpression {
853 pub operand: Option<Box<Expr>>,
854 pub alternatives: Vec<CaseAlternative>,
855 pub else_expression: Option<Box<Expr>>,
856}
857
858#[derive(Clone, Debug, PartialEq, Eq, Hash)]
860#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
861pub struct CaseAlternative {
862 pub when: Vec<Expr>,
864 pub then: Expr,
865 pub span: Span,
866}
867
868#[derive(Clone, Debug, PartialEq, Eq, Hash)]
870#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
871pub struct ListComprehension {
872 pub variable: Name,
873 pub list: Box<Expr>,
874 pub predicate: Option<Box<Expr>>,
875 pub projection: Option<Box<Expr>>,
876}
877
878#[derive(Clone, Debug, PartialEq, Eq, Hash)]
880#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
881pub struct PatternComprehension {
882 pub binding: Option<Name>,
883 pub pattern: Pattern,
884 pub predicate: Option<Box<Expr>>,
885 pub projection: Box<Expr>,
886}
887
888#[derive(Clone, Debug, PartialEq, Eq, Hash)]
890#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
891pub struct ReduceExpression {
892 pub accumulator: Name,
893 pub initial: Box<Expr>,
894 pub variable: Name,
895 pub list: Box<Expr>,
896 pub expression: Box<Expr>,
897}
898
899#[derive(Clone, Debug, PartialEq, Eq, Hash)]
901#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
902pub struct QuantifiedPredicate {
903 pub kind: Node<QuantifiedPredicateKind>,
904 pub variable: Name,
905 pub list: Box<Expr>,
906 pub predicate: Box<Expr>,
907}
908
909#[non_exhaustive]
911#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
912#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
913pub enum QuantifiedPredicateKind {
914 All,
915 Any,
916 None,
917 Single,
918}
919
920#[derive(Clone, Debug, PartialEq, Eq, Hash)]
922#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
923pub struct SubqueryExpression {
924 pub kind: Node<SubqueryExpressionKind>,
925 pub query: Box<Query>,
926}
927
928#[non_exhaustive]
930#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
931#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
932pub enum SubqueryExpressionKind {
933 Exists,
934 Count,
935 Collect,
936}
937
938#[derive(Clone, Debug, PartialEq, Eq, Hash)]
940#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
941pub struct MapEntry {
942 pub key: Name,
943 pub value: Expr,
944 pub span: Span,
945}
946
947#[derive(Clone, Debug, PartialEq, Eq, Hash)]
949#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
950pub struct MapProjection {
951 pub base: Box<Expr>,
952 pub items: Vec<MapProjectionItem>,
953}
954
955pub type MapProjectionItem = Node<MapProjectionItemKind>;
957
958#[non_exhaustive]
960#[derive(Clone, Debug, PartialEq, Eq, Hash)]
961#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
962pub enum MapProjectionItemKind {
963 Property(Name),
964 AllProperties,
965 Variable(Name),
966 Entry(MapEntry),
967}
968
969pub type Literal = Node<LiteralKind>;
971
972#[non_exhaustive]
974#[derive(Clone, Debug, PartialEq, Eq, Hash)]
975#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
976pub enum LiteralKind {
977 Null,
978 Boolean(bool),
979 Integer(IntegerLiteral),
980 Float(FloatLiteral),
981 String(StringLiteral),
982}
983
984#[derive(Clone, Debug, PartialEq, Eq, Hash)]
986#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
987pub struct IntegerLiteral {
988 pub text: String,
990 pub radix: IntegerRadix,
991}
992
993#[non_exhaustive]
995#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
996#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
997pub enum IntegerRadix {
998 Decimal,
999 Hexadecimal,
1000 Octal,
1001}
1002
1003#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1005#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1006pub struct FloatLiteral {
1007 pub text: String,
1008}
1009
1010#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1012#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1013pub struct StringLiteral {
1014 pub value: String,
1015 pub quote: QuoteStyle,
1016}
1017
1018#[non_exhaustive]
1020#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
1021#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1022pub enum QuoteStyle {
1023 Single,
1024 Double,
1025}
1026
1027#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1029#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1030pub struct Parameter {
1031 pub name: ParameterName,
1032}
1033
1034#[non_exhaustive]
1036#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1037#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1038pub enum ParameterName {
1039 Named(String),
1040 Positional(String),
1041}
1042
1043#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1045#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1046pub struct Identifier {
1047 pub text: String,
1049 pub escaped: bool,
1051}
1052
1053impl Identifier {
1054 #[must_use]
1056 pub fn new(text: impl Into<String>, escaped: bool) -> Self {
1057 Self {
1058 text: text.into(),
1059 escaped,
1060 }
1061 }
1062}
1063
1064pub type Name = Node<Identifier>;
1066
1067#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1069#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1070pub struct QualifiedName {
1071 pub parts: Vec<Name>,
1072 pub span: Span,
1073}
1074
1075pub type TypeRef = Node<TypeRefKind>;
1077
1078#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1080#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1081pub struct TypeRefKind {
1082 pub value: ValueType,
1083 pub nullable: Option<bool>,
1084}
1085
1086#[non_exhaustive]
1088#[derive(Clone, Debug, PartialEq, Eq, Hash)]
1089#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1090pub enum ValueType {
1091 Nothing,
1092 Null,
1093 Boolean,
1094 String,
1095 Integer,
1096 Float,
1097 Decimal,
1098 Number,
1099 Date,
1100 LocalTime,
1101 ZonedTime,
1102 LocalDateTime,
1103 ZonedDateTime,
1104 Duration,
1105 Point,
1106 Node,
1107 Relationship,
1108 Map,
1109 Path,
1110 List(Box<TypeRef>),
1111 Any,
1112 Named(QualifiedName),
1113}
1114
1115#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
1117#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1118pub struct ErrorNode;