From 27daa08b7773c2eaa49140e1d366097ab1290ab7 Mon Sep 17 00:00:00 2001 From: Zixuan Chen Date: Tue, 9 Jul 2024 00:32:16 +0800 Subject: [PATCH] pr: impl kv store --- crates/loro-internal/src/kv_store.rs | 26 +++++++++++++++---- .../loro-internal/src/oplog/change_store.rs | 5 +++- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/crates/loro-internal/src/kv_store.rs b/crates/loro-internal/src/kv_store.rs index d4698639..19f7ff0e 100644 --- a/crates/loro-internal/src/kv_store.rs +++ b/crates/loro-internal/src/kv_store.rs @@ -12,9 +12,14 @@ pub trait KvStore: std::fmt::Debug + Send + Sync { &self, start: Bound<&[u8]>, end: Bound<&[u8]>, - ) -> Box>; + ) -> Box + '_>; fn len(&self) -> usize; fn size(&self) -> usize; + /// Performs a binary search over the keys in the store. + /// + /// The comparator function should return an order code that indicates + /// whether its argument is `Less`, `Equal` or `Greater` the desired + /// target. fn binary_search_by( &self, start: Bound<&[u8]>, @@ -73,8 +78,11 @@ mod mem { &self, start: Bound<&[u8]>, end: Bound<&[u8]>, - ) -> Box> { - todo!() + ) -> Box + '_> { + Box::new( + self.range::<[u8], _>((start, end)) + .map(|(k, v)| (k.clone(), v.clone())), + ) } fn len(&self) -> usize { @@ -97,9 +105,17 @@ mod mem { &self, start: Bound<&[u8]>, end: Bound<&[u8]>, - f: Box std::cmp::Ordering>, + mut f: Box std::cmp::Ordering>, ) -> Option<(Bytes, Bytes)> { - todo!() + for (k, v) in self.range::<[u8], _>((start, end)) { + match f(k, v) { + std::cmp::Ordering::Equal => return Some((k.clone(), v.clone())), + std::cmp::Ordering::Less => continue, + std::cmp::Ordering::Greater => break, + } + } + + None } } } diff --git a/crates/loro-internal/src/oplog/change_store.rs b/crates/loro-internal/src/oplog/change_store.rs index 7436f7f9..6a4ff42c 100644 --- a/crates/loro-internal/src/oplog/change_store.rs +++ b/crates/loro-internal/src/oplog/change_store.rs @@ -165,7 +165,10 @@ impl ChangeStore { } let store = self.external_kv.lock().unwrap(); - let mut iter = store.scan(std::ops::Bound::Unbounded, Bound::Included(&id.to_bytes())); + let mut iter = store.scan( + std::ops::Bound::Unbounded, + Bound::Included(&Bytes::copy_from_slice(&id.to_bytes())), + ); let (b_id, b_bytes) = iter.next_back()?; let block_id: ID = ID::from_bytes(&b_id[..]); let block = ChangesBlock::from_bytes(b_bytes, true).unwrap();