use serde::{Deserialize, Serialize};
use crate::ast::{Direction, Expr, Pattern, Query, ReturnClause, UnaryOp};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LocyProgram {
pub module: Option<ModuleDecl>,
pub uses: Vec<UseDecl>,
pub statements: Vec<LocyStatement>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct QualifiedName {
pub parts: Vec<String>,
}
impl std::fmt::Display for QualifiedName {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.parts.join("."))
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ModuleDecl {
pub name: QualifiedName,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UseDecl {
pub name: QualifiedName,
pub imports: Option<Vec<String>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum LocyStatement {
Cypher(Query),
Rule(RuleDefinition),
GoalQuery(GoalQuery),
DeriveCommand(DeriveCommand),
AssumeBlock(AssumeBlock),
AbduceQuery(AbduceQuery),
ExplainRule(ExplainRule),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RuleDefinition {
pub name: QualifiedName,
pub priority: Option<i64>,
pub match_pattern: Pattern,
pub where_conditions: Vec<RuleCondition>,
pub along: Vec<AlongBinding>,
pub fold: Vec<FoldBinding>,
pub having: Vec<Expr>,
pub best_by: Option<BestByClause>,
pub output: RuleOutput,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum RuleCondition {
IsReference(IsReference),
Expression(Expr),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IsReference {
pub subjects: Vec<String>,
pub rule_name: QualifiedName,
pub target: Option<String>,
pub negated: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AlongBinding {
pub name: String,
pub expr: LocyExpr,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum LocyExpr {
PrevRef(String),
Cypher(Expr),
BinaryOp {
left: Box<LocyExpr>,
op: LocyBinaryOp,
right: Box<LocyExpr>,
},
UnaryOp(UnaryOp, Box<LocyExpr>),
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub enum LocyBinaryOp {
Add,
Sub,
Mul,
Div,
Mod,
Pow,
And,
Or,
Xor,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FoldBinding {
pub name: String,
pub aggregate: Expr,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BestByClause {
pub items: Vec<BestByItem>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BestByItem {
pub expr: Expr,
pub ascending: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum RuleOutput {
Yield(YieldClause),
Derive(DeriveClause),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct YieldClause {
pub items: Vec<LocyYieldItem>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LocyYieldItem {
pub is_key: bool,
pub is_prob: bool,
pub expr: Expr,
pub alias: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum DeriveClause {
Patterns(Vec<DerivePattern>),
Merge(String, String),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DerivePattern {
pub direction: Direction,
pub source: DeriveNodeSpec,
pub edge: DeriveEdgeSpec,
pub target: DeriveNodeSpec,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DeriveNodeSpec {
pub is_new: bool,
pub variable: String,
pub labels: Vec<String>,
pub properties: Option<Expr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DeriveEdgeSpec {
pub edge_type: String,
pub properties: Option<Expr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GoalQuery {
pub rule_name: QualifiedName,
pub where_expr: Option<Expr>,
pub return_clause: Option<ReturnClause>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DeriveCommand {
pub rule_name: QualifiedName,
pub where_expr: Option<Expr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AssumeBlock {
pub mutations: Vec<crate::ast::Clause>,
pub body: Vec<LocyStatement>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AbduceQuery {
pub negated: bool,
pub rule_name: QualifiedName,
pub where_expr: Option<Expr>,
pub return_clause: Option<ReturnClause>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ExplainRule {
pub rule_name: QualifiedName,
pub where_expr: Option<Expr>,
pub return_clause: Option<ReturnClause>,
}