@@ -9,8 +9,11 @@ use cost::{
9
9
} ;
10
10
use optd_core:: {
11
11
cascades:: { CascadesOptimizer , GroupId , OptimizerProperties } ,
12
+ heuristics:: { ApplyOrder , HeuristicsOptimizer } ,
13
+ optimizer:: Optimizer ,
14
+ property:: PropertyBuilderAny ,
12
15
rel_node:: RelNodeMetaMap ,
13
- rules:: RuleWrapper ,
16
+ rules:: { Rule , RuleWrapper } ,
14
17
} ;
15
18
16
19
use plan_nodes:: { OptRelNodeRef , OptRelNodeTyp } ;
@@ -33,9 +36,11 @@ pub mod properties;
33
36
pub mod rules;
34
37
35
38
pub struct DatafusionOptimizer {
36
- optimizer : CascadesOptimizer < OptRelNodeTyp > ,
39
+ hueristic_optimizer : HeuristicsOptimizer < OptRelNodeTyp > ,
40
+ cascades_optimizer : CascadesOptimizer < OptRelNodeTyp > ,
37
41
pub runtime_statistics : RuntimeAdaptionStorage ,
38
42
enable_adaptive : bool ,
43
+ enable_heuristic : bool ,
39
44
}
40
45
41
46
impl DatafusionOptimizer {
@@ -47,26 +52,43 @@ impl DatafusionOptimizer {
47
52
self . enable_adaptive
48
53
}
49
54
50
- pub fn optd_optimizer ( & self ) -> & CascadesOptimizer < OptRelNodeTyp > {
51
- & self . optimizer
55
+ pub fn enable_heuristic ( & mut self , enable : bool ) {
56
+ self . enable_heuristic = enable;
57
+ }
58
+
59
+ pub fn is_heuristic_enabled ( & self ) -> bool {
60
+ self . enable_heuristic
61
+ }
62
+
63
+ pub fn optd_cascades_optimizer ( & self ) -> & CascadesOptimizer < OptRelNodeTyp > {
64
+ & self . cascades_optimizer
65
+ }
66
+
67
+ pub fn optd_hueristic_optimizer ( & self ) -> & HeuristicsOptimizer < OptRelNodeTyp > {
68
+ & self . hueristic_optimizer
52
69
}
53
70
54
71
pub fn optd_optimizer_mut ( & mut self ) -> & mut CascadesOptimizer < OptRelNodeTyp > {
55
- & mut self . optimizer
72
+ & mut self . cascades_optimizer
56
73
}
57
74
58
- pub fn default_rules ( ) -> Vec < Arc < RuleWrapper < OptRelNodeTyp , CascadesOptimizer < OptRelNodeTyp > > > >
59
- {
75
+ pub fn default_heuristic_rules (
76
+ ) -> Vec < Arc < dyn Rule < OptRelNodeTyp , HeuristicsOptimizer < OptRelNodeTyp > > > > {
77
+ vec ! [
78
+ Arc :: new( SimplifyFilterRule :: new( ) ) ,
79
+ Arc :: new( SimplifyJoinCondRule :: new( ) ) ,
80
+ Arc :: new( EliminateFilterRule :: new( ) ) ,
81
+ Arc :: new( EliminateJoinRule :: new( ) ) ,
82
+ Arc :: new( EliminateLimitRule :: new( ) ) ,
83
+ Arc :: new( EliminateDuplicatedSortExprRule :: new( ) ) ,
84
+ Arc :: new( EliminateDuplicatedAggExprRule :: new( ) ) ,
85
+ ]
86
+ }
87
+
88
+ pub fn default_cascades_rules (
89
+ ) -> Vec < Arc < RuleWrapper < OptRelNodeTyp , CascadesOptimizer < OptRelNodeTyp > > > > {
60
90
let rules = PhysicalConversionRule :: all_conversions ( ) ;
61
- let mut rule_wrappers = vec ! [
62
- RuleWrapper :: new_heuristic( Arc :: new( SimplifyFilterRule :: new( ) ) ) ,
63
- RuleWrapper :: new_heuristic( Arc :: new( SimplifyJoinCondRule :: new( ) ) ) ,
64
- RuleWrapper :: new_heuristic( Arc :: new( EliminateFilterRule :: new( ) ) ) ,
65
- RuleWrapper :: new_heuristic( Arc :: new( EliminateJoinRule :: new( ) ) ) ,
66
- RuleWrapper :: new_heuristic( Arc :: new( EliminateLimitRule :: new( ) ) ) ,
67
- RuleWrapper :: new_heuristic( Arc :: new( EliminateDuplicatedSortExprRule :: new( ) ) ) ,
68
- RuleWrapper :: new_heuristic( Arc :: new( EliminateDuplicatedAggExprRule :: new( ) ) ) ,
69
- ] ;
91
+ let mut rule_wrappers = vec ! [ ] ;
70
92
for rule in rules {
71
93
rule_wrappers. push ( RuleWrapper :: new_cascades ( rule) ) ;
72
94
}
@@ -86,23 +108,34 @@ impl DatafusionOptimizer {
86
108
stats : DataFusionBaseTableStats ,
87
109
enable_adaptive : bool ,
88
110
) -> Self {
89
- let rules = Self :: default_rules ( ) ;
111
+ let cascades_rules = Self :: default_cascades_rules ( ) ;
112
+ let heuristic_rules = Self :: default_heuristic_rules ( ) ;
113
+ let property_builders: Arc < [ Box < dyn PropertyBuilderAny < OptRelNodeTyp > > ] > = Arc :: new ( [
114
+ Box :: new ( SchemaPropertyBuilder :: new ( catalog. clone ( ) ) ) ,
115
+ Box :: new ( ColumnRefPropertyBuilder :: new ( catalog. clone ( ) ) ) ,
116
+ ] ) ;
90
117
let cost_model = AdaptiveCostModel :: new ( DEFAULT_DECAY , stats) ;
91
118
Self {
92
119
runtime_statistics : cost_model. get_runtime_map ( ) ,
93
- optimizer : CascadesOptimizer :: new_with_prop (
94
- rules ,
120
+ cascades_optimizer : CascadesOptimizer :: new_with_prop (
121
+ cascades_rules ,
95
122
Box :: new ( cost_model) ,
96
123
vec ! [
97
124
Box :: new( SchemaPropertyBuilder :: new( catalog. clone( ) ) ) ,
98
- Box :: new( ColumnRefPropertyBuilder :: new( catalog) ) ,
125
+ Box :: new( ColumnRefPropertyBuilder :: new( catalog. clone ( ) ) ) ,
99
126
] ,
100
127
OptimizerProperties {
101
128
partial_explore_iter : Some ( 1 << 20 ) ,
102
129
partial_explore_space : Some ( 1 << 10 ) ,
103
130
} ,
104
131
) ,
132
+ hueristic_optimizer : HeuristicsOptimizer :: new_with_rules (
133
+ heuristic_rules,
134
+ ApplyOrder :: BottomUp ,
135
+ property_builders. clone ( ) ,
136
+ ) ,
105
137
enable_adaptive,
138
+ enable_heuristic : true ,
106
139
}
107
140
}
108
141
@@ -140,31 +173,45 @@ impl DatafusionOptimizer {
140
173
) ;
141
174
Self {
142
175
runtime_statistics,
143
- optimizer,
176
+ cascades_optimizer : optimizer,
144
177
enable_adaptive : true ,
178
+ enable_heuristic : false ,
179
+ hueristic_optimizer : HeuristicsOptimizer :: new_with_rules (
180
+ vec ! [ ] ,
181
+ ApplyOrder :: BottomUp ,
182
+ Arc :: new ( [ ] ) ,
183
+ ) ,
145
184
}
146
185
}
147
186
148
- pub fn optimize (
187
+ pub fn heuristic_optimize ( & mut self , root_rel : OptRelNodeRef ) -> OptRelNodeRef {
188
+ self . hueristic_optimizer
189
+ . optimize ( root_rel)
190
+ . expect ( "heuristics returns error" )
191
+ }
192
+
193
+ pub fn cascades_optimize (
149
194
& mut self ,
150
195
root_rel : OptRelNodeRef ,
151
196
) -> Result < ( GroupId , OptRelNodeRef , RelNodeMetaMap ) > {
152
197
if self . enable_adaptive {
153
198
self . runtime_statistics . lock ( ) . unwrap ( ) . iter_cnt += 1 ;
154
- self . optimizer . step_clear_winner ( ) ;
199
+ self . cascades_optimizer . step_clear_winner ( ) ;
155
200
} else {
156
- self . optimizer . step_clear ( ) ;
201
+ self . cascades_optimizer . step_clear ( ) ;
157
202
}
158
203
159
- let group_id = self . optimizer . step_optimize_rel ( root_rel) ?;
204
+ let group_id = self . cascades_optimizer . step_optimize_rel ( root_rel) ?;
160
205
161
206
let mut meta = Some ( HashMap :: new ( ) ) ;
162
- let optimized_rel = self . optimizer . step_get_optimize_rel ( group_id, & mut meta) ?;
207
+ let optimized_rel = self
208
+ . cascades_optimizer
209
+ . step_get_optimize_rel ( group_id, & mut meta) ?;
163
210
164
211
Ok ( ( group_id, optimized_rel, meta. unwrap ( ) ) )
165
212
}
166
213
167
214
pub fn dump ( & self , group_id : Option < GroupId > ) {
168
- self . optimizer . dump ( group_id)
215
+ self . cascades_optimizer . dump ( group_id)
169
216
}
170
217
}
0 commit comments