@@ -25,12 +25,13 @@ use datafusion::common::ScalarValue;
2525use datafusion:: physical_expr:: expressions:: { LikeExpr , Literal } ;
2626use datafusion:: physical_expr:: PhysicalExpr ;
2727use datafusion_comet_proto:: spark_expression:: Expr ;
28- use datafusion_comet_spark_expr:: { RLike , SubstringExpr } ;
28+ use datafusion_comet_spark_expr:: { FromJson , RLike , SubstringExpr } ;
2929
3030use crate :: execution:: {
3131 expressions:: extract_expr,
3232 operators:: ExecutionError ,
3333 planner:: { expression_registry:: ExpressionBuilder , PhysicalPlanner } ,
34+ serde:: to_arrow_datatype,
3435} ;
3536
3637/// Builder for Substring expressions
@@ -98,3 +99,27 @@ impl ExpressionBuilder for RlikeBuilder {
9899 }
99100 }
100101}
102+
103+ pub struct FromJsonBuilder ;
104+
105+ impl ExpressionBuilder for FromJsonBuilder {
106+ fn build (
107+ & self ,
108+ spark_expr : & Expr ,
109+ input_schema : SchemaRef ,
110+ planner : & PhysicalPlanner ,
111+ ) -> Result < Arc < dyn PhysicalExpr > , ExecutionError > {
112+ let expr = extract_expr ! ( spark_expr, FromJson ) ;
113+ let child = planner. create_expr (
114+ expr. child . as_ref ( ) . ok_or_else ( || {
115+ ExecutionError :: GeneralError ( "FromJson missing child" . to_string ( ) )
116+ } ) ?,
117+ input_schema,
118+ ) ?;
119+ let schema =
120+ to_arrow_datatype ( expr. schema . as_ref ( ) . ok_or_else ( || {
121+ ExecutionError :: GeneralError ( "FromJson missing schema" . to_string ( ) )
122+ } ) ?) ;
123+ Ok ( Arc :: new ( FromJson :: new ( child, schema, & expr. timezone ) ) )
124+ }
125+ }
0 commit comments