range scan may depend on the lifetime of session

main
Ziyang Hu 2 years ago
parent 51c9206b35
commit 7b3e0c39cf

@ -935,7 +935,7 @@ impl StoredRA {
} }
} }
fn iter(&self, tx: &SessionTx) -> Result<TupleIter<'_>> { fn iter<'a>(&'a self, tx: &'a SessionTx) -> Result<TupleIter<'a>> {
let it = self.storage.scan_all(tx); let it = self.storage.scan_all(tx);
Ok(if self.filters.is_empty() { Ok(if self.filters.is_empty() {
Box::new(it) Box::new(it)

@ -214,17 +214,17 @@ impl RelationHandle {
RelationDeserError RelationDeserError
})?) })?)
} }
pub(crate) fn scan_all(&self, tx: &SessionTx) -> impl Iterator<Item = Result<Tuple>> { pub(crate) fn scan_all<'a>(&self, tx: &'a SessionTx) -> impl Iterator<Item = Result<Tuple>> + 'a {
let lower = Tuple::default().encode_as_key(self.id); let lower = Tuple::default().encode_as_key(self.id);
let upper = Tuple::default().encode_as_key(self.id.next()); let upper = Tuple::default().encode_as_key(self.id.next());
tx.tx.range_scan(&lower, &upper) tx.tx.range_scan(&lower, &upper)
} }
pub(crate) fn scan_prefix( pub(crate) fn scan_prefix<'a>(
&self, &self,
tx: &SessionTx, tx: &'a SessionTx,
prefix: &Tuple, prefix: &Tuple,
) -> impl Iterator<Item = Result<Tuple>> { ) -> impl Iterator<Item = Result<Tuple>> + 'a {
let mut lower = prefix.0.clone(); let mut lower = prefix.0.clone();
lower.truncate(self.metadata.keys.len()); lower.truncate(self.metadata.keys.len());
let mut upper = lower.clone(); let mut upper = lower.clone();
@ -234,13 +234,13 @@ impl RelationHandle {
// RelationIterator::new(tx, &prefix_encoded, &upper_encoded) // RelationIterator::new(tx, &prefix_encoded, &upper_encoded)
tx.tx.range_scan(&prefix_encoded, &upper_encoded) tx.tx.range_scan(&prefix_encoded, &upper_encoded)
} }
pub(crate) fn scan_bounded_prefix( pub(crate) fn scan_bounded_prefix<'a>(
&self, &self,
tx: &SessionTx, tx: &'a SessionTx,
prefix: &Tuple, prefix: &Tuple,
lower: &[DataValue], lower: &[DataValue],
upper: &[DataValue], upper: &[DataValue],
) -> impl Iterator<Item = Result<Tuple>> { ) -> impl Iterator<Item = Result<Tuple>> + 'a {
let mut lower_t = prefix.clone(); let mut lower_t = prefix.clone();
lower_t.0.extend_from_slice(lower); lower_t.0.extend_from_slice(lower);
let mut upper_t = prefix.clone(); let mut upper_t = prefix.clone();

@ -25,14 +25,14 @@ pub trait StoreTx {
fn del(&mut self, key: &[u8]) -> Result<()>; fn del(&mut self, key: &[u8]) -> Result<()>;
fn exists(&self, key: &[u8], for_update: bool) -> Result<bool>; fn exists(&self, key: &[u8], for_update: bool) -> Result<bool>;
fn commit(&mut self) -> Result<()>; fn commit(&mut self) -> Result<()>;
fn range_scan( fn range_scan<'a>(
&self, &'a self,
lower: &[u8], lower: &[u8],
upper: &[u8], upper: &[u8],
) -> Box<dyn Iterator<Item = Result<Tuple>>>; ) -> Box<dyn Iterator<Item = Result<Tuple>> + 'a>;
fn range_scan_raw( fn range_scan_raw<'a>(
&self, &'a self,
lower: &[u8], lower: &[u8],
upper: &[u8], upper: &[u8],
) -> Box<dyn Iterator<Item = Result<(Vec<u8>, Vec<u8>)>>>; ) -> Box<dyn Iterator<Item = Result<(Vec<u8>, Vec<u8>)>> + 'a>;
} }

Loading…
Cancel
Save