@@ -24,21 +24,20 @@ use arrow::record_batch::RecordBatch;
24
24
use datafusion:: arrow:: datatypes:: { DataType , Field , Schema , TimeUnit } ;
25
25
use datafusion:: common:: { DFField , DFSchema } ;
26
26
use datafusion:: error:: Result ;
27
- use datafusion:: functions_array:: rewrite:: ArrayFunctionRewriter ;
28
27
use datafusion:: optimizer:: simplify_expressions:: ExprSimplifier ;
29
28
use datafusion:: physical_expr:: {
30
29
analyze, create_physical_expr, AnalysisContext , ExprBoundaries , PhysicalExpr ,
31
30
} ;
32
31
use datafusion:: prelude:: * ;
33
- use datafusion_common:: config:: ConfigOptions ;
34
- use datafusion_common:: tree_node:: TreeNode ;
32
+ use datafusion_common:: tree_node:: { Transformed , TreeNode } ;
35
33
use datafusion_common:: { ScalarValue , ToDFSchema } ;
36
34
use datafusion_expr:: execution_props:: ExecutionProps ;
37
35
use datafusion_expr:: expr:: BinaryExpr ;
38
- use datafusion_expr:: expr_rewriter:: FunctionRewrite ;
39
36
use datafusion_expr:: interval_arithmetic:: Interval ;
40
37
use datafusion_expr:: simplify:: SimplifyContext ;
41
- use datafusion_expr:: { ColumnarValue , ExprSchemable , Operator } ;
38
+ use datafusion_expr:: {
39
+ ColumnarValue , ExprSchemable , GetFieldAccess , GetIndexedField , Operator ,
40
+ } ;
42
41
43
42
/// This example demonstrates the DataFusion [`Expr`] API.
44
43
///
@@ -310,12 +309,19 @@ pub fn physical_expr(schema: &Schema, expr: Expr) -> Result<Arc<dyn PhysicalExpr
310
309
// apply type coercion here to ensure types match
311
310
let expr = simplifier. coerce ( expr, df_schema. clone ( ) ) ?;
312
311
313
- // Support array functions by rewriting expressions
314
- let rewriter = ArrayFunctionRewriter :: new ( ) ;
315
-
312
+ // Support Expr::struct by rewriting expressions
316
313
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
+ } )
319
325
} ) ?
320
326
. data ;
321
327
0 commit comments