use crate::{NetworkBroadcastExec, NetworkCoalesceExec, NetworkShuffleExec, Stage};
use datafusion::physical_plan::ExecutionPlan;
use std::sync::Arc;
pub trait NetworkBoundary: ExecutionPlan {
fn with_input_stage(
&self,
input_stage: Stage,
) -> datafusion::common::Result<Arc<dyn ExecutionPlan>>;
fn input_stage(&self) -> &Stage;
}
pub trait NetworkBoundaryExt {
fn as_network_boundary(&self) -> Option<&dyn NetworkBoundary>;
fn is_network_boundary(&self) -> bool {
self.as_network_boundary().is_some()
}
}
impl NetworkBoundaryExt for dyn ExecutionPlan {
fn as_network_boundary(&self) -> Option<&dyn NetworkBoundary> {
if let Some(node) = self.as_any().downcast_ref::<NetworkShuffleExec>() {
Some(node)
} else if let Some(node) = self.as_any().downcast_ref::<NetworkCoalesceExec>() {
Some(node)
} else if let Some(node) = self.as_any().downcast_ref::<NetworkBroadcastExec>() {
Some(node)
} else {
None
}
}
}