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]
137macro_rules! downcast_run_end_index {
138 ($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat => $fallback:expr $(,)*)*) => {
139 match ($($data_type),+) {
140 $crate::repeat_pat!($crate::cast::__private::DataType::Int16, $($data_type),+) => {
141 $m!($crate::types::Int16Type $(, $args)*)
142 }
143 $crate::repeat_pat!($crate::cast::__private::DataType::Int32, $($data_type),+) => {
144 $m!($crate::types::Int32Type $(, $args)*)
145 }
146 $crate::repeat_pat!($crate::cast::__private::DataType::Int64, $($data_type),+) => {
147 $m!($crate::types::Int64Type $(, $args)*)
148 }
149 $($p => $fallback,)*
150 }
151 };
152}
153
154#[macro_export]
180macro_rules! downcast_temporal {
181 ($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat => $fallback:expr $(,)*)*) => {
182 match ($($data_type),+) {
183 $crate::repeat_pat!($crate::cast::__private::DataType::Time32($crate::cast::__private::TimeUnit::Second), $($data_type),+) => {
184 $m!($crate::types::Time32SecondType $(, $args)*)
185 }
186 $crate::repeat_pat!($crate::cast::__private::DataType::Time32($crate::cast::__private::TimeUnit::Millisecond), $($data_type),+) => {
187 $m!($crate::types::Time32MillisecondType $(, $args)*)
188 }
189 $crate::repeat_pat!($crate::cast::__private::DataType::Time64($crate::cast::__private::TimeUnit::Microsecond), $($data_type),+) => {
190 $m!($crate::types::Time64MicrosecondType $(, $args)*)
191 }
192 $crate::repeat_pat!($crate::cast::__private::DataType::Time64($crate::cast::__private::TimeUnit::Nanosecond), $($data_type),+) => {
193 $m!($crate::types::Time64NanosecondType $(, $args)*)
194 }
195 $crate::repeat_pat!($crate::cast::__private::DataType::Date32, $($data_type),+) => {
196 $m!($crate::types::Date32Type $(, $args)*)
197 }
198 $crate::repeat_pat!($crate::cast::__private::DataType::Date64, $($data_type),+) => {
199 $m!($crate::types::Date64Type $(, $args)*)
200 }
201 $crate::repeat_pat!($crate::cast::__private::DataType::Timestamp($crate::cast::__private::TimeUnit::Second, _), $($data_type),+) => {
202 $m!($crate::types::TimestampSecondType $(, $args)*)
203 }
204 $crate::repeat_pat!($crate::cast::__private::DataType::Timestamp($crate::cast::__private::TimeUnit::Millisecond, _), $($data_type),+) => {
205 $m!($crate::types::TimestampMillisecondType $(, $args)*)
206 }
207 $crate::repeat_pat!($crate::cast::__private::DataType::Timestamp($crate::cast::__private::TimeUnit::Microsecond, _), $($data_type),+) => {
208 $m!($crate::types::TimestampMicrosecondType $(, $args)*)
209 }
210 $crate::repeat_pat!($crate::cast::__private::DataType::Timestamp($crate::cast::__private::TimeUnit::Nanosecond, _), $($data_type),+) => {
211 $m!($crate::types::TimestampNanosecondType $(, $args)*)
212 }
213 $($p => $fallback,)*
214 }
215 };
216}
217
218#[macro_export]
244macro_rules! downcast_temporal_array {
245 ($values:ident => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
246 $crate::downcast_temporal_array!($values => {$e} $($p => $fallback)*)
247 };
248 (($($values:ident),+) => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
249 $crate::downcast_temporal_array!($($values),+ => {$e} $($p => $fallback)*)
250 };
251 ($($values:ident),+ => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
252 $crate::downcast_temporal_array!(($($values),+) => $e $($p => $fallback)*)
253 };
254 (($($values:ident),+) => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
255 $crate::downcast_temporal!{
256 $($values.data_type()),+ => ($crate::downcast_primitive_array_helper, $($values),+, $e),
257 $($p => $fallback,)*
258 }
259 };
260}
261
262#[macro_export]
291macro_rules! downcast_primitive {
292 ($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat => $fallback:expr $(,)*)*) => {
293 $crate::downcast_integer! {
294 $($data_type),+ => ($m $(, $args)*),
295 $crate::repeat_pat!($crate::cast::__private::DataType::Float16, $($data_type),+) => {
296 $m!($crate::types::Float16Type $(, $args)*)
297 }
298 $crate::repeat_pat!($crate::cast::__private::DataType::Float32, $($data_type),+) => {
299 $m!($crate::types::Float32Type $(, $args)*)
300 }
301 $crate::repeat_pat!($crate::cast::__private::DataType::Float64, $($data_type),+) => {
302 $m!($crate::types::Float64Type $(, $args)*)
303 }
304 $crate::repeat_pat!($crate::cast::__private::DataType::Decimal128(_, _), $($data_type),+) => {
305 $m!($crate::types::Decimal128Type $(, $args)*)
306 }
307 $crate::repeat_pat!($crate::cast::__private::DataType::Decimal256(_, _), $($data_type),+) => {
308 $m!($crate::types::Decimal256Type $(, $args)*)
309 }
310 $crate::repeat_pat!($crate::cast::__private::DataType::Interval($crate::cast::__private::IntervalUnit::YearMonth), $($data_type),+) => {
311 $m!($crate::types::IntervalYearMonthType $(, $args)*)
312 }
313 $crate::repeat_pat!($crate::cast::__private::DataType::Interval($crate::cast::__private::IntervalUnit::DayTime), $($data_type),+) => {
314 $m!($crate::types::IntervalDayTimeType $(, $args)*)
315 }
316 $crate::repeat_pat!($crate::cast::__private::DataType::Interval($crate::cast::__private::IntervalUnit::MonthDayNano), $($data_type),+) => {
317 $m!($crate::types::IntervalMonthDayNanoType $(, $args)*)
318 }
319 $crate::repeat_pat!($crate::cast::__private::DataType::Duration($crate::cast::__private::TimeUnit::Second), $($data_type),+) => {
320 $m!($crate::types::DurationSecondType $(, $args)*)
321 }
322 $crate::repeat_pat!($crate::cast::__private::DataType::Duration($crate::cast::__private::TimeUnit::Millisecond), $($data_type),+) => {
323 $m!($crate::types::DurationMillisecondType $(, $args)*)
324 }
325 $crate::repeat_pat!($crate::cast::__private::DataType::Duration($crate::cast::__private::TimeUnit::Microsecond), $($data_type),+) => {
326 $m!($crate::types::DurationMicrosecondType $(, $args)*)
327 }
328 $crate::repeat_pat!($crate::cast::__private::DataType::Duration($crate::cast::__private::TimeUnit::Nanosecond), $($data_type),+) => {
329 $m!($crate::types::DurationNanosecondType $(, $args)*)
330 }
331 _ => {
332 $crate::downcast_temporal! {
333 $($data_type),+ => ($m $(, $args)*),
334 $($p => $fallback,)*
335 }
336 }
337 }
338 };
339}
340
341#[macro_export]
342#[doc(hidden)]
343macro_rules! downcast_primitive_array_helper {
344 ($t:ty, $($values:ident),+, $e:block) => {{
345 $(let $values = $crate::cast::as_primitive_array::<$t>($values);)+
346 $e
347 }};
348}
349
350#[macro_export]
376macro_rules! downcast_primitive_array {
377 ($values:ident => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
378 $crate::downcast_primitive_array!($values => {$e} $($p => $fallback)*)
379 };
380 (($($values:ident),+) => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
381 $crate::downcast_primitive_array!($($values),+ => {$e} $($p => $fallback)*)
382 };
383 ($($values:ident),+ => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
384 $crate::downcast_primitive_array!(($($values),+) => $e $($p => $fallback)*)
385 };
386 (($($values:ident),+) => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
387 $crate::downcast_primitive!{
388 $($values.data_type()),+ => ($crate::downcast_primitive_array_helper, $($values),+, $e),
389 $($p => $fallback,)*
390 }
391 };
392}
393
394pub fn as_primitive_array<T>(arr: &dyn Array) -> &PrimitiveArray<T>
420where
421 T: ArrowPrimitiveType,
422{
423 arr.as_any()
424 .downcast_ref::<PrimitiveArray<T>>()
425 .expect("Unable to downcast to primitive array")
426}
427
428#[macro_export]
429#[doc(hidden)]
430macro_rules! downcast_dictionary_array_helper {
431 ($t:ty, $($values:ident),+, $e:block) => {{
432 $(let $values = $crate::cast::as_dictionary_array::<$t>($values);)+
433 $e
434 }};
435}
436
437#[macro_export]
466macro_rules! downcast_dictionary_array {
467 ($values:ident => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
468 downcast_dictionary_array!($values => {$e} $($p => $fallback)*)
469 };
470
471 ($values:ident => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
472 match $values.data_type() {
473 $crate::cast::__private::DataType::Dictionary(k, _) => {
474 $crate::downcast_integer! {
475 k.as_ref() => ($crate::downcast_dictionary_array_helper, $values, $e),
476 k => unreachable!("unsupported dictionary key type: {}", k)
477 }
478 }
479 $($p => $fallback,)*
480 }
481 }
482}
483
484pub fn as_dictionary_array<T>(arr: &dyn Array) -> &DictionaryArray<T>
499where
500 T: ArrowDictionaryKeyType,
501{
502 arr.as_any()
503 .downcast_ref::<DictionaryArray<T>>()
504 .expect("Unable to downcast to dictionary array")
505}
506
507pub fn as_run_array<T>(arr: &dyn Array) -> &RunArray<T>
522where
523 T: RunEndIndexType,
524{
525 arr.as_any()
526 .downcast_ref::<RunArray<T>>()
527 .expect("Unable to downcast to run array")
528}
529
530#[macro_export]
531#[doc(hidden)]
532macro_rules! downcast_run_array_helper {
533 ($t:ty, $($values:ident),+, $e:block) => {{
534 $(let $values = $crate::cast::as_run_array::<$t>($values);)+
535 $e
536 }};
537}
538
539#[macro_export]
568macro_rules! downcast_run_array {
569 ($values:ident => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
570 downcast_run_array!($values => {$e} $($p => $fallback)*)
571 };
572
573 ($values:ident => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
574 match $values.data_type() {
575 $crate::cast::__private::DataType::RunEndEncoded(k, _) => {
576 $crate::downcast_run_end_index! {
577 k.data_type() => ($crate::downcast_run_array_helper, $values, $e),
578 k => unreachable!("unsupported run end index type: {}", k)
579 }
580 }
581 $($p => $fallback,)*
582 }
583 }
584}
585
586pub fn as_generic_list_array<S: OffsetSizeTrait>(arr: &dyn Array) -> &GenericListArray<S> {
589 arr.as_any()
590 .downcast_ref::<GenericListArray<S>>()
591 .expect("Unable to downcast to list array")
592}
593
594#[inline]
597pub fn as_list_array(arr: &dyn Array) -> &ListArray {
598 as_generic_list_array::<i32>(arr)
599}
600
601#[inline]
604pub fn as_fixed_size_list_array(arr: &dyn Array) -> &FixedSizeListArray {
605 arr.as_any()
606 .downcast_ref::<FixedSizeListArray>()
607 .expect("Unable to downcast to fixed size list array")
608}
609
610#[inline]
613pub fn as_large_list_array(arr: &dyn Array) -> &LargeListArray {
614 as_generic_list_array::<i64>(arr)
615}
616
617#[inline]
620pub fn as_generic_binary_array<S: OffsetSizeTrait>(arr: &dyn Array) -> &GenericBinaryArray<S> {
621 arr.as_any()
622 .downcast_ref::<GenericBinaryArray<S>>()
623 .expect("Unable to downcast to binary array")
624}
625
626pub fn as_string_array(arr: &dyn Array) -> &StringArray {
640 arr.as_any()
641 .downcast_ref::<StringArray>()
642 .expect("Unable to downcast to StringArray")
643}
644
645pub fn as_boolean_array(arr: &dyn Array) -> &BooleanArray {
659 arr.as_any()
660 .downcast_ref::<BooleanArray>()
661 .expect("Unable to downcast to BooleanArray")
662}
663
664macro_rules! array_downcast_fn {
665 ($name: ident, $arrty: ty, $arrty_str:expr) => {
666 #[doc = "Force downcast of an [`Array`], such as an [`ArrayRef`] to "]
667 #[doc = $arrty_str]
668 pub fn $name(arr: &dyn Array) -> &$arrty {
669 arr.as_any().downcast_ref::<$arrty>().expect(concat!(
670 "Unable to downcast to typed array through ",
671 stringify!($name)
672 ))
673 }
674 };
675
676 ($name: ident, $arrty: ty) => {
678 array_downcast_fn!(
679 $name,
680 $arrty,
681 concat!("[`", stringify!($arrty), "`], panicking on failure.")
682 );
683 };
684}
685
686array_downcast_fn!(as_largestring_array, LargeStringArray);
687array_downcast_fn!(as_null_array, NullArray);
688array_downcast_fn!(as_struct_array, StructArray);
689array_downcast_fn!(as_union_array, UnionArray);
690array_downcast_fn!(as_map_array, MapArray);
691
692pub fn downcast_array<T>(array: &dyn Array) -> T
718where
719 T: From<ArrayData>,
720{
721 T::from(array.to_data())
722}
723
724mod private {
725 pub trait Sealed {}
726}
727
728pub trait AsArray: private::Sealed {
739 fn as_boolean_opt(&self) -> Option<&BooleanArray>;
741
742 fn as_boolean(&self) -> &BooleanArray {
744 self.as_boolean_opt().expect("boolean array")
745 }
746
747 fn as_primitive_opt<T: ArrowPrimitiveType>(&self) -> Option<&PrimitiveArray<T>>;
749
750 fn as_primitive<T: ArrowPrimitiveType>(&self) -> &PrimitiveArray<T> {
752 self.as_primitive_opt().expect("primitive array")
753 }
754
755 fn as_bytes_opt<T: ByteArrayType>(&self) -> Option<&GenericByteArray<T>>;
757
758 fn as_bytes<T: ByteArrayType>(&self) -> &GenericByteArray<T> {
760 self.as_bytes_opt().expect("byte array")
761 }
762
763 fn as_string_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericStringArray<O>> {
765 self.as_bytes_opt()
766 }
767
768 fn as_string<O: OffsetSizeTrait>(&self) -> &GenericStringArray<O> {
770 self.as_bytes_opt().expect("string array")
771 }
772
773 fn as_binary_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericBinaryArray<O>> {
775 self.as_bytes_opt()
776 }
777
778 fn as_binary<O: OffsetSizeTrait>(&self) -> &GenericBinaryArray<O> {
780 self.as_bytes_opt().expect("binary array")
781 }
782
783 fn as_string_view_opt(&self) -> Option<&StringViewArray> {
785 self.as_byte_view_opt()
786 }
787
788 fn as_string_view(&self) -> &StringViewArray {
790 self.as_byte_view_opt().expect("string view array")
791 }
792
793 fn as_binary_view_opt(&self) -> Option<&BinaryViewArray> {
795 self.as_byte_view_opt()
796 }
797
798 fn as_binary_view(&self) -> &BinaryViewArray {
800 self.as_byte_view_opt().expect("binary view array")
801 }
802
803 fn as_byte_view_opt<T: ByteViewType>(&self) -> Option<&GenericByteViewArray<T>>;
805
806 fn as_byte_view<T: ByteViewType>(&self) -> &GenericByteViewArray<T> {
808 self.as_byte_view_opt().expect("byte view array")
809 }
810
811 fn as_struct_opt(&self) -> Option<&StructArray>;
813
814 fn as_struct(&self) -> &StructArray {
816 self.as_struct_opt().expect("struct array")
817 }
818
819 fn as_union_opt(&self) -> Option<&UnionArray>;
821
822 fn as_union(&self) -> &UnionArray {
824 self.as_union_opt().expect("union array")
825 }
826
827 fn as_list_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListArray<O>>;
829
830 fn as_list<O: OffsetSizeTrait>(&self) -> &GenericListArray<O> {
832 self.as_list_opt().expect("list array")
833 }
834
835 fn as_list_view_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListViewArray<O>>;
837
838 fn as_list_view<O: OffsetSizeTrait>(&self) -> &GenericListViewArray<O> {
840 self.as_list_view_opt().expect("list view array")
841 }
842
843 fn as_fixed_size_binary_opt(&self) -> Option<&FixedSizeBinaryArray>;
845
846 fn as_fixed_size_binary(&self) -> &FixedSizeBinaryArray {
848 self.as_fixed_size_binary_opt()
849 .expect("fixed size binary array")
850 }
851
852 fn as_fixed_size_list_opt(&self) -> Option<&FixedSizeListArray>;
854
855 fn as_fixed_size_list(&self) -> &FixedSizeListArray {
857 self.as_fixed_size_list_opt()
858 .expect("fixed size list array")
859 }
860
861 fn as_map_opt(&self) -> Option<&MapArray>;
863
864 fn as_map(&self) -> &MapArray {
866 self.as_map_opt().expect("map array")
867 }
868
869 fn as_dictionary_opt<K: ArrowDictionaryKeyType>(&self) -> Option<&DictionaryArray<K>>;
871
872 fn as_dictionary<K: ArrowDictionaryKeyType>(&self) -> &DictionaryArray<K> {
874 self.as_dictionary_opt().expect("dictionary array")
875 }
876
877 fn as_any_dictionary_opt(&self) -> Option<&dyn AnyDictionaryArray>;
879
880 fn as_any_dictionary(&self) -> &dyn AnyDictionaryArray {
882 self.as_any_dictionary_opt().expect("any dictionary array")
883 }
884}
885
886impl private::Sealed for dyn Array + '_ {}
887impl AsArray for dyn Array + '_ {
888 fn as_boolean_opt(&self) -> Option<&BooleanArray> {
889 self.as_any().downcast_ref()
890 }
891
892 fn as_primitive_opt<T: ArrowPrimitiveType>(&self) -> Option<&PrimitiveArray<T>> {
893 self.as_any().downcast_ref()
894 }
895
896 fn as_bytes_opt<T: ByteArrayType>(&self) -> Option<&GenericByteArray<T>> {
897 self.as_any().downcast_ref()
898 }
899
900 fn as_byte_view_opt<T: ByteViewType>(&self) -> Option<&GenericByteViewArray<T>> {
901 self.as_any().downcast_ref()
902 }
903
904 fn as_struct_opt(&self) -> Option<&StructArray> {
905 self.as_any().downcast_ref()
906 }
907
908 fn as_union_opt(&self) -> Option<&UnionArray> {
909 self.as_any().downcast_ref()
910 }
911
912 fn as_list_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListArray<O>> {
913 self.as_any().downcast_ref()
914 }
915
916 fn as_list_view_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListViewArray<O>> {
917 self.as_any().downcast_ref()
918 }
919
920 fn as_fixed_size_binary_opt(&self) -> Option<&FixedSizeBinaryArray> {
921 self.as_any().downcast_ref()
922 }
923
924 fn as_fixed_size_list_opt(&self) -> Option<&FixedSizeListArray> {
925 self.as_any().downcast_ref()
926 }
927
928 fn as_map_opt(&self) -> Option<&MapArray> {
929 self.as_any().downcast_ref()
930 }
931
932 fn as_dictionary_opt<K: ArrowDictionaryKeyType>(&self) -> Option<&DictionaryArray<K>> {
933 self.as_any().downcast_ref()
934 }
935
936 fn as_any_dictionary_opt(&self) -> Option<&dyn AnyDictionaryArray> {
937 let array = self;
938 downcast_dictionary_array! {
939 array => Some(array),
940 _ => None
941 }
942 }
943}
944
945impl private::Sealed for ArrayRef {}
946impl AsArray for ArrayRef {
947 fn as_boolean_opt(&self) -> Option<&BooleanArray> {
948 self.as_ref().as_boolean_opt()
949 }
950
951 fn as_primitive_opt<T: ArrowPrimitiveType>(&self) -> Option<&PrimitiveArray<T>> {
952 self.as_ref().as_primitive_opt()
953 }
954
955 fn as_bytes_opt<T: ByteArrayType>(&self) -> Option<&GenericByteArray<T>> {
956 self.as_ref().as_bytes_opt()
957 }
958
959 fn as_byte_view_opt<T: ByteViewType>(&self) -> Option<&GenericByteViewArray<T>> {
960 self.as_ref().as_byte_view_opt()
961 }
962
963 fn as_struct_opt(&self) -> Option<&StructArray> {
964 self.as_ref().as_struct_opt()
965 }
966
967 fn as_union_opt(&self) -> Option<&UnionArray> {
968 self.as_any().downcast_ref()
969 }
970
971 fn as_list_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListArray<O>> {
972 self.as_ref().as_list_opt()
973 }
974
975 fn as_list_view_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListViewArray<O>> {
976 self.as_ref().as_list_view_opt()
977 }
978
979 fn as_fixed_size_binary_opt(&self) -> Option<&FixedSizeBinaryArray> {
980 self.as_ref().as_fixed_size_binary_opt()
981 }
982
983 fn as_fixed_size_list_opt(&self) -> Option<&FixedSizeListArray> {
984 self.as_ref().as_fixed_size_list_opt()
985 }
986
987 fn as_map_opt(&self) -> Option<&MapArray> {
988 self.as_any().downcast_ref()
989 }
990
991 fn as_dictionary_opt<K: ArrowDictionaryKeyType>(&self) -> Option<&DictionaryArray<K>> {
992 self.as_ref().as_dictionary_opt()
993 }
994
995 fn as_any_dictionary_opt(&self) -> Option<&dyn AnyDictionaryArray> {
996 self.as_ref().as_any_dictionary_opt()
997 }
998}
999
1000#[cfg(test)]
1001mod tests {
1002 use arrow_buffer::i256;
1003 use std::sync::Arc;
1004
1005 use super::*;
1006
1007 #[test]
1008 fn test_as_primitive_array_ref() {
1009 let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
1010 assert!(!as_primitive_array::<Int32Type>(&array).is_empty());
1011
1012 let array: ArrayRef = Arc::new(array);
1014 assert!(!as_primitive_array::<Int32Type>(&array).is_empty());
1015 }
1016
1017 #[test]
1018 fn test_as_string_array_ref() {
1019 let array: StringArray = vec!["foo", "bar"].into_iter().map(Some).collect();
1020 assert!(!as_string_array(&array).is_empty());
1021
1022 let array: ArrayRef = Arc::new(array);
1024 assert!(!as_string_array(&array).is_empty())
1025 }
1026
1027 #[test]
1028 fn test_decimal128array() {
1029 let a = Decimal128Array::from_iter_values([1, 2, 4, 5]);
1030 assert!(!as_primitive_array::<Decimal128Type>(&a).is_empty());
1031 }
1032
1033 #[test]
1034 fn test_decimal256array() {
1035 let a = Decimal256Array::from_iter_values([1, 2, 4, 5].into_iter().map(i256::from_i128));
1036 assert!(!as_primitive_array::<Decimal256Type>(&a).is_empty());
1037 }
1038}