use crate::TextQuery;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct QueryAst {
pub root_kind: String,
pub steps: Vec<QueryStep>,
pub expansions: Vec<ExpansionSlot>,
pub edge_expansions: Vec<EdgeExpansionSlot>,
pub final_limit: Option<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct EdgeExpansionSlot {
pub slot: String,
pub direction: TraverseDirection,
pub label: String,
pub max_depth: usize,
pub endpoint_filter: Option<Predicate>,
pub edge_filter: Option<Predicate>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ExpansionSlot {
pub slot: String,
pub direction: TraverseDirection,
pub label: String,
pub max_depth: usize,
pub filter: Option<Predicate>,
pub edge_filter: Option<Predicate>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum QueryStep {
Search {
query: String,
limit: usize,
},
VectorSearch {
query: String,
limit: usize,
},
TextSearch {
query: TextQuery,
limit: usize,
},
Traverse {
direction: TraverseDirection,
label: String,
max_depth: usize,
filter: Option<Predicate>,
},
Filter(Predicate),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Predicate {
LogicalIdEq(String),
KindEq(String),
JsonPathEq {
path: String,
value: ScalarValue,
},
JsonPathCompare {
path: String,
op: ComparisonOp,
value: ScalarValue,
},
SourceRefEq(String),
ContentRefNotNull,
ContentRefEq(String),
JsonPathFusedEq {
path: String,
value: String,
},
JsonPathFusedTimestampCmp {
path: String,
op: ComparisonOp,
value: i64,
},
JsonPathFusedBoolEq {
path: String,
value: bool,
},
EdgePropertyEq {
path: String,
value: ScalarValue,
},
EdgePropertyCompare {
path: String,
op: ComparisonOp,
value: ScalarValue,
},
JsonPathFusedIn {
path: String,
values: Vec<String>,
},
JsonPathIn {
path: String,
values: Vec<ScalarValue>,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ComparisonOp {
Gt,
Gte,
Lt,
Lte,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum ScalarValue {
Text(String),
Integer(i64),
Bool(bool),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum TraverseDirection {
In,
Out,
}