Skip to content

Commit 96664ce

Browse files
authored
Remove physical expr of ListIndex and ListRange, convert to array_element and array_slice functions (#9492)
* remove physical range and index Signed-off-by: jayzhan211 <[email protected]> * remove proto Signed-off-by: jayzhan211 <[email protected]> --------- Signed-off-by: jayzhan211 <[email protected]>
1 parent 0b540ea commit 96664ce

File tree

10 files changed

+71
-713
lines changed

10 files changed

+71
-713
lines changed

datafusion/core/src/physical_planner.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -211,19 +211,19 @@ fn create_physical_name(e: &Expr, is_first_expr: bool) -> Result<String> {
211211
let expr = create_physical_name(expr, false)?;
212212
let name = match field {
213213
GetFieldAccess::NamedStructField { name } => format!("{expr}[{name}]"),
214-
GetFieldAccess::ListIndex { key } => {
215-
let key = create_physical_name(key, false)?;
216-
format!("{expr}[{key}]")
214+
GetFieldAccess::ListIndex { key: _ } => {
215+
unreachable!(
216+
"ListIndex should have been rewritten in OperatorToFunction"
217+
)
217218
}
218219
GetFieldAccess::ListRange {
219-
start,
220-
stop,
221-
stride,
220+
start: _,
221+
stop: _,
222+
stride: _,
222223
} => {
223-
let start = create_physical_name(start, false)?;
224-
let stop = create_physical_name(stop, false)?;
225-
let stride = create_physical_name(stride, false)?;
226-
format!("{expr}[{start}:{stop}:{stride}]")
224+
unreachable!(
225+
"ListIndex should have been rewritten in OperatorToFunction"
226+
)
227227
}
228228
};
229229

datafusion/optimizer/src/analyzer/rewrite_expr.rs

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@ use datafusion_common::{DFSchema, DFSchemaRef, Result};
2828
use datafusion_expr::expr::ScalarFunction;
2929
use datafusion_expr::expr_rewriter::rewrite_preserving_name;
3030
use datafusion_expr::utils::merge_schema;
31-
use datafusion_expr::{
32-
BinaryExpr, BuiltinScalarFunction, Expr, LogicalPlan, Operator,
33-
ScalarFunctionDefinition,
34-
};
31+
use datafusion_expr::BuiltinScalarFunction;
32+
use datafusion_expr::GetFieldAccess;
33+
use datafusion_expr::GetIndexedField;
34+
use datafusion_expr::Operator;
35+
use datafusion_expr::ScalarFunctionDefinition;
36+
use datafusion_expr::{BinaryExpr, Expr, LogicalPlan};
3537

3638
#[derive(Default)]
3739
pub struct OperatorToFunction {}
@@ -126,6 +128,39 @@ impl TreeNodeRewriter for OperatorToFunctionRewriter {
126128
return Ok(Transformed::yes(expr));
127129
}
128130
}
131+
132+
if let Expr::GetIndexedField(GetIndexedField {
133+
ref expr,
134+
ref field,
135+
}) = expr
136+
{
137+
match field {
138+
GetFieldAccess::ListIndex { ref key } => {
139+
let expr = *expr.clone();
140+
let key = *key.clone();
141+
let args = vec![expr, key];
142+
return Ok(Transformed::yes(Expr::ScalarFunction(
143+
ScalarFunction::new(BuiltinScalarFunction::ArrayElement, args),
144+
)));
145+
}
146+
GetFieldAccess::ListRange {
147+
start,
148+
stop,
149+
stride,
150+
} => {
151+
let expr = *expr.clone();
152+
let start = *start.clone();
153+
let stop = *stop.clone();
154+
let stride = *stride.clone();
155+
let args = vec![expr, start, stop, stride];
156+
return Ok(Transformed::yes(Expr::ScalarFunction(
157+
ScalarFunction::new(BuiltinScalarFunction::ArraySlice, args),
158+
)));
159+
}
160+
_ => {}
161+
}
162+
}
163+
129164
Ok(Transformed::no(expr))
130165
}
131166
}

0 commit comments

Comments
 (0)