use std::sync::Arc;
use arrow::datatypes::{DataType, Field, Schema, SchemaRef};
#[allow(dead_code)]
pub(crate) const EVENTS_COLUMNS: [&str; 8] = [
"partition",
"position",
"kind",
"kind_base",
"turn_id",
"trust",
"payload",
"payload_json",
];
#[derive(Debug)]
pub(crate) struct EventsTableProvider {
#[allow(dead_code)] partition: String,
}
impl EventsTableProvider {
#[must_use]
#[allow(dead_code)] pub(crate) fn new(partition: impl Into<String>) -> Self {
Self {
partition: partition.into(),
}
}
#[must_use]
#[allow(dead_code)] pub(crate) fn partition(&self) -> &str {
&self.partition
}
#[must_use]
pub(crate) fn schema() -> SchemaRef {
Arc::new(Schema::new(vec![
Field::new("partition", DataType::Utf8, false),
Field::new("position", DataType::UInt64, false),
Field::new("kind", DataType::Utf8, false),
Field::new("kind_base", DataType::Utf8, false),
Field::new("turn_id", DataType::Utf8, true),
Field::new("trust", DataType::Utf8, false),
Field::new("payload", DataType::Binary, false),
Field::new("payload_json", DataType::Utf8, true),
]))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn schema_matches_events_columns() {
let schema = EventsTableProvider::schema();
let names: Vec<&str> = schema.fields().iter().map(|f| f.name().as_str()).collect();
assert_eq!(names, EVENTS_COLUMNS.to_vec());
let expect = [
("partition", DataType::Utf8, false),
("position", DataType::UInt64, false),
("kind", DataType::Utf8, false),
("kind_base", DataType::Utf8, false),
("turn_id", DataType::Utf8, true),
("trust", DataType::Utf8, false),
("payload", DataType::Binary, false),
("payload_json", DataType::Utf8, true),
];
for (field, (name, ty, nullable)) in schema.fields().iter().zip(expect) {
assert_eq!(field.name(), name);
assert_eq!(field.data_type(), &ty);
assert_eq!(field.is_nullable(), nullable);
}
}
#[test]
fn provider_reports_its_partition() {
let provider = EventsTableProvider::new("conv-abc");
assert_eq!(provider.partition(), "conv-abc");
}
}