use crate::graph::bind_name::BindNameExt;
use crate::ValueExpr;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use std::fmt::Debug;
pub mod bind_name;
#[allow(clippy::upper_case_acronyms)]
#[derive(Debug, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum DirectionFilter {
L, U, R, LU, UR, LR, LUR, }
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum PathMode {
Walk,
Trail,
Acyclic,
Simple,
}
#[derive(Debug, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct BindSpec(pub String);
impl BindSpec {
pub fn is_anon(&self) -> bool {
self.0.is_anon()
}
}
#[derive(Default, Debug, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum LabelFilter {
#[default]
Always,
Named(String),
Negated(Box<LabelFilter>),
Conjunction(Vec<LabelFilter>),
Disjunction(Vec<LabelFilter>),
Never,
}
#[derive(Default, Debug, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum ValueFilter {
#[default]
Always,
Filter(Vec<ValueExpr>),
}
impl ValueFilter {
pub fn and(mut self, other: ValueFilter) -> ValueFilter {
self.extend(other);
self
}
pub fn extend(&mut self, other: ValueFilter) {
match other {
ValueFilter::Always => {}
ValueFilter::Filter(rhs) => match self {
ValueFilter::Always => {
*self = ValueFilter::Filter(rhs);
}
ValueFilter::Filter(lhs) => {
lhs.extend(rhs);
}
},
}
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct NodeFilter {
pub label: LabelFilter,
pub filter: ValueFilter,
}
#[derive(Debug, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct EdgeFilter {
pub label: LabelFilter,
pub filter: ValueFilter,
}
#[derive(Debug, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct TripleFilter {
pub lhs: NodeFilter,
pub e: EdgeFilter,
pub rhs: NodeFilter,
}
#[derive(Debug, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct StepFilter {
pub dir: DirectionFilter,
pub triple: TripleFilter,
}
#[derive(Debug, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct PathPattern {
pub head: NodeMatch,
pub tail: Vec<(DirectionFilter, EdgeMatch, NodeMatch)>,
pub filter: ValueFilter,
pub mode: PathMode,
}
#[derive(Debug, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct NodeMatch {
pub binder: BindSpec,
pub spec: NodeFilter,
}
#[derive(Debug, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct EdgeMatch {
pub binder: BindSpec,
pub spec: EdgeFilter,
}
#[derive(Debug, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct TripleMatch {
pub binders: (BindSpec, BindSpec, BindSpec),
pub spec: StepFilter,
pub filter: ValueFilter,
pub path_mode: PathMode,
}
#[derive(Debug, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct TripleSeriesMatch {
pub triples: Vec<TripleMatch>,
pub filter: ValueFilter,
pub path_mode: PathMode,
}
#[derive(Debug, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum PathPatternMatch {
Node(NodeMatch),
Match(TripleMatch),
Concat(Vec<TripleSeriesMatch>, PathMode),
}