use crate::arrow::datatypes::{DataType, Field, FieldRef};
use crate::metadata::FieldMetadata;
use std::sync::Arc;
pub trait DataTypeExt {
fn into_nullable_field(self) -> Field;
fn into_nullable_field_ref(self) -> FieldRef;
}
impl DataTypeExt for DataType {
fn into_nullable_field(self) -> Field {
Field::new("", self, true)
}
fn into_nullable_field_ref(self) -> FieldRef {
Arc::new(Field::new("", self, true))
}
}
pub trait FieldExt {
fn renamed(self, new_name: &str) -> Self;
fn retyped(self, new_data_type: DataType) -> Self;
fn with_field_metadata(self, metadata: &FieldMetadata) -> Self;
fn with_field_metadata_opt(self, metadata: Option<&FieldMetadata>) -> Self;
fn into_list(self) -> Self;
fn into_fixed_size_list(self, list_size: i32) -> Self;
fn into_list_item(self) -> Self;
}
impl FieldExt for Field {
fn renamed(self, new_name: &str) -> Self {
if self.name() != new_name {
self.with_name(new_name)
} else {
self
}
}
fn retyped(self, new_data_type: DataType) -> Self {
self.with_data_type(new_data_type)
}
fn with_field_metadata(self, metadata: &FieldMetadata) -> Self {
metadata.add_to_field(self)
}
fn with_field_metadata_opt(self, metadata: Option<&FieldMetadata>) -> Self {
if let Some(metadata) = metadata {
self.with_field_metadata(metadata)
} else {
self
}
}
fn into_list(self) -> Self {
DataType::List(Arc::new(self.into_list_item())).into_nullable_field()
}
fn into_fixed_size_list(self, list_size: i32) -> Self {
DataType::FixedSizeList(self.into_list_item().into(), list_size)
.into_nullable_field()
}
fn into_list_item(self) -> Self {
if self.name() != Field::LIST_FIELD_DEFAULT_NAME {
self.with_name(Field::LIST_FIELD_DEFAULT_NAME)
} else {
self
}
}
}
impl FieldExt for Arc<Field> {
fn renamed(mut self, new_name: &str) -> Self {
if self.name() != new_name {
Arc::make_mut(&mut self).set_name(new_name);
}
self
}
fn retyped(mut self, new_data_type: DataType) -> Self {
if self.data_type() != &new_data_type {
Arc::make_mut(&mut self).set_data_type(new_data_type);
}
self
}
fn with_field_metadata(self, metadata: &FieldMetadata) -> Self {
metadata.add_to_field_ref(self)
}
fn with_field_metadata_opt(self, metadata: Option<&FieldMetadata>) -> Self {
if let Some(metadata) = metadata {
self.with_field_metadata(metadata)
} else {
self
}
}
fn into_list(self) -> Self {
DataType::List(self.into_list_item())
.into_nullable_field()
.into()
}
fn into_fixed_size_list(self, list_size: i32) -> Self {
DataType::FixedSizeList(self.into_list_item(), list_size)
.into_nullable_field()
.into()
}
fn into_list_item(mut self) -> Self {
if self.name() != Field::LIST_FIELD_DEFAULT_NAME {
Arc::make_mut(&mut self).set_name(Field::LIST_FIELD_DEFAULT_NAME);
}
self
}
}