pub struct VarLenExpandNode {
pub input: Arc<LogicalPlan>,
pub rel_type_name: String,
pub min_hops: u16,
pub max_hops: Option<u16>,
pub src_var: u32,
pub dst_var: u32,
pub edge_var: u32,
pub direction: Direction,
pub rel_ty: Option<u32>,
pub dir: PathBuf,
pub mode: OntologyMode,
/* private fields */
}Expand description
Physical node for variable-length path expansion.
Triggered when Expand has max_hops != Some(1) — patterns like
(a)-[:KNOWS*1..3]->(b). These cannot be expressed as a finite join
sequence, so the physical layer (VarLenExpandExec in M13)
performs an iterative BFS over the Parquet edge table.
§Baked execution context
Like GraphCreateNode, the project dir and ontology mode are baked in
at lowering time because the physical-planning ExtensionPlanner only sees
the DataFusion session state, not the GraphForge project path. The physical
node reads edges directly from dir at execution time.
§Output schema
The output extends the input schema with the destination node’s columns
(var_<dst>-qualified TOPOLOGY_NODES_SCHEMA), then a
trailing edge-list column (var_<edge>-qualified var_len_edge_list_field)
binding the edge variable r to the openCypher list of relationships along
each path (#709). The edge column is last; the physical node produces
columns in this exact order.
Fields§
§input: Arc<LogicalPlan>Input plan (the source node scan / prior pipeline).
rel_type_name: StringName of the relation type to expand along (or "*" for wildcard).
min_hops: u16Minimum number of hops.
max_hops: Option<u16>Maximum number of hops (None = unbounded).
src_var: u32Source node pattern-variable id (the frontier seed in the input).
dst_var: u32Destination node pattern-variable id (bound to the reached node).
edge_var: u32Edge pattern-variable id (bound to the per-path relationship list).
direction: DirectionEdge traversal direction.
rel_ty: Option<u32>Resolved relation type id (TypeId.0), or None for a wildcard.
dir: PathBufProject directory the physical node reads edges from.
mode: OntologyModeOntology mode (drives typed vs exploratory edge-file routing).
Implementations§
Source§impl VarLenExpandNode
impl VarLenExpandNode
Sourcepub fn new(
input: Arc<LogicalPlan>,
rel_type_name: impl Into<String>,
min_hops: u16,
max_hops: Option<u16>,
src_var: u32,
dst_var: u32,
edge_var: u32,
direction: Direction,
rel_ty: Option<u32>,
dir: PathBuf,
mode: OntologyMode,
dst_fields: Vec<Arc<Field>>,
edge_field: Arc<Field>,
) -> Self
pub fn new( input: Arc<LogicalPlan>, rel_type_name: impl Into<String>, min_hops: u16, max_hops: Option<u16>, src_var: u32, dst_var: u32, edge_var: u32, direction: Direction, rel_ty: Option<u32>, dir: PathBuf, mode: OntologyMode, dst_fields: Vec<Arc<Field>>, edge_field: Arc<Field>, ) -> Self
Create a variable-length expand node.
dst_fields is the destination node’s column list (the storage layer’s
TOPOLOGY_NODES_SCHEMA fields), passed in by the lowerer so this crate
need not depend on graphforge-storage. They are qualified var_<dst_var> and
appended to the input schema. edge_field is the trailing edge-list
column (var_len_edge_list_field), qualified var_<edge_var>.
Trait Implementations§
Source§impl Clone for VarLenExpandNode
impl Clone for VarLenExpandNode
Source§impl Debug for VarLenExpandNode
impl Debug for VarLenExpandNode
impl Eq for VarLenExpandNode
Source§impl Hash for VarLenExpandNode
impl Hash for VarLenExpandNode
Source§impl PartialEq for VarLenExpandNode
impl PartialEq for VarLenExpandNode
Source§impl PartialOrd for VarLenExpandNode
impl PartialOrd for VarLenExpandNode
impl StructuralPartialEq for VarLenExpandNode
Source§impl UserDefinedLogicalNodeCore for VarLenExpandNode
impl UserDefinedLogicalNodeCore for VarLenExpandNode
Source§fn inputs(&self) -> Vec<&LogicalPlan>
fn inputs(&self) -> Vec<&LogicalPlan>
Source§fn schema(&self) -> &DFSchemaRef
fn schema(&self) -> &DFSchemaRef
Source§fn expressions(&self) -> Vec<Expr>
fn expressions(&self) -> Vec<Expr>
Source§fn fmt_for_explain(&self, f: &mut Formatter<'_>) -> Result
fn fmt_for_explain(&self, f: &mut Formatter<'_>) -> Result
f for use in explain plan. Read moreSource§fn with_exprs_and_inputs(
&self,
_exprs: Vec<Expr>,
inputs: Vec<LogicalPlan>,
) -> DfResult<Self>
fn with_exprs_and_inputs( &self, _exprs: Vec<Expr>, inputs: Vec<LogicalPlan>, ) -> DfResult<Self>
UserDefinedLogicalNode with the specified children
and expressions. This function is used during optimization
when the plan is being rewritten and a new instance of the
UserDefinedLogicalNode must be created. Read moreSource§fn check_invariants(
&self,
_check: InvariantLevel,
) -> Result<(), DataFusionError>
fn check_invariants( &self, _check: InvariantLevel, ) -> Result<(), DataFusionError>
Source§fn prevent_predicate_push_down_columns(&self) -> HashSet<String>
fn prevent_predicate_push_down_columns(&self) -> HashSet<String>
Source§fn necessary_children_exprs(
&self,
_output_columns: &[usize],
) -> Option<Vec<Vec<usize>>>
fn necessary_children_exprs( &self, _output_columns: &[usize], ) -> Option<Vec<Vec<usize>>>
Source§fn supports_limit_pushdown(&self) -> bool
fn supports_limit_pushdown(&self) -> bool
true if a limit can be safely pushed down through this
UserDefinedLogicalNode node. Read moreAuto Trait Implementations§
impl !RefUnwindSafe for VarLenExpandNode
impl !UnwindSafe for VarLenExpandNode
impl Freeze for VarLenExpandNode
impl Send for VarLenExpandNode
impl Sync for VarLenExpandNode
impl Unpin for VarLenExpandNode
impl UnsafeUnpin for VarLenExpandNode
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreimpl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> UserDefinedLogicalNode for Twhere
T: UserDefinedLogicalNodeCore,
impl<T> UserDefinedLogicalNode for Twhere
T: UserDefinedLogicalNodeCore,
Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Source§fn inputs(&self) -> Vec<&LogicalPlan>
fn inputs(&self) -> Vec<&LogicalPlan>
Source§fn check_invariants(&self, check: InvariantLevel) -> Result<(), DataFusionError>
fn check_invariants(&self, check: InvariantLevel) -> Result<(), DataFusionError>
Source§fn expressions(&self) -> Vec<Expr>
fn expressions(&self) -> Vec<Expr>
Source§fn prevent_predicate_push_down_columns(&self) -> HashSet<String>
fn prevent_predicate_push_down_columns(&self) -> HashSet<String>
Source§fn fmt_for_explain(&self, f: &mut Formatter<'_>) -> Result<(), Error>
fn fmt_for_explain(&self, f: &mut Formatter<'_>) -> Result<(), Error>
f for use in explain plan. Read moreSource§fn with_exprs_and_inputs(
&self,
exprs: Vec<Expr>,
inputs: Vec<LogicalPlan>,
) -> Result<Arc<dyn UserDefinedLogicalNode>, DataFusionError>
fn with_exprs_and_inputs( &self, exprs: Vec<Expr>, inputs: Vec<LogicalPlan>, ) -> Result<Arc<dyn UserDefinedLogicalNode>, DataFusionError>
UserDefinedLogicalNode with the specified children
and expressions. This function is used during optimization
when the plan is being rewritten and a new instance of the
UserDefinedLogicalNode must be created. Read moreSource§fn necessary_children_exprs(
&self,
output_columns: &[usize],
) -> Option<Vec<Vec<usize>>>
fn necessary_children_exprs( &self, output_columns: &[usize], ) -> Option<Vec<Vec<usize>>>
Source§fn dyn_eq(&self, other: &dyn UserDefinedLogicalNode) -> bool
fn dyn_eq(&self, other: &dyn UserDefinedLogicalNode) -> bool
Source§fn dyn_ord(&self, other: &dyn UserDefinedLogicalNode) -> Option<Ordering>
fn dyn_ord(&self, other: &dyn UserDefinedLogicalNode) -> Option<Ordering>
other, respecting requirements from PartialOrd.
Must return Some(Equal) if and only if self.dyn_eq(other).Source§fn supports_limit_pushdown(&self) -> bool
fn supports_limit_pushdown(&self) -> bool
true if a limit can be safely pushed down through this
UserDefinedLogicalNode node. Read more