use serde::Serialize;
#[derive(Serialize, zerompk::ToMessagePack, zerompk::FromMessagePack)]
#[msgpack(map)]
pub(in crate::data::executor) struct VectorSearchHit {
pub id: u32,
pub distance: f32,
#[serde(skip_serializing_if = "Option::is_none")]
pub doc_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub body: Option<Vec<u8>>,
}
#[derive(Serialize, Clone)]
pub(in crate::data::executor) struct DocumentRow {
pub id: String,
pub data: serde_json::Value,
}
impl zerompk::ToMessagePack for DocumentRow {
fn write<W: zerompk::Write>(&self, writer: &mut W) -> zerompk::Result<()> {
writer.write_map_len(2)?;
writer.write_string("id")?;
writer.write_string(&self.id)?;
writer.write_string("data")?;
nodedb_types::json_msgpack::JsonValue(self.data.clone()).write(writer)
}
}
#[derive(Serialize, zerompk::ToMessagePack)]
#[msgpack(map)]
pub(in crate::data::executor) struct NeighborEntry<'a> {
pub label: &'a str,
pub node: &'a str,
}
#[derive(Serialize, zerompk::ToMessagePack)]
#[msgpack(map)]
pub(in crate::data::executor) struct NeighborMultiEntry<'a> {
pub src: &'a str,
pub label: &'a str,
pub node: &'a str,
}
#[derive(Serialize, zerompk::ToMessagePack)]
#[msgpack(map)]
pub(in crate::data::executor) struct SubgraphEdge<'a> {
pub src: &'a str,
pub label: &'a str,
pub dst: &'a str,
}
#[derive(Serialize, zerompk::ToMessagePack)]
#[msgpack(map)]
pub(in crate::data::executor) struct GraphRagResult {
pub node_id: String,
pub rrf_score: f64,
#[serde(skip_serializing_if = "Option::is_none")]
pub vector_rank: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub vector_distance: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hop_distance: Option<usize>,
}
#[derive(Serialize, serde::Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack)]
#[msgpack(map)]
pub(crate) struct RowsPayload {
pub columns: Vec<String>,
pub rows: Vec<Vec<Option<String>>>,
}
#[derive(Serialize, zerompk::ToMessagePack, zerompk::FromMessagePack)]
#[msgpack(map)]
pub(crate) struct ArraySliceResponse {
pub rows_msgpack: Vec<u8>,
pub truncated_before_horizon: bool,
}
#[derive(Serialize, zerompk::ToMessagePack, zerompk::FromMessagePack)]
#[msgpack(map)]
#[allow(dead_code)]
pub(crate) struct ArrayAggregateResponse {
pub rows_msgpack: Vec<u8>,
pub truncated_before_horizon: bool,
}
pub(in crate::data::executor) struct HybridSearchHit<'a> {
pub doc_id: &'a str,
pub score_field: &'a str,
pub rrf_score: f64,
pub vector_rank: Option<usize>,
pub text_rank: Option<usize>,
}
impl<'a> zerompk::ToMessagePack for HybridSearchHit<'a> {
fn write<W: zerompk::Write>(&self, writer: &mut W) -> zerompk::Result<()> {
let count =
2usize + self.vector_rank.is_some() as usize + self.text_rank.is_some() as usize;
writer.write_map_len(count)?;
writer.write_string("doc_id")?;
writer.write_string(self.doc_id)?;
writer.write_string(self.score_field)?;
writer.write_f64(self.rrf_score)?;
if let Some(vr) = self.vector_rank {
writer.write_string("vector_rank")?;
writer.write_u64(vr as u64)?;
}
if let Some(tr) = self.text_rank {
writer.write_string("text_rank")?;
writer.write_u64(tr as u64)?;
}
Ok(())
}
}
#[derive(Serialize, zerompk::ToMessagePack)]
#[msgpack(map)]
pub(in crate::data::executor) struct GraphRagResponse {
pub results: Vec<GraphRagResult>,
pub metadata: GraphRagMetadata,
}
#[derive(Serialize, zerompk::ToMessagePack)]
#[msgpack(map)]
pub(in crate::data::executor) struct GraphRagMetadata {
pub vector_candidates: usize,
pub graph_expanded: usize,
pub truncated: bool,
pub watermark_lsn: u64,
}