|
|
@ -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))
|
|
|
|