use std::collections::BTreeMap;
use std::sync::Arc;
use arrow_schema::{DataType, Field, Schema, SchemaRef};
use crate::tenant::TenantId;
use crate::trigger::ids::TopicId;
pub const OFFSET_COLUMN: &str = "_offset";
pub const ROW_INDEX_COLUMN: &str = "_row_idx";
pub const PRODUCED_AT_COLUMN: &str = "_produced_at";
#[derive(Debug, Clone)]
pub struct TopicDefinition {
pub id: TopicId,
pub name: String,
pub schema: SchemaRef,
pub tenant: Option<TenantId>,
pub broker_metadata: BTreeMap<String, String>,
}
impl TopicDefinition {
pub fn backing_table_name(&self) -> String {
format!("__topic_{}", self.id.as_uuid().simple())
}
pub fn backing_table_schema(&self) -> SchemaRef {
Arc::new(augment_schema_for_backing(&self.schema))
}
}
pub fn augment_schema_for_backing(user: &SchemaRef) -> Schema {
let mut fields: Vec<Field> = Vec::with_capacity(user.fields().len() + 3);
fields.push(Field::new(OFFSET_COLUMN, DataType::Int64, false));
fields.push(Field::new(ROW_INDEX_COLUMN, DataType::Int64, false));
fields.push(Field::new(PRODUCED_AT_COLUMN, DataType::Int64, false));
for f in user.fields() {
fields.push(f.as_ref().clone());
}
Schema::new(fields)
}