From 921ce4d7ad6606f4ac2f66dde10f151822a940e9 Mon Sep 17 00:00:00 2001 From: Ziyang Hu Date: Sun, 8 May 2022 17:49:13 +0800 Subject: [PATCH] use while let --- src/db/ddl.rs | 6 ++---- src/db/engine.rs | 3 +-- src/db/env.rs | 6 ++---- src/db/eval.rs | 8 +++----- src/db/mutation.rs | 6 ++---- src/db/plan.rs | 30 +++++++++++++++++++++++------- 6 files changed, 33 insertions(+), 26 deletions(-) diff --git a/src/db/ddl.rs b/src/db/ddl.rs index 83bcbb2a..a6808318 100644 --- a/src/db/ddl.rs +++ b/src/db/ddl.rs @@ -284,8 +284,7 @@ impl<'s> Session<'s> { let it = self.txn.iterator(true, &self.perm_cf); it.seek(&prefix); - while it.is_valid() { - let val = it.key().ok_or_else(|| CozoError::LogicError("Failed to get tuple".to_string()))?; + while let Some(val) = it.key() { let cur = Tuple::new(val); if !cur.starts_with(&prefix) { break; @@ -301,8 +300,7 @@ impl<'s> Session<'s> { let it = self.txn.iterator(false, &self.temp_cf); it.seek(&prefix); - while it.is_valid() { - let val = it.key().ok_or_else(|| CozoError::LogicError("Failed to get tuple".to_string()))?; + while let Some(val) = it.key() { let cur = Tuple::new(val); if !cur.starts_with(&prefix) { break; diff --git a/src/db/engine.rs b/src/db/engine.rs index 5a85b316..e23a8a20 100644 --- a/src/db/engine.rs +++ b/src/db/engine.rs @@ -241,8 +241,7 @@ mod tests { } let it = sess.txn.iterator(true, &sess.perm_cf); it.to_first(); - while it.is_valid() { - let (key, val) = it.pair().unwrap(); + while let Some((key, val)) = it.pair() { println!("a: {:?} {:?}", key.as_ref(), val.as_ref()); println!("v: {:?} {:?}", Tuple::new(key), Tuple::new(val)); it.next(); diff --git a/src/db/env.rs b/src/db/env.rs index 87ba1fcf..bb2b9f21 100644 --- a/src/db/env.rs +++ b/src/db/env.rs @@ -101,8 +101,7 @@ impl<'s> Session<'s> { let it = self.txn.iterator(false, &self.temp_cf); it.seek(&prefix); let mut to_delete = vec![]; - while it.is_valid() { - let val = it.key().ok_or_else(|| CozoError::LogicError("Failed to get tuple".to_string()))?; + while let Some(val) = it.key() { let cur = Tuple::new(val); if cur.starts_with(&prefix) { if let Some(name) = cur.get(1) { @@ -144,8 +143,7 @@ impl<'s> Session<'s> { prefix.push_int(self.stack_depth as i64); let it = self.txn.iterator(false, &self.temp_cf); it.seek(&prefix); - while it.is_valid() { - let val = it.key().ok_or_else(|| CozoError::LogicError("Failed to get tuple".to_string()))?; + while let Some(val) = it.key() { let cur = Tuple::new(val); if cur.starts_with(&prefix) { let mut ikey = Tuple::with_prefix(cur.get_prefix()); diff --git a/src/db/eval.rs b/src/db/eval.rs index 5d443462..564df700 100644 --- a/src/db/eval.rs +++ b/src/db/eval.rs @@ -156,7 +156,7 @@ impl<'s> Session<'s> { Value::Uuid(_) | Value::Text(_) | Value::EndSentinel) => Ok((true, v)), - v@Value::TupleRef(_, _) => Ok((false, v)), + v @ Value::TupleRef(_, _) => Ok((false, v)), Value::List(l) => { let init_vec = Vec::with_capacity(l.len()); let res: Result<(bool, Vec)> = l.into_iter() @@ -1210,16 +1210,14 @@ mod tests { let it = env.txn.iterator(false, &env.perm_cf); it.to_first(); - while it.is_valid() { - let (k, v) = it.pair().unwrap(); + while let Some((k, v)) = it.pair() { println!("{:?}, {:?}", Tuple::new(k), Tuple::new(v)); it.next(); } let it = env.txn.iterator(false, &env.temp_cf); it.to_first(); - while it.is_valid() { - let (k, v) = it.pair().unwrap(); + while let Some((k, v)) = it.pair() { println!("{:?}, {:?}", Tuple::new(k), Tuple::new(v)); it.next(); } diff --git a/src/db/mutation.rs b/src/db/mutation.rs index c680fbac..26c5a6f8 100644 --- a/src/db/mutation.rs +++ b/src/db/mutation.rs @@ -289,8 +289,7 @@ mod tests { sess.rollback().unwrap(); let it = sess.txn.iterator(true, &sess.perm_cf); it.to_first(); - while it.is_valid() { - let (k, v) = it.pair().unwrap(); + while let Some((k, v)) = it.pair() { println!("K: {:?}, V: {:?}", Tuple::new(k), Tuple::new(v)); it.next(); } @@ -340,8 +339,7 @@ mod tests { let it = sess.txn.iterator(true, &sess.perm_cf); it.to_first(); - while it.is_valid() { - let (k, v) = it.pair().unwrap(); + while let Some((k, v)) = it.pair() { println!("K: {:?}, V: {:?}", Tuple::new(k), Tuple::new(v)); it.next(); } diff --git a/src/db/plan.rs b/src/db/plan.rs index 0adcb180..714d31aa 100644 --- a/src/db/plan.rs +++ b/src/db/plan.rs @@ -1,12 +1,13 @@ use std::collections::BTreeMap; use pest::iterators::Pair; +use cozorocks::{IteratorPtr, SlicePtr}; use crate::db::engine::Session; use crate::db::query::{FromEl, Selection}; use crate::db::table::{ColId, TableId, TableInfo}; use crate::relation::value::{StaticValue, Value}; use crate::parser::Rule; use crate::error::Result; -use crate::relation::tuple::OwnTuple; +use crate::relation::tuple::{OwnTuple, Tuple}; #[derive(Clone, Eq, PartialEq, Debug)] pub enum QueryPlan { @@ -132,7 +133,7 @@ impl<'a> Session<'a> { Ok(QueryPlan::Projection { arg: Box::new(plan), projection: select_data }) } - pub fn iter_table(&self, tid: TableId) -> ! { + pub fn iter_table(&self, tid: TableId) -> TableRowIterator { let it = if tid.in_root { self.txn.iterator(true, &self.perm_cf) } else { @@ -140,19 +141,34 @@ impl<'a> Session<'a> { }; let prefix = OwnTuple::with_prefix(tid.id as u32); it.seek(prefix); - // it.iter() - todo!() + TableRowIterator { + it, + started: false, + } } } -pub struct NodeRowIterator { - +pub struct TableRowIterator<'a> { + it: IteratorPtr<'a>, + started: bool, } -pub struct EdgeRowIterator { +impl<'a> Iterator for TableRowIterator<'a> { + type Item = (Tuple, Tuple); + fn next(&mut self) -> Option { + if self.started { + self.next(); + } + self.it.pair().map(|(k, v)| (Tuple::new(k), Tuple::new(v))) + } } + +pub struct NodeRowIterator {} + +pub struct EdgeRowIterator {} + #[cfg(test)] mod tests { use std::collections::BTreeMap;