use std::sync::Arc;
use datafusion::arrow::{self, datatypes::SchemaRef};
use serde::Deserialize;
use serde_derive::Serialize;
use crate::data_source::data_type::DataType;
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Field {
pub name: String,
#[serde(rename = "dataType")]
pub data_type: DataType,
pub nullable: Option<bool>,
}
impl Field {
#[allow(dead_code)]
fn to_arrow_field(&self) -> Arc<arrow::datatypes::Field> {
Arc::new(arrow::datatypes::Field::new(
self.name.clone(),
self.data_type.to_arrow_data_type(),
self.nullable.unwrap_or(true),
))
}
pub fn from_arrow_field(field: &arrow::datatypes::Field) -> Self {
Self {
name: field.name().clone(),
data_type: DataType::from_arrow_data_type(field.data_type()),
nullable: Some(field.is_nullable()),
}
}
}
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(transparent)]
#[allow(clippy::module_name_repetitions)]
pub struct DataSourceSchema {
pub fields: Vec<Field>,
}
impl DataSourceSchema {
pub fn to_arrow_schema(&self) -> arrow::datatypes::Schema {
let mut schema_fields = Vec::<arrow::datatypes::Field>::new();
for field in &self.fields {
schema_fields.push(arrow::datatypes::Field::new(
field.name.clone(),
field.data_type.to_arrow_data_type(),
field.nullable.unwrap_or(true),
));
}
arrow::datatypes::Schema::new(schema_fields)
}
pub fn from_arrow_schema(schema: &SchemaRef) -> Self {
let mut fields = Vec::<Field>::new();
for field in &schema.fields {
fields.push(Field::from_arrow_field(field));
}
Self { fields }
}
}