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/flatten_union.rs
6940 views
1
use IR::*;
2
use polars_core::error::PolarsResult;
3
use polars_utils::arena::{Arena, Node};
4
5
use super::OptimizationRule;
6
use crate::prelude::IR;
7
8
pub struct FlattenUnionRule {}
9
10
fn get_union_inputs(node: Node, lp_arena: &Arena<IR>) -> Option<&[Node]> {
11
match lp_arena.get(node) {
12
IR::Union { inputs, .. } => Some(inputs),
13
_ => None,
14
}
15
}
16
17
impl OptimizationRule for FlattenUnionRule {
18
fn optimize_plan(
19
&mut self,
20
lp_arena: &mut polars_utils::arena::Arena<IR>,
21
_expr_arena: &mut polars_utils::arena::Arena<crate::prelude::AExpr>,
22
node: polars_utils::arena::Node,
23
) -> PolarsResult<Option<IR>> {
24
let lp = lp_arena.get(node);
25
26
match lp {
27
Union { inputs, options }
28
if inputs.iter().any(|node| match lp_arena.get(*node) {
29
Union { options, .. } => !options.flattened_by_opt,
30
_ => false,
31
}) =>
32
{
33
let mut new_inputs = Vec::with_capacity(inputs.len() * 2);
34
let mut options = *options;
35
36
for node in inputs {
37
match get_union_inputs(*node, lp_arena) {
38
Some(inp) => new_inputs.extend_from_slice(inp),
39
None => new_inputs.push(*node),
40
}
41
}
42
options.flattened_by_opt = true;
43
44
Ok(Some(Union {
45
inputs: new_inputs,
46
options,
47
}))
48
},
49
_ => Ok(None),
50
}
51
}
52
}
53
54