1mod binary_array;
21
22use crate::types::*;
23use arrow_buffer::{ArrowNativeType, NullBuffer, OffsetBuffer, ScalarBuffer};
24use arrow_data::ArrayData;
25use arrow_schema::{DataType, IntervalUnit, TimeUnit};
26use std::any::Any;
27use std::sync::Arc;
28
29pub use binary_array::*;
30
31mod boolean_array;
32pub use boolean_array::*;
33
34mod byte_array;
35pub use byte_array::*;
36
37mod dictionary_array;
38pub use dictionary_array::*;
39
40mod fixed_size_binary_array;
41pub use fixed_size_binary_array::*;
42
43mod fixed_size_list_array;
44pub use fixed_size_list_array::*;
45
46mod list_array;
47pub use list_array::*;
48
49mod map_array;
50pub use map_array::*;
51
52mod null_array;
53pub use null_array::*;
54
55mod primitive_array;
56pub use primitive_array::*;
57
58mod string_array;
59pub use string_array::*;
60
61mod struct_array;
62pub use struct_array::*;
63
64mod union_array;
65pub use union_array::*;
66
67mod run_array;
68
69pub use run_array::*;
70
71mod byte_view_array;
72
73pub use byte_view_array::*;
74
75mod list_view_array;
76
77pub use list_view_array::*;
78
79use crate::iterator::ArrayIter;
80
81pub trait Array: std::fmt::Debug + Send + Sync {
83    fn as_any(&self) -> &dyn Any;
106
107    fn to_data(&self) -> ArrayData;
109
110    fn into_data(self) -> ArrayData;
114
115    fn data_type(&self) -> &DataType;
128
129    fn slice(&self, offset: usize, length: usize) -> ArrayRef;
143
144    fn len(&self) -> usize;
156
157    fn is_empty(&self) -> bool;
169
170    fn shrink_to_fit(&mut self) {}
175
176    fn offset(&self) -> usize;
192
193    fn nulls(&self) -> Option<&NullBuffer>;
206
207    fn logical_nulls(&self) -> Option<NullBuffer> {
226        self.nulls().cloned()
227    }
228
229    fn is_null(&self, index: usize) -> bool {
251        self.nulls().map(|n| n.is_null(index)).unwrap_or_default()
252    }
253
254    fn is_valid(&self, index: usize) -> bool {
268        !self.is_null(index)
269    }
270
271    fn null_count(&self) -> usize {
287        self.nulls().map(|n| n.null_count()).unwrap_or_default()
288    }
289
290    fn logical_null_count(&self) -> usize {
307        self.logical_nulls()
308            .map(|n| n.null_count())
309            .unwrap_or_default()
310    }
311
312    fn is_nullable(&self) -> bool {
326        self.logical_null_count() != 0
327    }
328
329    fn get_buffer_memory_size(&self) -> usize;
334
335    fn get_array_memory_size(&self) -> usize;
339}
340
341pub type ArrayRef = Arc<dyn Array>;
343
344impl Array for ArrayRef {
346    fn as_any(&self) -> &dyn Any {
347        self.as_ref().as_any()
348    }
349
350    fn to_data(&self) -> ArrayData {
351        self.as_ref().to_data()
352    }
353
354    fn into_data(self) -> ArrayData {
355        self.to_data()
356    }
357
358    fn data_type(&self) -> &DataType {
359        self.as_ref().data_type()
360    }
361
362    fn slice(&self, offset: usize, length: usize) -> ArrayRef {
363        self.as_ref().slice(offset, length)
364    }
365
366    fn len(&self) -> usize {
367        self.as_ref().len()
368    }
369
370    fn is_empty(&self) -> bool {
371        self.as_ref().is_empty()
372    }
373
374    fn shrink_to_fit(&mut self) {
376        if let Some(slf) = Arc::get_mut(self) {
377            slf.shrink_to_fit();
378        } else {
379            }
381    }
382
383    fn offset(&self) -> usize {
384        self.as_ref().offset()
385    }
386
387    fn nulls(&self) -> Option<&NullBuffer> {
388        self.as_ref().nulls()
389    }
390
391    fn logical_nulls(&self) -> Option<NullBuffer> {
392        self.as_ref().logical_nulls()
393    }
394
395    fn is_null(&self, index: usize) -> bool {
396        self.as_ref().is_null(index)
397    }
398
399    fn is_valid(&self, index: usize) -> bool {
400        self.as_ref().is_valid(index)
401    }
402
403    fn null_count(&self) -> usize {
404        self.as_ref().null_count()
405    }
406
407    fn logical_null_count(&self) -> usize {
408        self.as_ref().logical_null_count()
409    }
410
411    fn is_nullable(&self) -> bool {
412        self.as_ref().is_nullable()
413    }
414
415    fn get_buffer_memory_size(&self) -> usize {
416        self.as_ref().get_buffer_memory_size()
417    }
418
419    fn get_array_memory_size(&self) -> usize {
420        self.as_ref().get_array_memory_size()
421    }
422}
423
424impl<T: Array> Array for &T {
425    fn as_any(&self) -> &dyn Any {
426        T::as_any(self)
427    }
428
429    fn to_data(&self) -> ArrayData {
430        T::to_data(self)
431    }
432
433    fn into_data(self) -> ArrayData {
434        self.to_data()
435    }
436
437    fn data_type(&self) -> &DataType {
438        T::data_type(self)
439    }
440
441    fn slice(&self, offset: usize, length: usize) -> ArrayRef {
442        T::slice(self, offset, length)
443    }
444
445    fn len(&self) -> usize {
446        T::len(self)
447    }
448
449    fn is_empty(&self) -> bool {
450        T::is_empty(self)
451    }
452
453    fn offset(&self) -> usize {
454        T::offset(self)
455    }
456
457    fn nulls(&self) -> Option<&NullBuffer> {
458        T::nulls(self)
459    }
460
461    fn logical_nulls(&self) -> Option<NullBuffer> {
462        T::logical_nulls(self)
463    }
464
465    fn is_null(&self, index: usize) -> bool {
466        T::is_null(self, index)
467    }
468
469    fn is_valid(&self, index: usize) -> bool {
470        T::is_valid(self, index)
471    }
472
473    fn null_count(&self) -> usize {
474        T::null_count(self)
475    }
476
477    fn logical_null_count(&self) -> usize {
478        T::logical_null_count(self)
479    }
480
481    fn is_nullable(&self) -> bool {
482        T::is_nullable(self)
483    }
484
485    fn get_buffer_memory_size(&self) -> usize {
486        T::get_buffer_memory_size(self)
487    }
488
489    fn get_array_memory_size(&self) -> usize {
490        T::get_array_memory_size(self)
491    }
492}
493
494pub trait ArrayAccessor: Array {
575    type Item: Send + Sync;
577
578    fn value(&self, index: usize) -> Self::Item;
582
583    unsafe fn value_unchecked(&self, index: usize) -> Self::Item;
587}
588
589pub trait StringArrayType<'a>: ArrayAccessor<Item = &'a str> + Sized {
597    fn is_ascii(&self) -> bool;
599
600    fn iter(&self) -> ArrayIter<Self>;
602}
603
604impl<'a, O: OffsetSizeTrait> StringArrayType<'a> for &'a GenericStringArray<O> {
605    fn is_ascii(&self) -> bool {
606        GenericStringArray::<O>::is_ascii(self)
607    }
608
609    fn iter(&self) -> ArrayIter<Self> {
610        GenericStringArray::<O>::iter(self)
611    }
612}
613impl<'a> StringArrayType<'a> for &'a StringViewArray {
614    fn is_ascii(&self) -> bool {
615        StringViewArray::is_ascii(self)
616    }
617
618    fn iter(&self) -> ArrayIter<Self> {
619        StringViewArray::iter(self)
620    }
621}
622
623pub trait BinaryArrayType<'a>: ArrayAccessor<Item = &'a [u8]> + Sized {
631    fn iter(&self) -> ArrayIter<Self>;
633}
634
635impl<'a, O: OffsetSizeTrait> BinaryArrayType<'a> for &'a GenericBinaryArray<O> {
636    fn iter(&self) -> ArrayIter<Self> {
637        GenericBinaryArray::<O>::iter(self)
638    }
639}
640impl<'a> BinaryArrayType<'a> for &'a BinaryViewArray {
641    fn iter(&self) -> ArrayIter<Self> {
642        BinaryViewArray::iter(self)
643    }
644}
645
646impl PartialEq for dyn Array + '_ {
647    fn eq(&self, other: &Self) -> bool {
648        self.to_data().eq(&other.to_data())
649    }
650}
651
652impl<T: Array> PartialEq<T> for dyn Array + '_ {
653    fn eq(&self, other: &T) -> bool {
654        self.to_data().eq(&other.to_data())
655    }
656}
657
658impl PartialEq for NullArray {
659    fn eq(&self, other: &NullArray) -> bool {
660        self.to_data().eq(&other.to_data())
661    }
662}
663
664impl<T: ArrowPrimitiveType> PartialEq for PrimitiveArray<T> {
665    fn eq(&self, other: &PrimitiveArray<T>) -> bool {
666        self.to_data().eq(&other.to_data())
667    }
668}
669
670impl<K: ArrowDictionaryKeyType> PartialEq for DictionaryArray<K> {
671    fn eq(&self, other: &Self) -> bool {
672        self.to_data().eq(&other.to_data())
673    }
674}
675
676impl PartialEq for BooleanArray {
677    fn eq(&self, other: &BooleanArray) -> bool {
678        self.to_data().eq(&other.to_data())
679    }
680}
681
682impl<OffsetSize: OffsetSizeTrait> PartialEq for GenericStringArray<OffsetSize> {
683    fn eq(&self, other: &Self) -> bool {
684        self.to_data().eq(&other.to_data())
685    }
686}
687
688impl<OffsetSize: OffsetSizeTrait> PartialEq for GenericBinaryArray<OffsetSize> {
689    fn eq(&self, other: &Self) -> bool {
690        self.to_data().eq(&other.to_data())
691    }
692}
693
694impl PartialEq for FixedSizeBinaryArray {
695    fn eq(&self, other: &Self) -> bool {
696        self.to_data().eq(&other.to_data())
697    }
698}
699
700impl<OffsetSize: OffsetSizeTrait> PartialEq for GenericListArray<OffsetSize> {
701    fn eq(&self, other: &Self) -> bool {
702        self.to_data().eq(&other.to_data())
703    }
704}
705
706impl<OffsetSize: OffsetSizeTrait> PartialEq for GenericListViewArray<OffsetSize> {
707    fn eq(&self, other: &Self) -> bool {
708        self.to_data().eq(&other.to_data())
709    }
710}
711
712impl PartialEq for MapArray {
713    fn eq(&self, other: &Self) -> bool {
714        self.to_data().eq(&other.to_data())
715    }
716}
717
718impl PartialEq for FixedSizeListArray {
719    fn eq(&self, other: &Self) -> bool {
720        self.to_data().eq(&other.to_data())
721    }
722}
723
724impl PartialEq for StructArray {
725    fn eq(&self, other: &Self) -> bool {
726        self.to_data().eq(&other.to_data())
727    }
728}
729
730impl<T: ByteViewType + ?Sized> PartialEq for GenericByteViewArray<T> {
731    fn eq(&self, other: &Self) -> bool {
732        self.to_data().eq(&other.to_data())
733    }
734}
735
736impl<R: RunEndIndexType> PartialEq for RunArray<R> {
737    fn eq(&self, other: &Self) -> bool {
738        self.to_data().eq(&other.to_data())
739    }
740}
741
742pub fn make_array(data: ArrayData) -> ArrayRef {
745    match data.data_type() {
746        DataType::Boolean => Arc::new(BooleanArray::from(data)) as ArrayRef,
747        DataType::Int8 => Arc::new(Int8Array::from(data)) as ArrayRef,
748        DataType::Int16 => Arc::new(Int16Array::from(data)) as ArrayRef,
749        DataType::Int32 => Arc::new(Int32Array::from(data)) as ArrayRef,
750        DataType::Int64 => Arc::new(Int64Array::from(data)) as ArrayRef,
751        DataType::UInt8 => Arc::new(UInt8Array::from(data)) as ArrayRef,
752        DataType::UInt16 => Arc::new(UInt16Array::from(data)) as ArrayRef,
753        DataType::UInt32 => Arc::new(UInt32Array::from(data)) as ArrayRef,
754        DataType::UInt64 => Arc::new(UInt64Array::from(data)) as ArrayRef,
755        DataType::Float16 => Arc::new(Float16Array::from(data)) as ArrayRef,
756        DataType::Float32 => Arc::new(Float32Array::from(data)) as ArrayRef,
757        DataType::Float64 => Arc::new(Float64Array::from(data)) as ArrayRef,
758        DataType::Date32 => Arc::new(Date32Array::from(data)) as ArrayRef,
759        DataType::Date64 => Arc::new(Date64Array::from(data)) as ArrayRef,
760        DataType::Time32(TimeUnit::Second) => Arc::new(Time32SecondArray::from(data)) as ArrayRef,
761        DataType::Time32(TimeUnit::Millisecond) => {
762            Arc::new(Time32MillisecondArray::from(data)) as ArrayRef
763        }
764        DataType::Time64(TimeUnit::Microsecond) => {
765            Arc::new(Time64MicrosecondArray::from(data)) as ArrayRef
766        }
767        DataType::Time64(TimeUnit::Nanosecond) => {
768            Arc::new(Time64NanosecondArray::from(data)) as ArrayRef
769        }
770        DataType::Timestamp(TimeUnit::Second, _) => {
771            Arc::new(TimestampSecondArray::from(data)) as ArrayRef
772        }
773        DataType::Timestamp(TimeUnit::Millisecond, _) => {
774            Arc::new(TimestampMillisecondArray::from(data)) as ArrayRef
775        }
776        DataType::Timestamp(TimeUnit::Microsecond, _) => {
777            Arc::new(TimestampMicrosecondArray::from(data)) as ArrayRef
778        }
779        DataType::Timestamp(TimeUnit::Nanosecond, _) => {
780            Arc::new(TimestampNanosecondArray::from(data)) as ArrayRef
781        }
782        DataType::Interval(IntervalUnit::YearMonth) => {
783            Arc::new(IntervalYearMonthArray::from(data)) as ArrayRef
784        }
785        DataType::Interval(IntervalUnit::DayTime) => {
786            Arc::new(IntervalDayTimeArray::from(data)) as ArrayRef
787        }
788        DataType::Interval(IntervalUnit::MonthDayNano) => {
789            Arc::new(IntervalMonthDayNanoArray::from(data)) as ArrayRef
790        }
791        DataType::Duration(TimeUnit::Second) => {
792            Arc::new(DurationSecondArray::from(data)) as ArrayRef
793        }
794        DataType::Duration(TimeUnit::Millisecond) => {
795            Arc::new(DurationMillisecondArray::from(data)) as ArrayRef
796        }
797        DataType::Duration(TimeUnit::Microsecond) => {
798            Arc::new(DurationMicrosecondArray::from(data)) as ArrayRef
799        }
800        DataType::Duration(TimeUnit::Nanosecond) => {
801            Arc::new(DurationNanosecondArray::from(data)) as ArrayRef
802        }
803        DataType::Binary => Arc::new(BinaryArray::from(data)) as ArrayRef,
804        DataType::LargeBinary => Arc::new(LargeBinaryArray::from(data)) as ArrayRef,
805        DataType::FixedSizeBinary(_) => Arc::new(FixedSizeBinaryArray::from(data)) as ArrayRef,
806        DataType::BinaryView => Arc::new(BinaryViewArray::from(data)) as ArrayRef,
807        DataType::Utf8 => Arc::new(StringArray::from(data)) as ArrayRef,
808        DataType::LargeUtf8 => Arc::new(LargeStringArray::from(data)) as ArrayRef,
809        DataType::Utf8View => Arc::new(StringViewArray::from(data)) as ArrayRef,
810        DataType::List(_) => Arc::new(ListArray::from(data)) as ArrayRef,
811        DataType::LargeList(_) => Arc::new(LargeListArray::from(data)) as ArrayRef,
812        DataType::ListView(_) => Arc::new(ListViewArray::from(data)) as ArrayRef,
813        DataType::LargeListView(_) => Arc::new(LargeListViewArray::from(data)) as ArrayRef,
814        DataType::Struct(_) => Arc::new(StructArray::from(data)) as ArrayRef,
815        DataType::Map(_, _) => Arc::new(MapArray::from(data)) as ArrayRef,
816        DataType::Union(_, _) => Arc::new(UnionArray::from(data)) as ArrayRef,
817        DataType::FixedSizeList(_, _) => Arc::new(FixedSizeListArray::from(data)) as ArrayRef,
818        DataType::Dictionary(key_type, _) => match key_type.as_ref() {
819            DataType::Int8 => Arc::new(DictionaryArray::<Int8Type>::from(data)) as ArrayRef,
820            DataType::Int16 => Arc::new(DictionaryArray::<Int16Type>::from(data)) as ArrayRef,
821            DataType::Int32 => Arc::new(DictionaryArray::<Int32Type>::from(data)) as ArrayRef,
822            DataType::Int64 => Arc::new(DictionaryArray::<Int64Type>::from(data)) as ArrayRef,
823            DataType::UInt8 => Arc::new(DictionaryArray::<UInt8Type>::from(data)) as ArrayRef,
824            DataType::UInt16 => Arc::new(DictionaryArray::<UInt16Type>::from(data)) as ArrayRef,
825            DataType::UInt32 => Arc::new(DictionaryArray::<UInt32Type>::from(data)) as ArrayRef,
826            DataType::UInt64 => Arc::new(DictionaryArray::<UInt64Type>::from(data)) as ArrayRef,
827            dt => panic!("Unexpected dictionary key type {dt}"),
828        },
829        DataType::RunEndEncoded(run_ends_type, _) => match run_ends_type.data_type() {
830            DataType::Int16 => Arc::new(RunArray::<Int16Type>::from(data)) as ArrayRef,
831            DataType::Int32 => Arc::new(RunArray::<Int32Type>::from(data)) as ArrayRef,
832            DataType::Int64 => Arc::new(RunArray::<Int64Type>::from(data)) as ArrayRef,
833            dt => panic!("Unexpected data type for run_ends array {dt}"),
834        },
835        DataType::Null => Arc::new(NullArray::from(data)) as ArrayRef,
836        DataType::Decimal32(_, _) => Arc::new(Decimal32Array::from(data)) as ArrayRef,
837        DataType::Decimal64(_, _) => Arc::new(Decimal64Array::from(data)) as ArrayRef,
838        DataType::Decimal128(_, _) => Arc::new(Decimal128Array::from(data)) as ArrayRef,
839        DataType::Decimal256(_, _) => Arc::new(Decimal256Array::from(data)) as ArrayRef,
840        dt => panic!("Unexpected data type {dt}"),
841    }
842}
843
844pub fn new_empty_array(data_type: &DataType) -> ArrayRef {
857    let data = ArrayData::new_empty(data_type);
858    make_array(data)
859}
860
861pub fn new_null_array(data_type: &DataType, length: usize) -> ArrayRef {
875    make_array(ArrayData::new_null(data_type, length))
876}
877
878unsafe fn get_offsets<O: ArrowNativeType>(data: &ArrayData) -> OffsetBuffer<O> {
884    match data.is_empty() && data.buffers()[0].is_empty() {
885        true => OffsetBuffer::new_empty(),
886        false => {
887            let buffer =
888                ScalarBuffer::new(data.buffers()[0].clone(), data.offset(), data.len() + 1);
889            unsafe { OffsetBuffer::new_unchecked(buffer) }
892        }
893    }
894}
895
896fn print_long_array<A, F>(array: &A, f: &mut std::fmt::Formatter, print_item: F) -> std::fmt::Result
898where
899    A: Array,
900    F: Fn(&A, usize, &mut std::fmt::Formatter) -> std::fmt::Result,
901{
902    let head = std::cmp::min(10, array.len());
903
904    for i in 0..head {
905        if array.is_null(i) {
906            writeln!(f, "  null,")?;
907        } else {
908            write!(f, "  ")?;
909            print_item(array, i, f)?;
910            writeln!(f, ",")?;
911        }
912    }
913    if array.len() > 10 {
914        if array.len() > 20 {
915            writeln!(f, "  ...{} elements...,", array.len() - 20)?;
916        }
917
918        let tail = std::cmp::max(head, array.len() - 10);
919
920        for i in tail..array.len() {
921            if array.is_null(i) {
922                writeln!(f, "  null,")?;
923            } else {
924                write!(f, "  ")?;
925                print_item(array, i, f)?;
926                writeln!(f, ",")?;
927            }
928        }
929    }
930    Ok(())
931}
932
933#[cfg(test)]
934mod tests {
935    use super::*;
936    use crate::cast::{as_union_array, downcast_array};
937    use crate::downcast_run_array;
938    use arrow_buffer::MutableBuffer;
939    use arrow_schema::{Field, Fields, UnionFields, UnionMode};
940
941    #[test]
942    fn test_empty_primitive() {
943        let array = new_empty_array(&DataType::Int32);
944        let a = array.as_any().downcast_ref::<Int32Array>().unwrap();
945        assert_eq!(a.len(), 0);
946        let expected: &[i32] = &[];
947        assert_eq!(a.values(), expected);
948    }
949
950    #[test]
951    fn test_empty_variable_sized() {
952        let array = new_empty_array(&DataType::Utf8);
953        let a = array.as_any().downcast_ref::<StringArray>().unwrap();
954        assert_eq!(a.len(), 0);
955        assert_eq!(a.value_offsets()[0], 0i32);
956    }
957
958    #[test]
959    fn test_empty_list_primitive() {
960        let data_type = DataType::List(Arc::new(Field::new_list_field(DataType::Int32, false)));
961        let array = new_empty_array(&data_type);
962        let a = array.as_any().downcast_ref::<ListArray>().unwrap();
963        assert_eq!(a.len(), 0);
964        assert_eq!(a.value_offsets()[0], 0i32);
965    }
966
967    #[test]
968    fn test_null_boolean() {
969        let array = new_null_array(&DataType::Boolean, 9);
970        let a = array.as_any().downcast_ref::<BooleanArray>().unwrap();
971        assert_eq!(a.len(), 9);
972        for i in 0..9 {
973            assert!(a.is_null(i));
974        }
975    }
976
977    #[test]
978    fn test_null_primitive() {
979        let array = new_null_array(&DataType::Int32, 9);
980        let a = array.as_any().downcast_ref::<Int32Array>().unwrap();
981        assert_eq!(a.len(), 9);
982        for i in 0..9 {
983            assert!(a.is_null(i));
984        }
985    }
986
987    #[test]
988    fn test_null_struct() {
989        let struct_type = DataType::Struct(vec![Field::new("data", DataType::Int64, false)].into());
992        let array = new_null_array(&struct_type, 9);
993
994        let a = array.as_any().downcast_ref::<StructArray>().unwrap();
995        assert_eq!(a.len(), 9);
996        assert_eq!(a.column(0).len(), 9);
997        for i in 0..9 {
998            assert!(a.is_null(i));
999        }
1000
1001        a.slice(0, 5);
1003    }
1004
1005    #[test]
1006    fn test_null_variable_sized() {
1007        let array = new_null_array(&DataType::Utf8, 9);
1008        let a = array.as_any().downcast_ref::<StringArray>().unwrap();
1009        assert_eq!(a.len(), 9);
1010        assert_eq!(a.value_offsets()[9], 0i32);
1011        for i in 0..9 {
1012            assert!(a.is_null(i));
1013        }
1014    }
1015
1016    #[test]
1017    fn test_null_list_primitive() {
1018        let data_type = DataType::List(Arc::new(Field::new_list_field(DataType::Int32, true)));
1019        let array = new_null_array(&data_type, 9);
1020        let a = array.as_any().downcast_ref::<ListArray>().unwrap();
1021        assert_eq!(a.len(), 9);
1022        assert_eq!(a.value_offsets()[9], 0i32);
1023        for i in 0..9 {
1024            assert!(a.is_null(i));
1025        }
1026    }
1027
1028    #[test]
1029    fn test_null_map() {
1030        let data_type = DataType::Map(
1031            Arc::new(Field::new(
1032                "entry",
1033                DataType::Struct(Fields::from(vec![
1034                    Field::new("key", DataType::Utf8, false),
1035                    Field::new("value", DataType::Int32, true),
1036                ])),
1037                false,
1038            )),
1039            false,
1040        );
1041        let array = new_null_array(&data_type, 9);
1042        let a = array.as_any().downcast_ref::<MapArray>().unwrap();
1043        assert_eq!(a.len(), 9);
1044        assert_eq!(a.value_offsets()[9], 0i32);
1045        for i in 0..9 {
1046            assert!(a.is_null(i));
1047        }
1048    }
1049
1050    #[test]
1051    fn test_null_dictionary() {
1052        let values =
1053            vec![None, None, None, None, None, None, None, None, None] as Vec<Option<&str>>;
1054
1055        let array: DictionaryArray<Int8Type> = values.into_iter().collect();
1056        let array = Arc::new(array) as ArrayRef;
1057
1058        let null_array = new_null_array(array.data_type(), 9);
1059        assert_eq!(&array, &null_array);
1060        assert_eq!(
1061            array.to_data().buffers()[0].len(),
1062            null_array.to_data().buffers()[0].len()
1063        );
1064    }
1065
1066    #[test]
1067    fn test_null_union() {
1068        for mode in [UnionMode::Sparse, UnionMode::Dense] {
1069            let data_type = DataType::Union(
1070                UnionFields::new(
1071                    vec![2, 1],
1072                    vec![
1073                        Field::new("foo", DataType::Int32, true),
1074                        Field::new("bar", DataType::Int64, true),
1075                    ],
1076                ),
1077                mode,
1078            );
1079            let array = new_null_array(&data_type, 4);
1080
1081            let array = as_union_array(array.as_ref());
1082            assert_eq!(array.len(), 4);
1083            assert_eq!(array.null_count(), 0);
1084            assert_eq!(array.logical_null_count(), 4);
1085
1086            for i in 0..4 {
1087                let a = array.value(i);
1088                assert_eq!(a.len(), 1);
1089                assert_eq!(a.null_count(), 1);
1090                assert_eq!(a.logical_null_count(), 1);
1091                assert!(a.is_null(0))
1092            }
1093
1094            array.to_data().validate_full().unwrap();
1095        }
1096    }
1097
1098    #[test]
1099    #[allow(unused_parens)]
1100    fn test_null_runs() {
1101        for r in [DataType::Int16, DataType::Int32, DataType::Int64] {
1102            let data_type = DataType::RunEndEncoded(
1103                Arc::new(Field::new("run_ends", r, false)),
1104                Arc::new(Field::new("values", DataType::Utf8, true)),
1105            );
1106
1107            let array = new_null_array(&data_type, 4);
1108            let array = array.as_ref();
1109
1110            downcast_run_array! {
1111                array => {
1112                    assert_eq!(array.len(), 4);
1113                    assert_eq!(array.null_count(), 0);
1114                    assert_eq!(array.logical_null_count(), 4);
1115                    assert_eq!(array.values().len(), 1);
1116                    assert_eq!(array.values().null_count(), 1);
1117                    assert_eq!(array.run_ends().len(), 4);
1118                    assert_eq!(array.run_ends().values(), &[4]);
1119
1120                    let idx = array.get_physical_indices(&[0, 1, 2, 3]).unwrap();
1121                    assert_eq!(idx, &[0,0,0,0]);
1122                }
1123                d => unreachable!("{d}")
1124            }
1125        }
1126    }
1127
1128    #[test]
1129    fn test_null_fixed_size_binary() {
1130        for size in [1, 2, 7] {
1131            let array = new_null_array(&DataType::FixedSizeBinary(size), 6);
1132            let array = array
1133                .as_ref()
1134                .as_any()
1135                .downcast_ref::<FixedSizeBinaryArray>()
1136                .unwrap();
1137
1138            assert_eq!(array.len(), 6);
1139            assert_eq!(array.null_count(), 6);
1140            assert_eq!(array.logical_null_count(), 6);
1141            array.iter().for_each(|x| assert!(x.is_none()));
1142        }
1143    }
1144
1145    #[test]
1146    fn test_memory_size_null() {
1147        let null_arr = NullArray::new(32);
1148
1149        assert_eq!(0, null_arr.get_buffer_memory_size());
1150        assert_eq!(
1151            std::mem::size_of::<usize>(),
1152            null_arr.get_array_memory_size()
1153        );
1154    }
1155
1156    #[test]
1157    fn test_memory_size_primitive() {
1158        let arr = PrimitiveArray::<Int64Type>::from_iter_values(0..128);
1159        let empty = PrimitiveArray::<Int64Type>::from(ArrayData::new_empty(arr.data_type()));
1160
1161        assert_eq!(
1163            arr.get_array_memory_size() - empty.get_array_memory_size(),
1164            128 * std::mem::size_of::<i64>()
1165        );
1166    }
1167
1168    #[test]
1169    fn test_memory_size_primitive_sliced() {
1170        let arr = PrimitiveArray::<Int64Type>::from_iter_values(0..128);
1171        let slice1 = arr.slice(0, 64);
1172        let slice2 = arr.slice(64, 64);
1173
1174        assert_eq!(slice1.get_array_memory_size(), arr.get_array_memory_size());
1176        assert_eq!(slice2.get_array_memory_size(), arr.get_array_memory_size());
1177    }
1178
1179    #[test]
1180    fn test_memory_size_primitive_nullable() {
1181        let arr: PrimitiveArray<Int64Type> = (0..128)
1182            .map(|i| if i % 20 == 0 { Some(i) } else { None })
1183            .collect();
1184        let empty_with_bitmap = PrimitiveArray::<Int64Type>::from(
1185            ArrayData::builder(arr.data_type().clone())
1186                .add_buffer(MutableBuffer::new(0).into())
1187                .null_bit_buffer(Some(MutableBuffer::new_null(0).into()))
1188                .build()
1189                .unwrap(),
1190        );
1191
1192        assert_eq!(
1196            std::mem::size_of::<PrimitiveArray<Int64Type>>(),
1197            empty_with_bitmap.get_array_memory_size()
1198        );
1199
1200        assert_eq!(
1203            arr.get_array_memory_size() - empty_with_bitmap.get_array_memory_size(),
1204            128 * std::mem::size_of::<i64>() + 64
1205        );
1206    }
1207
1208    #[test]
1209    fn test_memory_size_dictionary() {
1210        let values = PrimitiveArray::<Int64Type>::from_iter_values(0..16);
1211        let keys = PrimitiveArray::<Int16Type>::from_iter_values(
1212            (0..256).map(|i| (i % values.len()) as i16),
1213        );
1214
1215        let dict_data_type = DataType::Dictionary(
1216            Box::new(keys.data_type().clone()),
1217            Box::new(values.data_type().clone()),
1218        );
1219        let dict_data = keys
1220            .into_data()
1221            .into_builder()
1222            .data_type(dict_data_type)
1223            .child_data(vec![values.into_data()])
1224            .build()
1225            .unwrap();
1226
1227        let empty_data = ArrayData::new_empty(&DataType::Dictionary(
1228            Box::new(DataType::Int16),
1229            Box::new(DataType::Int64),
1230        ));
1231
1232        let arr = DictionaryArray::<Int16Type>::from(dict_data);
1233        let empty = DictionaryArray::<Int16Type>::from(empty_data);
1234
1235        let expected_keys_size = 256 * std::mem::size_of::<i16>();
1236        assert_eq!(
1237            arr.keys().get_array_memory_size() - empty.keys().get_array_memory_size(),
1238            expected_keys_size
1239        );
1240
1241        let expected_values_size = 16 * std::mem::size_of::<i64>();
1242        assert_eq!(
1243            arr.values().get_array_memory_size() - empty.values().get_array_memory_size(),
1244            expected_values_size
1245        );
1246
1247        let expected_size = expected_keys_size + expected_values_size;
1248        assert_eq!(
1249            arr.get_array_memory_size() - empty.get_array_memory_size(),
1250            expected_size
1251        );
1252    }
1253
1254    fn compute_my_thing(arr: &dyn Array) -> bool {
1256        !arr.is_empty()
1257    }
1258
1259    #[test]
1260    fn test_array_ref_as_array() {
1261        let arr: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
1262
1263        assert!(compute_my_thing(&arr));
1265
1266        let arr: ArrayRef = Arc::new(arr);
1268        assert!(compute_my_thing(&arr));
1269        assert!(compute_my_thing(arr.as_ref()));
1270    }
1271
1272    #[test]
1273    fn test_downcast_array() {
1274        let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
1275
1276        let boxed: ArrayRef = Arc::new(array);
1277        let array: Int32Array = downcast_array(&boxed);
1278
1279        let expected: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
1280        assert_eq!(array, expected);
1281    }
1282}