1use crate::array::*;
21use crate::types::*;
22use arrow_data::ArrayData;
23
24#[doc(hidden)]
28pub mod __private {
29 pub use arrow_schema::{DataType, IntervalUnit, TimeUnit};
30}
31
32#[doc(hidden)]
34#[macro_export]
35macro_rules! repeat_pat {
36 ($e:pat, $v_:expr) => {
37 $e
38 };
39 ($e:pat, $v_:expr $(, $tail:expr)+) => {
40 ($e, $crate::repeat_pat!($e $(, $tail)+))
41 }
42}
43
44#[macro_export]
74macro_rules! downcast_integer {
75 ($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat => $fallback:expr $(,)*)*) => {
76 match ($($data_type),+) {
77 $crate::repeat_pat!($crate::cast::__private::DataType::Int8, $($data_type),+) => {
78 $m!($crate::types::Int8Type $(, $args)*)
79 }
80 $crate::repeat_pat!($crate::cast::__private::DataType::Int16, $($data_type),+) => {
81 $m!($crate::types::Int16Type $(, $args)*)
82 }
83 $crate::repeat_pat!($crate::cast::__private::DataType::Int32, $($data_type),+) => {
84 $m!($crate::types::Int32Type $(, $args)*)
85 }
86 $crate::repeat_pat!($crate::cast::__private::DataType::Int64, $($data_type),+) => {
87 $m!($crate::types::Int64Type $(, $args)*)
88 }
89 $crate::repeat_pat!($crate::cast::__private::DataType::UInt8, $($data_type),+) => {
90 $m!($crate::types::UInt8Type $(, $args)*)
91 }
92 $crate::repeat_pat!($crate::cast::__private::DataType::UInt16, $($data_type),+) => {
93 $m!($crate::types::UInt16Type $(, $args)*)
94 }
95 $crate::repeat_pat!($crate::cast::__private::DataType::UInt32, $($data_type),+) => {
96 $m!($crate::types::UInt32Type $(, $args)*)
97 }
98 $crate::repeat_pat!($crate::cast::__private::DataType::UInt64, $($data_type),+) => {
99 $m!($crate::types::UInt64Type $(, $args)*)
100 }
101 $($p => $fallback,)*
102 }
103 };
104}
105
106#[macro_export]
132macro_rules! downcast_integer_array {
133 ($values:ident => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
134 $crate::downcast_integer_array!($values => {$e} $($p => $fallback)*)
135 };
136 (($($values:ident),+) => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
137 $crate::downcast_integer_array!($($values),+ => {$e} $($p => $fallback)*)
138 };
139 ($($values:ident),+ => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
140 $crate::downcast_integer_array!(($($values),+) => $e $($p => $fallback)*)
141 };
142 (($($values:ident),+) => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
143 $crate::downcast_integer!{
144 $($values.data_type()),+ => ($crate::downcast_primitive_array_helper, $($values),+, $e),
145 $($p => $fallback,)*
146 }
147 };
148}
149
150#[macro_export]
181macro_rules! downcast_run_end_index {
182 ($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat => $fallback:expr $(,)*)*) => {
183 match ($($data_type),+) {
184 $crate::repeat_pat!($crate::cast::__private::DataType::Int16, $($data_type),+) => {
185 $m!($crate::types::Int16Type $(, $args)*)
186 }
187 $crate::repeat_pat!($crate::cast::__private::DataType::Int32, $($data_type),+) => {
188 $m!($crate::types::Int32Type $(, $args)*)
189 }
190 $crate::repeat_pat!($crate::cast::__private::DataType::Int64, $($data_type),+) => {
191 $m!($crate::types::Int64Type $(, $args)*)
192 }
193 $($p => $fallback,)*
194 }
195 };
196}
197
198#[macro_export]
224macro_rules! downcast_temporal {
225 ($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat => $fallback:expr $(,)*)*) => {
226 match ($($data_type),+) {
227 $crate::repeat_pat!($crate::cast::__private::DataType::Time32($crate::cast::__private::TimeUnit::Second), $($data_type),+) => {
228 $m!($crate::types::Time32SecondType $(, $args)*)
229 }
230 $crate::repeat_pat!($crate::cast::__private::DataType::Time32($crate::cast::__private::TimeUnit::Millisecond), $($data_type),+) => {
231 $m!($crate::types::Time32MillisecondType $(, $args)*)
232 }
233 $crate::repeat_pat!($crate::cast::__private::DataType::Time64($crate::cast::__private::TimeUnit::Microsecond), $($data_type),+) => {
234 $m!($crate::types::Time64MicrosecondType $(, $args)*)
235 }
236 $crate::repeat_pat!($crate::cast::__private::DataType::Time64($crate::cast::__private::TimeUnit::Nanosecond), $($data_type),+) => {
237 $m!($crate::types::Time64NanosecondType $(, $args)*)
238 }
239 $crate::repeat_pat!($crate::cast::__private::DataType::Date32, $($data_type),+) => {
240 $m!($crate::types::Date32Type $(, $args)*)
241 }
242 $crate::repeat_pat!($crate::cast::__private::DataType::Date64, $($data_type),+) => {
243 $m!($crate::types::Date64Type $(, $args)*)
244 }
245 $crate::repeat_pat!($crate::cast::__private::DataType::Timestamp($crate::cast::__private::TimeUnit::Second, _), $($data_type),+) => {
246 $m!($crate::types::TimestampSecondType $(, $args)*)
247 }
248 $crate::repeat_pat!($crate::cast::__private::DataType::Timestamp($crate::cast::__private::TimeUnit::Millisecond, _), $($data_type),+) => {
249 $m!($crate::types::TimestampMillisecondType $(, $args)*)
250 }
251 $crate::repeat_pat!($crate::cast::__private::DataType::Timestamp($crate::cast::__private::TimeUnit::Microsecond, _), $($data_type),+) => {
252 $m!($crate::types::TimestampMicrosecondType $(, $args)*)
253 }
254 $crate::repeat_pat!($crate::cast::__private::DataType::Timestamp($crate::cast::__private::TimeUnit::Nanosecond, _), $($data_type),+) => {
255 $m!($crate::types::TimestampNanosecondType $(, $args)*)
256 }
257 $($p => $fallback,)*
258 }
259 };
260}
261
262#[macro_export]
288macro_rules! downcast_temporal_array {
289 ($values:ident => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
290 $crate::downcast_temporal_array!($values => {$e} $($p => $fallback)*)
291 };
292 (($($values:ident),+) => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
293 $crate::downcast_temporal_array!($($values),+ => {$e} $($p => $fallback)*)
294 };
295 ($($values:ident),+ => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
296 $crate::downcast_temporal_array!(($($values),+) => $e $($p => $fallback)*)
297 };
298 (($($values:ident),+) => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
299 $crate::downcast_temporal!{
300 $($values.data_type()),+ => ($crate::downcast_primitive_array_helper, $($values),+, $e),
301 $($p => $fallback,)*
302 }
303 };
304}
305
306#[macro_export]
335macro_rules! downcast_primitive {
336 ($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat => $fallback:expr $(,)*)*) => {
337 $crate::downcast_integer! {
338 $($data_type),+ => ($m $(, $args)*),
339 $crate::repeat_pat!($crate::cast::__private::DataType::Float16, $($data_type),+) => {
340 $m!($crate::types::Float16Type $(, $args)*)
341 }
342 $crate::repeat_pat!($crate::cast::__private::DataType::Float32, $($data_type),+) => {
343 $m!($crate::types::Float32Type $(, $args)*)
344 }
345 $crate::repeat_pat!($crate::cast::__private::DataType::Float64, $($data_type),+) => {
346 $m!($crate::types::Float64Type $(, $args)*)
347 }
348 $crate::repeat_pat!($crate::cast::__private::DataType::Decimal128(_, _), $($data_type),+) => {
349 $m!($crate::types::Decimal128Type $(, $args)*)
350 }
351 $crate::repeat_pat!($crate::cast::__private::DataType::Decimal256(_, _), $($data_type),+) => {
352 $m!($crate::types::Decimal256Type $(, $args)*)
353 }
354 $crate::repeat_pat!($crate::cast::__private::DataType::Interval($crate::cast::__private::IntervalUnit::YearMonth), $($data_type),+) => {
355 $m!($crate::types::IntervalYearMonthType $(, $args)*)
356 }
357 $crate::repeat_pat!($crate::cast::__private::DataType::Interval($crate::cast::__private::IntervalUnit::DayTime), $($data_type),+) => {
358 $m!($crate::types::IntervalDayTimeType $(, $args)*)
359 }
360 $crate::repeat_pat!($crate::cast::__private::DataType::Interval($crate::cast::__private::IntervalUnit::MonthDayNano), $($data_type),+) => {
361 $m!($crate::types::IntervalMonthDayNanoType $(, $args)*)
362 }
363 $crate::repeat_pat!($crate::cast::__private::DataType::Duration($crate::cast::__private::TimeUnit::Second), $($data_type),+) => {
364 $m!($crate::types::DurationSecondType $(, $args)*)
365 }
366 $crate::repeat_pat!($crate::cast::__private::DataType::Duration($crate::cast::__private::TimeUnit::Millisecond), $($data_type),+) => {
367 $m!($crate::types::DurationMillisecondType $(, $args)*)
368 }
369 $crate::repeat_pat!($crate::cast::__private::DataType::Duration($crate::cast::__private::TimeUnit::Microsecond), $($data_type),+) => {
370 $m!($crate::types::DurationMicrosecondType $(, $args)*)
371 }
372 $crate::repeat_pat!($crate::cast::__private::DataType::Duration($crate::cast::__private::TimeUnit::Nanosecond), $($data_type),+) => {
373 $m!($crate::types::DurationNanosecondType $(, $args)*)
374 }
375 _ => {
376 $crate::downcast_temporal! {
377 $($data_type),+ => ($m $(, $args)*),
378 $($p => $fallback,)*
379 }
380 }
381 }
382 };
383}
384
385#[macro_export]
386#[doc(hidden)]
387macro_rules! downcast_primitive_array_helper {
388 ($t:ty, $($values:ident),+, $e:block) => {{
389 $(let $values = $crate::cast::as_primitive_array::<$t>($values);)+
390 $e
391 }};
392}
393
394#[macro_export]
420macro_rules! downcast_primitive_array {
421 ($values:ident => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
422 $crate::downcast_primitive_array!($values => {$e} $($p => $fallback)*)
423 };
424 (($($values:ident),+) => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
425 $crate::downcast_primitive_array!($($values),+ => {$e} $($p => $fallback)*)
426 };
427 ($($values:ident),+ => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
428 $crate::downcast_primitive_array!(($($values),+) => $e $($p => $fallback)*)
429 };
430 (($($values:ident),+) => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
431 $crate::downcast_primitive!{
432 $($values.data_type()),+ => ($crate::downcast_primitive_array_helper, $($values),+, $e),
433 $($p => $fallback,)*
434 }
435 };
436}
437
438pub fn as_primitive_array<T>(arr: &dyn Array) -> &PrimitiveArray<T>
464where
465 T: ArrowPrimitiveType,
466{
467 arr.as_any()
468 .downcast_ref::<PrimitiveArray<T>>()
469 .expect("Unable to downcast to primitive array")
470}
471
472#[macro_export]
473#[doc(hidden)]
474macro_rules! downcast_dictionary_array_helper {
475 ($t:ty, $($values:ident),+, $e:block) => {{
476 $(let $values = $crate::cast::as_dictionary_array::<$t>($values);)+
477 $e
478 }};
479}
480
481#[macro_export]
510macro_rules! downcast_dictionary_array {
511 ($values:ident => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
512 downcast_dictionary_array!($values => {$e} $($p => $fallback)*)
513 };
514
515 ($values:ident => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
516 match $values.data_type() {
517 $crate::cast::__private::DataType::Dictionary(k, _) => {
518 $crate::downcast_integer! {
519 k.as_ref() => ($crate::downcast_dictionary_array_helper, $values, $e),
520 k => unreachable!("unsupported dictionary key type: {}", k)
521 }
522 }
523 $($p => $fallback,)*
524 }
525 }
526}
527
528pub fn as_dictionary_array<T>(arr: &dyn Array) -> &DictionaryArray<T>
543where
544 T: ArrowDictionaryKeyType,
545{
546 arr.as_any()
547 .downcast_ref::<DictionaryArray<T>>()
548 .expect("Unable to downcast to dictionary array")
549}
550
551pub fn as_run_array<T>(arr: &dyn Array) -> &RunArray<T>
566where
567 T: RunEndIndexType,
568{
569 arr.as_any()
570 .downcast_ref::<RunArray<T>>()
571 .expect("Unable to downcast to run array")
572}
573
574#[macro_export]
575#[doc(hidden)]
576macro_rules! downcast_run_array_helper {
577 ($t:ty, $($values:ident),+, $e:block) => {{
578 $(let $values = $crate::cast::as_run_array::<$t>($values);)+
579 $e
580 }};
581}
582
583#[macro_export]
612macro_rules! downcast_run_array {
613 ($values:ident => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
614 downcast_run_array!($values => {$e} $($p => $fallback)*)
615 };
616
617 ($values:ident => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
618 match $values.data_type() {
619 $crate::cast::__private::DataType::RunEndEncoded(k, _) => {
620 $crate::downcast_run_end_index! {
621 k.data_type() => ($crate::downcast_run_array_helper, $values, $e),
622 k => unreachable!("unsupported run end index type: {}", k)
623 }
624 }
625 $($p => $fallback,)*
626 }
627 }
628}
629
630pub fn as_generic_list_array<S: OffsetSizeTrait>(arr: &dyn Array) -> &GenericListArray<S> {
633 arr.as_any()
634 .downcast_ref::<GenericListArray<S>>()
635 .expect("Unable to downcast to list array")
636}
637
638#[inline]
641pub fn as_list_array(arr: &dyn Array) -> &ListArray {
642 as_generic_list_array::<i32>(arr)
643}
644
645#[inline]
648pub fn as_fixed_size_list_array(arr: &dyn Array) -> &FixedSizeListArray {
649 arr.as_any()
650 .downcast_ref::<FixedSizeListArray>()
651 .expect("Unable to downcast to fixed size list array")
652}
653
654#[inline]
657pub fn as_large_list_array(arr: &dyn Array) -> &LargeListArray {
658 as_generic_list_array::<i64>(arr)
659}
660
661#[inline]
664pub fn as_generic_binary_array<S: OffsetSizeTrait>(arr: &dyn Array) -> &GenericBinaryArray<S> {
665 arr.as_any()
666 .downcast_ref::<GenericBinaryArray<S>>()
667 .expect("Unable to downcast to binary array")
668}
669
670pub fn as_string_array(arr: &dyn Array) -> &StringArray {
684 arr.as_any()
685 .downcast_ref::<StringArray>()
686 .expect("Unable to downcast to StringArray")
687}
688
689pub fn as_boolean_array(arr: &dyn Array) -> &BooleanArray {
703 arr.as_any()
704 .downcast_ref::<BooleanArray>()
705 .expect("Unable to downcast to BooleanArray")
706}
707
708macro_rules! array_downcast_fn {
709 ($name: ident, $arrty: ty, $arrty_str:expr) => {
710 #[doc = "Force downcast of an [`Array`], such as an [`ArrayRef`] to "]
711 #[doc = $arrty_str]
712 pub fn $name(arr: &dyn Array) -> &$arrty {
713 arr.as_any().downcast_ref::<$arrty>().expect(concat!(
714 "Unable to downcast to typed array through ",
715 stringify!($name)
716 ))
717 }
718 };
719
720 ($name: ident, $arrty: ty) => {
722 array_downcast_fn!(
723 $name,
724 $arrty,
725 concat!("[`", stringify!($arrty), "`], panicking on failure.")
726 );
727 };
728}
729
730array_downcast_fn!(as_largestring_array, LargeStringArray);
731array_downcast_fn!(as_null_array, NullArray);
732array_downcast_fn!(as_struct_array, StructArray);
733array_downcast_fn!(as_union_array, UnionArray);
734array_downcast_fn!(as_map_array, MapArray);
735
736pub fn downcast_array<T>(array: &dyn Array) -> T
762where
763 T: From<ArrayData>,
764{
765 T::from(array.to_data())
766}
767
768mod private {
769 pub trait Sealed {}
770}
771
772pub trait AsArray: private::Sealed {
783 fn as_boolean_opt(&self) -> Option<&BooleanArray>;
785
786 fn as_boolean(&self) -> &BooleanArray {
788 self.as_boolean_opt().expect("boolean array")
789 }
790
791 fn as_primitive_opt<T: ArrowPrimitiveType>(&self) -> Option<&PrimitiveArray<T>>;
793
794 fn as_primitive<T: ArrowPrimitiveType>(&self) -> &PrimitiveArray<T> {
796 self.as_primitive_opt().expect("primitive array")
797 }
798
799 fn as_bytes_opt<T: ByteArrayType>(&self) -> Option<&GenericByteArray<T>>;
801
802 fn as_bytes<T: ByteArrayType>(&self) -> &GenericByteArray<T> {
804 self.as_bytes_opt().expect("byte array")
805 }
806
807 fn as_string_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericStringArray<O>> {
809 self.as_bytes_opt()
810 }
811
812 fn as_string<O: OffsetSizeTrait>(&self) -> &GenericStringArray<O> {
814 self.as_bytes_opt().expect("string array")
815 }
816
817 fn as_binary_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericBinaryArray<O>> {
819 self.as_bytes_opt()
820 }
821
822 fn as_binary<O: OffsetSizeTrait>(&self) -> &GenericBinaryArray<O> {
824 self.as_bytes_opt().expect("binary array")
825 }
826
827 fn as_string_view_opt(&self) -> Option<&StringViewArray> {
829 self.as_byte_view_opt()
830 }
831
832 fn as_string_view(&self) -> &StringViewArray {
834 self.as_byte_view_opt().expect("string view array")
835 }
836
837 fn as_binary_view_opt(&self) -> Option<&BinaryViewArray> {
839 self.as_byte_view_opt()
840 }
841
842 fn as_binary_view(&self) -> &BinaryViewArray {
844 self.as_byte_view_opt().expect("binary view array")
845 }
846
847 fn as_byte_view_opt<T: ByteViewType>(&self) -> Option<&GenericByteViewArray<T>>;
849
850 fn as_byte_view<T: ByteViewType>(&self) -> &GenericByteViewArray<T> {
852 self.as_byte_view_opt().expect("byte view array")
853 }
854
855 fn as_struct_opt(&self) -> Option<&StructArray>;
857
858 fn as_struct(&self) -> &StructArray {
860 self.as_struct_opt().expect("struct array")
861 }
862
863 fn as_union_opt(&self) -> Option<&UnionArray>;
865
866 fn as_union(&self) -> &UnionArray {
868 self.as_union_opt().expect("union array")
869 }
870
871 fn as_list_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListArray<O>>;
873
874 fn as_list<O: OffsetSizeTrait>(&self) -> &GenericListArray<O> {
876 self.as_list_opt().expect("list array")
877 }
878
879 fn as_list_view_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListViewArray<O>>;
881
882 fn as_list_view<O: OffsetSizeTrait>(&self) -> &GenericListViewArray<O> {
884 self.as_list_view_opt().expect("list view array")
885 }
886
887 fn as_fixed_size_binary_opt(&self) -> Option<&FixedSizeBinaryArray>;
889
890 fn as_fixed_size_binary(&self) -> &FixedSizeBinaryArray {
892 self.as_fixed_size_binary_opt()
893 .expect("fixed size binary array")
894 }
895
896 fn as_fixed_size_list_opt(&self) -> Option<&FixedSizeListArray>;
898
899 fn as_fixed_size_list(&self) -> &FixedSizeListArray {
901 self.as_fixed_size_list_opt()
902 .expect("fixed size list array")
903 }
904
905 fn as_map_opt(&self) -> Option<&MapArray>;
907
908 fn as_map(&self) -> &MapArray {
910 self.as_map_opt().expect("map array")
911 }
912
913 fn as_dictionary_opt<K: ArrowDictionaryKeyType>(&self) -> Option<&DictionaryArray<K>>;
915
916 fn as_dictionary<K: ArrowDictionaryKeyType>(&self) -> &DictionaryArray<K> {
918 self.as_dictionary_opt().expect("dictionary array")
919 }
920
921 fn as_any_dictionary_opt(&self) -> Option<&dyn AnyDictionaryArray>;
923
924 fn as_any_dictionary(&self) -> &dyn AnyDictionaryArray {
926 self.as_any_dictionary_opt().expect("any dictionary array")
927 }
928}
929
930impl private::Sealed for dyn Array + '_ {}
931impl AsArray for dyn Array + '_ {
932 fn as_boolean_opt(&self) -> Option<&BooleanArray> {
933 self.as_any().downcast_ref()
934 }
935
936 fn as_primitive_opt<T: ArrowPrimitiveType>(&self) -> Option<&PrimitiveArray<T>> {
937 self.as_any().downcast_ref()
938 }
939
940 fn as_bytes_opt<T: ByteArrayType>(&self) -> Option<&GenericByteArray<T>> {
941 self.as_any().downcast_ref()
942 }
943
944 fn as_byte_view_opt<T: ByteViewType>(&self) -> Option<&GenericByteViewArray<T>> {
945 self.as_any().downcast_ref()
946 }
947
948 fn as_struct_opt(&self) -> Option<&StructArray> {
949 self.as_any().downcast_ref()
950 }
951
952 fn as_union_opt(&self) -> Option<&UnionArray> {
953 self.as_any().downcast_ref()
954 }
955
956 fn as_list_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListArray<O>> {
957 self.as_any().downcast_ref()
958 }
959
960 fn as_list_view_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListViewArray<O>> {
961 self.as_any().downcast_ref()
962 }
963
964 fn as_fixed_size_binary_opt(&self) -> Option<&FixedSizeBinaryArray> {
965 self.as_any().downcast_ref()
966 }
967
968 fn as_fixed_size_list_opt(&self) -> Option<&FixedSizeListArray> {
969 self.as_any().downcast_ref()
970 }
971
972 fn as_map_opt(&self) -> Option<&MapArray> {
973 self.as_any().downcast_ref()
974 }
975
976 fn as_dictionary_opt<K: ArrowDictionaryKeyType>(&self) -> Option<&DictionaryArray<K>> {
977 self.as_any().downcast_ref()
978 }
979
980 fn as_any_dictionary_opt(&self) -> Option<&dyn AnyDictionaryArray> {
981 let array = self;
982 downcast_dictionary_array! {
983 array => Some(array),
984 _ => None
985 }
986 }
987}
988
989impl private::Sealed for ArrayRef {}
990impl AsArray for ArrayRef {
991 fn as_boolean_opt(&self) -> Option<&BooleanArray> {
992 self.as_ref().as_boolean_opt()
993 }
994
995 fn as_primitive_opt<T: ArrowPrimitiveType>(&self) -> Option<&PrimitiveArray<T>> {
996 self.as_ref().as_primitive_opt()
997 }
998
999 fn as_bytes_opt<T: ByteArrayType>(&self) -> Option<&GenericByteArray<T>> {
1000 self.as_ref().as_bytes_opt()
1001 }
1002
1003 fn as_byte_view_opt<T: ByteViewType>(&self) -> Option<&GenericByteViewArray<T>> {
1004 self.as_ref().as_byte_view_opt()
1005 }
1006
1007 fn as_struct_opt(&self) -> Option<&StructArray> {
1008 self.as_ref().as_struct_opt()
1009 }
1010
1011 fn as_union_opt(&self) -> Option<&UnionArray> {
1012 self.as_any().downcast_ref()
1013 }
1014
1015 fn as_list_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListArray<O>> {
1016 self.as_ref().as_list_opt()
1017 }
1018
1019 fn as_list_view_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListViewArray<O>> {
1020 self.as_ref().as_list_view_opt()
1021 }
1022
1023 fn as_fixed_size_binary_opt(&self) -> Option<&FixedSizeBinaryArray> {
1024 self.as_ref().as_fixed_size_binary_opt()
1025 }
1026
1027 fn as_fixed_size_list_opt(&self) -> Option<&FixedSizeListArray> {
1028 self.as_ref().as_fixed_size_list_opt()
1029 }
1030
1031 fn as_map_opt(&self) -> Option<&MapArray> {
1032 self.as_any().downcast_ref()
1033 }
1034
1035 fn as_dictionary_opt<K: ArrowDictionaryKeyType>(&self) -> Option<&DictionaryArray<K>> {
1036 self.as_ref().as_dictionary_opt()
1037 }
1038
1039 fn as_any_dictionary_opt(&self) -> Option<&dyn AnyDictionaryArray> {
1040 self.as_ref().as_any_dictionary_opt()
1041 }
1042}
1043
1044#[cfg(test)]
1045mod tests {
1046 use super::*;
1047 use arrow_buffer::i256;
1048 use arrow_schema::DataType;
1049 use std::sync::Arc;
1050
1051 #[test]
1052 fn test_as_primitive_array_ref() {
1053 let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
1054 assert!(!as_primitive_array::<Int32Type>(&array).is_empty());
1055
1056 let array: ArrayRef = Arc::new(array);
1058 assert!(!as_primitive_array::<Int32Type>(&array).is_empty());
1059 }
1060
1061 #[test]
1062 fn test_as_string_array_ref() {
1063 let array: StringArray = vec!["foo", "bar"].into_iter().map(Some).collect();
1064 assert!(!as_string_array(&array).is_empty());
1065
1066 let array: ArrayRef = Arc::new(array);
1068 assert!(!as_string_array(&array).is_empty())
1069 }
1070
1071 #[test]
1072 fn test_decimal128array() {
1073 let a = Decimal128Array::from_iter_values([1, 2, 4, 5]);
1074 assert!(!as_primitive_array::<Decimal128Type>(&a).is_empty());
1075 }
1076
1077 #[test]
1078 fn test_decimal256array() {
1079 let a = Decimal256Array::from_iter_values([1, 2, 4, 5].into_iter().map(i256::from_i128));
1080 assert!(!as_primitive_array::<Decimal256Type>(&a).is_empty());
1081 }
1082
1083 #[test]
1084 fn downcast_integer_array_should_match_only_integers() {
1085 let i32_array: ArrayRef = Arc::new(Int32Array::new_null(1));
1086 let i32_array_ref = &i32_array;
1087 downcast_integer_array!(
1088 i32_array_ref => {
1089 assert_eq!(i32_array_ref.null_count(), 1);
1090 },
1091 _ => panic!("unexpected data type")
1092 );
1093 }
1094
1095 #[test]
1096 fn downcast_integer_array_should_not_match_primitive_that_are_not_integers() {
1097 let array: ArrayRef = Arc::new(Float32Array::new_null(1));
1098 let array_ref = &array;
1099 downcast_integer_array!(
1100 array_ref => {
1101 panic!("unexpected data type {}", array_ref.data_type())
1102 },
1103 DataType::Float32 => {
1104 assert_eq!(array_ref.null_count(), 1);
1105 },
1106 _ => panic!("unexpected data type")
1107 );
1108 }
1109
1110 #[test]
1111 fn downcast_integer_array_should_not_match_non_primitive() {
1112 let array: ArrayRef = Arc::new(StringArray::new_null(1));
1113 let array_ref = &array;
1114 downcast_integer_array!(
1115 array_ref => {
1116 panic!("unexpected data type {}", array_ref.data_type())
1117 },
1118 DataType::Utf8 => {
1119 assert_eq!(array_ref.null_count(), 1);
1120 },
1121 _ => panic!("unexpected data type")
1122 );
1123 }
1124}