chryso-metadata 0.0.2

Chryso metadata crate.
Documentation
use crate::{ColumnStats, StatsCache, TableStats};

pub trait Analyzer {
    fn analyze(&self, table: &str) -> (TableStats, Vec<(String, ColumnStats)>);
}

pub fn apply_analyze(
    cache: &mut StatsCache,
    table: &str,
    stats: TableStats,
    columns: Vec<(String, ColumnStats)>,
) {
    cache.insert_table_stats(table, stats);
    for (column, column_stats) in columns {
        cache.insert_column_stats(table, column, column_stats);
    }
}

pub struct MockAnalyzer;

impl Analyzer for MockAnalyzer {
    fn analyze(&self, table: &str) -> (TableStats, Vec<(String, ColumnStats)>) {
        let stats = TableStats { row_count: 100.0 };
        let columns = vec![(
            "id".to_string(),
            ColumnStats {
                distinct_count: 100.0,
                null_fraction: 0.0,
            },
        )];
        let _ = table;
        (stats, columns)
    }
}

#[cfg(test)]
mod tests {
    use super::{Analyzer, MockAnalyzer, apply_analyze};
    use crate::StatsCache;

    #[test]
    fn apply_analyze_updates_cache() {
        let mut cache = StatsCache::new();
        let analyzer = MockAnalyzer;
        let (table_stats, columns) = analyzer.analyze("users");
        apply_analyze(&mut cache, "users", table_stats, columns);
        assert!(cache.table_stats("users").is_some());
        assert!(cache.column_stats("users", "id").is_some());
    }
}