feat: Use sdset Set primitives everywhere possible

This commit is contained in:
Clément Renault 2018-12-09 14:18:23 +01:00
parent 06ba82cfa8
commit 6cb1bfd815
No known key found for this signature in database
GPG key ID: 0151CDAB43460DAE
8 changed files with 41 additions and 35 deletions

View file

@ -4,6 +4,7 @@ use std::path::Path;
use std::sync::Arc;
use std::{io, mem};
use sdset::Set;
use fst::raw::MmapReadOnly;
use serde::ser::{Serialize, Serializer};
@ -42,11 +43,12 @@ impl DocIds {
self.doc_ids().binary_search(&doc).is_ok()
}
pub fn doc_ids(&self) -> &[DocumentId] {
pub fn doc_ids(&self) -> &Set<DocumentId> {
let slice = &self.data;
let ptr = slice.as_ptr() as *const DocumentId;
let len = slice.len() / mem::size_of::<DocumentId>();
unsafe { from_raw_parts(ptr, len) }
let slice = unsafe { from_raw_parts(ptr, len) };
Set::new_unchecked(slice)
}
}

View file

@ -5,8 +5,9 @@ use std::ops::Index;
use std::path::Path;
use std::sync::Arc;
use fst::raw::MmapReadOnly;
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
use fst::raw::MmapReadOnly;
use sdset::Set;
use crate::DocIndex;
use crate::data::Data;
@ -64,11 +65,12 @@ impl DocIndexes {
bytes
}
pub fn get(&self, index: usize) -> Option<&[DocIndex]> {
pub fn get(&self, index: usize) -> Option<&Set<DocIndex>> {
self.ranges().get(index as usize).map(|Range { start, end }| {
let start = *start as usize;
let end = *end as usize;
&self.indexes()[start..end]
let slice = &self.indexes()[start..end];
Set::new_unchecked(slice)
})
}
@ -117,7 +119,7 @@ impl<W: Write> DocIndexesBuilder<W> {
}
}
pub fn insert(&mut self, indexes: &[DocIndex]) -> io::Result<()> {
pub fn insert(&mut self, indexes: &Set<DocIndex>) -> io::Result<()> {
let len = indexes.len() as u64;
let start = self.ranges.last().map(|r| r.end).unwrap_or(0);
let range = Range { start, end: start + len };
@ -164,16 +166,16 @@ mod tests {
let mut builder = DocIndexesBuilder::memory();
builder.insert(&[a])?;
builder.insert(&[a, b, c])?;
builder.insert(&[a, c])?;
builder.insert(Set::new(&[a])?)?;
builder.insert(Set::new(&[a, b, c])?)?;
builder.insert(Set::new(&[a, c])?)?;
let bytes = builder.into_inner()?;
let docs = DocIndexes::from_bytes(bytes)?;
assert_eq!(docs.get(0), Some(&[a][..]));
assert_eq!(docs.get(1), Some(&[a, b, c][..]));
assert_eq!(docs.get(2), Some(&[a, c][..]));
assert_eq!(docs.get(0), Some(Set::new(&[a])?));
assert_eq!(docs.get(1), Some(Set::new(&[a, b, c])?));
assert_eq!(docs.get(2), Some(Set::new(&[a, c])?));
assert_eq!(docs.get(3), None);
Ok(())
@ -187,9 +189,9 @@ mod tests {
let mut builder = DocIndexesBuilder::memory();
builder.insert(&[a])?;
builder.insert(&[a, b, c])?;
builder.insert(&[a, c])?;
builder.insert(Set::new(&[a])?)?;
builder.insert(Set::new(&[a, b, c])?)?;
builder.insert(Set::new(&[a, c])?)?;
let builder_bytes = builder.into_inner()?;
let docs = DocIndexes::from_bytes(builder_bytes.clone())?;