use std::collections::BTreeSet;
use mz_repr::{ColumnName, ColumnType, Datum, RelationDesc, Row};
pub trait Encode {
fn get_format_name(&self) -> &str;
fn encode_key_unchecked(&self, row: Row) -> Vec<u8>;
fn encode_value_unchecked(&self, row: Row) -> Vec<u8>;
}
#[derive(Debug)]
pub struct TypedDatum<'a> {
pub datum: Datum<'a>,
pub typ: &'a ColumnType,
}
impl<'a> TypedDatum<'a> {
pub fn new(datum: Datum<'a>, typ: &'a ColumnType) -> Self {
Self { datum, typ }
}
}
pub fn column_names_and_types(desc: RelationDesc) -> Vec<(ColumnName, ColumnType)> {
let mut columns: Vec<_> = desc.into_iter().collect();
let mut seen = BTreeSet::new();
for (name, _ty) in &mut columns {
let stem_len = name.as_str().len();
let mut i = 1;
while seen.contains(name) {
name.as_mut_str().truncate(stem_len);
if name.as_str().ends_with(|c: char| c.is_ascii_digit()) {
name.as_mut_str().push('_');
}
name.as_mut_str().push_str(&i.to_string());
i += 1;
}
seen.insert(name);
}
columns
}