1
- use std:: collections:: hash_map:: Entry ;
2
- use std:: collections:: { HashMap , HashSet , VecDeque } ;
3
-
4
- use async_recursion:: async_recursion;
5
-
6
- use crate :: cir:: Child ;
7
-
8
- use super :: Memoize ;
9
1
use super :: merge_repr:: Representative ;
10
2
use super :: * ;
3
+ use crate :: core:: cir:: Child ;
4
+ use async_recursion:: async_recursion;
5
+ use std:: collections:: hash_map:: Entry ;
6
+ use std:: collections:: { HashMap , HashSet , VecDeque } ;
11
7
12
8
/// An in-memory implementation of the memo table.
13
9
#[ derive( Default ) ]
@@ -347,7 +343,7 @@ impl Memoize for MemoryMemo {
347
343
. transform_dependency
348
344
. get ( & logical_expr_id)
349
345
. and_then ( |status_map| status_map. get ( rule) )
350
- . map ( |dep| dep. status . clone ( ) )
346
+ . map ( |dep| dep. status )
351
347
. unwrap_or ( Status :: Dirty ) ;
352
348
Ok ( status)
353
349
}
@@ -386,7 +382,7 @@ impl Memoize for MemoryMemo {
386
382
. implement_dependency
387
383
. get ( & logical_expr_id)
388
384
. and_then ( |status_map| status_map. get ( & ( goal_id, rule. clone ( ) ) ) )
389
- . map ( |dep| dep. status . clone ( ) )
385
+ . map ( |dep| dep. status )
390
386
. unwrap_or ( Status :: Dirty ) ;
391
387
Ok ( status)
392
388
}
@@ -422,7 +418,7 @@ impl Memoize for MemoryMemo {
422
418
let status = self
423
419
. cost_dependency
424
420
. get ( & physical_expr_id)
425
- . map ( |dep| dep. status . clone ( ) )
421
+ . map ( |dep| dep. status )
426
422
. unwrap_or ( Status :: Dirty ) ;
427
423
Ok ( status)
428
424
}
@@ -573,14 +569,14 @@ impl Memoize for MemoryMemo {
573
569
match child {
574
570
Child :: Singleton ( group_id) => {
575
571
self . group_dependent_logical_exprs
576
- . entry ( group_id. clone ( ) )
572
+ . entry ( * group_id)
577
573
. or_default ( )
578
574
. insert ( logical_expr_id) ;
579
575
}
580
576
Child :: VarLength ( group_ids) => {
581
577
for group_id in group_ids. iter ( ) {
582
578
self . group_dependent_logical_exprs
583
- . entry ( group_id. clone ( ) )
579
+ . entry ( * group_id)
584
580
. or_default ( )
585
581
. insert ( logical_expr_id) ;
586
582
}
@@ -624,7 +620,7 @@ impl Memoize for MemoryMemo {
624
620
Child :: Singleton ( goal_member_id) => {
625
621
if let GoalMemberId :: GoalId ( goal_id) = goal_member_id {
626
622
self . goal_dependent_physical_exprs
627
- . entry ( goal_id. clone ( ) )
623
+ . entry ( * goal_id)
628
624
. or_default ( )
629
625
. insert ( physical_expr_id) ;
630
626
}
@@ -634,13 +630,13 @@ impl Memoize for MemoryMemo {
634
630
match goal_member_id {
635
631
GoalMemberId :: GoalId ( goal_id) => {
636
632
self . goal_dependent_physical_exprs
637
- . entry ( goal_id. clone ( ) )
633
+ . entry ( * goal_id)
638
634
. or_default ( )
639
635
. insert ( physical_expr_id) ;
640
636
}
641
637
GoalMemberId :: PhysicalExpressionId ( child_physical_expr_id) => {
642
638
self . physical_expr_dependent_physical_exprs
643
- . entry ( child_physical_expr_id. clone ( ) )
639
+ . entry ( * child_physical_expr_id)
644
640
. or_default ( )
645
641
. insert ( physical_expr_id) ;
646
642
}
@@ -703,17 +699,16 @@ impl MemoryMemo {
703
699
for child in repr_logical_expr. children . iter ( ) {
704
700
match child {
705
701
Child :: Singleton ( group_id) => {
706
- let repr_group_id = self . find_repr_group ( group_id. clone ( ) ) . await ?;
702
+ let repr_group_id = self . find_repr_group ( * group_id) . await ?;
707
703
new_children. push ( Child :: Singleton ( repr_group_id) ) ;
708
704
}
709
705
Child :: VarLength ( group_ids) => {
710
706
let new_group_ids = group_ids
711
707
. iter ( )
712
708
. map ( |group_id| {
713
- let group_id = group_id. clone ( ) ;
714
709
let self_ref = & self ;
715
710
// TODO(Sarvesh): this is a hack to get the repr group id, i'm sure there's a better way to do this.
716
- async move { self_ref. find_repr_group ( group_id) . await }
711
+ async move { self_ref. find_repr_group ( * group_id) . await }
717
712
} )
718
713
. collect :: < Vec < _ > > ( ) ;
719
714
@@ -742,24 +737,23 @@ impl MemoryMemo {
742
737
match child {
743
738
Child :: Singleton ( goal_member_id) => {
744
739
if let GoalMemberId :: GoalId ( goal_id) = goal_member_id {
745
- let repr_goal_id = self . find_repr_goal ( goal_id. clone ( ) ) . await ?;
740
+ let repr_goal_id = self . find_repr_goal ( * goal_id) . await ?;
746
741
new_children. push ( Child :: Singleton ( GoalMemberId :: GoalId ( repr_goal_id) ) ) ;
747
742
} else {
748
- new_children. push ( Child :: Singleton ( goal_member_id. clone ( ) ) ) ;
743
+ new_children. push ( Child :: Singleton ( * goal_member_id) ) ;
749
744
}
750
745
}
751
746
Child :: VarLength ( goal_member_ids) => {
752
747
let mut new_goal_member_ids = Vec :: new ( ) ;
753
748
for goal_member_id in goal_member_ids. iter ( ) {
754
749
match goal_member_id {
755
750
GoalMemberId :: GoalId ( goal_id) => {
756
- let repr_goal_id = self . find_repr_goal ( goal_id. clone ( ) ) . await ?;
751
+ let repr_goal_id = self . find_repr_goal ( * goal_id) . await ?;
757
752
new_goal_member_ids. push ( GoalMemberId :: GoalId ( repr_goal_id) ) ;
758
753
}
759
754
GoalMemberId :: PhysicalExpressionId ( physical_expr_id) => {
760
- let repr_physical_expr_id = self
761
- . find_repr_physical_expr ( physical_expr_id. clone ( ) )
762
- . await ?;
755
+ let repr_physical_expr_id =
756
+ self . find_repr_physical_expr ( * physical_expr_id) . await ?;
763
757
new_goal_member_ids. push ( GoalMemberId :: PhysicalExpressionId (
764
758
repr_physical_expr_id,
765
759
) ) ;
@@ -780,7 +774,7 @@ impl MemoryMemo {
780
774
& mut self ,
781
775
physical_expr_id : PhysicalExpressionId ,
782
776
) -> MemoizeResult < Vec < MergePhysicalExprResult > > {
783
- let ( physical_expr, cost ) = self . physical_exprs . get ( & physical_expr_id) . unwrap ( ) ;
777
+ let ( physical_expr, _cost ) = self . physical_exprs . get ( & physical_expr_id) . unwrap ( ) ;
784
778
let repr_physical_expr = self
785
779
. create_repr_physical_expr ( physical_expr. clone ( ) )
786
780
. await ?;
@@ -796,7 +790,7 @@ impl MemoryMemo {
796
790
let mut results = Vec :: new ( ) ;
797
791
results. push ( MergePhysicalExprResult {
798
792
repr_physical_expr : repr_physical_expr_id,
799
- stale_physical_exprs : stale_physical_exprs ,
793
+ stale_physical_exprs,
800
794
} ) ;
801
795
802
796
let dependent_physical_exprs = self
@@ -808,7 +802,7 @@ impl MemoryMemo {
808
802
for dependent_physical_expr_id in dependent_physical_exprs {
809
803
// TODO(Sarvesh): handle async recursion
810
804
let merge_physical_expr_result = self
811
- . merge_physical_exprs ( dependent_physical_expr_id. clone ( ) )
805
+ . merge_physical_exprs ( dependent_physical_expr_id)
812
806
. await ?;
813
807
results. extend ( merge_physical_expr_result) ;
814
808
}
@@ -825,8 +819,6 @@ impl MemoryMemo {
825
819
) -> MemoizeResult < ( MergeGoalResult , Vec < MergePhysicalExprResult > ) > {
826
820
let goal_2 = self . goals . remove ( & goal_id2) . unwrap ( ) ;
827
821
let goal_1 = self . goals . get ( & goal_id1) . unwrap ( ) ;
828
- let goal_1_props = & goal_1. goal . 1 ;
829
- let goal_2_props = & goal_2. goal . 1 ;
830
822
self . repr_goal . merge ( & goal_id2, & goal_id1) ;
831
823
832
824
let mut merged_goal_result = MergeGoalResult {
@@ -855,8 +847,8 @@ impl MemoryMemo {
855
847
merged_goal_result. best_expr = Some ( best_expr) ;
856
848
}
857
849
858
- let mut merged_goal_info_1 = MergedGoalInfo {
859
- goal_id : goal_id1. clone ( ) ,
850
+ let merged_goal_info_1 = MergedGoalInfo {
851
+ goal_id : goal_id1,
860
852
members : goal_1. members . iter ( ) . cloned ( ) . collect ( ) ,
861
853
seen_best_expr_before_merge : {
862
854
if let Some ( best_expr_goal1) = best_expr_goal1 {
@@ -874,8 +866,8 @@ impl MemoryMemo {
874
866
} ,
875
867
} ;
876
868
877
- let mut merged_goal_info_2 = MergedGoalInfo {
878
- goal_id : goal_id2. clone ( ) ,
869
+ let merged_goal_info_2 = MergedGoalInfo {
870
+ goal_id : goal_id2,
879
871
members : goal_2. members . iter ( ) . cloned ( ) . collect ( ) ,
880
872
seen_best_expr_before_merge : {
881
873
if let Some ( best_expr_goal2) = best_expr_goal2 {
@@ -895,10 +887,10 @@ impl MemoryMemo {
895
887
896
888
merged_goal_result
897
889
. merged_goals
898
- . insert ( goal_id1. clone ( ) , merged_goal_info_1) ;
890
+ . insert ( goal_id1, merged_goal_info_1) ;
899
891
merged_goal_result
900
892
. merged_goals
901
- . insert ( goal_id2. clone ( ) , merged_goal_info_2) ;
893
+ . insert ( goal_id2, merged_goal_info_2) ;
902
894
903
895
// Now, we need to update all the physical exprs that depend on goal 2 to now depend on goal 1.
904
896
let goal_2_dependent_physical_exprs = self
@@ -966,14 +958,13 @@ impl MemoryMemo {
966
958
967
959
for goal_id1 in group_1_goals. iter ( ) {
968
960
for goal_id2 in group_2_goals. iter ( ) {
969
- let goal_1 = self . goals . get ( & goal_id1) . unwrap ( ) ;
970
- let goal_2 = self . goals . get ( & goal_id2) . unwrap ( ) ;
961
+ let goal_1 = self . goals . get ( goal_id1) . unwrap ( ) ;
962
+ let goal_2 = self . goals . get ( goal_id2) . unwrap ( ) ;
971
963
let goal_1_props = & goal_1. goal . 1 ;
972
964
let goal_2_props = & goal_2. goal . 1 ;
973
965
if goal_1_props == goal_2_props {
974
- let ( merged_goal_result, merge_physical_expr_results) = self
975
- . merge_goals_helper ( goal_id1. clone ( ) , goal_id2. clone ( ) )
976
- . await ?;
966
+ let ( merged_goal_result, merge_physical_expr_results) =
967
+ self . merge_goals_helper ( * goal_id1, * goal_id2) . await ?;
977
968
result. goal_merges . push ( merged_goal_result) ;
978
969
result
979
970
. physical_expr_merges
@@ -995,7 +986,7 @@ impl MemoryMemo {
995
986
let repr_logical_expr_id = self . get_logical_expr_id ( & repr_logical_expr) . await ?;
996
987
// merge the logical exprs
997
988
self . repr_logical_expr
998
- . merge ( & logical_expr_id, & repr_logical_expr_id) ;
989
+ . merge ( logical_expr_id, & repr_logical_expr_id) ;
999
990
1000
991
let parent_group_id = self . logical_expr_group_index . get ( logical_expr_id) . unwrap ( ) ;
1001
992
let parent_group_state = self . groups . get_mut ( parent_group_id) . unwrap ( ) ;
@@ -1012,7 +1003,7 @@ impl MemoryMemo {
1012
1003
// we have another merge to do
1013
1004
// do a cascading merge between repr_parent_group_id and parent_group_id
1014
1005
let merge_result = self
1015
- . merge_groups_helper ( repr_parent_group_id. clone ( ) , parent_group_id. clone ( ) )
1006
+ . merge_groups_helper ( * repr_parent_group_id, * parent_group_id)
1016
1007
. await ?;
1017
1008
// merge the cascading merge result with the current result.
1018
1009
if let Some ( merge_result) = merge_result {
@@ -1031,7 +1022,7 @@ impl MemoryMemo {
1031
1022
. insert ( repr_logical_expr_id) ;
1032
1023
// we update the index
1033
1024
self . logical_expr_group_index
1034
- . insert ( repr_logical_expr_id, parent_group_id. clone ( ) ) ;
1025
+ . insert ( repr_logical_expr_id, * parent_group_id) ;
1035
1026
}
1036
1027
}
1037
1028
0 commit comments