1818//! [`EliminateJoin`] rewrites `INNER JOIN` with `true`/`null`
1919use crate :: optimizer:: ApplyOrder ;
2020use crate :: { OptimizerConfig , OptimizerRule } ;
21- use datafusion_common:: { Result , ScalarValue } ;
21+ use datafusion_common:: tree_node:: Transformed ;
22+ use datafusion_common:: { internal_err, Result , ScalarValue } ;
2223use datafusion_expr:: JoinType :: Inner ;
2324use datafusion_expr:: {
2425 logical_plan:: { EmptyRelation , LogicalPlan } ,
@@ -39,38 +40,50 @@ impl EliminateJoin {
3940impl OptimizerRule for EliminateJoin {
4041 fn try_optimize (
4142 & self ,
42- plan : & LogicalPlan ,
43+ _plan : & LogicalPlan ,
4344 _config : & dyn OptimizerConfig ,
4445 ) -> Result < Option < LogicalPlan > > {
46+ internal_err ! ( "Should have called EliminateJoin::rewrite" )
47+ }
48+
49+ fn name ( & self ) -> & str {
50+ "eliminate_join"
51+ }
52+
53+ fn apply_order ( & self ) -> Option < ApplyOrder > {
54+ Some ( ApplyOrder :: TopDown )
55+ }
56+
57+ fn rewrite (
58+ & self ,
59+ plan : LogicalPlan ,
60+ _config : & dyn OptimizerConfig ,
61+ ) -> Result < Transformed < LogicalPlan > > {
4562 match plan {
4663 LogicalPlan :: Join ( join) if join. join_type == Inner && join. on . is_empty ( ) => {
4764 match join. filter {
4865 Some ( Expr :: Literal ( ScalarValue :: Boolean ( Some ( true ) ) ) ) => {
49- Ok ( Some ( LogicalPlan :: CrossJoin ( CrossJoin {
50- left : join. left . clone ( ) ,
51- right : join. right . clone ( ) ,
52- schema : join. schema . clone ( ) ,
66+ Ok ( Transformed :: yes ( LogicalPlan :: CrossJoin ( CrossJoin {
67+ left : join. left ,
68+ right : join. right ,
69+ schema : join. schema ,
5370 } ) ) )
5471 }
55- Some ( Expr :: Literal ( ScalarValue :: Boolean ( Some ( false ) ) ) ) => {
56- Ok ( Some ( LogicalPlan :: EmptyRelation ( EmptyRelation {
72+ Some ( Expr :: Literal ( ScalarValue :: Boolean ( Some ( false ) ) ) ) => Ok (
73+ Transformed :: yes ( LogicalPlan :: EmptyRelation ( EmptyRelation {
5774 produce_one_row : false ,
58- schema : join. schema . clone ( ) ,
59- } ) ) )
60- }
61- _ => Ok ( None ) ,
75+ schema : join. schema ,
76+ } ) ) ,
77+ ) ,
78+ _ => Ok ( Transformed :: no ( LogicalPlan :: Join ( join ) ) ) ,
6279 }
6380 }
64- _ => Ok ( None ) ,
81+ _ => Ok ( Transformed :: no ( plan ) ) ,
6582 }
6683 }
6784
68- fn name ( & self ) -> & str {
69- "eliminate_join"
70- }
71-
72- fn apply_order ( & self ) -> Option < ApplyOrder > {
73- Some ( ApplyOrder :: TopDown )
85+ fn supports_rewrite ( & self ) -> bool {
86+ true
7487 }
7588}
7689
0 commit comments