Path: blob/main/crates/polars-plan/src/plans/optimizer/delay_rechunk.rs
6940 views
use std::collections::BTreeSet;12use super::*;34#[derive(Default)]5pub(super) struct DelayRechunk {6processed: BTreeSet<usize>,7}89impl DelayRechunk {10pub(super) fn new() -> Self {11Default::default()12}13}1415impl OptimizationRule for DelayRechunk {16fn optimize_plan(17&mut self,18lp_arena: &mut Arena<IR>,19_expr_arena: &mut Arena<AExpr>,20node: Node,21) -> PolarsResult<Option<IR>> {22match lp_arena.get(node) {23// An aggregation can be partitioned, its wasteful to rechunk before that partition.24#[allow(unused_mut)]25IR::GroupBy { input, keys, .. } => {26// Multiple keys on multiple chunks is much slower, so rechunk.27if !self.processed.insert(node.0) || keys.len() > 1 {28return Ok(None);29};3031use IR::*;32let mut input_node = None;33for (node, lp) in lp_arena.iter(*input) {34match lp {35Scan { .. } => {36input_node = Some(node);37break;38},39Union { .. } => {40input_node = Some(node);41break;42},43// don't delay rechunk if there is a join first44Join { .. } => break,45_ => {},46}47}4849if let Some(node) = input_node {50match lp_arena.get_mut(node) {51Scan {52unified_scan_args, ..53} => {54unified_scan_args.rechunk = false;55},56Union { options, .. } => {57options.rechunk = false;58},59_ => unreachable!(),60}61};6263Ok(None)64},65_ => Ok(None),66}67}68}697071