use std::collections::BTreeMap;
use opensqlany::{ApModel, PageStore};
use crate::iter_syscolumns;
#[derive(Debug, Clone)]
pub struct NullsFlagBucket {
pub flag: u8,
pub count: usize,
pub sample_columns: Vec<String>,
}
pub fn histogram(store: &PageStore, model: &ApModel) -> Vec<NullsFlagBucket> {
let mut counts: BTreeMap<u8, (usize, Vec<String>)> = BTreeMap::new();
for c in iter_syscolumns(store, model) {
let entry = counts.entry(c.nulls_flag).or_insert((0, Vec::new()));
entry.0 += 1;
if entry.1.len() < 4 && !entry.1.contains(&c.name) {
entry.1.push(c.name);
}
}
counts
.into_iter()
.map(|(flag, (count, sample_columns))| NullsFlagBucket {
flag,
count,
sample_columns,
})
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn bucket_fields_round_trip() {
let b = NullsFlagBucket {
flag: 0x18,
count: 42,
sample_columns: vec!["is_build".into(), "is_receipt".into()],
};
assert_eq!(b.flag, 0x18);
assert_eq!(b.count, 42);
assert_eq!(b.sample_columns.len(), 2);
}
}