mirror of
https://github.com/quickwit-oss/tantivy.git
synced 2025-12-27 04:29:58 +00:00
blip
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
use std::io::Write;
|
||||
use std::io::BufWriter;
|
||||
use std::io::Read;
|
||||
use std::io::Cursor;
|
||||
use std::io::SeekFrom;
|
||||
use std::io::Seek;
|
||||
use core::DocId;
|
||||
use std::ops::DerefMut;
|
||||
use serde::Serialize;
|
||||
@@ -10,9 +14,6 @@ use core::error;
|
||||
use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
|
||||
|
||||
|
||||
|
||||
// writer
|
||||
|
||||
struct LayerBuilder {
|
||||
period: usize,
|
||||
buffer: Vec<u8>,
|
||||
@@ -69,7 +70,6 @@ pub struct SkipListBuilder {
|
||||
layers: Vec<LayerBuilder>,
|
||||
}
|
||||
|
||||
|
||||
enum InsertResult {
|
||||
SkipPointer(usize),
|
||||
NoNeedForSkip,
|
||||
@@ -128,3 +128,47 @@ impl SkipListBuilder {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ---------------------------
|
||||
|
||||
|
||||
struct Layer<R: Read + Seek> {
|
||||
reader: R,
|
||||
num_items: u32,
|
||||
}
|
||||
|
||||
impl<R: Read + Seek + Clone> Layer<R> {
|
||||
fn read(reader: &mut R) -> Layer<R> {
|
||||
// TODO error handling?
|
||||
let num_items = reader.read_u32::<BigEndian>().unwrap() as u32;
|
||||
let num_bytes = reader.read_u32::<BigEndian>().unwrap() as u32;
|
||||
let reader_clone = reader.clone();
|
||||
reader.seek(SeekFrom::Current(num_bytes as i64));
|
||||
Layer {
|
||||
reader: reader_clone,
|
||||
num_items: num_items,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct SkipList<R: Read + Seek> {
|
||||
layers: Vec<Layer<R>>,
|
||||
}
|
||||
|
||||
impl<R: Read + Seek> SkipList<R> {
|
||||
|
||||
pub fn read(data: &[u8]) -> SkipList<Cursor<&[u8]>> {
|
||||
let mut cursor = Cursor::new(data);
|
||||
// TODO error handling?
|
||||
let num_layers = cursor.read_u8().unwrap();
|
||||
let mut layers = Vec::new();
|
||||
for _ in (0..num_layers) {
|
||||
layers.push(Layer::read(&mut cursor));
|
||||
}
|
||||
SkipList {
|
||||
layers: layers
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -35,3 +35,16 @@ fn test_skip_list_builder() {
|
||||
assert_eq!(output[0], 3);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#[test]
|
||||
fn test_skip_list_builder() {
|
||||
{
|
||||
let mut output: Vec<u8> = Vec::new();
|
||||
let mut skip_list_builder: SkipListBuilder = SkipListBuilder::new(10);
|
||||
skip_list_builder.insert(2, 3);
|
||||
skip_list_builder.write::<Vec<u8>>(&mut output);
|
||||
let skip_list = SkipList::read(output.as_slice());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user