Path: blob/main/crates/polars-plan/src/plans/optimizer/projection_pushdown/functions/unpivot.rs
7896 views
use super::*;12#[allow(clippy::too_many_arguments)]3pub(super) fn process_unpivot(4proj_pd: &mut ProjectionPushDown,5args: &Arc<UnpivotArgsIR>,6input: Node,7ctx: ProjectionContext,8lp_arena: &mut Arena<IR>,9expr_arena: &mut Arena<AExpr>,10) -> PolarsResult<IR> {11let input_schema = lp_arena.get(input).schema(lp_arena);1213let project_from_input: PlHashSet<&PlSmallStr> =14args.index.iter().chain(args.on.iter()).collect();15let (new_projections, new_projected_names): (Vec<ColumnNode>, PlHashSet<PlSmallStr>) =16input_schema17.iter_names()18.filter(|x| project_from_input.contains(x))19.map(|name| {20(21ColumnNode(expr_arena.add(AExpr::Column(name.clone()))),22name.clone(),23)24})25.unzip();2627let local_projections = ctx.acc_projections;28let new_ctx = ProjectionContext::new(new_projections, new_projected_names, ctx.inner);29proj_pd.pushdown_and_assign(input, new_ctx, lp_arena, expr_arena)?;3031// re-make unpivot node so that the schema is updated32let lp = IRBuilder::new(input, expr_arena, lp_arena)33.unpivot(args.clone())34.build();3536Ok(IRBuilder::from_lp(lp, expr_arena, lp_arena)37.project_simple_nodes(local_projections)38.unwrap()39.build())40}414243