From 608505dc7a78c8f489bc07ee5344a8129fb2188d Mon Sep 17 00:00:00 2001 From: Chris Mikkelson Date: Wed, 7 Aug 2024 18:12:38 -0600 Subject: [PATCH] Update API layout to use prelude Add test for range iter, add missing linear search step to BlockIter seek --- src/lib.rs | 14 ++++++++++++-- src/reader/block.rs | 11 +++++++++-- src/writer/block_builder.rs | 1 - tests/rwtest.rs | 21 +++++++++++++++------ 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 66d1355..4a536c0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,9 +1,10 @@ #![allow(dead_code)] pub mod entry; -use entry::Entry; +pub use entry::Entry; pub mod source; -use source::Source; +pub use source::IterSource; +pub use source::Source; pub mod iter; use iter::Iter; @@ -18,3 +19,12 @@ mod metadata; type Error = Box; type Result = std::result::Result; + +pub mod prelude { + pub use super::entry::Entry; + pub use super::iter::Iter; + pub use super::reader::Reader; + pub use super::source::IterSource; + pub use super::source::Source; + pub use super::writer::Writer; +} diff --git a/src/reader/block.rs b/src/reader/block.rs index 2695e27..be4327b 100644 --- a/src/reader/block.rs +++ b/src/reader/block.rs @@ -45,14 +45,12 @@ pub(crate) struct Block> { impl> Block { pub(crate) fn new(data: DataSlice) -> Result { - println!("Block::new( {:?} )", data.as_ref()); if data.as_ref().len() < size_of::() { return Err("block data too short".into()); } let rc_off = data.as_ref().len() - size_of::(); let restart_count = u32::from_be_bytes(data.as_ref()[rc_off..].try_into()?) as usize; - println!("restart_count = {}", restart_count); // try 32-bit restarts if (restart_count * size_of::()) > rc_off { @@ -203,5 +201,14 @@ impl> Iter for BlockIter { Some(()) }); } + if self.cur_ent.is_none() && self.decode().is_none() { + // empty block? + return; + } + while self.cur_ent.as_ref().unwrap().key.as_slice() < key { + if self.decode().is_none() { + return; + } + } } } diff --git a/src/writer/block_builder.rs b/src/writer/block_builder.rs index 2f6c0ef..bbfc487 100644 --- a/src/writer/block_builder.rs +++ b/src/writer/block_builder.rs @@ -133,7 +133,6 @@ mod test { let block_len = bb.len(); let block_data = bb.as_slice(); assert_eq!(block_data.len(), block_len); - println!("Block: {:?}", block_data); let bi = Block::new(DataSlice::new(bb.as_slice())) .unwrap() .into_iter(); diff --git a/tests/rwtest.rs b/tests/rwtest.rs index 6dde2ce..5c6fa5e 100644 --- a/tests/rwtest.rs +++ b/tests/rwtest.rs @@ -1,7 +1,4 @@ -use mtbl::entry::Entry; -use mtbl::reader::Reader; -use mtbl::source::IterSource; -use mtbl::writer::Writer; +use mtbl::prelude::*; #[test] fn test_write_readback() { @@ -17,6 +14,18 @@ fn test_write_readback() { } assert!(store.len() > 512); - let ri = Reader::new(&store).iter(); - assert_eq!(ri.collect::>(), reference); + let r = Reader::new(&store); + let ri = r.iter(); + assert_eq!(ri.collect::>(), reference); + + // test range + let rangei = r.get_range(&u32::to_be_bytes(3), &u32::to_be_bytes(5)); + assert_eq!( + rangei.collect::>(), + reference + .into_iter() + .filter(|e| e.key.as_slice() >= &u32::to_be_bytes(3) + && e.key.as_slice() <= &u32::to_be_bytes(5)) + .collect::>() + ) } -- 2.50.1