Transforms `expr` by propagating information about monotonicity through operators, using [`mz_repr::optimize::OptimizerFeatures`] from `ctx` and global monotonic ids.
(
&self,
expr: &mut MirRelationExpr,
ctx: &mut TransformCtx,
global_monotonic_ids: &BTreeSet<GlobalId>,
)
| 27 | /// Transforms `expr` by propagating information about monotonicity through operators, |
| 28 | /// using [`mz_repr::optimize::OptimizerFeatures`] from `ctx` and global monotonic ids. |
| 29 | pub fn transform( |
| 30 | &self, |
| 31 | expr: &mut MirRelationExpr, |
| 32 | ctx: &mut TransformCtx, |
| 33 | global_monotonic_ids: &BTreeSet<GlobalId>, |
| 34 | ) -> Result<(), crate::RecursionLimitError> { |
| 35 | let mut builder = DerivedBuilder::new(ctx.features); |
| 36 | builder.require(Monotonic::new(global_monotonic_ids.clone())); |
| 37 | let derived = builder.visit(&*expr); |
| 38 | |
| 39 | let mut todo = vec![(&mut *expr, derived.as_view())]; |
| 40 | while let Some((expr, view)) = todo.pop() { |
| 41 | match expr { |
| 42 | MirRelationExpr::Reduce { monotonic, .. } |
| 43 | | MirRelationExpr::TopK { monotonic, .. } => { |
| 44 | *monotonic = *view |
| 45 | .last_child() |
| 46 | .value::<Monotonic>() |
| 47 | .expect("Monotonic required"); |
| 48 | } |
| 49 | _ => {} |
| 50 | } |
| 51 | todo.extend(expr.children_mut().rev().zip_eq(view.children_rev())) |
| 52 | } |
| 53 | |
| 54 | mz_repr::explain::trace_plan(&*expr); |
| 55 | Ok(()) |
| 56 | } |
| 57 | } |