Path: blob/main/crates/polars-plan/src/plans/optimizer/flatten_union.rs
6940 views
use IR::*;1use polars_core::error::PolarsResult;2use polars_utils::arena::{Arena, Node};34use super::OptimizationRule;5use crate::prelude::IR;67pub struct FlattenUnionRule {}89fn get_union_inputs(node: Node, lp_arena: &Arena<IR>) -> Option<&[Node]> {10match lp_arena.get(node) {11IR::Union { inputs, .. } => Some(inputs),12_ => None,13}14}1516impl OptimizationRule for FlattenUnionRule {17fn optimize_plan(18&mut self,19lp_arena: &mut polars_utils::arena::Arena<IR>,20_expr_arena: &mut polars_utils::arena::Arena<crate::prelude::AExpr>,21node: polars_utils::arena::Node,22) -> PolarsResult<Option<IR>> {23let lp = lp_arena.get(node);2425match lp {26Union { inputs, options }27if inputs.iter().any(|node| match lp_arena.get(*node) {28Union { options, .. } => !options.flattened_by_opt,29_ => false,30}) =>31{32let mut new_inputs = Vec::with_capacity(inputs.len() * 2);33let mut options = *options;3435for node in inputs {36match get_union_inputs(*node, lp_arena) {37Some(inp) => new_inputs.extend_from_slice(inp),38None => new_inputs.push(*node),39}40}41options.flattened_by_opt = true;4243Ok(Some(Union {44inputs: new_inputs,45options,46}))47},48_ => Ok(None),49}50}51}525354