use kevy_store::Store;
use super::super::wire::{encode_highlight, encode_hydration_row, peek_hydration};
use crate::cmd_index_query::ST_OK;
fn encode_okey(chunk: &mut Vec<u8>, okey: Option<&[u8]>) {
match okey {
Some(k) => {
chunk.push(1);
chunk.extend_from_slice(&(k.len() as u32).to_le_bytes());
chunk.extend_from_slice(k);
}
None => chunk.push(0),
}
}
pub(super) fn encode_hits(
store: &mut Store,
hits: &[kevy_text::TextMatch],
spans: &Option<Vec<crate::cmd_index_query::HitSpans>>,
okeys: &Option<Vec<Option<Vec<u8>>>>,
dkeys: &Option<Vec<Option<Vec<u8>>>>,
facets: &[Vec<kevy_text::Bucket>],
fields: &[Vec<u8>],
) -> Vec<u8> {
let mut chunk = vec![ST_OK];
chunk.extend_from_slice(&(hits.len() as u32).to_le_bytes());
let keys: Vec<&[u8]> = hits.iter().map(|h| h.key.as_slice()).collect();
let rows = peek_hydration(store, &keys, fields);
for (i, h) in hits.iter().enumerate() {
chunk.extend_from_slice(&(h.key.len() as u32).to_le_bytes());
chunk.extend_from_slice(&h.key);
chunk.extend_from_slice(&h.score.to_le_bytes());
encode_hydration_row(&mut chunk, fields.len(), &rows[i]);
if let Some(spans) = &spans {
encode_highlight(&mut chunk, &spans[i]);
}
if let Some(okeys) = okeys {
encode_okey(&mut chunk, okeys[i].as_deref());
}
if let Some(dkeys) = dkeys {
encode_okey(&mut chunk, dkeys[i].as_deref());
}
}
for field in facets {
chunk.extend_from_slice(&(field.len() as u32).to_le_bytes());
for (key, label, n) in field {
for part in [key, label] {
chunk.extend_from_slice(&(part.len() as u32).to_le_bytes());
chunk.extend_from_slice(part);
}
chunk.extend_from_slice(&n.to_le_bytes());
}
}
chunk
}