use std::collections::HashMap;
#[derive(Debug, Clone)]
pub struct ColumnStats {
pub table_id: u64,
pub column_id: u32,
pub num_distinct_values: u64,
pub num_null_values: u64,
pub min_value: Option<Vec<u8>>,
pub max_value: Option<Vec<u8>>,
}
#[derive(Debug, Default)]
pub struct TableStats {
pub num_rows: u64,
pub columns: HashMap<u32, ColumnStats>,
}
#[derive(Debug, Default)]
pub struct StatsStore {
tables: HashMap<u64, TableStats>,
}
impl StatsStore {
pub fn new() -> Self {
Self::default()
}
pub fn get_table_stats(&self, table_id: u64) -> Option<&TableStats> {
self.tables.get(&table_id)
}
pub fn get_column_stats(&self, table_id: u64, column_id: u32) -> Option<&ColumnStats> {
self.tables.get(&table_id).and_then(|t| t.columns.get(&column_id))
}
pub fn update_table_stats(&mut self, table_id: u64, stats: TableStats) {
self.tables.insert(table_id, stats);
}
pub fn table_stats_by_id(&self, table_id: u64) -> (u64, u64) {
if let Some(stats) = self.tables.get(&table_id) {
let estimated_size = stats.num_rows * 256;
(stats.num_rows, estimated_size)
} else {
(0, 0)
}
}
}