Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-plan/src/plans/optimizer/projection_pushdown/functions/unpivot.rs
7896 views
1
use super::*;
2
3
#[allow(clippy::too_many_arguments)]
4
pub(super) fn process_unpivot(
5
proj_pd: &mut ProjectionPushDown,
6
args: &Arc<UnpivotArgsIR>,
7
input: Node,
8
ctx: ProjectionContext,
9
lp_arena: &mut Arena<IR>,
10
expr_arena: &mut Arena<AExpr>,
11
) -> PolarsResult<IR> {
12
let input_schema = lp_arena.get(input).schema(lp_arena);
13
14
let project_from_input: PlHashSet<&PlSmallStr> =
15
args.index.iter().chain(args.on.iter()).collect();
16
let (new_projections, new_projected_names): (Vec<ColumnNode>, PlHashSet<PlSmallStr>) =
17
input_schema
18
.iter_names()
19
.filter(|x| project_from_input.contains(x))
20
.map(|name| {
21
(
22
ColumnNode(expr_arena.add(AExpr::Column(name.clone()))),
23
name.clone(),
24
)
25
})
26
.unzip();
27
28
let local_projections = ctx.acc_projections;
29
let new_ctx = ProjectionContext::new(new_projections, new_projected_names, ctx.inner);
30
proj_pd.pushdown_and_assign(input, new_ctx, lp_arena, expr_arena)?;
31
32
// re-make unpivot node so that the schema is updated
33
let lp = IRBuilder::new(input, expr_arena, lp_arena)
34
.unpivot(args.clone())
35
.build();
36
37
Ok(IRBuilder::from_lp(lp, expr_arena, lp_arena)
38
.project_simple_nodes(local_projections)
39
.unwrap()
40
.build())
41
}
42
43