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]
76macro_rules! downcast_integer {
77 ($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
78 match ($($data_type),+) {
79 $crate::repeat_pat!($crate::cast::__private::DataType::Int8, $($data_type),+) => {
80 $m!($crate::types::Int8Type $(, $args)*)
81 }
82 $crate::repeat_pat!($crate::cast::__private::DataType::Int16, $($data_type),+) => {
83 $m!($crate::types::Int16Type $(, $args)*)
84 }
85 $crate::repeat_pat!($crate::cast::__private::DataType::Int32, $($data_type),+) => {
86 $m!($crate::types::Int32Type $(, $args)*)
87 }
88 $crate::repeat_pat!($crate::cast::__private::DataType::Int64, $($data_type),+) => {
89 $m!($crate::types::Int64Type $(, $args)*)
90 }
91 $crate::repeat_pat!($crate::cast::__private::DataType::UInt8, $($data_type),+) => {
92 $m!($crate::types::UInt8Type $(, $args)*)
93 }
94 $crate::repeat_pat!($crate::cast::__private::DataType::UInt16, $($data_type),+) => {
95 $m!($crate::types::UInt16Type $(, $args)*)
96 }
97 $crate::repeat_pat!($crate::cast::__private::DataType::UInt32, $($data_type),+) => {
98 $m!($crate::types::UInt32Type $(, $args)*)
99 }
100 $crate::repeat_pat!($crate::cast::__private::DataType::UInt64, $($data_type),+) => {
101 $m!($crate::types::UInt64Type $(, $args)*)
102 }
103 $($p $(if $pred)? => $fallback,)*
104 }
105 };
106}
107
108#[macro_export]
140macro_rules! downcast_integer_array {
141 ($($values:ident),+ => $e:block $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
142 $crate::downcast_integer!{
143 $($values.data_type()),+ => ($crate::downcast_primitive_array_helper, $($values),+, $e),
144 $($p $(if $pred)? => $fallback,)*
145 }
146 };
147 ($values:ident => $e:expr, $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
149 $crate::downcast_integer_array!($values => {$e} $($p $(if $pred)? => $fallback,)*)
150 };
151 (($($values:ident),+) => $e:block $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
153 $crate::downcast_integer_array!($($values),+ => $e $($p $(if $pred)? => $fallback,)*)
154 };
155 (($($values:ident),+) => $e:expr, $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
157 $crate::downcast_integer_array!($($values),+ => {$e} $($p $(if $pred)? => $fallback,)*)
158 };
159}
160
161#[macro_export]
194macro_rules! downcast_run_end_index {
195 ($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
196 match ($($data_type),+) {
197 $crate::repeat_pat!($crate::cast::__private::DataType::Int16, $($data_type),+) => {
198 $m!($crate::types::Int16Type $(, $args)*)
199 }
200 $crate::repeat_pat!($crate::cast::__private::DataType::Int32, $($data_type),+) => {
201 $m!($crate::types::Int32Type $(, $args)*)
202 }
203 $crate::repeat_pat!($crate::cast::__private::DataType::Int64, $($data_type),+) => {
204 $m!($crate::types::Int64Type $(, $args)*)
205 }
206 $($p $(if $pred)? => $fallback,)*
207 }
208 };
209}
210
211#[macro_export]
239macro_rules! downcast_temporal {
240 ($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
241 match ($($data_type),+) {
242 $crate::repeat_pat!($crate::cast::__private::DataType::Time32($crate::cast::__private::TimeUnit::Second), $($data_type),+) => {
243 $m!($crate::types::Time32SecondType $(, $args)*)
244 }
245 $crate::repeat_pat!($crate::cast::__private::DataType::Time32($crate::cast::__private::TimeUnit::Millisecond), $($data_type),+) => {
246 $m!($crate::types::Time32MillisecondType $(, $args)*)
247 }
248 $crate::repeat_pat!($crate::cast::__private::DataType::Time64($crate::cast::__private::TimeUnit::Microsecond), $($data_type),+) => {
249 $m!($crate::types::Time64MicrosecondType $(, $args)*)
250 }
251 $crate::repeat_pat!($crate::cast::__private::DataType::Time64($crate::cast::__private::TimeUnit::Nanosecond), $($data_type),+) => {
252 $m!($crate::types::Time64NanosecondType $(, $args)*)
253 }
254 $crate::repeat_pat!($crate::cast::__private::DataType::Date32, $($data_type),+) => {
255 $m!($crate::types::Date32Type $(, $args)*)
256 }
257 $crate::repeat_pat!($crate::cast::__private::DataType::Date64, $($data_type),+) => {
258 $m!($crate::types::Date64Type $(, $args)*)
259 }
260 $crate::repeat_pat!($crate::cast::__private::DataType::Timestamp($crate::cast::__private::TimeUnit::Second, _), $($data_type),+) => {
261 $m!($crate::types::TimestampSecondType $(, $args)*)
262 }
263 $crate::repeat_pat!($crate::cast::__private::DataType::Timestamp($crate::cast::__private::TimeUnit::Millisecond, _), $($data_type),+) => {
264 $m!($crate::types::TimestampMillisecondType $(, $args)*)
265 }
266 $crate::repeat_pat!($crate::cast::__private::DataType::Timestamp($crate::cast::__private::TimeUnit::Microsecond, _), $($data_type),+) => {
267 $m!($crate::types::TimestampMicrosecondType $(, $args)*)
268 }
269 $crate::repeat_pat!($crate::cast::__private::DataType::Timestamp($crate::cast::__private::TimeUnit::Nanosecond, _), $($data_type),+) => {
270 $m!($crate::types::TimestampNanosecondType $(, $args)*)
271 }
272 $($p $(if $pred)? => $fallback,)*
273 }
274 };
275}
276
277#[macro_export]
309macro_rules! downcast_temporal_array {
310 ($($values:ident),+ => $e:block $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
311 $crate::downcast_temporal!{
312 $($values.data_type()),+ => ($crate::downcast_primitive_array_helper, $($values),+, $e),
313 $($p $(if $pred)? => $fallback,)*
314 }
315 };
316 ($values:ident => $e:expr, $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
318 $crate::downcast_temporal_array!($values => {$e} $($p $(if $pred)? => $fallback,)*)
319 };
320 (($($values:ident),+) => $e:block $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
322 $crate::downcast_temporal_array!($($values),+ => $e $($p $(if $pred)? => $fallback,)*)
323 };
324 (($($values:ident),+) => $e:expr, $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
326 $crate::downcast_temporal_array!($($values),+ => {$e} $($p $(if $pred)? => $fallback,)*)
327 };
328}
329
330#[macro_export]
361macro_rules! downcast_primitive {
362 ($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
363 $crate::downcast_integer! {
364 $($data_type),+ => ($m $(, $args)*),
365 $crate::repeat_pat!($crate::cast::__private::DataType::Float16, $($data_type),+) => {
366 $m!($crate::types::Float16Type $(, $args)*)
367 }
368 $crate::repeat_pat!($crate::cast::__private::DataType::Float32, $($data_type),+) => {
369 $m!($crate::types::Float32Type $(, $args)*)
370 }
371 $crate::repeat_pat!($crate::cast::__private::DataType::Float64, $($data_type),+) => {
372 $m!($crate::types::Float64Type $(, $args)*)
373 }
374 $crate::repeat_pat!($crate::cast::__private::DataType::Decimal32(_, _), $($data_type),+) => {
375 $m!($crate::types::Decimal32Type $(, $args)*)
376 }
377 $crate::repeat_pat!($crate::cast::__private::DataType::Decimal64(_, _), $($data_type),+) => {
378 $m!($crate::types::Decimal64Type $(, $args)*)
379 }
380 $crate::repeat_pat!($crate::cast::__private::DataType::Decimal128(_, _), $($data_type),+) => {
381 $m!($crate::types::Decimal128Type $(, $args)*)
382 }
383 $crate::repeat_pat!($crate::cast::__private::DataType::Decimal256(_, _), $($data_type),+) => {
384 $m!($crate::types::Decimal256Type $(, $args)*)
385 }
386 $crate::repeat_pat!($crate::cast::__private::DataType::Interval($crate::cast::__private::IntervalUnit::YearMonth), $($data_type),+) => {
387 $m!($crate::types::IntervalYearMonthType $(, $args)*)
388 }
389 $crate::repeat_pat!($crate::cast::__private::DataType::Interval($crate::cast::__private::IntervalUnit::DayTime), $($data_type),+) => {
390 $m!($crate::types::IntervalDayTimeType $(, $args)*)
391 }
392 $crate::repeat_pat!($crate::cast::__private::DataType::Interval($crate::cast::__private::IntervalUnit::MonthDayNano), $($data_type),+) => {
393 $m!($crate::types::IntervalMonthDayNanoType $(, $args)*)
394 }
395 $crate::repeat_pat!($crate::cast::__private::DataType::Duration($crate::cast::__private::TimeUnit::Second), $($data_type),+) => {
396 $m!($crate::types::DurationSecondType $(, $args)*)
397 }
398 $crate::repeat_pat!($crate::cast::__private::DataType::Duration($crate::cast::__private::TimeUnit::Millisecond), $($data_type),+) => {
399 $m!($crate::types::DurationMillisecondType $(, $args)*)
400 }
401 $crate::repeat_pat!($crate::cast::__private::DataType::Duration($crate::cast::__private::TimeUnit::Microsecond), $($data_type),+) => {
402 $m!($crate::types::DurationMicrosecondType $(, $args)*)
403 }
404 $crate::repeat_pat!($crate::cast::__private::DataType::Duration($crate::cast::__private::TimeUnit::Nanosecond), $($data_type),+) => {
405 $m!($crate::types::DurationNanosecondType $(, $args)*)
406 }
407 _ => {
408 $crate::downcast_temporal! {
409 $($data_type),+ => ($m $(, $args)*),
410 $($p $(if $pred)? => $fallback,)*
411 }
412 }
413 }
414 };
415}
416
417#[macro_export]
418#[doc(hidden)]
419macro_rules! downcast_primitive_array_helper {
420 ($t:ty, $($values:ident),+, $e:block) => {{
421 $(let $values = $crate::cast::as_primitive_array::<$t>($values);)+
422 $e
423 }};
424}
425
426#[macro_export]
458macro_rules! downcast_primitive_array {
459 ($($values:ident),+ => $e:block $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
460 $crate::downcast_primitive!{
461 $($values.data_type()),+ => ($crate::downcast_primitive_array_helper, $($values),+, $e),
462 $($p $(if $pred)? => $fallback,)*
463 }
464 };
465 ($values:ident => $e:expr, $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
467 $crate::downcast_primitive_array!($values => {$e} $($p $(if $pred)? => $fallback,)*)
468 };
469 (($($values:ident),+) => $e:block $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
471 $crate::downcast_primitive_array!($($values),+ => $e $($p $(if $pred)? => $fallback,)*)
472 };
473 (($($values:ident),+) => $e:expr, $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
475 $crate::downcast_primitive_array!($($values),+ => {$e} $($p $(if $pred)? => $fallback,)*)
476 };
477}
478
479pub fn as_primitive_array<T>(arr: &dyn Array) -> &PrimitiveArray<T>
505where
506 T: ArrowPrimitiveType,
507{
508 arr.as_any()
509 .downcast_ref::<PrimitiveArray<T>>()
510 .expect("Unable to downcast to primitive array")
511}
512
513#[macro_export]
514#[doc(hidden)]
515macro_rules! downcast_dictionary_array_helper {
516 ($t:ty, $($values:ident),+, $e:block) => {{
517 $(let $values = $crate::cast::as_dictionary_array::<$t>($values);)+
518 $e
519 }};
520}
521
522#[macro_export]
557macro_rules! downcast_dictionary_array {
558 ($values:ident => $e:expr, $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
559 downcast_dictionary_array!($values => {$e} $($p $(if $pred)? => $fallback,)*)
560 };
561
562 ($values:ident => $e:block $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
563 match $values.data_type() {
564 $crate::cast::__private::DataType::Dictionary(k, _) => {
565 $crate::downcast_integer! {
566 k.as_ref() => ($crate::downcast_dictionary_array_helper, $values, $e),
567 k => unreachable!("unsupported dictionary key type: {}", k)
568 }
569 }
570 $($p $(if $pred)? => $fallback,)*
571 }
572 }
573}
574
575pub fn as_dictionary_array<T>(arr: &dyn Array) -> &DictionaryArray<T>
590where
591 T: ArrowDictionaryKeyType,
592{
593 arr.as_any()
594 .downcast_ref::<DictionaryArray<T>>()
595 .expect("Unable to downcast to dictionary array")
596}
597
598pub fn as_run_array<T>(arr: &dyn Array) -> &RunArray<T>
613where
614 T: RunEndIndexType,
615{
616 arr.as_any()
617 .downcast_ref::<RunArray<T>>()
618 .expect("Unable to downcast to run array")
619}
620
621#[macro_export]
622#[doc(hidden)]
623macro_rules! downcast_run_array_helper {
624 ($t:ty, $($values:ident),+, $e:block) => {{
625 $(let $values = $crate::cast::as_run_array::<$t>($values);)+
626 $e
627 }};
628}
629
630#[macro_export]
665macro_rules! downcast_run_array {
666 ($values:ident => $e:expr, $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
667 downcast_run_array!($values => {$e} $($p $(if $pred)? => $fallback,)*)
668 };
669
670 ($values:ident => $e:block $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
671 match $values.data_type() {
672 $crate::cast::__private::DataType::RunEndEncoded(k, _) => {
673 $crate::downcast_run_end_index! {
674 k.data_type() => ($crate::downcast_run_array_helper, $values, $e),
675 k => unreachable!("unsupported run end index type: {}", k)
676 }
677 }
678 $($p $(if $pred)? => $fallback,)*
679 }
680 }
681}
682
683pub fn as_generic_list_array<S: OffsetSizeTrait>(arr: &dyn Array) -> &GenericListArray<S> {
686 arr.as_any()
687 .downcast_ref::<GenericListArray<S>>()
688 .expect("Unable to downcast to list array")
689}
690
691#[inline]
694pub fn as_list_array(arr: &dyn Array) -> &ListArray {
695 as_generic_list_array::<i32>(arr)
696}
697
698#[inline]
701pub fn as_fixed_size_list_array(arr: &dyn Array) -> &FixedSizeListArray {
702 arr.as_any()
703 .downcast_ref::<FixedSizeListArray>()
704 .expect("Unable to downcast to fixed size list array")
705}
706
707#[inline]
710pub fn as_large_list_array(arr: &dyn Array) -> &LargeListArray {
711 as_generic_list_array::<i64>(arr)
712}
713
714#[inline]
717pub fn as_generic_binary_array<S: OffsetSizeTrait>(arr: &dyn Array) -> &GenericBinaryArray<S> {
718 arr.as_any()
719 .downcast_ref::<GenericBinaryArray<S>>()
720 .expect("Unable to downcast to binary array")
721}
722
723pub fn as_string_array(arr: &dyn Array) -> &StringArray {
737 arr.as_any()
738 .downcast_ref::<StringArray>()
739 .expect("Unable to downcast to StringArray")
740}
741
742pub fn as_boolean_array(arr: &dyn Array) -> &BooleanArray {
756 arr.as_any()
757 .downcast_ref::<BooleanArray>()
758 .expect("Unable to downcast to BooleanArray")
759}
760
761macro_rules! array_downcast_fn {
762 ($name: ident, $arrty: ty, $arrty_str:expr) => {
763 #[doc = "Force downcast of an [`Array`], such as an [`ArrayRef`] to "]
764 #[doc = $arrty_str]
765 pub fn $name(arr: &dyn Array) -> &$arrty {
766 arr.as_any().downcast_ref::<$arrty>().expect(concat!(
767 "Unable to downcast to typed array through ",
768 stringify!($name)
769 ))
770 }
771 };
772
773 ($name: ident, $arrty: ty) => {
775 array_downcast_fn!(
776 $name,
777 $arrty,
778 concat!("[`", stringify!($arrty), "`], panicking on failure.")
779 );
780 };
781}
782
783array_downcast_fn!(as_largestring_array, LargeStringArray);
784array_downcast_fn!(as_null_array, NullArray);
785array_downcast_fn!(as_struct_array, StructArray);
786array_downcast_fn!(as_union_array, UnionArray);
787array_downcast_fn!(as_map_array, MapArray);
788
789pub fn downcast_array<T>(array: &dyn Array) -> T
815where
816 T: From<ArrayData>,
817{
818 T::from(array.to_data())
819}
820
821mod private {
822 pub trait Sealed {}
823}
824
825pub trait AsArray: private::Sealed {
836 fn as_boolean_opt(&self) -> Option<&BooleanArray>;
838
839 fn as_boolean(&self) -> &BooleanArray {
841 self.as_boolean_opt().expect("boolean array")
842 }
843
844 fn as_primitive_opt<T: ArrowPrimitiveType>(&self) -> Option<&PrimitiveArray<T>>;
846
847 fn as_primitive<T: ArrowPrimitiveType>(&self) -> &PrimitiveArray<T> {
849 self.as_primitive_opt().expect("primitive array")
850 }
851
852 fn as_bytes_opt<T: ByteArrayType>(&self) -> Option<&GenericByteArray<T>>;
854
855 fn as_bytes<T: ByteArrayType>(&self) -> &GenericByteArray<T> {
857 self.as_bytes_opt().expect("byte array")
858 }
859
860 fn as_string_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericStringArray<O>> {
862 self.as_bytes_opt()
863 }
864
865 fn as_string<O: OffsetSizeTrait>(&self) -> &GenericStringArray<O> {
867 self.as_bytes_opt().expect("string array")
868 }
869
870 fn as_binary_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericBinaryArray<O>> {
872 self.as_bytes_opt()
873 }
874
875 fn as_binary<O: OffsetSizeTrait>(&self) -> &GenericBinaryArray<O> {
877 self.as_bytes_opt().expect("binary array")
878 }
879
880 fn as_string_view_opt(&self) -> Option<&StringViewArray> {
882 self.as_byte_view_opt()
883 }
884
885 fn as_string_view(&self) -> &StringViewArray {
887 self.as_byte_view_opt().expect("string view array")
888 }
889
890 fn as_binary_view_opt(&self) -> Option<&BinaryViewArray> {
892 self.as_byte_view_opt()
893 }
894
895 fn as_binary_view(&self) -> &BinaryViewArray {
897 self.as_byte_view_opt().expect("binary view array")
898 }
899
900 fn as_byte_view_opt<T: ByteViewType>(&self) -> Option<&GenericByteViewArray<T>>;
902
903 fn as_byte_view<T: ByteViewType>(&self) -> &GenericByteViewArray<T> {
905 self.as_byte_view_opt().expect("byte view array")
906 }
907
908 fn as_struct_opt(&self) -> Option<&StructArray>;
910
911 fn as_struct(&self) -> &StructArray {
913 self.as_struct_opt().expect("struct array")
914 }
915
916 fn as_union_opt(&self) -> Option<&UnionArray>;
918
919 fn as_union(&self) -> &UnionArray {
921 self.as_union_opt().expect("union array")
922 }
923
924 fn as_list_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListArray<O>>;
926
927 fn as_list<O: OffsetSizeTrait>(&self) -> &GenericListArray<O> {
929 self.as_list_opt().expect("list array")
930 }
931
932 fn as_list_view_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListViewArray<O>>;
934
935 fn as_list_view<O: OffsetSizeTrait>(&self) -> &GenericListViewArray<O> {
937 self.as_list_view_opt().expect("list view array")
938 }
939
940 fn as_fixed_size_binary_opt(&self) -> Option<&FixedSizeBinaryArray>;
942
943 fn as_fixed_size_binary(&self) -> &FixedSizeBinaryArray {
945 self.as_fixed_size_binary_opt()
946 .expect("fixed size binary array")
947 }
948
949 fn as_fixed_size_list_opt(&self) -> Option<&FixedSizeListArray>;
951
952 fn as_fixed_size_list(&self) -> &FixedSizeListArray {
954 self.as_fixed_size_list_opt()
955 .expect("fixed size list array")
956 }
957
958 fn as_map_opt(&self) -> Option<&MapArray>;
960
961 fn as_map(&self) -> &MapArray {
963 self.as_map_opt().expect("map array")
964 }
965
966 fn as_dictionary_opt<K: ArrowDictionaryKeyType>(&self) -> Option<&DictionaryArray<K>>;
968
969 fn as_dictionary<K: ArrowDictionaryKeyType>(&self) -> &DictionaryArray<K> {
971 self.as_dictionary_opt().expect("dictionary array")
972 }
973
974 fn as_run_opt<K: RunEndIndexType>(&self) -> Option<&RunArray<K>>;
976
977 fn as_run<K: RunEndIndexType>(&self) -> &RunArray<K> {
979 self.as_run_opt().expect("run array")
980 }
981
982 fn as_any_dictionary_opt(&self) -> Option<&dyn AnyDictionaryArray>;
984
985 fn as_any_dictionary(&self) -> &dyn AnyDictionaryArray {
987 self.as_any_dictionary_opt().expect("any dictionary array")
988 }
989}
990
991impl private::Sealed for dyn Array + '_ {}
992impl AsArray for dyn Array + '_ {
993 fn as_boolean_opt(&self) -> Option<&BooleanArray> {
994 self.as_any().downcast_ref()
995 }
996
997 fn as_primitive_opt<T: ArrowPrimitiveType>(&self) -> Option<&PrimitiveArray<T>> {
998 self.as_any().downcast_ref()
999 }
1000
1001 fn as_bytes_opt<T: ByteArrayType>(&self) -> Option<&GenericByteArray<T>> {
1002 self.as_any().downcast_ref()
1003 }
1004
1005 fn as_byte_view_opt<T: ByteViewType>(&self) -> Option<&GenericByteViewArray<T>> {
1006 self.as_any().downcast_ref()
1007 }
1008
1009 fn as_struct_opt(&self) -> Option<&StructArray> {
1010 self.as_any().downcast_ref()
1011 }
1012
1013 fn as_union_opt(&self) -> Option<&UnionArray> {
1014 self.as_any().downcast_ref()
1015 }
1016
1017 fn as_list_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListArray<O>> {
1018 self.as_any().downcast_ref()
1019 }
1020
1021 fn as_list_view_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListViewArray<O>> {
1022 self.as_any().downcast_ref()
1023 }
1024
1025 fn as_fixed_size_binary_opt(&self) -> Option<&FixedSizeBinaryArray> {
1026 self.as_any().downcast_ref()
1027 }
1028
1029 fn as_fixed_size_list_opt(&self) -> Option<&FixedSizeListArray> {
1030 self.as_any().downcast_ref()
1031 }
1032
1033 fn as_map_opt(&self) -> Option<&MapArray> {
1034 self.as_any().downcast_ref()
1035 }
1036
1037 fn as_dictionary_opt<K: ArrowDictionaryKeyType>(&self) -> Option<&DictionaryArray<K>> {
1038 self.as_any().downcast_ref()
1039 }
1040
1041 fn as_run_opt<K: RunEndIndexType>(&self) -> Option<&RunArray<K>> {
1042 self.as_any().downcast_ref()
1043 }
1044
1045 fn as_any_dictionary_opt(&self) -> Option<&dyn AnyDictionaryArray> {
1046 let array = self;
1047 downcast_dictionary_array! {
1048 array => Some(array),
1049 _ => None
1050 }
1051 }
1052}
1053
1054impl private::Sealed for ArrayRef {}
1055impl AsArray for ArrayRef {
1056 fn as_boolean_opt(&self) -> Option<&BooleanArray> {
1057 self.as_ref().as_boolean_opt()
1058 }
1059
1060 fn as_primitive_opt<T: ArrowPrimitiveType>(&self) -> Option<&PrimitiveArray<T>> {
1061 self.as_ref().as_primitive_opt()
1062 }
1063
1064 fn as_bytes_opt<T: ByteArrayType>(&self) -> Option<&GenericByteArray<T>> {
1065 self.as_ref().as_bytes_opt()
1066 }
1067
1068 fn as_byte_view_opt<T: ByteViewType>(&self) -> Option<&GenericByteViewArray<T>> {
1069 self.as_ref().as_byte_view_opt()
1070 }
1071
1072 fn as_struct_opt(&self) -> Option<&StructArray> {
1073 self.as_ref().as_struct_opt()
1074 }
1075
1076 fn as_union_opt(&self) -> Option<&UnionArray> {
1077 self.as_any().downcast_ref()
1078 }
1079
1080 fn as_list_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListArray<O>> {
1081 self.as_ref().as_list_opt()
1082 }
1083
1084 fn as_list_view_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericListViewArray<O>> {
1085 self.as_ref().as_list_view_opt()
1086 }
1087
1088 fn as_fixed_size_binary_opt(&self) -> Option<&FixedSizeBinaryArray> {
1089 self.as_ref().as_fixed_size_binary_opt()
1090 }
1091
1092 fn as_fixed_size_list_opt(&self) -> Option<&FixedSizeListArray> {
1093 self.as_ref().as_fixed_size_list_opt()
1094 }
1095
1096 fn as_map_opt(&self) -> Option<&MapArray> {
1097 self.as_any().downcast_ref()
1098 }
1099
1100 fn as_dictionary_opt<K: ArrowDictionaryKeyType>(&self) -> Option<&DictionaryArray<K>> {
1101 self.as_ref().as_dictionary_opt()
1102 }
1103
1104 fn as_any_dictionary_opt(&self) -> Option<&dyn AnyDictionaryArray> {
1105 self.as_ref().as_any_dictionary_opt()
1106 }
1107
1108 fn as_run_opt<K: RunEndIndexType>(&self) -> Option<&RunArray<K>> {
1109 self.as_ref().as_run_opt()
1110 }
1111
1112 fn as_string_opt<O: OffsetSizeTrait>(&self) -> Option<&GenericStringArray<O>> {
1113 self.as_ref().as_string_opt()
1114 }
1115}
1116
1117#[cfg(test)]
1118mod tests {
1119 use super::*;
1120 use arrow_buffer::i256;
1121 use arrow_schema::DataType;
1122 use std::sync::Arc;
1123
1124 #[test]
1125 fn test_as_primitive_array_ref() {
1126 let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
1127 assert!(!as_primitive_array::<Int32Type>(&array).is_empty());
1128
1129 let array: ArrayRef = Arc::new(array);
1131 assert!(!as_primitive_array::<Int32Type>(&array).is_empty());
1132 }
1133
1134 #[test]
1135 fn test_as_string_array_ref() {
1136 let array: StringArray = vec!["foo", "bar"].into_iter().map(Some).collect();
1137 assert!(!as_string_array(&array).is_empty());
1138
1139 let array: ArrayRef = Arc::new(array);
1141 assert!(!as_string_array(&array).is_empty())
1142 }
1143
1144 #[test]
1145 fn test_decimal32array() {
1146 let a = Decimal32Array::from_iter_values([1, 2, 4, 5]);
1147 assert!(!as_primitive_array::<Decimal32Type>(&a).is_empty());
1148 }
1149
1150 #[test]
1151 fn test_decimal64array() {
1152 let a = Decimal64Array::from_iter_values([1, 2, 4, 5]);
1153 assert!(!as_primitive_array::<Decimal64Type>(&a).is_empty());
1154 }
1155
1156 #[test]
1157 fn test_decimal128array() {
1158 let a = Decimal128Array::from_iter_values([1, 2, 4, 5]);
1159 assert!(!as_primitive_array::<Decimal128Type>(&a).is_empty());
1160 }
1161
1162 #[test]
1163 fn test_decimal256array() {
1164 let a = Decimal256Array::from_iter_values([1, 2, 4, 5].into_iter().map(i256::from_i128));
1165 assert!(!as_primitive_array::<Decimal256Type>(&a).is_empty());
1166 }
1167
1168 #[test]
1169 fn downcast_integer_array_should_match_only_integers() {
1170 let i32_array: ArrayRef = Arc::new(Int32Array::new_null(1));
1171 let i32_array_ref = &i32_array;
1172 downcast_integer_array!(
1173 i32_array_ref => {
1174 assert_eq!(i32_array_ref.null_count(), 1);
1175 },
1176 _ => panic!("unexpected data type")
1177 );
1178 }
1179
1180 #[test]
1181 fn downcast_integer_array_should_not_match_primitive_that_are_not_integers() {
1182 let array: ArrayRef = Arc::new(Float32Array::new_null(1));
1183 let array_ref = &array;
1184 downcast_integer_array!(
1185 array_ref => {
1186 panic!("unexpected data type {}", array_ref.data_type())
1187 },
1188 DataType::Float32 => {
1189 assert_eq!(array_ref.null_count(), 1);
1190 },
1191 _ => panic!("unexpected data type")
1192 );
1193 }
1194
1195 #[test]
1196 fn downcast_integer_array_should_not_match_non_primitive() {
1197 let array: ArrayRef = Arc::new(StringArray::new_null(1));
1198 let array_ref = &array;
1199 downcast_integer_array!(
1200 array_ref => {
1201 panic!("unexpected data type {}", array_ref.data_type())
1202 },
1203 DataType::Utf8 => {
1204 assert_eq!(array_ref.null_count(), 1);
1205 },
1206 _ => panic!("unexpected data type")
1207 );
1208 }
1209}