@@ -23,7 +23,7 @@ use datafusion::catalog::TableProvider;
2323use datafusion:: datasource:: provider_as_source;
2424use datafusion:: execution:: context:: SessionState ;
2525use datafusion:: execution:: { SendableRecordBatchStream , TaskContext } ;
26- use datafusion:: physical_expr:: { LexRequirement , PhysicalSortExpr , PhysicalSortRequirement } ;
26+ use datafusion:: physical_expr:: { PhysicalSortExpr , PhysicalSortRequirement } ;
2727use datafusion:: physical_expr_common:: sort_expr:: format_physical_sort_requirement_list;
2828use datafusion:: physical_optimizer:: PhysicalOptimizerRule ;
2929use datafusion:: physical_plan:: { DisplayAs , DisplayFormatType , ExecutionPlan , PlanProperties } ;
@@ -32,6 +32,7 @@ use datafusion_common::tree_node::{Transformed, TreeNode, TreeNodeRecursion, Tre
3232use datafusion_common:: { DataFusionError , Result , TableReference } ;
3333use datafusion_expr:: { Extension , LogicalPlan , UserDefinedLogicalNode , UserDefinedLogicalNodeCore } ;
3434use datafusion_optimizer:: OptimizerRule ;
35+ use datafusion_physical_expr:: OrderingRequirements ;
3536use itertools:: Itertools ;
3637use ordered_float:: OrderedFloat ;
3738
@@ -316,7 +317,7 @@ pub struct OneOfExec {
316317 // Optionally declare a required input ordering
317318 // This will inform DataFusion to add sorts to children,
318319 // which will improve cost estimation of candidates
319- required_input_ordering : Option < LexRequirement > ,
320+ required_input_ordering : Option < OrderingRequirements > ,
320321 // Index of the candidate with the best cost
321322 best : usize ,
322323 // Cost function to use in optimization
@@ -337,7 +338,7 @@ impl OneOfExec {
337338 /// Create a new `OneOfExec`
338339 pub fn try_new (
339340 candidates : Vec < Arc < dyn ExecutionPlan > > ,
340- required_input_ordering : Option < LexRequirement > ,
341+ required_input_ordering : Option < OrderingRequirements > ,
341342 cost : CostFn ,
342343 ) -> Result < Self > {
343344 if candidates. is_empty ( ) {
@@ -366,7 +367,7 @@ impl OneOfExec {
366367
367368 /// Modify this plan's required input ordering.
368369 /// Used for sort pushdown
369- pub fn with_required_input_ordering ( self , requirement : Option < LexRequirement > ) -> Self {
370+ pub fn with_required_input_ordering ( self , requirement : Option < OrderingRequirements > ) -> Self {
370371 Self {
371372 required_input_ordering : requirement,
372373 ..self
@@ -387,7 +388,7 @@ impl ExecutionPlan for OneOfExec {
387388 self . candidates [ self . best ] . properties ( )
388389 }
389390
390- fn required_input_ordering ( & self ) -> Vec < Option < LexRequirement > > {
391+ fn required_input_ordering ( & self ) -> Vec < Option < OrderingRequirements > > {
391392 vec ! [ self . required_input_ordering. clone( ) ; self . children( ) . len( ) ]
392393 }
393394
@@ -455,12 +456,16 @@ impl DisplayAs for OneOfExec {
455456 format_physical_sort_requirement_list(
456457 & self
457458 . required_input_ordering
458- . clone( )
459- . unwrap_or_default( )
460- . into_iter( )
461- . map( PhysicalSortExpr :: from)
462- . map( PhysicalSortRequirement :: from)
463- . collect_vec( )
459+ . as_ref( )
460+ . map( |req| {
461+ req. clone( )
462+ . into_single( )
463+ . into_iter( )
464+ . map( PhysicalSortExpr :: from)
465+ . map( PhysicalSortRequirement :: from)
466+ . collect_vec( )
467+ } )
468+ . unwrap_or_default( ) ,
464469 )
465470 )
466471 }
0 commit comments