@@ -185,39 +185,11 @@ pub struct Optimizer {
185
185
pub rules : Vec < Arc < dyn OptimizerRule + Send + Sync > > ,
186
186
}
187
187
188
- /// If a rule is with `ApplyOrder`, it means the optimizer will handle
189
- /// recursion. If it is `None` the rule must handle any required recursion
188
+ /// Specifies how recursion for an `OptimizerRule` should be handled.
190
189
///
191
- /// Notice: **sometime** result after optimize still can be optimized, we need
192
- /// apply again.
193
- ///
194
- /// Usage Example: Merge Limit (subtree pattern is: Limit-Limit)
195
- /// ```rust
196
- /// use datafusion_expr::{Limit, LogicalPlan, LogicalPlanBuilder};
197
- /// use datafusion_common::Result;
198
- /// fn merge_limit(parent: &Limit, child: &Limit) -> LogicalPlan {
199
- /// // just for run
200
- /// return parent.input.as_ref().clone();
201
- /// }
202
- /// fn try_optimize(plan: &LogicalPlan) -> Result<Option<LogicalPlan>> {
203
- /// match plan {
204
- /// LogicalPlan::Limit(limit) => match limit.input.as_ref() {
205
- /// LogicalPlan::Limit(child_limit) => {
206
- /// // merge limit ...
207
- /// let optimized_plan = merge_limit(limit, child_limit);
208
- /// // due to optimized_plan may be optimized again,
209
- /// // for example: plan is Limit-Limit-Limit
210
- /// Ok(Some(
211
- /// try_optimize(&optimized_plan)?
212
- /// .unwrap_or_else(|| optimized_plan.clone()),
213
- /// ))
214
- /// }
215
- /// _ => Ok(None),
216
- /// },
217
- /// _ => Ok(None),
218
- /// }
219
- /// }
220
- /// ```
190
+ /// If an `OptimizerRule` returns `Some` from `apply_order`, it means the
191
+ /// optimizer will handle recursively applying the rule to the plan. If the
192
+ /// apply order is `None`, the rule must handle any required recursion itself.
221
193
#[ derive( Debug , Clone , Copy , PartialEq ) ]
222
194
pub enum ApplyOrder {
223
195
TopDown ,
0 commit comments