use std::sync::Arc; use async_trait::async_trait; use datafusion::logical_expr::LogicalPlan; use datafusion::physical_plan::ExecutionPlan; use datafusion::physical_planner::ExtensionPlanner; use super::session::SessionCtx; use crate::QueryResult; #[async_trait] pub trait PhysicalPlanner { /// Given a `LogicalPlan`, create an `ExecutionPlan` suitable for execution async fn create_physical_plan( &self, logical_plan: &LogicalPlan, session_state: &SessionCtx, ) -> QueryResult>; fn inject_physical_transform_rule(&mut self, rule: Arc); }