expression evaluation API change

main
Ziyang Hu 1 year ago
parent cd840e687c
commit a71f240a5c

@ -214,9 +214,7 @@ fn process_line(
match op { match op {
"eval" => { "eval" => {
let out = evaluate_expressions(payload, params, params)?; let out = evaluate_expressions(payload, params, params)?;
for val in out { println!("{out}");
println!("{val}");
}
} }
"set" => { "set" => {
let (key, v_str) = payload let (key, v_str) = payload

@ -268,4 +268,4 @@ fts_and = {"AND"}
fts_or = {"OR" | "," | ";"} fts_or = {"OR" | "," | ";"}
fts_not = {"NOT"} fts_not = {"NOT"}
expression_script = {SOI ~ expr ~ ("," ~ expr)* ~ EOI} expression_script = {SOI ~ expr ~ EOI}

@ -213,8 +213,7 @@ pub(crate) fn parse_type(src: &str) -> Result<NullableColType> {
pub(crate) fn parse_expressions( pub(crate) fn parse_expressions(
src: &str, src: &str,
param_pool: &BTreeMap<String, DataValue>, param_pool: &BTreeMap<String, DataValue>,
) -> Result<Vec<Expr>> { ) -> Result<Expr> {
let mut ret = vec![];
let parsed = CozoScriptParser::parse(Rule::expression_script, src) let parsed = CozoScriptParser::parse(Rule::expression_script, src)
.map_err(|err| { .map_err(|err| {
let span = match err.location { let span = match err.location {
@ -224,18 +223,9 @@ pub(crate) fn parse_expressions(
ParseError { span } ParseError { span }
})? })?
.next() .next()
.unwrap() .unwrap();
.into_inner();
for rule in parsed { Ok(build_expr(parsed.into_inner().next().unwrap(), param_pool)?)
match rule.as_rule() {
Rule::expr => {
ret.push(build_expr(rule, param_pool)?);
}
Rule::EOI => {}
_ => unreachable!(),
}
}
Ok(ret)
} }
pub(crate) fn parse_script( pub(crate) fn parse_script(

@ -1829,7 +1829,7 @@ pub fn evaluate_expressions(
src: &str, src: &str,
params: &BTreeMap<String, DataValue>, params: &BTreeMap<String, DataValue>,
vars: &BTreeMap<String, DataValue>, vars: &BTreeMap<String, DataValue>,
) -> Result<Vec<DataValue>> { ) -> Result<DataValue> {
_evaluate_expressions(src, params, vars).map_err(|err| { _evaluate_expressions(src, params, vars).map_err(|err| {
if err.source().is_none() { if err.source().is_none() {
err.with_source_code(format!("{src} ")) err.with_source_code(format!("{src} "))
@ -1854,29 +1854,21 @@ fn _evaluate_expressions(
src: &str, src: &str,
params: &BTreeMap<String, DataValue>, params: &BTreeMap<String, DataValue>,
vars: &BTreeMap<String, DataValue>, vars: &BTreeMap<String, DataValue>,
) -> Result<Vec<DataValue>> { ) -> Result<DataValue> {
let mut exprs = parse_expressions(src, params)?; let mut expr = parse_expressions(src, params)?;
let mut ctx = vec![]; let mut ctx = vec![];
let mut binding_map = BTreeMap::new(); let mut binding_map = BTreeMap::new();
for (i, (k, v)) in vars.iter().enumerate() { for (i, (k, v)) in vars.iter().enumerate() {
ctx.push(v.clone()); ctx.push(v.clone());
binding_map.insert(Symbol::new(k, Default::default()), i); binding_map.insert(Symbol::new(k, Default::default()), i);
} }
let mut ret = vec![];
for expr in exprs.iter_mut() {
expr.fill_binding_indices(&binding_map)?; expr.fill_binding_indices(&binding_map)?;
ret.push(expr.eval(&ctx)?); expr.eval(&ctx)
}
Ok(ret)
} }
fn _get_variables(src: &str, params: &BTreeMap<String, DataValue>) -> Result<BTreeSet<String>> { fn _get_variables(src: &str, params: &BTreeMap<String, DataValue>) -> Result<BTreeSet<String>> {
let mut exprs = parse_expressions(src, params)?; let expr = parse_expressions(src, params)?;
let mut ret = BTreeSet::new(); expr.get_variables()
for expr in exprs.iter_mut() {
ret.extend(expr.get_variables()?);
}
Ok(ret)
} }
/// Used for user-initiated termination of running queries /// Used for user-initiated termination of running queries

@ -417,11 +417,11 @@ fn eval_expressions(
query: &str, query: &str,
params: &PyDict, params: &PyDict,
bindings: &PyDict, bindings: &PyDict,
) -> PyResult<Vec<PyObject>> { ) -> PyResult<PyObject> {
let params = convert_params(params).unwrap(); let params = convert_params(params).unwrap();
let bindings = convert_params(bindings).unwrap(); let bindings = convert_params(bindings).unwrap();
match evaluate_expressions(query, &params, &bindings) { match evaluate_expressions(query, &params, &bindings) {
Ok(rows) => Ok(rows.into_iter().map(|r| value_to_py(r, py)).collect()), Ok(v) => Ok(value_to_py(v, py)),
Err(err) => { Err(err) => {
let reports = format_error_as_json(err, Some(query)).to_string(); let reports = format_error_as_json(err, Some(query)).to_string();
let json_mod = py.import("json")?; let json_mod = py.import("json")?;

Loading…
Cancel
Save