datafusion_common/types/
field.rsuse arrow_schema::{Field, Fields, UnionFields};
use std::hash::{Hash, Hasher};
use std::{ops::Deref, sync::Arc};
use super::{LogicalTypeRef, NativeType};
#[derive(Debug, Clone, Eq, PartialOrd, Ord)]
pub struct LogicalField {
pub name: String,
pub logical_type: LogicalTypeRef,
pub nullable: bool,
}
impl PartialEq for LogicalField {
fn eq(&self, other: &Self) -> bool {
self.name == other.name
&& self.logical_type.eq(&other.logical_type)
&& self.nullable == other.nullable
}
}
impl Hash for LogicalField {
fn hash<H: Hasher>(&self, state: &mut H) {
self.name.hash(state);
self.logical_type.hash(state);
self.nullable.hash(state);
}
}
impl From<&Field> for LogicalField {
fn from(value: &Field) -> Self {
Self {
name: value.name().clone(),
logical_type: Arc::new(NativeType::from(value.data_type().clone())),
nullable: value.is_nullable(),
}
}
}
pub type LogicalFieldRef = Arc<LogicalField>;
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct LogicalFields(Arc<[LogicalFieldRef]>);
impl Deref for LogicalFields {
type Target = [LogicalFieldRef];
fn deref(&self) -> &Self::Target {
self.0.as_ref()
}
}
impl From<&Fields> for LogicalFields {
fn from(value: &Fields) -> Self {
value
.iter()
.map(|field| Arc::new(LogicalField::from(field.as_ref())))
.collect()
}
}
impl FromIterator<LogicalFieldRef> for LogicalFields {
fn from_iter<T: IntoIterator<Item = LogicalFieldRef>>(iter: T) -> Self {
Self(iter.into_iter().collect())
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct LogicalUnionFields(Arc<[(i8, LogicalFieldRef)]>);
impl Deref for LogicalUnionFields {
type Target = [(i8, LogicalFieldRef)];
fn deref(&self) -> &Self::Target {
self.0.as_ref()
}
}
impl From<&UnionFields> for LogicalUnionFields {
fn from(value: &UnionFields) -> Self {
value
.iter()
.map(|(i, field)| (i, Arc::new(LogicalField::from(field.as_ref()))))
.collect()
}
}
impl FromIterator<(i8, LogicalFieldRef)> for LogicalUnionFields {
fn from_iter<T: IntoIterator<Item = (i8, LogicalFieldRef)>>(iter: T) -> Self {
Self(iter.into_iter().collect())
}
}