mirror of
https://github.com/meilisearch/MeiliSearch
synced 2025-07-04 20:37:15 +02:00
Simplify indexing task for facet_exists_docids database
This commit is contained in:
parent
392472f4bb
commit
30bd4db0fc
6 changed files with 50 additions and 105 deletions
25
milli/src/heed_codec/facet/field_id_codec.rs
Normal file
25
milli/src/heed_codec/facet/field_id_codec.rs
Normal file
|
@ -0,0 +1,25 @@
|
|||
use crate::{FieldId, BEU16};
|
||||
use heed::zerocopy::AsBytes;
|
||||
use std::{borrow::Cow, convert::TryInto};
|
||||
|
||||
pub struct FieldIdCodec;
|
||||
|
||||
impl<'a> heed::BytesDecode<'a> for FieldIdCodec {
|
||||
type DItem = FieldId;
|
||||
|
||||
fn bytes_decode(bytes: &'a [u8]) -> Option<Self::DItem> {
|
||||
let bytes: [u8; 2] = bytes[..2].try_into().ok()?;
|
||||
let field_id = BEU16::from(bytes).get();
|
||||
Some(field_id)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> heed::BytesEncode<'a> for FieldIdCodec {
|
||||
type EItem = FieldId;
|
||||
|
||||
fn bytes_encode(field_id: &Self::EItem) -> Option<Cow<[u8]>> {
|
||||
let field_id = BEU16::new(*field_id);
|
||||
let bytes = field_id.as_bytes();
|
||||
Some(Cow::Owned(bytes.to_vec()))
|
||||
}
|
||||
}
|
|
@ -5,6 +5,7 @@ mod facet_string_level_zero_value_codec;
|
|||
mod facet_string_zero_bounds_value_codec;
|
||||
mod field_doc_id_facet_f64_codec;
|
||||
mod field_doc_id_facet_string_codec;
|
||||
mod field_id_codec;
|
||||
|
||||
pub use self::facet_level_value_f64_codec::FacetLevelValueF64Codec;
|
||||
pub use self::facet_level_value_u32_codec::FacetLevelValueU32Codec;
|
||||
|
@ -15,6 +16,7 @@ pub use self::facet_string_level_zero_value_codec::{
|
|||
pub use self::facet_string_zero_bounds_value_codec::FacetStringZeroBoundsValueCodec;
|
||||
pub use self::field_doc_id_facet_f64_codec::FieldDocIdFacetF64Codec;
|
||||
pub use self::field_doc_id_facet_string_codec::FieldDocIdFacetStringCodec;
|
||||
pub use self::field_id_codec::FieldIdCodec;
|
||||
|
||||
/// Tries to split a slice in half at the given middle point,
|
||||
/// `None` if the slice is too short.
|
||||
|
@ -25,44 +27,3 @@ pub fn try_split_at(slice: &[u8], mid: usize) -> Option<(&[u8], &[u8])> {
|
|||
None
|
||||
}
|
||||
}
|
||||
|
||||
use std::borrow::Cow;
|
||||
use std::convert::TryInto;
|
||||
|
||||
use crate::{try_split_array_at, DocumentId, FieldId};
|
||||
|
||||
pub struct FieldIdCodec;
|
||||
|
||||
impl<'a> heed::BytesDecode<'a> for FieldIdCodec {
|
||||
type DItem = FieldId;
|
||||
|
||||
fn bytes_decode(bytes: &'a [u8]) -> Option<Self::DItem> {
|
||||
let (field_id_bytes, _) = try_split_array_at(bytes)?;
|
||||
let field_id = u16::from_be_bytes(field_id_bytes);
|
||||
Some(field_id)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> heed::BytesEncode<'a> for FieldIdCodec {
|
||||
type EItem = FieldId;
|
||||
|
||||
fn bytes_encode(field_id: &Self::EItem) -> Option<Cow<[u8]>> {
|
||||
Some(Cow::Owned(field_id.to_be_bytes().to_vec()))
|
||||
}
|
||||
}
|
||||
|
||||
pub struct FieldIdDocIdCodec;
|
||||
|
||||
impl<'a> heed::BytesDecode<'a> for FieldIdDocIdCodec {
|
||||
type DItem = (FieldId, DocumentId);
|
||||
|
||||
fn bytes_decode(bytes: &'a [u8]) -> Option<Self::DItem> {
|
||||
let (field_id_bytes, bytes) = try_split_array_at(bytes)?;
|
||||
let field_id = u16::from_be_bytes(field_id_bytes);
|
||||
|
||||
let document_id_bytes = bytes[..4].try_into().ok()?;
|
||||
let document_id = u32::from_be_bytes(document_id_bytes);
|
||||
|
||||
Some((field_id, document_id))
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue