From 413cb4e71432e3e9dd432914eefa1394d120b00a Mon Sep 17 00:00:00 2001 From: Ziyang Hu Date: Wed, 11 May 2022 18:45:23 +0800 Subject: [PATCH] edge iterator --- src/db/iterator.rs | 8 ++++---- src/db/plan.rs | 48 +++++++++++++++++++++++++--------------------- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/db/iterator.rs b/src/db/iterator.rs index 6ff34648..fa16a623 100644 --- a/src/db/iterator.rs +++ b/src/db/iterator.rs @@ -1018,7 +1018,7 @@ mod tests { }; let it = OutputIterator::new(&it, &vals)?; for val in it { - println!("{}", val.unwrap()); + println!("{}", val?); } let duration = start.elapsed(); let duration2 = start2.elapsed(); @@ -1033,13 +1033,13 @@ mod tests { }; { for el in it.iter()? { - println!("{:?}", el); + println!("{:?}", el?); } } println!("XXXXX"); { for el in it.iter()? { - println!("{:?}", el); + println!("{:?}", el?); } } let mut it = sess.iter_node(tbl); @@ -1102,7 +1102,7 @@ mod tests { let plan = sess.reify_output_plan(plan)?; println!("{:?}", plan); for val in plan.iter()? { - println!("{:?}", val) + println!("{}", val?) } } drop(engine); diff --git a/src/db/plan.rs b/src/db/plan.rs index 53dbac97..0db2f82c 100644 --- a/src/db/plan.rs +++ b/src/db/plan.rs @@ -139,32 +139,36 @@ impl<'a> Session<'a> { self.convert_select_data_to_plan(plan, select_data) } fn convert_from_data_to_plan(&self, mut from_data: Vec) -> Result { - let res = match from_data.pop().unwrap() { - FromEl::Simple(el) => { - // println!( - // "{:#?}", - // self.base_relation_to_accessor_map(&el.table, &el.binding, &el.info) - // ); - match el.info.kind { - DataKind::Node => { - ExecPlan::NodeItPlan { - it: IteratorSlot::Dummy, - info: el.info, - binding: el.binding, + let convert_el = |el| + match el { + FromEl::Simple(el) => { + match el.info.kind { + DataKind::Node => { + Ok(ExecPlan::NodeItPlan { + it: IteratorSlot::Dummy, + info: el.info, + binding: el.binding, + }) } - } - DataKind::Edge => { - ExecPlan::EdgeItPlan { - it: IteratorSlot::Dummy, - info: el.info, - binding: el.binding, + DataKind::Edge => { + Ok(ExecPlan::EdgeItPlan { + it: IteratorSlot::Dummy, + info: el.info, + binding: el.binding, + }) } + _ => Err(LogicError("Wrong type for table binding".to_string())) } - _ => return Err(LogicError("Wrong type for table binding".to_string())) } - } - FromEl::Chain(_) => todo!(), - }; + FromEl::Chain(_) => todo!(), + }; + let mut from_data = from_data.into_iter(); + let fst = from_data.next().ok_or_else(|| + LogicError("Empty from clause".to_string()))?; + let res = convert_el(fst)?; + for _nxt in from_data { + // TODO build cartesian product + } Ok(res) } pub(crate) fn node_accessor_map(