#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GraphBfsParams {
pub source_vertex: i64,
pub source_vertices: Option<GraphPredicateInput>,
pub depth_limit: Option<i64>,
pub predicates: GraphBfsPredicateInputs,
pub endpoint_policy: GraphBfsEndpointPolicy,
pub path_output: Option<GraphBfsPathOutput>,
}
impl GraphBfsParams {
pub fn new(source_vertex: i64, depth_limit: Option<i64>) -> Self {
Self {
source_vertex,
source_vertices: None,
depth_limit,
predicates: GraphBfsPredicateInputs::default(),
endpoint_policy: GraphBfsEndpointPolicy::Strict,
path_output: None,
}
}
pub(crate) fn side_input_ordinals(&self) -> impl Iterator<Item = usize> + '_ {
self.source_vertices.iter().map(|input| input.input).chain(self.predicates.ordinals())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct GraphBfsPathOutput {
pub max_output_rows: u64,
}
impl GraphBfsPathOutput {
pub const fn new(max_output_rows: u64) -> Self {
Self { max_output_rows }
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GraphBfsEndpointPolicy {
Strict,
EmptyOnMissingPathEndpoint,
}
impl GraphBfsEndpointPolicy {
pub const fn as_str(self) -> &'static str {
match self {
Self::Strict => "strict",
Self::EmptyOnMissingPathEndpoint => "empty_on_missing_path_endpoint",
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct GraphBfsPredicateInputs {
pub include_vertices: Option<GraphPredicateInput>,
pub exclude_vertices: Option<GraphPredicateInput>,
pub target_vertices: Option<GraphPredicateInput>,
pub include_edge_ids: Option<GraphPredicateInput>,
pub include_edges: Option<GraphEdgePredicateInput>,
}
impl GraphBfsPredicateInputs {
pub(crate) fn ordinals(&self) -> impl Iterator<Item = usize> + '_ {
self.include_vertices
.iter()
.map(|input| input.input)
.chain(self.exclude_vertices.iter().map(|input| input.input))
.chain(self.target_vertices.iter().map(|input| input.input))
.chain(self.include_edge_ids.iter().map(|input| input.input))
.chain(self.include_edges.iter().map(|input| input.input))
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GraphPredicateInput {
pub input: usize,
pub column: String,
}
impl GraphPredicateInput {
pub fn new(input: usize, column: impl Into<String>) -> Self {
Self { input, column: column.into() }
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GraphEdgePredicateInput {
pub input: usize,
pub source: String,
pub destination: String,
pub edge_id: Option<String>,
}
impl GraphEdgePredicateInput {
pub fn new(
input: usize,
source: impl Into<String>,
destination: impl Into<String>,
edge_id: Option<impl Into<String>>,
) -> Self {
Self { input, source: source.into(), destination: destination.into(), edge_id: edge_id.map(Into::into) }
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct GraphSsspParams {
pub source_vertex: GraphSsspSource,
pub cutoff: Option<f64>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum GraphSsspSource {
I64(i64),
Input(GraphPredicateInput),
}
impl std::fmt::Display for GraphSsspSource {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::I64(value) => write!(formatter, "{value}"),
Self::Input(input) => write!(formatter, "input:{}:{}", input.input, input.column),
}
}
}
impl GraphSsspParams {
pub(crate) fn side_input_ordinals(&self) -> impl Iterator<Item = usize> + '_ {
match &self.source_vertex {
GraphSsspSource::I64(_) => None,
GraphSsspSource::Input(input) => Some(input.input),
}
.into_iter()
}
}