use serde::{Deserialize, Serialize};
use redb::TableDefinition;
pub const GRAPH_STATS: TableDefinition<(u64, &str), &[u8]> = TableDefinition::new("graph_stats");
#[derive(
Debug,
Clone,
PartialEq,
Eq,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct SummaryRow {
pub edge_count: u64,
pub distinct_node_count: u64,
pub distinct_label_count: u64,
}
impl SummaryRow {
pub fn zero() -> Self {
Self {
edge_count: 0,
distinct_node_count: 0,
distinct_label_count: 0,
}
}
pub fn encode(&self) -> crate::Result<Vec<u8>> {
zerompk::to_msgpack_vec(self).map_err(|e| crate::Error::Storage {
engine: "graph".into(),
detail: format!("encode SummaryRow: {e}"),
})
}
pub fn decode(bytes: &[u8]) -> crate::Result<Self> {
zerompk::from_msgpack(bytes).map_err(|e| crate::Error::Storage {
engine: "graph".into(),
detail: format!("decode SummaryRow: {e}"),
})
}
}
#[derive(
Debug,
Clone,
PartialEq,
Eq,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct LabelRow {
pub count: u64,
}
impl LabelRow {
pub fn encode(&self) -> crate::Result<Vec<u8>> {
zerompk::to_msgpack_vec(self).map_err(|e| crate::Error::Storage {
engine: "graph".into(),
detail: format!("encode LabelRow: {e}"),
})
}
pub fn decode(bytes: &[u8]) -> crate::Result<Self> {
zerompk::from_msgpack(bytes).map_err(|e| crate::Error::Storage {
engine: "graph".into(),
detail: format!("decode LabelRow: {e}"),
})
}
}
#[derive(
Debug,
Clone,
PartialEq,
Eq,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct NodeRow {
pub refcount: u32,
}
impl NodeRow {
pub fn encode(&self) -> crate::Result<Vec<u8>> {
zerompk::to_msgpack_vec(self).map_err(|e| crate::Error::Storage {
engine: "graph".into(),
detail: format!("encode NodeRow: {e}"),
})
}
pub fn decode(bytes: &[u8]) -> crate::Result<Self> {
zerompk::from_msgpack(bytes).map_err(|e| crate::Error::Storage {
engine: "graph".into(),
detail: format!("decode NodeRow: {e}"),
})
}
}
pub fn summary_key(collection: &str) -> String {
format!("{collection}\x00summary")
}
pub fn label_key(collection: &str, label: &str) -> String {
format!("{collection}\x00label\x00{label}")
}
pub fn node_key(collection: &str, node_id: &str) -> String {
format!("{collection}\x00node\x00{node_id}")
}
pub fn collection_stat_prefix(collection: &str) -> String {
format!("{collection}\x00")
}
pub fn label_prefix(collection: &str) -> String {
format!("{collection}\x00label\x00")
}
#[derive(
Debug,
Clone,
PartialEq,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
#[msgpack(map)]
pub struct CollectionStats {
pub collection: String,
pub edge_count: u64,
pub distinct_node_count: u64,
pub distinct_label_count: u64,
pub labels: Vec<(String, u64)>,
}
impl CollectionStats {
pub fn zero(collection: String) -> Self {
Self {
collection,
edge_count: 0,
distinct_node_count: 0,
distinct_label_count: 0,
labels: Vec::new(),
}
}
}