use apache_spark_connect::LiteralExpression;
#[cfg(feature = "chrono")]
use chrono::{NaiveDate, NaiveDateTime};
pub trait ToLiteral {
fn to_literal(self) -> LiteralExpression;
}
macro_rules! impl_to_literal {
($ty:ty => $variant:ident) => {
impl ToLiteral for $ty {
fn to_literal(self) -> LiteralExpression {
LiteralExpression::$variant(self.into())
}
}
};
}
impl_to_literal!(i8 => Byte);
impl_to_literal!(i16 => Short);
impl_to_literal!(i32 => Integer);
impl_to_literal!(i64 => Long);
impl_to_literal!(f32 => Float);
impl_to_literal!(f64 => Double);
impl_to_literal!(bool => Boolean);
impl_to_literal!(String => String);
impl_to_literal!(&str => String);
impl_to_literal!(Vec<u8> => Binary);
impl ToLiteral for LiteralExpression {
fn to_literal(self) -> LiteralExpression {
self
}
}
#[cfg(feature = "chrono")]
impl ToLiteral for NaiveDate {
fn to_literal(self) -> LiteralExpression {
let epoch = NaiveDate::from_ymd_opt(1970, 1, 1).unwrap();
let days_since_epoch = self.signed_duration_since(epoch).num_days() as i32;
LiteralExpression::Date(days_since_epoch)
}
}
#[cfg(feature = "chrono")]
impl ToLiteral for NaiveDateTime {
fn to_literal(self) -> LiteralExpression {
LiteralExpression::Timestamp(self.and_utc().timestamp_micros())
}
}