From 5fb4a14234605b4d7ea5ad9f4a99b77c9054a800 Mon Sep 17 00:00:00 2001 From: Ziyang Hu Date: Thu, 19 May 2022 22:42:51 +0800 Subject: [PATCH] avoid unnecessary evaluation --- src/data/eval.rs | 75 +++++++++++++++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 27 deletions(-) diff --git a/src/data/eval.rs b/src/data/eval.rs index 35209a65..815b1ad0 100644 --- a/src/data/eval.rs +++ b/src/data/eval.rs @@ -116,44 +116,65 @@ impl<'a> Expr<'a> { // expr => expr.partial_eval(ctx)?, // }; // match expr {expr - match arg.partial_eval(ctx)? { - Expr::Const(Value::Null) => Expr::Const(Value::Null), - Expr::Const(Value::Dict(mut d)) => { - Expr::Const(d.remove(&f as &str).unwrap_or(Value::Null)) + match *arg { + Expr::Dict(mut d) => { + // This skips evaluation of other keys + d.remove(&f as &str) + .unwrap_or(Expr::Const(Value::Null)) + .partial_eval(ctx)? + } + arg => { + match arg.partial_eval(ctx)? { + Expr::Const(Value::Null) => Expr::Const(Value::Null), + Expr::Const(Value::Dict(mut d)) => { + Expr::Const(d.remove(&f as &str).unwrap_or(Value::Null)) + } + v @ (Expr::IdxAcc(_, _) + | Expr::FieldAcc(_, _) + | Expr::TableCol(_, _) + | Expr::Apply(_, _) + | Expr::ApplyAgg(_, _, _)) => Expr::FieldAcc(f, v.into()), + Expr::Dict(mut d) => d.remove(&f as &str).unwrap_or(Expr::Const(Value::Null)), + v => return Err(EvalError::FieldAccess(f, Value::from(v).to_static())), + } } - v @ (Expr::IdxAcc(_, _) - | Expr::FieldAcc(_, _) - | Expr::TableCol(_, _) - | Expr::Apply(_, _) - | Expr::ApplyAgg(_, _, _)) => Expr::FieldAcc(f, v.into()), - Expr::Dict(mut d) => d.remove(&f as &str).unwrap_or(Expr::Const(Value::Null)), - v => return Err(EvalError::FieldAccess(f, Value::from(v).to_static())), } } Expr::IdxAcc(i, arg) => { - let arg = arg.partial_eval(ctx)?; - match arg { - Expr::Const(Value::Null) => Expr::Const(Value::Null), - Expr::Const(Value::List(mut l)) => { + match *arg { + // This skips evaluation of other keys + Expr::List(mut l) => { if i >= l.len() { Expr::Const(Value::Null) } else { - Expr::Const(l.swap_remove(i)) + l.swap_remove(i).partial_eval(ctx)? } } - Expr::List(mut l) => { - if i >= l.len() { - Expr::Const(Value::Null) - } else { - l.swap_remove(i) + arg => { + match arg.partial_eval(ctx)? { + Expr::Const(Value::Null) => Expr::Const(Value::Null), + Expr::Const(Value::List(mut l)) => { + if i >= l.len() { + Expr::Const(Value::Null) + } else { + Expr::Const(l.swap_remove(i)) + } + } + Expr::List(mut l) => { + if i >= l.len() { + Expr::Const(Value::Null) + } else { + l.swap_remove(i) + } + } + v @ (Expr::IdxAcc(_, _) + | Expr::FieldAcc(_, _) + | Expr::TableCol(_, _) + | Expr::Apply(_, _) + | Expr::ApplyAgg(_, _, _)) => Expr::IdxAcc(i, v.into()), + v => return Err(EvalError::IndexAccess(i, Value::from(v).to_static())), } } - v @ (Expr::IdxAcc(_, _) - | Expr::FieldAcc(_, _) - | Expr::TableCol(_, _) - | Expr::Apply(_, _) - | Expr::ApplyAgg(_, _, _)) => Expr::IdxAcc(i, v.into()), - v => return Err(EvalError::IndexAccess(i, Value::from(v).to_static())), } } Expr::Apply(op, args) => {