1818//! Converts Spark physical plan to DataFusion physical plan
1919
2020pub mod expression_registry;
21- pub mod traits;
21+ pub mod macros;
22+ pub mod operator_registry;
2223
2324use crate :: execution:: operators:: IcebergScanExec ;
2425use crate :: {
@@ -27,6 +28,7 @@ use crate::{
2728 expressions:: subquery:: Subquery ,
2829 operators:: { ExecutionError , ExpandExec , ParquetWriterExec , ScanExec } ,
2930 planner:: expression_registry:: ExpressionRegistry ,
31+ planner:: operator_registry:: OperatorRegistry ,
3032 serde:: to_arrow_datatype,
3133 shuffle:: ShuffleWriterExec ,
3234 } ,
@@ -861,29 +863,19 @@ impl PhysicalPlanner {
861863 inputs : & mut Vec < Arc < GlobalRef > > ,
862864 partition_count : usize ,
863865 ) -> Result < ( Vec < ScanExec > , Arc < SparkPlan > ) , ExecutionError > {
866+ // Try to use the modular registry first - this automatically handles any registered operator types
867+ if OperatorRegistry :: global ( ) . can_handle ( spark_plan) {
868+ return OperatorRegistry :: global ( ) . create_plan (
869+ spark_plan,
870+ inputs,
871+ partition_count,
872+ self ,
873+ ) ;
874+ }
875+
876+ // Fall back to the original monolithic match for other operators
864877 let children = & spark_plan. children ;
865878 match spark_plan. op_struct . as_ref ( ) . unwrap ( ) {
866- OpStruct :: Projection ( project) => {
867- assert_eq ! ( children. len( ) , 1 ) ;
868- let ( scans, child) = self . create_plan ( & children[ 0 ] , inputs, partition_count) ?;
869- let exprs: PhyExprResult = project
870- . project_list
871- . iter ( )
872- . enumerate ( )
873- . map ( |( idx, expr) | {
874- self . create_expr ( expr, child. schema ( ) )
875- . map ( |r| ( r, format ! ( "col_{idx}" ) ) )
876- } )
877- . collect ( ) ;
878- let projection = Arc :: new ( ProjectionExec :: try_new (
879- exprs?,
880- Arc :: clone ( & child. native_plan ) ,
881- ) ?) ;
882- Ok ( (
883- scans,
884- Arc :: new ( SparkPlan :: new ( spark_plan. plan_id , projection, vec ! [ child] ) ) ,
885- ) )
886- }
887879 OpStruct :: Filter ( filter) => {
888880 assert_eq ! ( children. len( ) , 1 ) ;
889881 let ( scans, child) = self . create_plan ( & children[ 0 ] , inputs, partition_count) ?;
@@ -1634,6 +1626,10 @@ impl PhysicalPlanner {
16341626 Arc :: new ( SparkPlan :: new ( spark_plan. plan_id , window_agg, vec ! [ child] ) ) ,
16351627 ) )
16361628 }
1629+ _ => Err ( GeneralError ( format ! (
1630+ "Unsupported or unregistered operator type: {:?}" ,
1631+ spark_plan. op_struct
1632+ ) ) ) ,
16371633 }
16381634 }
16391635
0 commit comments