hand-crafted queries

main
Ziyang Hu 2 years ago
parent a29819ff95
commit 0e97db174f

@ -187,7 +187,7 @@ mod tests {
FromEl::Simple(s) => s, FromEl::Simple(s) => s,
FromEl::Chain(_) => panic!() FromEl::Chain(_) => panic!()
}; };
let s = "where e.id >= 100, e.id <= 105"; let s = "where e.id >= 100, e.id <= 105 || e.id == 110";
let p = Parser::parse(Rule::where_pattern, s).unwrap().next().unwrap(); let p = Parser::parse(Rule::where_pattern, s).unwrap().next().unwrap();
let where_pat = sess.parse_where_pattern(p).unwrap(); let where_pat = sess.parse_where_pattern(p).unwrap();
@ -199,8 +199,10 @@ mod tests {
let amap = sess.base_relation_to_accessor_map(&from_pat.table, &from_pat.binding, &from_pat.info); let amap = sess.base_relation_to_accessor_map(&from_pat.table, &from_pat.binding, &from_pat.info);
let (_, vals) = sess.partial_eval(sel_pat.vals, &Default::default(), &amap).unwrap(); let (_, vals) = sess.partial_eval(sel_pat.vals, &Default::default(), &amap).unwrap();
let (_, where_vals) = sess.partial_eval(where_pat, &Default::default(), &amap).unwrap(); let (_, where_vals) = sess.partial_eval(where_pat, &Default::default(), &amap).unwrap();
let (vals, mut rel_tbls) = vals.extract_relevant_tables().unwrap(); let (vcoll, mut rel_tbls) = Value::extract_relevant_tables([vals, where_vals].into_iter()).unwrap();
let (where_vals, _) = where_vals.extract_relevant_tables().unwrap(); let mut vcoll = vcoll.into_iter();
let vals = vcoll.next().unwrap();
let where_vals = vcoll.next().unwrap();
println!("VALS AFTER 2 {} {}", vals, where_vals); println!("VALS AFTER 2 {} {}", vals, where_vals);
println!("{:?}", from_pat); println!("{:?}", from_pat);
@ -225,18 +227,17 @@ mod tests {
println!("{}", extracted); println!("{}", extracted);
} }
Value::Null | Value::Null |
Value::Bool(_) => {}, Value::Bool(_) => {}
_ => panic!("Bad type") _ => panic!("Bad type")
} }
it.next(); it.next();
} else { } else {
break break;
} }
} }
let duration = start.elapsed(); let duration = start.elapsed();
let duration2 = start2.elapsed(); let duration2 = start2.elapsed();
println!("Time elapsed {:?} {:?}", duration, duration2); println!("Time elapsed {:?} {:?}", duration, duration2);
} }
drop(engine); drop(engine);
let _ = fs::remove_dir_all(db_path); let _ = fs::remove_dir_all(db_path);

@ -176,9 +176,12 @@ impl<'a> Value<'a> {
Value::from_pair(pair) Value::from_pair(pair)
} }
pub fn extract_relevant_tables(self) -> Result<(Self, Vec<TableId>)> { pub fn extract_relevant_tables<T: Iterator<Item=Self>>(data: T) -> Result<(Vec<Self>, Vec<TableId>)> {
let mut coll = vec![]; let mut coll = vec![];
let res = self.do_extract_relevant_tables(&mut coll)?; let mut res = Vec::with_capacity(data.size_hint().1.unwrap_or(0));
for v in data {
res.push(v.do_extract_relevant_tables(&mut coll)?);
}
Ok((res, coll)) Ok((res, coll))
} }
@ -310,11 +313,11 @@ impl<'a> From<BTreeMap<Cow<'a, str>, Value<'a>>> for Value<'a> {
impl<'a> Display for Value<'a> { impl<'a> Display for Value<'a> {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self { match self {
Value::Null => { f.write_str("null")?; } Value::Null => { write!(f, "null")?; }
Value::Bool(b) => { f.write_str(if *b { "true" } else { "false" })?; } Value::Bool(b) => { write!(f, "{}", if *b { "true" } else { "false" })?; }
Value::Int(i) => { f.write_str(&i.to_string())?; } Value::Int(i) => { write!(f, "{}", i)?; }
Value::Float(n) => { f.write_str(&format!("{:e}", n.into_inner()))?; } Value::Float(n) => { write!(f, "{}", n.into_inner())?; }
Value::Uuid(u) => { f.write_str(&u.to_string())?; } Value::Uuid(u) => { write!(f, "{}", u)?; }
Value::Text(t) => { Value::Text(t) => {
f.write_char('"')?; f.write_char('"')?;
for char in t.chars() { for char in t.chars() {

Loading…
Cancel
Save