use arrow::datatypes::Schema;
use dashmap::DashMap;
use std::sync::Arc;
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub enum StorageTier {
#[default]
MemoryWOS,
DiskROS,
ColdEC,
}
#[derive(Debug, Clone)]
pub struct PartitionMeta {
pub min_key: Vec<u8>,
pub max_key: Vec<u8>,
pub file_path: String,
pub row_count: usize,
pub tier: StorageTier,
pub node_addr: Option<String>,
}
#[derive(Debug, Clone)]
pub struct TableMeta {
pub schema: Arc<Schema>,
pub partitions: Arc<DashMap<String, PartitionMeta>>,
}
impl TableMeta {
pub fn new(schema: Arc<Schema>) -> Self {
Self {
schema,
partitions: Arc::new(DashMap::new()),
}
}
}
#[derive(Clone)]
pub struct MetadataRegistry {
pub tables: Arc<DashMap<String, Arc<TableMeta>>>,
}
impl Default for MetadataRegistry {
fn default() -> Self {
Self::new()
}
}
impl MetadataRegistry {
pub fn new() -> Self {
Self {
tables: Arc::new(DashMap::new()),
}
}
pub fn get_table(&self, table_name: &str) -> Option<Arc<TableMeta>> {
self.tables.get(table_name).map(|r| Arc::clone(r.value()))
}
pub fn register_table(&self, table_name: String, schema: Arc<Schema>) {
self.tables
.insert(table_name, Arc::new(TableMeta::new(schema)));
}
pub fn update_partition(&self, table_name: &str, partition_id: String, meta: PartitionMeta) {
if let Some(table) = self.get_table(table_name) {
table.partitions.insert(partition_id, meta);
}
}
pub fn drop_partition(&self, table_name: &str, partition_id: &str) {
if let Some(table) = self.get_table(table_name) {
table.partitions.remove(partition_id);
}
}
}