Skip to content

Commit f29af9d

Browse files
committed
try migrate json expr
Signed-off-by: tison <[email protected]>
1 parent c112222 commit f29af9d

File tree

1 file changed

+48
-45
lines changed

1 file changed

+48
-45
lines changed

datafusion/sql/src/expr/mod.rs

Lines changed: 48 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
use arrow_schema::DataType;
1919
use arrow_schema::TimeUnit;
20-
use sqlparser::ast::{CastKind, Expr as SQLExpr, TrimWhereField, Value};
20+
use sqlparser::ast::{CastKind, Expr as SQLExpr, JsonPathElem, TrimWhereField, Value};
2121
use sqlparser::parser::ParserError::ParserError;
2222

2323
use datafusion_common::{
@@ -212,7 +212,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
212212
agg_func.order_by.clone(),
213213
agg_func.null_treatment,
214214
)), true)
215-
},
215+
}
216216
_ => (expr, false),
217217
}
218218
}
@@ -916,7 +916,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
916916
distinct,
917917
order_by,
918918
null_treatment,
919-
filter: None, // filter is passed in
919+
filter: _, // filter is passed in
920920
}) => Ok(Expr::AggregateFunction(expr::AggregateFunction::new(
921921
fun,
922922
args,
@@ -944,65 +944,68 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
944944
schema: &DFSchema,
945945
planner_context: &mut PlannerContext,
946946
) -> Result<GetFieldAccess> {
947-
let field = match expr.clone() {
947+
match expr.clone() {
948948
SQLExpr::Value(
949949
Value::SingleQuotedString(s) | Value::DoubleQuotedString(s),
950-
) => GetFieldAccess::NamedStructField {
951-
name: ScalarValue::from(s),
952-
},
950+
) => {
951+
return Ok(GetFieldAccess::NamedStructField {
952+
name: ScalarValue::from(s),
953+
})
954+
}
953955
SQLExpr::JsonAccess { value, path } => {
954-
let (start, stop, stride) = if let SQLExpr::JsonAccess {
955-
left: l,
956-
operator: JsonOperator::Colon,
957-
right: r,
958-
} = *left
959-
{
960-
let start = Box::new(self.sql_expr_to_logical_expr(
961-
*l,
962-
schema,
963-
planner_context,
964-
)?);
965-
let stop = Box::new(self.sql_expr_to_logical_expr(
966-
*r,
967-
schema,
968-
planner_context,
969-
)?);
970-
let stride = Box::new(self.sql_expr_to_logical_expr(
971-
*right,
972-
schema,
973-
planner_context,
974-
)?);
975-
(start, stop, stride)
976-
} else {
977-
let start = Box::new(self.sql_expr_to_logical_expr(
978-
*left,
956+
let start = Box::new(self.sql_expr_to_logical_expr(
957+
*value,
958+
schema,
959+
planner_context,
960+
)?);
961+
962+
fn json_path_elem_to_expr(expr: JsonPathElem) -> SQLExpr {
963+
match expr {
964+
JsonPathElem::Dot { key, .. } => SQLExpr::Value(Value::SingleQuotedString(key)),
965+
JsonPathElem::Bracket { key } => key,
966+
}
967+
}
968+
969+
let mut path_iter = path.path.into_iter();
970+
let stop = match path_iter.next() {
971+
None => {
972+
return Ok(GetFieldAccess::ListIndex {
973+
key: Box::new(self.sql_expr_to_logical_expr(
974+
expr,
975+
schema,
976+
planner_context,
977+
)?),
978+
})
979+
}
980+
Some(expr) => Box::new(self.sql_expr_to_logical_expr(
981+
json_path_elem_to_expr(expr),
979982
schema,
980983
planner_context,
981-
)?);
982-
let stop = Box::new(self.sql_expr_to_logical_expr(
983-
*right,
984+
)?),
985+
};
986+
let stride = match path_iter.next() {
987+
None => Box::new(Expr::Literal(ScalarValue::Int64(Some(1)))),
988+
Some(expr) => Box::new(self.sql_expr_to_logical_expr(
989+
json_path_elem_to_expr(expr),
984990
schema,
985991
planner_context,
986-
)?);
987-
let stride = Box::new(Expr::Literal(ScalarValue::Int64(Some(1))));
988-
(start, stop, stride)
992+
)?),
989993
};
990-
GetFieldAccess::ListRange {
994+
995+
Ok(GetFieldAccess::ListRange {
991996
start,
992997
stop,
993998
stride,
994-
}
999+
})
9951000
}
996-
_ => GetFieldAccess::ListIndex {
1001+
_ => Ok(GetFieldAccess::ListIndex {
9971002
key: Box::new(self.sql_expr_to_logical_expr(
9981003
expr,
9991004
schema,
10001005
planner_context,
10011006
)?),
1002-
},
1003-
};
1004-
1005-
Ok(field)
1007+
}),
1008+
}
10061009
}
10071010

10081011
fn plan_indexed(

0 commit comments

Comments
 (0)