#![allow(dead_code)]
use crate::lexical::index::structures::dictionary::BlockMax;
use super::block_max_data::BlockMaxData;
use super::front_coding::encode_block_terms;
use super::term_info_block::{FixedTermInfo, FixedTermInfoBlock};
pub(super) fn encode_block_into(
out: &mut Vec<u8>,
terms: &[&[u8]],
fixed_infos: &[FixedTermInfo],
block_max_per_term: &[Vec<BlockMax>],
) {
assert_eq!(
terms.len(),
fixed_infos.len(),
"terms and fixed_infos must have equal length"
);
assert_eq!(
terms.len(),
block_max_per_term.len(),
"terms and block_max_per_term must have equal length"
);
assert!(
!terms.is_empty() && terms.len() <= 128,
"terms.len() must be in 1..=128"
);
let term_count = terms.len();
write_varint_into(out, term_count as u64);
let fc = encode_block_terms(terms);
write_varint_into(out, fc.len() as u64);
out.extend_from_slice(&fc);
let ftib = FixedTermInfoBlock::encode(fixed_infos);
out.extend_from_slice(&ftib.block_min_posting_offset.to_le_bytes());
out.extend_from_slice(&ftib.block_min_posting_length.to_le_bytes());
out.extend_from_slice(&ftib.block_min_doc_frequency.to_le_bytes());
out.extend_from_slice(&ftib.block_min_total_frequency.to_le_bytes());
out.extend_from_slice(&ftib.ref_max_score_factor.to_le_bytes());
out.push(ftib.posting_offset_nbits);
out.push(ftib.posting_length_nbits);
out.push(ftib.doc_frequency_nbits);
out.push(ftib.total_frequency_nbits);
out.push(ftib.max_score_factor_size);
out.extend_from_slice(&(ftib.payload.len() as u32).to_le_bytes());
out.extend_from_slice(&ftib.payload);
let bmd = BlockMaxData::encode(block_max_per_term);
for off in &bmd.offsets {
out.extend_from_slice(&off.to_le_bytes());
}
out.extend_from_slice(&(bmd.data.len() as u32).to_le_bytes());
out.extend_from_slice(&bmd.data);
}
fn write_varint_into(buf: &mut Vec<u8>, mut value: u64) {
while value >= 0x80 {
buf.push(((value as u8) & 0x7F) | 0x80);
value >>= 7;
}
buf.push(value as u8);
}