Skip to content

Commit 8ac50e2

Browse files
authored
Reduce repetition in try_process_group_by_unnest and try_process_unnest (#11714)
* refactor: process unnest * pass clippy
1 parent 7ca7456 commit 8ac50e2

File tree

2 files changed

+35
-29
lines changed

2 files changed

+35
-29
lines changed

datafusion/sql/src/select.rs

Lines changed: 13 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use crate::planner::{
2323
};
2424
use crate::utils::{
2525
check_columns_satisfy_exprs, extract_aliases, rebase_expr, resolve_aliases_to_exprs,
26-
resolve_columns, resolve_positions_to_exprs, transform_bottom_unnest,
26+
resolve_columns, resolve_positions_to_exprs, transform_bottom_unnests,
2727
};
2828

2929
use datafusion_common::tree_node::{TreeNode, TreeNodeRecursion};
@@ -318,20 +318,12 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
318318
// - unnest(struct_col) will be transformed into unnest(struct_col).field1, unnest(struct_col).field2
319319
// - unnest(array_col) will be transformed into unnest(array_col).element
320320
// - unnest(array_col) + 1 will be transformed into unnest(array_col).element +1
321-
let outer_projection_exprs: Vec<Expr> = intermediate_select_exprs
322-
.iter()
323-
.map(|expr| {
324-
transform_bottom_unnest(
325-
&intermediate_plan,
326-
&mut unnest_columns,
327-
&mut inner_projection_exprs,
328-
expr,
329-
)
330-
})
331-
.collect::<Result<Vec<_>>>()?
332-
.into_iter()
333-
.flatten()
334-
.collect();
321+
let outer_projection_exprs = transform_bottom_unnests(
322+
&intermediate_plan,
323+
&mut unnest_columns,
324+
&mut inner_projection_exprs,
325+
&intermediate_select_exprs,
326+
)?;
335327

336328
// No more unnest is possible
337329
if unnest_columns.is_empty() {
@@ -417,20 +409,12 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
417409
let mut unnest_columns = vec![];
418410
let mut inner_projection_exprs = vec![];
419411

420-
let outer_projection_exprs: Vec<Expr> = intermediate_select_exprs
421-
.iter()
422-
.map(|expr| {
423-
transform_bottom_unnest(
424-
&intermediate_plan,
425-
&mut unnest_columns,
426-
&mut inner_projection_exprs,
427-
expr,
428-
)
429-
})
430-
.collect::<Result<Vec<_>>>()?
431-
.into_iter()
432-
.flatten()
433-
.collect();
412+
let outer_projection_exprs = transform_bottom_unnests(
413+
&intermediate_plan,
414+
&mut unnest_columns,
415+
&mut inner_projection_exprs,
416+
&intermediate_select_exprs,
417+
)?;
434418

435419
if unnest_columns.is_empty() {
436420
break;

datafusion/sql/src/utils.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,28 @@ pub(crate) fn value_to_string(value: &Value) -> Option<String> {
287287
}
288288
}
289289

290+
pub(crate) fn transform_bottom_unnests(
291+
input: &LogicalPlan,
292+
unnest_placeholder_columns: &mut Vec<String>,
293+
inner_projection_exprs: &mut Vec<Expr>,
294+
original_exprs: &[Expr],
295+
) -> Result<Vec<Expr>> {
296+
Ok(original_exprs
297+
.iter()
298+
.map(|expr| {
299+
transform_bottom_unnest(
300+
input,
301+
unnest_placeholder_columns,
302+
inner_projection_exprs,
303+
expr,
304+
)
305+
})
306+
.collect::<Result<Vec<_>>>()?
307+
.into_iter()
308+
.flatten()
309+
.collect::<Vec<_>>())
310+
}
311+
290312
/// The context is we want to rewrite unnest() into InnerProjection->Unnest->OuterProjection
291313
/// Given an expression which contains unnest expr as one of its children,
292314
/// Try transform depends on unnest type

0 commit comments

Comments
 (0)