use crate::array::*;
use crate::types::*;
use arrow_data::ArrayData;
#[doc(hidden)]
pub mod __private {
pub use arrow_schema::{DataType, IntervalUnit, TimeUnit};
}
#[doc(hidden)]
#[macro_export]
macro_rules! repeat_pat {
($e:pat, $v_:expr) => {
$e
};
($e:pat, $v_:expr $(, $tail:expr)+) => {
($e, $crate::repeat_pat!($e $(, $tail)+))
}
}
#[macro_export]
macro_rules! downcast_integer {
($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat => $fallback:expr $(,)*)*) => {
match ($($data_type),+) {
$crate::repeat_pat!($crate::cast::__private::DataType::Int8, $($data_type),+) => {
$m!($crate::types::Int8Type $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Int16, $($data_type),+) => {
$m!($crate::types::Int16Type $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Int32, $($data_type),+) => {
$m!($crate::types::Int32Type $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Int64, $($data_type),+) => {
$m!($crate::types::Int64Type $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::UInt8, $($data_type),+) => {
$m!($crate::types::UInt8Type $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::UInt16, $($data_type),+) => {
$m!($crate::types::UInt16Type $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::UInt32, $($data_type),+) => {
$m!($crate::types::UInt32Type $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::UInt64, $($data_type),+) => {
$m!($crate::types::UInt64Type $(, $args)*)
}
$($p => $fallback,)*
}
};
}
#[macro_export]
macro_rules! downcast_integer_array {
($values:ident => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
$crate::downcast_integer_array!($values => {$e} $($p => $fallback)*)
};
(($($values:ident),+) => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
$crate::downcast_integer_array!($($values),+ => {$e} $($p => $fallback)*)
};
($($values:ident),+ => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
$crate::downcast_integer_array!(($($values),+) => $e $($p => $fallback)*)
};
(($($values:ident),+) => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
$crate::downcast_integer!{
$($values.data_type()),+ => ($crate::downcast_primitive_array_helper, $($values),+, $e),
$($p => $fallback,)*
}
};
}
#[macro_export]
macro_rules! downcast_run_end_index {
($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat => $fallback:expr $(,)*)*) => {
match ($($data_type),+) {
$crate::repeat_pat!($crate::cast::__private::DataType::Int16, $($data_type),+) => {
$m!($crate::types::Int16Type $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Int32, $($data_type),+) => {
$m!($crate::types::Int32Type $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Int64, $($data_type),+) => {
$m!($crate::types::Int64Type $(, $args)*)
}
$($p => $fallback,)*
}
};
}
#[macro_export]
macro_rules! downcast_temporal {
($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat => $fallback:expr $(,)*)*) => {
match ($($data_type),+) {
$crate::repeat_pat!($crate::cast::__private::DataType::Time32($crate::cast::__private::TimeUnit::Second), $($data_type),+) => {
$m!($crate::types::Time32SecondType $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Time32($crate::cast::__private::TimeUnit::Millisecond), $($data_type),+) => {
$m!($crate::types::Time32MillisecondType $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Time64($crate::cast::__private::TimeUnit::Microsecond), $($data_type),+) => {
$m!($crate::types::Time64MicrosecondType $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Time64($crate::cast::__private::TimeUnit::Nanosecond), $($data_type),+) => {
$m!($crate::types::Time64NanosecondType $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Date32, $($data_type),+) => {
$m!($crate::types::Date32Type $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Date64, $($data_type),+) => {
$m!($crate::types::Date64Type $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Timestamp($crate::cast::__private::TimeUnit::Second, _), $($data_type),+) => {
$m!($crate::types::TimestampSecondType $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Timestamp($crate::cast::__private::TimeUnit::Millisecond, _), $($data_type),+) => {
$m!($crate::types::TimestampMillisecondType $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Timestamp($crate::cast::__private::TimeUnit::Microsecond, _), $($data_type),+) => {
$m!($crate::types::TimestampMicrosecondType $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Timestamp($crate::cast::__private::TimeUnit::Nanosecond, _), $($data_type),+) => {
$m!($crate::types::TimestampNanosecondType $(, $args)*)
}
$($p => $fallback,)*
}
};
}
#[macro_export]
macro_rules! downcast_temporal_array {
($values:ident => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
$crate::downcast_temporal_array!($values => {$e} $($p => $fallback)*)
};
(($($values:ident),+) => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
$crate::downcast_temporal_array!($($values),+ => {$e} $($p => $fallback)*)
};
($($values:ident),+ => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
$crate::downcast_temporal_array!(($($values),+) => $e $($p => $fallback)*)
};
(($($values:ident),+) => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
$crate::downcast_temporal!{
$($values.data_type()),+ => ($crate::downcast_primitive_array_helper, $($values),+, $e),
$($p => $fallback,)*
}
};
}
#[macro_export]
macro_rules! downcast_primitive {
($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat => $fallback:expr $(,)*)*) => {
$crate::downcast_integer! {
$($data_type),+ => ($m $(, $args)*),
$crate::repeat_pat!($crate::cast::__private::DataType::Float16, $($data_type),+) => {
$m!($crate::types::Float16Type $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Float32, $($data_type),+) => {
$m!($crate::types::Float32Type $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Float64, $($data_type),+) => {
$m!($crate::types::Float64Type $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Decimal128(_, _), $($data_type),+) => {
$m!($crate::types::Decimal128Type $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Decimal256(_, _), $($data_type),+) => {
$m!($crate::types::Decimal256Type $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Interval($crate::cast::__private::IntervalUnit::YearMonth), $($data_type),+) => {
$m!($crate::types::IntervalYearMonthType $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Interval($crate::cast::__private::IntervalUnit::DayTime), $($data_type),+) => {
$m!($crate::types::IntervalDayTimeType $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Interval($crate::cast::__private::IntervalUnit::MonthDayNano), $($data_type),+) => {
$m!($crate::types::IntervalMonthDayNanoType $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Duration($crate::cast::__private::TimeUnit::Second), $($data_type),+) => {
$m!($crate::types::DurationSecondType $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Duration($crate::cast::__private::TimeUnit::Millisecond), $($data_type),+) => {
$m!($crate::types::DurationMillisecondType $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Duration($crate::cast::__private::TimeUnit::Microsecond), $($data_type),+) => {
$m!($crate::types::DurationMicrosecondType $(, $args)*)
}
$crate::repeat_pat!($crate::cast::__private::DataType::Duration($crate::cast::__private::TimeUnit::Nanosecond), $($data_type),+) => {
$m!($crate::types::DurationNanosecondType $(, $args)*)
}
_ => {
$crate::downcast_temporal! {
$($data_type),+ => ($m $(, $args)*),
$($p => $fallback,)*
}
}
}
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! downcast_primitive_array_helper {
($t:ty, $($values:ident),+, $e:block) => {{
$(let $values = $crate::cast::as_primitive_array::<$t>($values);)+
$e
}};
}
#[macro_export]
macro_rules! downcast_primitive_array {
($values:ident => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
$crate::downcast_primitive_array!($values => {$e} $($p => $fallback)*)
};
(($($values:ident),+) => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
$crate::downcast_primitive_array!($($values),+ => {$e} $($p => $fallback)*)
};
($($values:ident),+ => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
$crate::downcast_primitive_array!(($($values),+) => $e $($p => $fallback)*)
};
(($($values:ident),+) => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
$crate::downcast_primitive!{
$($values.data_type()),+ => ($crate::downcast_primitive_array_helper, $($values),+, $e),
$($p => $fallback,)*
}
};
}
pub fn as_primitive_array<T>(arr: &dyn Array) -> &PrimitiveArray<T>
where
T: ArrowPrimitiveType,
{
arr.as_any()
.downcast_ref::<PrimitiveArray<T>>()
.expect("Unable to downcast to primitive array")
}
#[macro_export]
#[doc(hidden)]
macro_rules! downcast_dictionary_array_helper {
($t:ty, $($values:ident),+, $e:block) => {{
$(let $values = $crate::cast::as_dictionary_array::<$t>($values);)+
$e
}};
}
#[macro_export]
macro_rules! downcast_dictionary_array {
($values:ident => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
downcast_dictionary_array!($values => {$e} $($p => $fallback)*)
};
($values:ident => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
match $values.data_type() {
$crate::cast::__private::DataType::Dictionary(k, _) => {
$crate::downcast_integer! {
k.as_ref() => ($crate::downcast_dictionary_array_helper, $values, $e),
k => unreachable!("unsupported dictionary key type: {}", k)
}
}
$($p => $fallback,)*
}
}
}
pub fn as_dictionary_array<T>(arr: &dyn Array) -> &DictionaryArray<T>
where
T: ArrowDictionaryKeyType,
{
arr.as_any()
.downcast_ref::<DictionaryArray<T>>()
.expect("Unable to downcast to dictionary array")
}
pub fn as_run_array<T>(arr: &dyn Array) -> &RunArray<T>
where
T: RunEndIndexType,
{
arr.as_any()
.downcast_ref::<RunArray<T>>()
.expect("Unable to downcast to run array")
}
#[macro_export]
#[doc(hidden)]
macro_rules! downcast_run_array_helper {
($t:ty, $($values:ident),+, $e:block) => {{
$(let $values = $crate::cast::as_run_array::<$t>($values);)+
$e
}};
}
#[macro_export]
macro_rules! downcast_run_array {
($values:ident => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
downcast_run_array!($values => {$e} $($p => $fallback)*)
};
($values:ident => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
match $values.data_type() {
$crate::cast::__private::DataType::RunEndEncoded(k, _) => {
$crate::downcast_run_end_index! {
k.data_type() => ($crate::downcast_run_array_helper, $values, $e),
k => unreachable!("unsupported run end index type: {}", k)
}
}
$($p => $fallback,)*
}
}
}
pub fn as_generic_list_array<S: OffsetSizeTrait>(arr: &dyn Array) -> &GenericListArray<S> {
arr.as_any()
.downcast_ref::<GenericListArray<S>>()
.expect("Unable to downcast to list array")
}
#[inline]
pub fn as_list_array(arr: &dyn Array) -> &ListArray {
as_generic_list_array::<i32>(arr)
}
#[inline]
pub fn as_fixed_size_list_array(arr: &dyn Array) -> &FixedSizeListArray {
arr.as_any()
.downcast_ref::<FixedSizeListArray>()
.expect("Unable to downcast to fixed size list array")
}
#[inline]
pub fn as_large_list_array(arr: &dyn Array) -> &LargeListArray {
as_generic_list_array::<i64>(arr)
}
#[inline]
pub fn as_generic_binary_array<S: OffsetSizeTrait>(arr: &dyn Array) -> &GenericBinaryArray<S> {
arr.as_any()
.downcast_ref::<GenericBinaryArray<S>>()
.expect("Unable to downcast to binary array")
}
pub fn as_string_array(arr: &dyn Array) -> &StringArray {
arr.as_any()
.downcast_ref::<StringArray>()
.expect("Unable to downcast to StringArray")
}
pub fn as_boolean_array(arr: &dyn Array) -> &BooleanArray {
arr.as_any()
.downcast_ref::<BooleanArray>()
.expect("Unable to downcast to BooleanArray")
}
macro_rules! array_downcast_fn {
($name: ident, $arrty: ty, $arrty_str:expr) => {
#[doc = "Force downcast of an [`Array`], such as an [`ArrayRef`] to "]
#[doc = $arrty_str]
pub fn $name(arr: &dyn Array) -> &$arrty {
arr.as_any().downcast_ref::<$arrty>().expect(concat!(
"Unable to downcast to typed array through ",
stringify!($name)
))
}
};
($name: ident, $arrty: ty) => {
array_downcast_fn!(
$name,
$arrty,
concat!("[`", stringify!($arrty), "`], panicking on failure.")
);
};
}
array_downcast_fn!(as_largestring_array, LargeStringArray);
array_downcast_fn!(as_null_array, NullArray);
array_downcast_fn!(as_struct_array, StructArray);
array_downcast_fn!(as_union_array, UnionArray);
array_downcast_fn!(as_map_array, MapArray);
pub fn downcast_array<T>(array: &dyn Array) -> T
where
T: From<ArrayData>,
{
T::from(array.to_data())
}
mod private {
pub trait Sealed {}
}
pub trait AsArray: private::Sealed {
fn as_boolean_opt(&self) -> Option<&BooleanArray>;
fn as_boolean(&self) -> &BooleanArray {
self.as_boolean_opt().expect("boolean array")
}
fn as_primitive_opt<T: ArrowPrimitiveType>(&self) -> Option<&PrimitiveArray<T>>;
fn as_primitive<T: ArrowPrimitiveType>(&self) -> &PrimitiveArray<T> {
self.as_primitive_opt().expect("primitive array")
}
fn as_bytes_opt<T: ByteArrayType>(&self) -> Option<&GenericByteArray<T>>;
fn as_bytes<T: ByteArrayType>(&self) -> &GenericByteArray<T> {
self.as_bytes_opt().expect("byte array")
}
fn as_string_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericStringArray<O>> {
self.as_bytes_opt()
}
fn as_string<O: OffsetSizeTrait>(&self) -> &GenericStringArray<O> {
self.as_bytes_opt().expect("string array")
}
fn as_binary_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericBinaryArray<O>> {
self.as_bytes_opt()
}
fn as_binary<O: OffsetSizeTrait>(&self) -> &GenericBinaryArray<O> {
self.as_bytes_opt().expect("binary array")
}
fn as_string_view_opt(&self) -> Option<&StringViewArray> {
self.as_byte_view_opt()
}
fn as_string_view(&self) -> &StringViewArray {
self.as_byte_view_opt().expect("string view array")
}
fn as_binary_view_opt(&self) -> Option<&BinaryViewArray> {
self.as_byte_view_opt()
}
fn as_binary_view(&self) -> &BinaryViewArray {
self.as_byte_view_opt().expect("binary view array")
}
fn as_byte_view_opt<T: ByteViewType>(&self) -> Option<&GenericByteViewArray<T>>;
fn as_byte_view<T: ByteViewType>(&self) -> &GenericByteViewArray<T> {
self.as_byte_view_opt().expect("byte view array")
}
fn as_struct_opt(&self) -> Option<&StructArray>;
fn as_struct(&self) -> &StructArray {
self.as_struct_opt().expect("struct array")
}
fn as_union_opt(&self) -> Option<&UnionArray>;
fn as_union(&self) -> &UnionArray {
self.as_union_opt().expect("union array")
}
fn as_list_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListArray<O>>;
fn as_list<O: OffsetSizeTrait>(&self) -> &GenericListArray<O> {
self.as_list_opt().expect("list array")
}
fn as_list_view_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListViewArray<O>>;
fn as_list_view<O: OffsetSizeTrait>(&self) -> &GenericListViewArray<O> {
self.as_list_view_opt().expect("list view array")
}
fn as_fixed_size_binary_opt(&self) -> Option<&FixedSizeBinaryArray>;
fn as_fixed_size_binary(&self) -> &FixedSizeBinaryArray {
self.as_fixed_size_binary_opt()
.expect("fixed size binary array")
}
fn as_fixed_size_list_opt(&self) -> Option<&FixedSizeListArray>;
fn as_fixed_size_list(&self) -> &FixedSizeListArray {
self.as_fixed_size_list_opt()
.expect("fixed size list array")
}
fn as_map_opt(&self) -> Option<&MapArray>;
fn as_map(&self) -> &MapArray {
self.as_map_opt().expect("map array")
}
fn as_dictionary_opt<K: ArrowDictionaryKeyType>(&self) -> Option<&DictionaryArray<K>>;
fn as_dictionary<K: ArrowDictionaryKeyType>(&self) -> &DictionaryArray<K> {
self.as_dictionary_opt().expect("dictionary array")
}
fn as_any_dictionary_opt(&self) -> Option<&dyn AnyDictionaryArray>;
fn as_any_dictionary(&self) -> &dyn AnyDictionaryArray {
self.as_any_dictionary_opt().expect("any dictionary array")
}
}
impl private::Sealed for dyn Array + '_ {}
impl AsArray for dyn Array + '_ {
fn as_boolean_opt(&self) -> Option<&BooleanArray> {
self.as_any().downcast_ref()
}
fn as_primitive_opt<T: ArrowPrimitiveType>(&self) -> Option<&PrimitiveArray<T>> {
self.as_any().downcast_ref()
}
fn as_bytes_opt<T: ByteArrayType>(&self) -> Option<&GenericByteArray<T>> {
self.as_any().downcast_ref()
}
fn as_byte_view_opt<T: ByteViewType>(&self) -> Option<&GenericByteViewArray<T>> {
self.as_any().downcast_ref()
}
fn as_struct_opt(&self) -> Option<&StructArray> {
self.as_any().downcast_ref()
}
fn as_union_opt(&self) -> Option<&UnionArray> {
self.as_any().downcast_ref()
}
fn as_list_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListArray<O>> {
self.as_any().downcast_ref()
}
fn as_list_view_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListViewArray<O>> {
self.as_any().downcast_ref()
}
fn as_fixed_size_binary_opt(&self) -> Option<&FixedSizeBinaryArray> {
self.as_any().downcast_ref()
}
fn as_fixed_size_list_opt(&self) -> Option<&FixedSizeListArray> {
self.as_any().downcast_ref()
}
fn as_map_opt(&self) -> Option<&MapArray> {
self.as_any().downcast_ref()
}
fn as_dictionary_opt<K: ArrowDictionaryKeyType>(&self) -> Option<&DictionaryArray<K>> {
self.as_any().downcast_ref()
}
fn as_any_dictionary_opt(&self) -> Option<&dyn AnyDictionaryArray> {
let array = self;
downcast_dictionary_array! {
array => Some(array),
_ => None
}
}
}
impl private::Sealed for ArrayRef {}
impl AsArray for ArrayRef {
fn as_boolean_opt(&self) -> Option<&BooleanArray> {
self.as_ref().as_boolean_opt()
}
fn as_primitive_opt<T: ArrowPrimitiveType>(&self) -> Option<&PrimitiveArray<T>> {
self.as_ref().as_primitive_opt()
}
fn as_bytes_opt<T: ByteArrayType>(&self) -> Option<&GenericByteArray<T>> {
self.as_ref().as_bytes_opt()
}
fn as_byte_view_opt<T: ByteViewType>(&self) -> Option<&GenericByteViewArray<T>> {
self.as_ref().as_byte_view_opt()
}
fn as_struct_opt(&self) -> Option<&StructArray> {
self.as_ref().as_struct_opt()
}
fn as_union_opt(&self) -> Option<&UnionArray> {
self.as_any().downcast_ref()
}
fn as_list_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListArray<O>> {
self.as_ref().as_list_opt()
}
fn as_list_view_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListViewArray<O>> {
self.as_ref().as_list_view_opt()
}
fn as_fixed_size_binary_opt(&self) -> Option<&FixedSizeBinaryArray> {
self.as_ref().as_fixed_size_binary_opt()
}
fn as_fixed_size_list_opt(&self) -> Option<&FixedSizeListArray> {
self.as_ref().as_fixed_size_list_opt()
}
fn as_map_opt(&self) -> Option<&MapArray> {
self.as_any().downcast_ref()
}
fn as_dictionary_opt<K: ArrowDictionaryKeyType>(&self) -> Option<&DictionaryArray<K>> {
self.as_ref().as_dictionary_opt()
}
fn as_any_dictionary_opt(&self) -> Option<&dyn AnyDictionaryArray> {
self.as_ref().as_any_dictionary_opt()
}
}
#[cfg(test)]
mod tests {
use super::*;
use arrow_buffer::i256;
use arrow_schema::DataType;
use std::sync::Arc;
#[test]
fn test_as_primitive_array_ref() {
let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
assert!(!as_primitive_array::<Int32Type>(&array).is_empty());
let array: ArrayRef = Arc::new(array);
assert!(!as_primitive_array::<Int32Type>(&array).is_empty());
}
#[test]
fn test_as_string_array_ref() {
let array: StringArray = vec!["foo", "bar"].into_iter().map(Some).collect();
assert!(!as_string_array(&array).is_empty());
let array: ArrayRef = Arc::new(array);
assert!(!as_string_array(&array).is_empty())
}
#[test]
fn test_decimal128array() {
let a = Decimal128Array::from_iter_values([1, 2, 4, 5]);
assert!(!as_primitive_array::<Decimal128Type>(&a).is_empty());
}
#[test]
fn test_decimal256array() {
let a = Decimal256Array::from_iter_values([1, 2, 4, 5].into_iter().map(i256::from_i128));
assert!(!as_primitive_array::<Decimal256Type>(&a).is_empty());
}
#[test]
fn downcast_integer_array_should_match_only_integers() {
let i32_array: ArrayRef = Arc::new(Int32Array::new_null(1));
let i32_array_ref = &i32_array;
downcast_integer_array!(
i32_array_ref => {
assert_eq!(i32_array_ref.null_count(), 1);
},
_ => panic!("unexpected data type")
);
}
#[test]
fn downcast_integer_array_should_not_match_primitive_that_are_not_integers() {
let array: ArrayRef = Arc::new(Float32Array::new_null(1));
let array_ref = &array;
downcast_integer_array!(
array_ref => {
panic!("unexpected data type {}", array_ref.data_type())
},
DataType::Float32 => {
assert_eq!(array_ref.null_count(), 1);
},
_ => panic!("unexpected data type")
);
}
#[test]
fn downcast_integer_array_should_not_match_non_primitive() {
let array: ArrayRef = Arc::new(StringArray::new_null(1));
let array_ref = &array;
downcast_integer_array!(
array_ref => {
panic!("unexpected data type {}", array_ref.data_type())
},
DataType::Utf8 => {
assert_eq!(array_ref.null_count(), 1);
},
_ => panic!("unexpected data type")
);
}
}