Skip to content

Commit 9560732

Browse files
committed
WIP demonstrate using get_field with expr_api in 37.1.0
1 parent 4f5c52a commit 9560732

File tree

2 files changed

+18
-20
lines changed

2 files changed

+18
-20
lines changed

datafusion-examples/examples/expr_api.rs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,20 @@ use arrow::record_batch::RecordBatch;
2424
use datafusion::arrow::datatypes::{DataType, Field, Schema, TimeUnit};
2525
use datafusion::common::{DFField, DFSchema};
2626
use datafusion::error::Result;
27-
use datafusion::functions_array::rewrite::ArrayFunctionRewriter;
2827
use datafusion::optimizer::simplify_expressions::ExprSimplifier;
2928
use datafusion::physical_expr::{
3029
analyze, create_physical_expr, AnalysisContext, ExprBoundaries, PhysicalExpr,
3130
};
3231
use datafusion::prelude::*;
33-
use datafusion_common::config::ConfigOptions;
34-
use datafusion_common::tree_node::TreeNode;
32+
use datafusion_common::tree_node::{Transformed, TreeNode};
3533
use datafusion_common::{ScalarValue, ToDFSchema};
3634
use datafusion_expr::execution_props::ExecutionProps;
3735
use datafusion_expr::expr::BinaryExpr;
38-
use datafusion_expr::expr_rewriter::FunctionRewrite;
3936
use datafusion_expr::interval_arithmetic::Interval;
4037
use datafusion_expr::simplify::SimplifyContext;
41-
use datafusion_expr::{ColumnarValue, ExprSchemable, Operator};
38+
use datafusion_expr::{
39+
ColumnarValue, ExprSchemable, GetFieldAccess, GetIndexedField, Operator,
40+
};
4241

4342
/// This example demonstrates the DataFusion [`Expr`] API.
4443
///
@@ -310,12 +309,19 @@ pub fn physical_expr(schema: &Schema, expr: Expr) -> Result<Arc<dyn PhysicalExpr
310309
// apply type coercion here to ensure types match
311310
let expr = simplifier.coerce(expr, df_schema.clone())?;
312311

313-
// Support array functions by rewriting expressions
314-
let rewriter = ArrayFunctionRewriter::new();
315-
312+
// Support Expr::struct by rewriting expressions
316313
let expr = expr
317-
.transform_up(|expr| {
318-
rewriter.rewrite(expr, df_schema.as_ref(), &ConfigOptions::default())
314+
.transform_up(&|expr| {
315+
Ok(match expr {
316+
Expr::GetIndexedField(GetIndexedField {
317+
expr,
318+
field: GetFieldAccess::NamedStructField { name },
319+
}) => {
320+
let name = Expr::Literal(name);
321+
Transformed::yes(get_field(*expr, name))
322+
}
323+
_ => Transformed::no(expr),
324+
})
319325
})?
320326
.data;
321327

datafusion/functions-array/src/rewrite.rs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,8 @@ use datafusion_expr::expr_rewriter::FunctionRewrite;
3030
use datafusion_expr::{BinaryExpr, Expr, GetFieldAccess, GetIndexedField, Operator};
3131
use datafusion_functions::expr_fn::get_field;
3232

33-
/// Rewrites expressions such as `expr[field]` into function dor array functions
34-
#[derive(Debug, Default)]
35-
pub struct ArrayFunctionRewriter {}
36-
37-
impl ArrayFunctionRewriter {
38-
/// Create a new `ArrayFunctionRewriter`
39-
pub fn new() -> Self {
40-
Self::default()
41-
}
42-
}
33+
/// Rewrites expressions into function calls to array functions
34+
pub(crate) struct ArrayFunctionRewriter {}
4335

4436
impl FunctionRewrite for ArrayFunctionRewriter {
4537
fn name(&self) -> &str {

0 commit comments

Comments
 (0)