retire the special case of field access

main
Ziyang Hu 2 years ago
parent 793030d9a1
commit dff378c7ac

@ -54,16 +54,16 @@ impl RowEvalContext for () {
pub(crate) trait PartialEvalContext { pub(crate) trait PartialEvalContext {
fn resolve(&self, key: &str) -> Option<Expr>; fn resolve(&self, key: &str) -> Option<Expr>;
fn resolve_table_col(&self, binding: &str, col: &str) -> Option<(TableId, ColId)>; // fn resolve_table_col(&self, binding: &str, col: &str) -> Option<(TableId, ColId)>;
} }
impl PartialEvalContext for () { impl PartialEvalContext for () {
fn resolve(&self, _key: &str) -> Option<Expr> { fn resolve(&self, _key: &str) -> Option<Expr> {
None None
} }
fn resolve_table_col(&self, _binding: &str, _col: &str) -> Option<(TableId, ColId)> { // fn resolve_table_col(&self, _binding: &str, _col: &str) -> Option<(TableId, ColId)> {
None // None
} // }
} }
fn extract_optimized_bin_args(args: Vec<Expr>) -> (Expr, Expr) { fn extract_optimized_bin_args(args: Vec<Expr>) -> (Expr, Expr) {
@ -103,19 +103,20 @@ impl<'a> Expr<'a> {
.resolve(&var) .resolve(&var)
.ok_or(EvalError::UnresolvedVariable(var))?, .ok_or(EvalError::UnresolvedVariable(var))?,
Expr::FieldAcc(f, arg) => { Expr::FieldAcc(f, arg) => {
let expr = match *arg { // let expr = match *arg {
Expr::Variable(var) => { // Expr::Variable(var) => {
if let Some((tid, cid)) = ctx.resolve_table_col(&var, &f) { // if let Some((tid, cid)) = ctx.resolve_table_col(&var, &f) {
return Ok(Expr::TableCol(tid, cid)); // return Ok(Expr::TableCol(tid, cid));
} else { // } else {
ctx.resolve(&var) // ctx.resolve(&var)
.ok_or(EvalError::UnresolvedVariable(var))? // .ok_or(EvalError::UnresolvedVariable(var))?
.partial_eval(ctx)? // .partial_eval(ctx)?
} // }
} // }
expr => expr.partial_eval(ctx)?, // expr => expr.partial_eval(ctx)?,
}; // };
match expr { // match expr {expr
match arg.partial_eval(ctx)? {
Expr::Const(Value::Null) => Expr::Const(Value::Null), Expr::Const(Value::Null) => Expr::Const(Value::Null),
Expr::Const(Value::Dict(mut d)) => { Expr::Const(Value::Dict(mut d)) => {
Expr::Const(d.remove(&f as &str).unwrap_or(Value::Null)) Expr::Const(d.remove(&f as &str).unwrap_or(Value::Null))

@ -270,9 +270,9 @@ impl<'a> PartialEvalContext for NodeDefEvalCtx<'a> {
self.resolve_name(key).map(Expr::TupleSetIdx) self.resolve_name(key).map(Expr::TupleSetIdx)
} }
fn resolve_table_col(&self, _binding: &str, _col: &str) -> Option<(TableId, ColId)> { // fn resolve_table_col(&self, _binding: &str, _col: &str) -> Option<(TableId, ColId)> {
None // None
} // }
} }
@ -342,7 +342,7 @@ impl<'a> PartialEvalContext for EdgeDefEvalCtx<'a> {
self.resolve_name(key).map(Expr::TupleSetIdx) self.resolve_name(key).map(Expr::TupleSetIdx)
} }
fn resolve_table_col(&self, _binding: &str, _col: &str) -> Option<(TableId, ColId)> { // fn resolve_table_col(&self, _binding: &str, _col: &str) -> Option<(TableId, ColId)> {
None // None
} // }
} }

Loading…
Cancel
Save