use arrow::datatypes::DataType;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Dimension {
name: String,
data_type: DataType,
cardinality: Option<usize>,
nullable: bool,
description: Option<String>,
}
impl Dimension {
pub fn new(name: impl Into<String>, data_type: DataType) -> Self {
Self {
name: name.into(),
data_type,
cardinality: None,
nullable: true,
description: None,
}
}
pub fn with_config(
name: impl Into<String>,
data_type: DataType,
nullable: bool,
cardinality: Option<usize>,
description: Option<String>,
) -> Self {
Self {
name: name.into(),
data_type,
cardinality,
nullable,
description,
}
}
pub fn name(&self) -> &str {
&self.name
}
pub fn data_type(&self) -> &DataType {
&self.data_type
}
pub fn cardinality(&self) -> Option<usize> {
self.cardinality
}
pub fn is_nullable(&self) -> bool {
self.nullable
}
pub fn description(&self) -> Option<&str> {
self.description.as_deref()
}
pub fn set_cardinality(&mut self, cardinality: usize) {
self.cardinality = Some(cardinality);
}
pub fn set_description(&mut self, description: impl Into<String>) {
self.description = Some(description.into());
}
pub fn with_cardinality(mut self, cardinality: usize) -> Self {
self.cardinality = Some(cardinality);
self
}
pub fn with_nullable(mut self, nullable: bool) -> Self {
self.nullable = nullable;
self
}
pub fn with_description(mut self, description: impl Into<String>) -> Self {
self.description = Some(description.into());
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_dimension_creation() {
let dim = Dimension::new("region", DataType::Utf8);
assert_eq!(dim.name(), "region");
assert_eq!(dim.data_type(), &DataType::Utf8);
assert!(dim.is_nullable());
assert_eq!(dim.cardinality(), None);
}
#[test]
fn test_dimension_builder() {
let dim = Dimension::new("country", DataType::Utf8)
.with_cardinality(195)
.with_nullable(false)
.with_description("ISO country code");
assert_eq!(dim.name(), "country");
assert_eq!(dim.cardinality(), Some(195));
assert!(!dim.is_nullable());
assert_eq!(dim.description(), Some("ISO country code"));
}
}