#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct Span {
pub start: usize,
pub end: usize,
}
impl Span {
pub fn new(start: usize, end: usize) -> Self {
Self { start, end }
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct GremlinTraversal {
pub source: SourceStep,
pub steps: Vec<Step>,
pub terminal: Option<TerminalStep>,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq)]
pub struct AnonymousTraversal {
pub steps: Vec<Step>,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq)]
pub enum SourceStep {
V {
ids: Vec<Literal>,
variable: Option<String>,
span: Span,
},
E {
ids: Vec<Literal>,
variable: Option<String>,
span: Span,
},
AddV { label: String, span: Span },
AddE { label: String, span: Span },
Inject { values: Vec<Literal>, span: Span },
SearchTextV {
property: String,
query: TextQueryAst,
k: u64,
span: Span,
},
SearchTextE {
property: String,
query: TextQueryAst,
k: u64,
span: Span,
},
}
#[derive(Debug, Clone, PartialEq)]
pub enum TerminalStep {
Next { count: Option<u64>, span: Span },
ToList { span: Span },
ToSet { span: Span },
Iterate { span: Span },
HasNext { span: Span },
Explain { span: Span },
}
#[derive(Debug, Clone, PartialEq)]
pub enum Step {
Out { labels: Vec<String>, span: Span },
In { labels: Vec<String>, span: Span },
Both { labels: Vec<String>, span: Span },
OutE { labels: Vec<String>, span: Span },
InE { labels: Vec<String>, span: Span },
BothE { labels: Vec<String>, span: Span },
OutV { span: Span },
InV { span: Span },
BothV { span: Span },
OtherV { span: Span },
Has { args: HasArgs, span: Span },
HasLabel { labels: Vec<String>, span: Span },
HasId { ids: Vec<Literal>, span: Span },
HasNot { key: String, span: Span },
HasKey { keys: Vec<String>, span: Span },
HasValue { values: Vec<Literal>, span: Span },
Where { args: WhereArgs, span: Span },
Is { args: IsArgs, span: Span },
And {
traversals: Vec<AnonymousTraversal>,
span: Span,
},
Or {
traversals: Vec<AnonymousTraversal>,
span: Span,
},
Not {
traversal: Box<AnonymousTraversal>,
span: Span,
},
Dedup {
by_label: Option<String>,
span: Span,
},
Limit { count: u64, span: Span },
Skip { count: u64, span: Span },
Range { start: u64, end: u64, span: Span },
Tail { count: Option<u64>, span: Span },
Coin { probability: f64, span: Span },
Sample { count: u64, span: Span },
SimplePath { span: Span },
CyclicPath { span: Span },
Values { keys: Vec<String>, span: Span },
Properties { keys: Vec<String>, span: Span },
ValueMap { args: ValueMapArgs, span: Span },
ElementMap { keys: Vec<String>, span: Span },
PropertyMap { keys: Vec<String>, span: Span },
Id { span: Span },
Label { span: Span },
Key { span: Span },
Value { span: Span },
Path { span: Span },
Select { labels: Vec<String>, span: Span },
Project { keys: Vec<String>, span: Span },
By { args: ByArgs, span: Span },
Unfold { span: Span },
Fold { span: Span },
Count { span: Span },
Sum { span: Span },
Max { span: Span },
Min { span: Span },
Mean { span: Span },
Group { span: Span },
GroupCount { span: Span },
Order { span: Span },
Math { expression: String, span: Span },
Constant { value: Literal, span: Span },
Identity { span: Span },
Index { span: Span },
Loops { span: Span },
TextScore { span: Span },
Choose { args: ChooseArgs, span: Span },
Union {
traversals: Vec<AnonymousTraversal>,
span: Span,
},
Coalesce {
traversals: Vec<AnonymousTraversal>,
span: Span,
},
Optional {
traversal: Box<AnonymousTraversal>,
span: Span,
},
Local {
traversal: Box<AnonymousTraversal>,
span: Span,
},
Branch {
traversal: Box<AnonymousTraversal>,
span: Span,
},
Option { args: OptionArgs, span: Span },
Repeat {
traversal: Box<AnonymousTraversal>,
span: Span,
},
Times { count: u32, span: Span },
Until {
traversal: Box<AnonymousTraversal>,
span: Span,
},
Emit {
traversal: Option<Box<AnonymousTraversal>>,
span: Span,
},
As { label: String, span: Span },
Aggregate { key: String, span: Span },
Store { key: String, span: Span },
Cap { keys: Vec<String>, span: Span },
SideEffect {
traversal: Box<AnonymousTraversal>,
span: Span,
},
Profile { key: Option<String>, span: Span },
ShortestPath {
target: Literal,
span: Span,
},
KShortestPaths {
target: Literal,
k: u64,
span: Span,
},
BfsTraversal { span: Span },
DfsTraversal { span: Span },
BidirectionalBfs {
target: Literal,
span: Span,
},
Iddfs {
target: Literal,
max_depth: u32,
span: Span,
},
With { args: WithArgs, span: Span },
AddV { label: String, span: Span },
AddE { label: String, span: Span },
Property { args: PropertyArgs, span: Span },
From { args: FromToArgs, span: Span },
To { args: FromToArgs, span: Span },
Drop { span: Span },
}
#[derive(Debug, Clone, PartialEq)]
pub enum HasArgs {
Key(String),
KeyValue { key: String, value: Literal },
KeyPredicate { key: String, predicate: Predicate },
LabelKeyValue {
label: String,
key: String,
value: Literal,
},
}
#[derive(Debug, Clone, PartialEq)]
pub enum WhereArgs {
Traversal(Box<AnonymousTraversal>),
Predicate(Predicate),
}
#[derive(Debug, Clone, PartialEq)]
pub enum IsArgs {
Value(Literal),
Predicate(Predicate),
}
#[derive(Debug, Clone, PartialEq, Default)]
pub struct ValueMapArgs {
pub include_tokens: bool,
pub keys: Vec<String>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum ByArgs {
Identity,
Key(String),
Traversal(Box<AnonymousTraversal>),
Order(OrderDirection),
KeyOrder { key: String, order: OrderDirection },
TraversalOrder {
traversal: Box<AnonymousTraversal>,
order: OrderDirection,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OrderDirection {
Asc,
Desc,
Shuffle,
}
#[derive(Debug, Clone, PartialEq)]
pub enum ChooseArgs {
IfThenElse {
condition: Box<AnonymousTraversal>,
if_true: Box<AnonymousTraversal>,
if_false: Box<AnonymousTraversal>,
},
ByTraversal(Box<AnonymousTraversal>),
ByPredicate(Predicate),
}
#[derive(Debug, Clone, PartialEq)]
pub enum OptionArgs {
KeyValue {
key: Literal,
traversal: Box<AnonymousTraversal>,
},
None { traversal: Box<AnonymousTraversal> },
}
#[derive(Debug, Clone, PartialEq)]
pub struct PropertyArgs {
pub cardinality: Option<Cardinality>,
pub key: String,
pub value: Literal,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Cardinality {
Single,
List,
Set,
}
#[derive(Debug, Clone, PartialEq)]
pub enum FromToArgs {
Label(String),
Traversal(Box<AnonymousTraversal>),
Id(Literal),
Variable(String),
}
#[derive(Debug, Clone, PartialEq)]
pub struct WithArgs {
pub key: String,
pub value: Literal,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Predicate {
Eq(Literal),
Neq(Literal),
Lt(Literal),
Lte(Literal),
Gt(Literal),
Gte(Literal),
Between { start: Literal, end: Literal },
Inside { start: Literal, end: Literal },
Outside { start: Literal, end: Literal },
Within(Vec<Literal>),
Without(Vec<Literal>),
And(Box<Predicate>, Box<Predicate>),
Or(Box<Predicate>, Box<Predicate>),
Not(Box<Predicate>),
Containing(String),
NotContaining(String),
StartingWith(String),
NotStartingWith(String),
EndingWith(String),
NotEndingWith(String),
Regex(String),
GeoWithinDistance {
geometry: Literal,
distance: Literal,
},
GeoIntersects(Literal),
GeoContainedBy(Literal),
GeoBBox {
min_lon: f64,
min_lat: f64,
max_lon: f64,
max_lat: f64,
},
}
#[derive(Debug, Clone, PartialEq)]
pub enum Literal {
String(String),
Int(i64),
Float(f64),
Bool(bool),
Null,
List(Vec<Literal>),
Map(Vec<(String, Literal)>),
Point { lon: f64, lat: f64 },
Polygon(Vec<(f64, f64)>),
Distance { value: f64, unit: DistanceUnit },
}
#[derive(Debug, Clone, PartialEq)]
pub struct Script {
pub statements: Vec<Statement>,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Statement {
Assignment {
name: String,
traversal: GremlinTraversal,
span: Span,
},
Traversal {
traversal: GremlinTraversal,
span: Span,
},
}
#[derive(Debug, Clone, PartialEq)]
pub enum VertexSource {
All,
Ids(Vec<Literal>),
Variable(String),
}
#[derive(Debug, Clone, PartialEq)]
pub enum EdgeEndpoint {
VertexId(Literal),
StepLabel(String),
Variable(String),
Traversal(Box<AnonymousTraversal>),
}
#[derive(Debug, Clone, PartialEq)]
pub enum TextQueryAst {
Match(String),
MatchAll(String),
Phrase(String),
Prefix(String),
And(Vec<TextQueryAst>),
Or(Vec<TextQueryAst>),
Not(Box<TextQueryAst>),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DistanceUnit {
Meters,
Kilometers,
Miles,
NauticalMiles,
}