mirror of
https://github.com/meilisearch/meilisearch.git
synced 2025-06-12 06:57:50 +00:00
56 lines
1.3 KiB
Rust
56 lines
1.3 KiB
Rust
use std::io::{Cursor, Write};
|
|
use std::path::PathBuf;
|
|
use std::error::Error;
|
|
|
|
use byteorder::{NetworkEndian, WriteBytesExt};
|
|
|
|
use crate::index::schema::SchemaAttr;
|
|
use crate::DocumentId;
|
|
|
|
mod negative;
|
|
mod positive;
|
|
|
|
pub use self::positive::{PositiveUpdateBuilder, NewState};
|
|
pub use self::negative::NegativeUpdateBuilder;
|
|
|
|
const DOC_KEY_LEN: usize = 4 + std::mem::size_of::<u64>();
|
|
const DOC_KEY_ATTR_LEN: usize = DOC_KEY_LEN + 1 + std::mem::size_of::<u32>();
|
|
|
|
pub struct Update {
|
|
path: PathBuf,
|
|
}
|
|
|
|
impl Update {
|
|
pub fn open<P: Into<PathBuf>>(path: P) -> Result<Update, Box<Error>> {
|
|
Ok(Update { path: path.into() })
|
|
}
|
|
|
|
pub fn into_path_buf(self) -> PathBuf {
|
|
self.path
|
|
}
|
|
}
|
|
|
|
// "doc-{ID_8_BYTES}"
|
|
fn raw_document_key(id: DocumentId) -> [u8; DOC_KEY_LEN] {
|
|
let mut key = [0; DOC_KEY_LEN];
|
|
|
|
let mut wtr = Cursor::new(&mut key[..]);
|
|
wtr.write_all(b"doc-").unwrap();
|
|
wtr.write_u64::<NetworkEndian>(id).unwrap();
|
|
|
|
key
|
|
}
|
|
|
|
// "doc-{ID_8_BYTES}-{ATTR_4_BYTES}"
|
|
fn raw_document_key_attr(id: DocumentId, attr: SchemaAttr) -> [u8; DOC_KEY_ATTR_LEN] {
|
|
let mut key = [0; DOC_KEY_ATTR_LEN];
|
|
let raw_key = raw_document_key(id);
|
|
|
|
let mut wtr = Cursor::new(&mut key[..]);
|
|
wtr.write_all(&raw_key).unwrap();
|
|
wtr.write_all(b"-").unwrap();
|
|
wtr.write_u32::<NetworkEndian>(attr.as_u32()).unwrap();
|
|
|
|
key
|
|
}
|