preparing for table env

main
Ziyang Hu 2 years ago
parent 26c008fbca
commit 31f1e1dc40

@ -22,6 +22,32 @@ use crate::relation::value;
/// `[Null, Int, Text, Int, Text]` inverted index for related tables /// `[Null, Int, Text, Int, Text]` inverted index for related tables
/// `[True, Int]` table info, value is key /// `[True, Int]` table info, value is key
// type TableEnv = BTreeMap<String, ()>;
#[derive(Debug, Default)]
pub struct TableEnv<'a> {
pub parent: Option<&'a TableEnv<'a>>,
pub current: BTreeMap<String, ()>,
}
impl<'a> TableEnv<'a> {
pub fn derive(&'a self) -> TableEnv<'a> {
TableEnv {
parent: Some(self),
current: Default::default(),
}
}
pub fn resolve(&self, key: &str) -> Option<&()> {
match self.current.get(key) {
None => match self.parent {
None => None,
Some(t) => t.resolve(key)
}
v => v
}
}
}
impl<'s> Session<'s> { impl<'s> Session<'s> {
pub fn define_variable(&mut self, name: &str, val: &Value, in_root: bool) -> Result<()> { pub fn define_variable(&mut self, name: &str, val: &Value, in_root: bool) -> Result<()> {
let mut data = Tuple::with_data_prefix(DataKind::Value); let mut data = Tuple::with_data_prefix(DataKind::Value);
@ -259,7 +285,7 @@ impl<'s> Session<'s> {
self.define_data(&name, tuple, in_root) self.define_data(&name, tuple, in_root)
} }
pub fn partial_eval<'a>(&self, value: Value<'a>, params: &BTreeMap<String, Value<'a>>, pub fn partial_eval<'a>(&self, value: Value<'a>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
match value { match value {
v @ (Value::Null | v @ (Value::Null |
Value::Bool(_) | Value::Bool(_) |
@ -367,7 +393,7 @@ impl<'s> Session<'s> {
} }
fn coalesce_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn coalesce_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let res = args.into_iter().try_fold(vec![], |mut accum, cur| { let res = args.into_iter().try_fold(vec![], |mut accum, cur| {
match self.partial_eval(cur, params, table_bindings) { match self.partial_eval(cur, params, table_bindings) {
Ok((ev, cur)) => { Ok((ev, cur)) => {
@ -398,7 +424,7 @@ impl<'s> Session<'s> {
} }
} }
fn str_cat_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn str_cat_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut args = args.into_iter(); let mut args = args.into_iter();
let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
@ -414,7 +440,7 @@ impl<'s> Session<'s> {
}) })
} }
fn add_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn add_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut args = args.into_iter(); let mut args = args.into_iter();
let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
@ -433,7 +459,7 @@ impl<'s> Session<'s> {
}) })
} }
fn sub_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn sub_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut args = args.into_iter(); let mut args = args.into_iter();
let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
@ -452,7 +478,7 @@ impl<'s> Session<'s> {
}) })
} }
fn minus_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn minus_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut args = args.into_iter(); let mut args = args.into_iter();
let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
if left == Value::Null { if left == Value::Null {
@ -468,7 +494,7 @@ impl<'s> Session<'s> {
}) })
} }
fn negate_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn negate_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut args = args.into_iter(); let mut args = args.into_iter();
let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
if left == Value::Null { if left == Value::Null {
@ -483,7 +509,7 @@ impl<'s> Session<'s> {
}) })
} }
fn is_null_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn is_null_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut args = args.into_iter(); let mut args = args.into_iter();
let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
if left == Value::Null { if left == Value::Null {
@ -495,7 +521,7 @@ impl<'s> Session<'s> {
Ok((true, false.into())) Ok((true, false.into()))
} }
fn not_null_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn not_null_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut args = args.into_iter(); let mut args = args.into_iter();
let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
if left == Value::Null { if left == Value::Null {
@ -507,7 +533,7 @@ impl<'s> Session<'s> {
Ok((true, true.into())) Ok((true, true.into()))
} }
fn pow_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn pow_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut args = args.into_iter(); let mut args = args.into_iter();
let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
@ -526,7 +552,7 @@ impl<'s> Session<'s> {
}) })
} }
fn gt_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn gt_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut args = args.into_iter(); let mut args = args.into_iter();
let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
@ -545,7 +571,7 @@ impl<'s> Session<'s> {
}) })
} }
fn lt_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn lt_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut args = args.into_iter(); let mut args = args.into_iter();
let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
@ -564,7 +590,7 @@ impl<'s> Session<'s> {
}) })
} }
fn ge_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn ge_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut args = args.into_iter(); let mut args = args.into_iter();
let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
@ -583,7 +609,7 @@ impl<'s> Session<'s> {
}) })
} }
fn le_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn le_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut args = args.into_iter(); let mut args = args.into_iter();
let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
@ -602,7 +628,7 @@ impl<'s> Session<'s> {
}) })
} }
fn mod_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn mod_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut args = args.into_iter(); let mut args = args.into_iter();
let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
@ -618,7 +644,7 @@ impl<'s> Session<'s> {
}) })
} }
fn mul_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn mul_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut args = args.into_iter(); let mut args = args.into_iter();
let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
@ -637,7 +663,7 @@ impl<'s> Session<'s> {
}) })
} }
fn div_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn div_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut args = args.into_iter(); let mut args = args.into_iter();
let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
@ -656,7 +682,7 @@ impl<'s> Session<'s> {
}) })
} }
fn eq_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn eq_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut args = args.into_iter(); let mut args = args.into_iter();
let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
@ -669,7 +695,7 @@ impl<'s> Session<'s> {
Ok((true, (left == right).into())) Ok((true, (left == right).into()))
} }
fn ne_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn ne_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut args = args.into_iter(); let mut args = args.into_iter();
let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (le, left) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?; let (re, right) = self.partial_eval(args.next().unwrap(), params, table_bindings)?;
@ -682,7 +708,7 @@ impl<'s> Session<'s> {
Ok((true, (left != right).into())) Ok((true, (left != right).into()))
} }
fn or_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn or_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let res = args.into_iter().map(|v| self.partial_eval(v, params, table_bindings)) let res = args.into_iter().map(|v| self.partial_eval(v, params, table_bindings))
.try_fold( .try_fold(
(true, false, vec![]), (true, false, vec![]),
@ -745,7 +771,7 @@ impl<'s> Session<'s> {
} }
} }
fn concat_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn concat_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut total_ret = vec![]; let mut total_ret = vec![];
let mut cur_ret = vec![]; let mut cur_ret = vec![];
let mut evaluated = true; let mut evaluated = true;
@ -785,7 +811,7 @@ impl<'s> Session<'s> {
} }
} }
fn merge_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn merge_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let mut total_ret = vec![]; let mut total_ret = vec![];
let mut cur_ret = BTreeMap::new(); let mut cur_ret = BTreeMap::new();
let mut evaluated = true; let mut evaluated = true;
@ -825,7 +851,7 @@ impl<'s> Session<'s> {
} }
} }
fn and_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>, fn and_values<'a>(&self, args: Vec<Value<'a>>, params: &BTreeMap<String, Value<'a>>,
table_bindings: &BTreeMap<String, ()>) -> Result<(bool, Value<'a>)> { table_bindings: &TableEnv) -> Result<(bool, Value<'a>)> {
let res = args.into_iter().map(|v| self.partial_eval(v, params, table_bindings)) let res = args.into_iter().map(|v| self.partial_eval(v, params, table_bindings))
.try_fold( .try_fold(
(true, false, vec![]), (true, false, vec![]),
@ -1238,6 +1264,18 @@ mod tests {
drop(engine); drop(engine);
fs::remove_dir_all(db_path).unwrap(); fs::remove_dir_all(db_path).unwrap();
} }
#[test]
fn table_env() {
let mut tenv = TableEnv::default();
tenv.current.insert("c".into(), ());
let child = tenv.derive();
let mut another = child.derive();
another.current.insert("a".into(), ());
println!("{:?}", another.resolve("c"));
println!("{:?}", another.resolve("a"));
println!("{:?}", another.resolve("d"));
}
} }
// fn test_null_expr<'a>(&self, exprs: &[Expr<'a>]) -> Result<Expr<'a>> { // fn test_null_expr<'a>(&self, exprs: &[Expr<'a>]) -> Result<Expr<'a>> {

Loading…
Cancel
Save