3
3
// Use of this source code is governed by an MIT-style license that can be found in the LICENSE file or at
4
4
// https://opensource.org/licenses/MIT.
5
5
6
- use std:: any:: Any ;
7
6
use std:: collections:: hash_map:: Entry ;
8
7
use std:: collections:: { HashMap , HashSet } ;
9
8
use std:: sync:: Arc ;
@@ -14,8 +13,8 @@ use tracing::trace;
14
13
15
14
use super :: optimizer:: { ExprId , GroupId , PredId } ;
16
15
use crate :: cost:: { Cost , Statistics } ;
16
+ use crate :: logical_property:: { LogicalProperty , LogicalPropertyBuilderAny } ;
17
17
use crate :: nodes:: { ArcPlanNode , ArcPredNode , NodeType , PlanNode , PlanNodeOrGroup } ;
18
- use crate :: property:: PropertyBuilderAny ;
19
18
20
19
pub type ArcMemoPlanNode < T > = Arc < MemoPlanNode < T > > ;
21
20
@@ -89,7 +88,7 @@ pub struct GroupInfo {
89
88
pub struct Group {
90
89
pub ( crate ) group_exprs : HashSet < ExprId > ,
91
90
pub ( crate ) info : GroupInfo ,
92
- pub ( crate ) properties : Arc < [ Box < dyn Any + Send + Sync + ' static > ] > ,
91
+ pub ( crate ) properties : Arc < [ Box < dyn LogicalProperty > ] > ,
93
92
}
94
93
95
94
/// Trait for memo table implementations.
@@ -262,7 +261,7 @@ pub struct NaiveMemo<T: NodeType> {
262
261
263
262
// Internal states.
264
263
group_expr_counter : usize ,
265
- property_builders : Arc < [ Box < dyn PropertyBuilderAny < T > > ] > ,
264
+ property_builders : Arc < [ Box < dyn LogicalPropertyBuilderAny < T > > ] > ,
266
265
267
266
// Indexes.
268
267
expr_node_to_expr_id : HashMap < MemoPlanNode < T > , ExprId > ,
@@ -376,7 +375,7 @@ impl<T: NodeType> Memo<T> for NaiveMemo<T> {
376
375
}
377
376
378
377
impl < T : NodeType > NaiveMemo < T > {
379
- pub fn new ( property_builders : Arc < [ Box < dyn PropertyBuilderAny < T > > ] > ) -> Self {
378
+ pub fn new ( property_builders : Arc < [ Box < dyn LogicalPropertyBuilderAny < T > > ] > ) -> Self {
380
379
Self {
381
380
expr_id_to_group_id : HashMap :: new ( ) ,
382
381
expr_id_to_expr_node : HashMap :: new ( ) ,
@@ -615,10 +614,7 @@ impl<T: NodeType> NaiveMemo<T> {
615
614
( group_id, expr_id)
616
615
}
617
616
618
- fn infer_properties (
619
- & self ,
620
- memo_node : MemoPlanNode < T > ,
621
- ) -> Vec < Box < dyn Any + ' static + Send + Sync > > {
617
+ fn infer_properties ( & self , memo_node : MemoPlanNode < T > ) -> Vec < Box < dyn LogicalProperty > > {
622
618
let child_properties = memo_node
623
619
. children
624
620
. iter ( )
@@ -628,7 +624,7 @@ impl<T: NodeType> NaiveMemo<T> {
628
624
for ( id, builder) in self . property_builders . iter ( ) . enumerate ( ) {
629
625
let child_properties = child_properties
630
626
. iter ( )
631
- . map ( |x| x[ id] . as_ref ( ) as & dyn std :: any :: Any )
627
+ . map ( |x| x[ id] . as_ref ( ) )
632
628
. collect :: < Vec < _ > > ( ) ;
633
629
let child_predicates = memo_node
634
630
. predicates
@@ -678,107 +674,15 @@ impl<T: NodeType> NaiveMemo<T> {
678
674
}
679
675
680
676
#[ cfg( test) ]
681
- mod tests {
682
-
677
+ pub ( crate ) mod tests {
683
678
use super :: * ;
684
679
use crate :: {
685
- nodes:: { PredNode , Value } ,
686
- property:: PropertyBuilder ,
680
+ nodes:: Value ,
681
+ tests:: common:: {
682
+ expr, group, join, list, project, scan, MemoTestRelTyp , TestProp , TestPropertyBuilder ,
683
+ } ,
687
684
} ;
688
685
689
- #[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
690
- enum MemoTestRelTyp {
691
- Join ,
692
- Project ,
693
- Scan ,
694
- }
695
-
696
- #[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
697
- enum MemoTestPredTyp {
698
- List ,
699
- Expr ,
700
- TableName ,
701
- }
702
-
703
- impl std:: fmt:: Display for MemoTestRelTyp {
704
- fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
705
- write ! ( f, "{:?}" , self )
706
- }
707
- }
708
-
709
- impl std:: fmt:: Display for MemoTestPredTyp {
710
- fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
711
- write ! ( f, "{:?}" , self )
712
- }
713
- }
714
-
715
- impl NodeType for MemoTestRelTyp {
716
- type PredType = MemoTestPredTyp ;
717
-
718
- fn is_logical ( & self ) -> bool {
719
- matches ! ( self , Self :: Project | Self :: Scan | Self :: Join )
720
- }
721
- }
722
-
723
- fn join (
724
- left : impl Into < PlanNodeOrGroup < MemoTestRelTyp > > ,
725
- right : impl Into < PlanNodeOrGroup < MemoTestRelTyp > > ,
726
- cond : ArcPredNode < MemoTestRelTyp > ,
727
- ) -> ArcPlanNode < MemoTestRelTyp > {
728
- Arc :: new ( PlanNode {
729
- typ : MemoTestRelTyp :: Join ,
730
- children : vec ! [ left. into( ) , right. into( ) ] ,
731
- predicates : vec ! [ cond] ,
732
- } )
733
- }
734
-
735
- fn scan ( table : & str ) -> ArcPlanNode < MemoTestRelTyp > {
736
- Arc :: new ( PlanNode {
737
- typ : MemoTestRelTyp :: Scan ,
738
- children : vec ! [ ] ,
739
- predicates : vec ! [ table_name( table) ] ,
740
- } )
741
- }
742
-
743
- fn table_name ( table : & str ) -> ArcPredNode < MemoTestRelTyp > {
744
- Arc :: new ( PredNode {
745
- typ : MemoTestPredTyp :: TableName ,
746
- children : vec ! [ ] ,
747
- data : Some ( Value :: String ( table. to_string ( ) . into ( ) ) ) ,
748
- } )
749
- }
750
-
751
- fn project (
752
- input : impl Into < PlanNodeOrGroup < MemoTestRelTyp > > ,
753
- expr_list : ArcPredNode < MemoTestRelTyp > ,
754
- ) -> ArcPlanNode < MemoTestRelTyp > {
755
- Arc :: new ( PlanNode {
756
- typ : MemoTestRelTyp :: Project ,
757
- children : vec ! [ input. into( ) ] ,
758
- predicates : vec ! [ expr_list] ,
759
- } )
760
- }
761
-
762
- fn list ( items : Vec < ArcPredNode < MemoTestRelTyp > > ) -> ArcPredNode < MemoTestRelTyp > {
763
- Arc :: new ( PredNode {
764
- typ : MemoTestPredTyp :: List ,
765
- children : items,
766
- data : None ,
767
- } )
768
- }
769
-
770
- fn expr ( data : Value ) -> ArcPredNode < MemoTestRelTyp > {
771
- Arc :: new ( PredNode {
772
- typ : MemoTestPredTyp :: Expr ,
773
- children : vec ! [ ] ,
774
- data : Some ( data) ,
775
- } )
776
- }
777
-
778
- fn group ( group_id : GroupId ) -> PlanNodeOrGroup < MemoTestRelTyp > {
779
- PlanNodeOrGroup :: Group ( group_id)
780
- }
781
-
782
686
#[ test]
783
687
fn add_predicate ( ) {
784
688
let mut memo = NaiveMemo :: < MemoTestRelTyp > :: new ( Arc :: new ( [ ] ) ) ;
@@ -882,49 +786,8 @@ mod tests {
882
786
assert_eq ! ( memo. get_expr_info( expr1) , memo. get_expr_info( expr2) ) ;
883
787
}
884
788
885
- struct TestPropertyBuilder ;
886
-
887
- #[ derive( Clone , Debug ) ]
888
- struct TestProp ( Vec < String > ) ;
889
- impl std:: fmt:: Display for TestProp {
890
- fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
891
- write ! ( f, "{:?}" , self . 0 )
892
- }
893
- }
894
- impl PropertyBuilder < MemoTestRelTyp > for TestPropertyBuilder {
895
- type Prop = TestProp ;
896
- fn derive (
897
- & self ,
898
- typ : MemoTestRelTyp ,
899
- pred : & [ ArcPredNode < MemoTestRelTyp > ] ,
900
- children : & [ & Self :: Prop ] ,
901
- ) -> Self :: Prop {
902
- match typ {
903
- MemoTestRelTyp :: Join => {
904
- let mut a = children[ 0 ] . 0 . clone ( ) ;
905
- let b = children[ 1 ] . 0 . clone ( ) ;
906
- a. extend ( b) ;
907
- TestProp ( a)
908
- }
909
- MemoTestRelTyp :: Project => {
910
- let preds = & pred[ 0 ] . children ;
911
- TestProp (
912
- preds
913
- . iter ( )
914
- . map ( |x| x. data . as_ref ( ) . unwrap ( ) . as_i64 ( ) . to_string ( ) )
915
- . collect ( ) ,
916
- )
917
- }
918
- MemoTestRelTyp :: Scan => TestProp ( vec ! [ "scan_col" . to_string( ) ] ) ,
919
- }
920
- }
921
- fn property_name ( & self ) -> & ' static str {
922
- "test"
923
- }
924
- }
925
-
926
789
#[ test]
927
- fn logical_property ( ) {
790
+ fn derive_logical_property ( ) {
928
791
let mut memo = NaiveMemo :: new ( Arc :: new ( [ Box :: new ( TestPropertyBuilder ) ] ) ) ;
929
792
let ( group_id, _) = memo. add_new_expr ( join (
930
793
scan ( "t1" ) ,
@@ -937,7 +800,11 @@ mod tests {
937
800
let group = memo. get_group ( group_id) ;
938
801
assert_eq ! ( group. properties. len( ) , 1 ) ;
939
802
assert_eq ! (
940
- group. properties[ 0 ] . downcast_ref:: <TestProp >( ) . unwrap( ) . 0 ,
803
+ group. properties[ 0 ]
804
+ . as_any( )
805
+ . downcast_ref:: <TestProp >( )
806
+ . unwrap( )
807
+ . 0 ,
941
808
vec![ "scan_col" , "1" , "2" ]
942
809
) ;
943
810
}
0 commit comments