use crate::span::Span;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Node<T> {
pub kind: T,
pub span: Span,
}
impl<T> Node<T> {
#[must_use]
pub const fn new(kind: T, span: Span) -> Self {
Self { kind, span }
}
#[must_use]
pub fn map<U>(self, map: impl FnOnce(T) -> U) -> Node<U> {
Node::new(map(self.kind), self.span)
}
#[must_use]
pub const fn as_ref(&self) -> Node<&T> {
Node::new(&self.kind, self.span)
}
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Program {
pub statements: Vec<Statement>,
pub span: Span,
}
impl Program {
#[must_use]
pub const fn new(statements: Vec<Statement>, span: Span) -> Self {
Self { statements, span }
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.statements.is_empty()
}
}
pub type Statement = Node<StatementKind>;
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum StatementKind {
Query(QueryStatement),
Error(ErrorNode),
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct QueryStatement {
pub mode: Option<Node<ExecutionMode>>,
pub query: Query,
pub terminator: Option<Span>,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ExecutionMode {
Explain,
Profile,
}
pub type Query = Node<QueryKind>;
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum QueryKind {
Regular(RegularQuery),
Error(ErrorNode),
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct RegularQuery {
pub head: SingleQuery,
pub unions: Vec<UnionBranch>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct UnionBranch {
pub operator: Node<UnionOperator>,
pub query: SingleQuery,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum UnionOperator {
Default,
All,
Distinct,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SetQuantifier {
All,
Distinct,
}
pub type SingleQuery = Node<SingleQueryKind>;
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SingleQueryKind {
pub clauses: Vec<Clause>,
}
pub type Clause = Node<ClauseKind>;
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ClauseKind {
Use(UseClause),
Match(MatchClause),
Unwind(UnwindClause),
Let(LetClause),
Create(CreateClause),
Insert(InsertClause),
Merge(MergeClause),
Delete(DeleteClause),
Set(SetClause),
Remove(RemoveClause),
Foreach(ForeachClause),
LoadCsv(LoadCsvClause),
Call(CallClause),
With(WithClause),
Return(ReturnClause),
Select(ProjectionClause),
Next(ProjectionClause),
Filter(FilterClause),
Finish,
Error(ErrorNode),
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct UseClause {
pub graph: Expr,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MatchClause {
pub optional: bool,
pub mode: Option<Node<PathMode>>,
pub pattern: Pattern,
pub hints: Vec<MatchHint>,
pub where_clause: Option<Expr>,
}
pub type MatchHint = Node<MatchHintKind>;
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum MatchHintKind {
Index {
variable: Name,
label: Name,
properties: Vec<Name>,
seek: bool,
},
Scan {
variable: Name,
label: Name,
},
Join {
variables: Vec<Name>,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct UnwindClause {
pub expression: Expr,
pub variable: Name,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct LetClause {
pub bindings: Vec<Binding>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Binding {
pub variable: Name,
pub expression: Expr,
pub span: Span,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CreateClause {
pub pattern: Pattern,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct InsertClause {
pub pattern: Pattern,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MergeClause {
pub pattern: PatternPart,
pub actions: Vec<MergeAction>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MergeAction {
pub trigger: Node<MergeTrigger>,
pub set: SetClause,
pub span: Span,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum MergeTrigger {
Match,
Create,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct DeleteClause {
pub mode: Node<DeleteMode>,
pub expressions: Vec<Expr>,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum DeleteMode {
Normal,
Detach,
Nodetach,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SetClause {
pub items: Vec<SetItem>,
}
pub type SetItem = Node<SetItemKind>;
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SetItemKind {
Property {
target: Expr,
value: Expr,
},
ReplaceProperties {
target: Name,
value: Expr,
},
MergeProperties {
target: Name,
value: Expr,
},
Labels {
target: Name,
labels: LabelExpression,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct RemoveClause {
pub items: Vec<RemoveItem>,
}
pub type RemoveItem = Node<RemoveItemKind>;
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum RemoveItemKind {
Property(Expr),
Labels {
target: Name,
labels: LabelExpression,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ForeachClause {
pub variable: Name,
pub list: Expr,
pub clauses: Vec<Clause>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct LoadCsvClause {
pub with_headers: bool,
pub source: Expr,
pub variable: Name,
pub field_terminator: Option<Node<StringLiteral>>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CallClause {
pub optional: bool,
pub target: CallTarget,
pub yield_clause: Option<YieldClause>,
}
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum CallTarget {
Procedure {
name: QualifiedName,
arguments: Option<Vec<Expr>>,
},
Subquery {
scope: Option<SubqueryScope>,
query: Box<Query>,
in_transactions: Option<Box<InTransactions>>,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SubqueryScope {
pub import_all: bool,
pub variables: Vec<Name>,
pub span: Span,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct InTransactions {
pub rows: Option<Expr>,
pub on_error: Option<Node<TransactionErrorBehavior>>,
pub report_status_as: Option<Name>,
pub span: Span,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TransactionErrorBehavior {
Continue,
Break,
Fail,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct YieldClause {
pub all: bool,
pub items: Vec<ProjectionItem>,
pub where_clause: Option<Expr>,
pub span: Span,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct WithClause {
pub projection: ProjectionClause,
pub where_clause: Option<Expr>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ReturnClause {
pub projection: ProjectionClause,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ProjectionClause {
pub quantifier: Option<Node<SetQuantifier>>,
pub items: Vec<ProjectionItem>,
pub order_by: Option<OrderBy>,
pub offset: Option<Expr>,
pub skip: Option<Expr>,
pub limit: Option<Expr>,
pub span: Span,
}
pub type ProjectionItem = Node<ProjectionItemKind>;
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ProjectionItemKind {
Wildcard,
Expression {
expression: Expr,
alias: Option<Name>,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct OrderBy {
pub items: Vec<SortItem>,
pub span: Span,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SortItem {
pub expression: Expr,
pub direction: Option<Node<SortDirection>>,
pub nulls: Option<Node<NullOrder>>,
pub span: Span,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SortDirection {
Ascending,
Descending,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum NullOrder {
First,
Last,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FilterClause {
pub predicate: Expr,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Pattern {
pub parts: Vec<PatternPart>,
pub span: Span,
}
pub type PatternPart = Node<PatternPartKind>;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PatternPartKind {
pub binding: Option<Name>,
pub selector: Option<Node<PathSelector>>,
pub path: PathPattern,
}
pub type PathPattern = Node<PathPatternKind>;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PathPatternKind {
pub factors: Vec<PathFactor>,
}
pub type PathFactor = Node<PathFactorKind>;
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PathFactorKind {
Node(NodePattern),
QuantifiedNode {
pattern: NodePattern,
quantifier: Quantifier,
},
Relationship(RelationshipPattern),
Parenthesized {
pattern: Box<PathPattern>,
where_clause: Option<Box<Expr>>,
quantifier: Option<Quantifier>,
},
Subpath {
binding: Name,
pattern: Box<PathPattern>,
where_clause: Option<Box<Expr>>,
quantifier: Option<Quantifier>,
},
LegacyShortest {
all: bool,
pattern: Box<PathPattern>,
},
Error(ErrorNode),
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NodePattern {
pub variable: Option<Name>,
pub labels: Option<LabelExpression>,
pub properties: Option<Box<Expr>>,
pub where_clause: Option<Box<Expr>>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct RelationshipPattern {
pub direction: Node<RelationshipDirection>,
pub variable: Option<Name>,
pub labels: Option<LabelExpression>,
pub legacy_quantifier: Option<Quantifier>,
pub graph_quantifier: Option<Quantifier>,
pub properties: Option<Box<Expr>>,
pub where_clause: Option<Box<Expr>>,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum RelationshipDirection {
Left,
Right,
Undirected,
Both,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Quantifier {
pub kind: QuantifierKind,
pub span: Span,
}
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum QuantifierKind {
ZeroOrMore,
OneOrMore,
Optional,
Fixed(String),
Range {
lower: Option<String>,
upper: Option<String>,
},
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PathMode {
Walk,
Trail,
Simple,
Acyclic,
}
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PathSelector {
All,
Any { count: Option<String> },
AnyShortest,
AllShortest,
Shortest { count: Option<String>, groups: bool },
}
pub type LabelExpression = Node<LabelExpressionKind>;
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum LabelExpressionKind {
Name(Name),
Wildcard,
Not(Box<LabelExpression>),
And(Vec<LabelExpression>),
Or(Vec<LabelExpression>),
Parenthesized(Box<LabelExpression>),
Error(ErrorNode),
}
pub type Expr = Node<ExprKind>;
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ExprKind {
Literal(Literal),
Variable(Name),
Parameter(Parameter),
Wildcard,
List(Vec<Expr>),
Map(Vec<MapEntry>),
MapProjection(MapProjection),
Unary {
operator: Node<UnaryOperator>,
operand: Box<Expr>,
},
Binary {
left: Box<Expr>,
operator: Node<BinaryOperator>,
right: Box<Expr>,
},
Is {
expression: Box<Expr>,
negated: bool,
predicate: IsPredicate,
},
Property {
expression: Box<Expr>,
key: Name,
},
DynamicProperty {
expression: Box<Expr>,
key: Box<Expr>,
},
Index {
expression: Box<Expr>,
index: Box<Expr>,
},
Slice {
expression: Box<Expr>,
lower: Option<Box<Expr>>,
upper: Option<Box<Expr>>,
},
Function(FunctionInvocation),
Case(CaseExpression),
ListComprehension(ListComprehension),
PatternComprehension(PatternComprehension),
Reduce(ReduceExpression),
QuantifiedPredicate(QuantifiedPredicate),
Subquery(SubqueryExpression),
Pattern(Pattern),
Parenthesized(Box<Expr>),
Error(ErrorNode),
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum UnaryOperator {
Plus,
Minus,
Not,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum BinaryOperator {
Or,
Xor,
And,
Equal,
NotEqual,
Less,
LessEqual,
Greater,
GreaterEqual,
RegexMatch,
In,
StartsWith,
EndsWith,
Contains,
Add,
Subtract,
Multiply,
Divide,
Remainder,
Power,
Concat,
}
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum IsPredicate {
Null,
Typed(TypeRef),
Normalized(Option<Node<NormalizationForm>>),
Label(LabelExpression),
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum NormalizationForm {
Nfc,
Nfd,
Nfkc,
Nfkd,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FunctionInvocation {
pub name: QualifiedName,
pub quantifier: Option<Node<SetQuantifier>>,
pub arguments: Vec<Expr>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CaseExpression {
pub operand: Option<Box<Expr>>,
pub alternatives: Vec<CaseAlternative>,
pub else_expression: Option<Box<Expr>>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CaseAlternative {
pub when: Vec<Expr>,
pub then: Expr,
pub span: Span,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ListComprehension {
pub variable: Name,
pub list: Box<Expr>,
pub predicate: Option<Box<Expr>>,
pub projection: Option<Box<Expr>>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PatternComprehension {
pub binding: Option<Name>,
pub pattern: Pattern,
pub predicate: Option<Box<Expr>>,
pub projection: Box<Expr>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ReduceExpression {
pub accumulator: Name,
pub initial: Box<Expr>,
pub variable: Name,
pub list: Box<Expr>,
pub expression: Box<Expr>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct QuantifiedPredicate {
pub kind: Node<QuantifiedPredicateKind>,
pub variable: Name,
pub list: Box<Expr>,
pub predicate: Box<Expr>,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum QuantifiedPredicateKind {
All,
Any,
None,
Single,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SubqueryExpression {
pub kind: Node<SubqueryExpressionKind>,
pub query: Box<Query>,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SubqueryExpressionKind {
Exists,
Count,
Collect,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MapEntry {
pub key: Name,
pub value: Expr,
pub span: Span,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MapProjection {
pub base: Box<Expr>,
pub items: Vec<MapProjectionItem>,
}
pub type MapProjectionItem = Node<MapProjectionItemKind>;
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum MapProjectionItemKind {
Property(Name),
AllProperties,
Variable(Name),
Entry(MapEntry),
}
pub type Literal = Node<LiteralKind>;
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum LiteralKind {
Null,
Boolean(bool),
Integer(IntegerLiteral),
Float(FloatLiteral),
String(StringLiteral),
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct IntegerLiteral {
pub text: String,
pub radix: IntegerRadix,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum IntegerRadix {
Decimal,
Hexadecimal,
Octal,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FloatLiteral {
pub text: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct StringLiteral {
pub value: String,
pub quote: QuoteStyle,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum QuoteStyle {
Single,
Double,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Parameter {
pub name: ParameterName,
}
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ParameterName {
Named(String),
Positional(String),
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Identifier {
pub text: String,
pub escaped: bool,
}
impl Identifier {
#[must_use]
pub fn new(text: impl Into<String>, escaped: bool) -> Self {
Self {
text: text.into(),
escaped,
}
}
}
pub type Name = Node<Identifier>;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct QualifiedName {
pub parts: Vec<Name>,
pub span: Span,
}
pub type TypeRef = Node<TypeRefKind>;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TypeRefKind {
pub value: ValueType,
pub nullable: Option<bool>,
}
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ValueType {
Nothing,
Null,
Boolean,
String,
Integer,
Float,
Decimal,
Number,
Date,
LocalTime,
ZonedTime,
LocalDateTime,
ZonedDateTime,
Duration,
Point,
Node,
Relationship,
Map,
Path,
List(Box<TypeRef>),
Any,
Named(QualifiedName),
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ErrorNode;