diff --git a/src/store/broken_seg/e6ece22e5bca4e0dbe7ce3e4dcbd5bbf.store b/src/store/broken_seg/e6ece22e5bca4e0dbe7ce3e4dcbd5bbf.store new file mode 100644 index 000000000..30635b47c Binary files /dev/null and b/src/store/broken_seg/e6ece22e5bca4e0dbe7ce3e4dcbd5bbf.store differ diff --git a/src/store/mod.rs b/src/store/mod.rs index 6eff6ddd7..64804eec9 100644 --- a/src/store/mod.rs +++ b/src/store/mod.rs @@ -36,6 +36,8 @@ and should rely on either mod index; mod reader; mod writer; +mod tests_store; + pub use self::reader::StoreReader; pub use self::writer::StoreWriter; diff --git a/src/store/reader.rs b/src/store/reader.rs index 4a47b716c..61e625dff 100644 --- a/src/store/reader.rs +++ b/src/store/reader.rs @@ -50,6 +50,21 @@ impl StoreReader { self.skip_index.checkpoints() } + pub fn documents(&self) -> Vec { + let mut documents = Vec::new(); + for checkpoint in self.skip_index.checkpoints() { + let block = self.read_block(&checkpoint).unwrap(); + let mut cursor = &block[..]; + while cursor.len() > 0 { + let doc_length = VInt::deserialize(&mut cursor).unwrap().val() as usize; + let doc = Document::deserialize(&mut &cursor[..doc_length]).unwrap(); + documents.push(doc); + cursor = &cursor[doc_length..]; + } + } + documents + } + fn block_checkpoint(&self, doc_id: DocId) -> Option { self.skip_index.seek(doc_id) } diff --git a/src/store/tests_store.rs b/src/store/tests_store.rs new file mode 100644 index 000000000..1aefc07b9 --- /dev/null +++ b/src/store/tests_store.rs @@ -0,0 +1,33 @@ +use std::path::Path; + +use crate::HasLen; +use crate::directory::{Directory, ManagedDirectory, MmapDirectory, RAMDirectory}; +use crate::fastfield::DeleteBitSet; + +use super::{StoreReader, StoreWriter}; + + +#[test] +fn test_toto() -> crate::Result<()> { + let directory = ManagedDirectory::wrap(MmapDirectory::open("src/store/broken_seg")?)?; + assert!(directory.validate_checksum(Path::new("e6ece22e5bca4e0dbe7ce3e4dcbd5bbf.store"))?); + let store_file = directory.open_read(Path::new("e6ece22e5bca4e0dbe7ce3e4dcbd5bbf.store"))?; + let store = StoreReader::open(store_file)?; + let documents = store.documents(); + let ram_directory = RAMDirectory::create(); + let path = Path::new("store"); + let store_wrt = ram_directory.open_write(path)?; + let mut store_writer = StoreWriter::new(store_wrt); + for doc in &documents { + store_writer.store(doc)?; + } + store_writer.close()?; + let store_data = ram_directory.open_read(path)?; + let new_store = StoreReader::open(store_data)?; + for doc in 0.. { + println!("{}", doc); + let doc = store.get(53)?; + println!("{:?}", doc); + } + Ok(()) +}