1use crate::array::print_long_array;
19use crate::builder::{BooleanBufferBuilder, BufferBuilder, PrimitiveBuilder};
20use crate::iterator::PrimitiveIter;
21use crate::temporal_conversions::{
22 as_date, as_datetime, as_datetime_with_timezone, as_duration, as_time,
23};
24use crate::timezone::Tz;
25use crate::trusted_len::trusted_len_unzip;
26use crate::types::*;
27use crate::{Array, ArrayAccessor, ArrayRef, Scalar};
28use arrow_buffer::{i256, ArrowNativeType, Buffer, NullBuffer, ScalarBuffer};
29use arrow_data::bit_iterator::try_for_each_valid_idx;
30use arrow_data::{ArrayData, ArrayDataBuilder};
31use arrow_schema::{ArrowError, DataType};
32use chrono::{DateTime, Duration, NaiveDate, NaiveDateTime, NaiveTime};
33use half::f16;
34use std::any::Any;
35use std::sync::Arc;
36
37pub type Int8Array = PrimitiveArray<Int8Type>;
55
56pub type Int16Array = PrimitiveArray<Int16Type>;
74
75pub type Int32Array = PrimitiveArray<Int32Type>;
93
94pub type Int64Array = PrimitiveArray<Int64Type>;
112
113pub type UInt8Array = PrimitiveArray<UInt8Type>;
131
132pub type UInt16Array = PrimitiveArray<UInt16Type>;
150
151pub type UInt32Array = PrimitiveArray<UInt32Type>;
169
170pub type UInt64Array = PrimitiveArray<UInt64Type>;
188
189pub type Float16Array = PrimitiveArray<Float16Type>;
215
216pub type Float32Array = PrimitiveArray<Float32Type>;
234
235pub type Float64Array = PrimitiveArray<Float64Type>;
253
254pub type TimestampSecondArray = PrimitiveArray<TimestampSecondType>;
302
303pub type TimestampMillisecondArray = PrimitiveArray<TimestampMillisecondType>;
307
308pub type TimestampMicrosecondArray = PrimitiveArray<TimestampMicrosecondType>;
312
313pub type TimestampNanosecondArray = PrimitiveArray<TimestampNanosecondType>;
317
318pub type Date32Array = PrimitiveArray<Date32Type>;
323
324pub type Date64Array = PrimitiveArray<Date64Type>;
329
330pub type Time32SecondArray = PrimitiveArray<Time32SecondType>;
335
336pub type Time32MillisecondArray = PrimitiveArray<Time32MillisecondType>;
341
342pub type Time64MicrosecondArray = PrimitiveArray<Time64MicrosecondType>;
347
348pub type Time64NanosecondArray = PrimitiveArray<Time64NanosecondType>;
353
354pub type IntervalYearMonthArray = PrimitiveArray<IntervalYearMonthType>;
368
369pub type IntervalDayTimeArray = PrimitiveArray<IntervalDayTimeType>;
384
385pub type IntervalMonthDayNanoArray = PrimitiveArray<IntervalMonthDayNanoType>;
400
401pub type DurationSecondArray = PrimitiveArray<DurationSecondType>;
403
404pub type DurationMillisecondArray = PrimitiveArray<DurationMillisecondType>;
406
407pub type DurationMicrosecondArray = PrimitiveArray<DurationMicrosecondType>;
409
410pub type DurationNanosecondArray = PrimitiveArray<DurationNanosecondType>;
412
413pub type Decimal128Array = PrimitiveArray<Decimal128Type>;
431
432pub type Decimal256Array = PrimitiveArray<Decimal256Type>;
451
452pub use crate::types::ArrowPrimitiveType;
453
454pub struct PrimitiveArray<T: ArrowPrimitiveType> {
529 data_type: DataType,
530 values: ScalarBuffer<T::Native>,
532 nulls: Option<NullBuffer>,
533}
534
535impl<T: ArrowPrimitiveType> Clone for PrimitiveArray<T> {
536 fn clone(&self) -> Self {
537 Self {
538 data_type: self.data_type.clone(),
539 values: self.values.clone(),
540 nulls: self.nulls.clone(),
541 }
542 }
543}
544
545impl<T: ArrowPrimitiveType> PrimitiveArray<T> {
546 pub fn new(values: ScalarBuffer<T::Native>, nulls: Option<NullBuffer>) -> Self {
568 Self::try_new(values, nulls).unwrap()
569 }
570
571 pub fn new_null(length: usize) -> Self {
573 Self {
574 data_type: T::DATA_TYPE,
575 values: vec![T::Native::usize_as(0); length].into(),
576 nulls: Some(NullBuffer::new_null(length)),
577 }
578 }
579
580 pub fn try_new(
587 values: ScalarBuffer<T::Native>,
588 nulls: Option<NullBuffer>,
589 ) -> Result<Self, ArrowError> {
590 if let Some(n) = nulls.as_ref() {
591 if n.len() != values.len() {
592 return Err(ArrowError::InvalidArgumentError(format!(
593 "Incorrect length of null buffer for PrimitiveArray, expected {} got {}",
594 values.len(),
595 n.len(),
596 )));
597 }
598 }
599
600 Ok(Self {
601 data_type: T::DATA_TYPE,
602 values,
603 nulls,
604 })
605 }
606
607 pub fn new_scalar(value: T::Native) -> Scalar<Self> {
609 Scalar::new(Self {
610 data_type: T::DATA_TYPE,
611 values: vec![value].into(),
612 nulls: None,
613 })
614 }
615
616 pub fn into_parts(self) -> (DataType, ScalarBuffer<T::Native>, Option<NullBuffer>) {
618 (self.data_type, self.values, self.nulls)
619 }
620
621 pub fn with_data_type(self, data_type: DataType) -> Self {
630 Self::assert_compatible(&data_type);
631 Self { data_type, ..self }
632 }
633
634 fn assert_compatible(data_type: &DataType) {
636 assert!(
637 Self::is_compatible(data_type),
638 "PrimitiveArray expected data type {} got {}",
639 T::DATA_TYPE,
640 data_type
641 );
642 }
643
644 #[inline]
646 pub fn len(&self) -> usize {
647 self.values.len()
648 }
649
650 pub fn is_empty(&self) -> bool {
652 self.values.is_empty()
653 }
654
655 #[inline]
657 pub fn values(&self) -> &ScalarBuffer<T::Native> {
658 &self.values
659 }
660
661 pub fn builder(capacity: usize) -> PrimitiveBuilder<T> {
663 PrimitiveBuilder::<T>::with_capacity(capacity)
664 }
665
666 pub fn is_compatible(data_type: &DataType) -> bool {
671 match T::DATA_TYPE {
672 DataType::Timestamp(t1, _) => {
673 matches!(data_type, DataType::Timestamp(t2, _) if &t1 == t2)
674 }
675 DataType::Decimal128(_, _) => matches!(data_type, DataType::Decimal128(_, _)),
676 DataType::Decimal256(_, _) => matches!(data_type, DataType::Decimal256(_, _)),
677 _ => T::DATA_TYPE.eq(data_type),
678 }
679 }
680
681 #[inline]
687 pub unsafe fn value_unchecked(&self, i: usize) -> T::Native {
688 *self.values.get_unchecked(i)
689 }
690
691 #[inline]
695 pub fn value(&self, i: usize) -> T::Native {
696 assert!(
697 i < self.len(),
698 "Trying to access an element at index {} from a PrimitiveArray of length {}",
699 i,
700 self.len()
701 );
702 unsafe { self.value_unchecked(i) }
703 }
704
705 pub fn from_iter_values<I: IntoIterator<Item = T::Native>>(iter: I) -> Self {
707 let val_buf: Buffer = iter.into_iter().collect();
708 let len = val_buf.len() / std::mem::size_of::<T::Native>();
709 Self {
710 data_type: T::DATA_TYPE,
711 values: ScalarBuffer::new(val_buf, 0, len),
712 nulls: None,
713 }
714 }
715
716 pub fn from_iter_values_with_nulls<I: IntoIterator<Item = T::Native>>(
718 iter: I,
719 nulls: Option<NullBuffer>,
720 ) -> Self {
721 let val_buf: Buffer = iter.into_iter().collect();
722 let len = val_buf.len() / std::mem::size_of::<T::Native>();
723 Self {
724 data_type: T::DATA_TYPE,
725 values: ScalarBuffer::new(val_buf, 0, len),
726 nulls,
727 }
728 }
729
730 pub fn from_value(value: T::Native, count: usize) -> Self {
732 unsafe {
733 let val_buf = Buffer::from_trusted_len_iter((0..count).map(|_| value));
734 Self::new(val_buf.into(), None)
735 }
736 }
737
738 pub fn take_iter<'a>(
740 &'a self,
741 indexes: impl Iterator<Item = Option<usize>> + 'a,
742 ) -> impl Iterator<Item = Option<T::Native>> + 'a {
743 indexes.map(|opt_index| opt_index.map(|index| self.value(index)))
744 }
745
746 pub unsafe fn take_iter_unchecked<'a>(
751 &'a self,
752 indexes: impl Iterator<Item = Option<usize>> + 'a,
753 ) -> impl Iterator<Item = Option<T::Native>> + 'a {
754 indexes.map(|opt_index| opt_index.map(|index| self.value_unchecked(index)))
755 }
756
757 pub fn slice(&self, offset: usize, length: usize) -> Self {
759 Self {
760 data_type: self.data_type.clone(),
761 values: self.values.slice(offset, length),
762 nulls: self.nulls.as_ref().map(|n| n.slice(offset, length)),
763 }
764 }
765
766 pub fn reinterpret_cast<K>(&self) -> PrimitiveArray<K>
784 where
785 K: ArrowPrimitiveType<Native = T::Native>,
786 {
787 let d = self.to_data().into_builder().data_type(K::DATA_TYPE);
788
789 PrimitiveArray::from(unsafe { d.build_unchecked() })
792 }
793
794 pub fn unary<F, O>(&self, op: F) -> PrimitiveArray<O>
825 where
826 O: ArrowPrimitiveType,
827 F: Fn(T::Native) -> O::Native,
828 {
829 let nulls = self.nulls().cloned();
830 let values = self.values().iter().map(|v| op(*v));
831 let buffer = unsafe { Buffer::from_trusted_len_iter(values) };
837 PrimitiveArray::new(buffer.into(), nulls)
838 }
839
840 pub fn unary_mut<F>(self, op: F) -> Result<PrimitiveArray<T>, PrimitiveArray<T>>
884 where
885 F: Fn(T::Native) -> T::Native,
886 {
887 let mut builder = self.into_builder()?;
888 builder
889 .values_slice_mut()
890 .iter_mut()
891 .for_each(|v| *v = op(*v));
892 Ok(builder.finish())
893 }
894
895 pub fn try_unary<F, O, E>(&self, op: F) -> Result<PrimitiveArray<O>, E>
904 where
905 O: ArrowPrimitiveType,
906 F: Fn(T::Native) -> Result<O::Native, E>,
907 {
908 let len = self.len();
909
910 let nulls = self.nulls().cloned();
911 let mut buffer = BufferBuilder::<O::Native>::new(len);
912 buffer.append_n_zeroed(len);
913 let slice = buffer.as_slice_mut();
914
915 let f = |idx| {
916 unsafe { *slice.get_unchecked_mut(idx) = op(self.value_unchecked(idx))? };
917 Ok::<_, E>(())
918 };
919
920 match &nulls {
921 Some(nulls) => nulls.try_for_each_valid_idx(f)?,
922 None => (0..len).try_for_each(f)?,
923 }
924
925 let values = buffer.finish().into();
926 Ok(PrimitiveArray::new(values, nulls))
927 }
928
929 pub fn try_unary_mut<F, E>(
947 self,
948 op: F,
949 ) -> Result<Result<PrimitiveArray<T>, E>, PrimitiveArray<T>>
950 where
951 F: Fn(T::Native) -> Result<T::Native, E>,
952 {
953 let len = self.len();
954 let null_count = self.null_count();
955 let mut builder = self.into_builder()?;
956
957 let (slice, null_buffer) = builder.slices_mut();
958
959 let r = try_for_each_valid_idx(len, 0, null_count, null_buffer.as_deref(), |idx| {
960 unsafe { *slice.get_unchecked_mut(idx) = op(*slice.get_unchecked(idx))? };
961 Ok::<_, E>(())
962 });
963
964 if let Err(err) = r {
965 return Ok(Err(err));
966 }
967
968 Ok(Ok(builder.finish()))
969 }
970
971 pub fn unary_opt<F, O>(&self, op: F) -> PrimitiveArray<O>
979 where
980 O: ArrowPrimitiveType,
981 F: Fn(T::Native) -> Option<O::Native>,
982 {
983 let len = self.len();
984 let (nulls, null_count, offset) = match self.nulls() {
985 Some(n) => (Some(n.validity()), n.null_count(), n.offset()),
986 None => (None, 0, 0),
987 };
988
989 let mut null_builder = BooleanBufferBuilder::new(len);
990 match nulls {
991 Some(b) => null_builder.append_packed_range(offset..offset + len, b),
992 None => null_builder.append_n(len, true),
993 }
994
995 let mut buffer = BufferBuilder::<O::Native>::new(len);
996 buffer.append_n_zeroed(len);
997 let slice = buffer.as_slice_mut();
998
999 let mut out_null_count = null_count;
1000
1001 let _ = try_for_each_valid_idx(len, offset, null_count, nulls, |idx| {
1002 match op(unsafe { self.value_unchecked(idx) }) {
1003 Some(v) => unsafe { *slice.get_unchecked_mut(idx) = v },
1004 None => {
1005 out_null_count += 1;
1006 null_builder.set_bit(idx, false);
1007 }
1008 }
1009 Ok::<_, ()>(())
1010 });
1011
1012 let nulls = null_builder.finish();
1013 let values = buffer.finish().into();
1014 let nulls = unsafe { NullBuffer::new_unchecked(nulls, out_null_count) };
1015 PrimitiveArray::new(values, Some(nulls))
1016 }
1017
1018 pub fn from_unary<U: ArrayAccessor, F>(left: U, mut op: F) -> Self
1034 where
1035 F: FnMut(U::Item) -> T::Native,
1036 {
1037 let nulls = left.logical_nulls();
1038 let buffer = unsafe {
1039 let iter = (0..left.len()).map(|i| op(left.value_unchecked(i)));
1041 Buffer::from_trusted_len_iter(iter)
1043 };
1044
1045 PrimitiveArray::new(buffer.into(), nulls)
1046 }
1047
1048 pub fn into_builder(self) -> Result<PrimitiveBuilder<T>, Self> {
1059 let len = self.len();
1060 let data = self.into_data();
1061 let null_bit_buffer = data.nulls().map(|b| b.inner().sliced());
1062
1063 let element_len = std::mem::size_of::<T::Native>();
1064 let buffer =
1065 data.buffers()[0].slice_with_length(data.offset() * element_len, len * element_len);
1066
1067 drop(data);
1068
1069 let try_mutable_null_buffer = match null_bit_buffer {
1070 None => Ok(None),
1071 Some(null_buffer) => {
1072 null_buffer.into_mutable().map(Some)
1074 }
1075 };
1076
1077 let try_mutable_buffers = match try_mutable_null_buffer {
1078 Ok(mutable_null_buffer) => {
1079 let try_mutable_buffer = buffer.into_mutable();
1081
1082 match try_mutable_buffer {
1085 Ok(mutable_buffer) => Ok(PrimitiveBuilder::<T>::new_from_buffer(
1086 mutable_buffer,
1087 mutable_null_buffer,
1088 )),
1089 Err(buffer) => Err((buffer, mutable_null_buffer.map(|b| b.into()))),
1090 }
1091 }
1092 Err(mutable_null_buffer) => {
1093 Err((buffer, Some(mutable_null_buffer)))
1095 }
1096 };
1097
1098 match try_mutable_buffers {
1099 Ok(builder) => Ok(builder),
1100 Err((buffer, null_bit_buffer)) => {
1101 let builder = ArrayData::builder(T::DATA_TYPE)
1102 .len(len)
1103 .add_buffer(buffer)
1104 .null_bit_buffer(null_bit_buffer);
1105
1106 let array_data = unsafe { builder.build_unchecked() };
1107 let array = PrimitiveArray::<T>::from(array_data);
1108
1109 Err(array)
1110 }
1111 }
1112 }
1113}
1114
1115impl<T: ArrowPrimitiveType> From<PrimitiveArray<T>> for ArrayData {
1116 fn from(array: PrimitiveArray<T>) -> Self {
1117 let builder = ArrayDataBuilder::new(array.data_type)
1118 .len(array.values.len())
1119 .nulls(array.nulls)
1120 .buffers(vec![array.values.into_inner()]);
1121
1122 unsafe { builder.build_unchecked() }
1123 }
1124}
1125
1126impl<T: ArrowPrimitiveType> Array for PrimitiveArray<T> {
1127 fn as_any(&self) -> &dyn Any {
1128 self
1129 }
1130
1131 fn to_data(&self) -> ArrayData {
1132 self.clone().into()
1133 }
1134
1135 fn into_data(self) -> ArrayData {
1136 self.into()
1137 }
1138
1139 fn data_type(&self) -> &DataType {
1140 &self.data_type
1141 }
1142
1143 fn slice(&self, offset: usize, length: usize) -> ArrayRef {
1144 Arc::new(self.slice(offset, length))
1145 }
1146
1147 fn len(&self) -> usize {
1148 self.values.len()
1149 }
1150
1151 fn is_empty(&self) -> bool {
1152 self.values.is_empty()
1153 }
1154
1155 fn shrink_to_fit(&mut self) {
1156 self.values.shrink_to_fit();
1157 if let Some(nulls) = &mut self.nulls {
1158 nulls.shrink_to_fit();
1159 }
1160 }
1161
1162 fn offset(&self) -> usize {
1163 0
1164 }
1165
1166 fn nulls(&self) -> Option<&NullBuffer> {
1167 self.nulls.as_ref()
1168 }
1169
1170 fn logical_null_count(&self) -> usize {
1171 self.null_count()
1172 }
1173
1174 fn get_buffer_memory_size(&self) -> usize {
1175 let mut size = self.values.inner().capacity();
1176 if let Some(n) = self.nulls.as_ref() {
1177 size += n.buffer().capacity();
1178 }
1179 size
1180 }
1181
1182 fn get_array_memory_size(&self) -> usize {
1183 std::mem::size_of::<Self>() + self.get_buffer_memory_size()
1184 }
1185}
1186
1187impl<T: ArrowPrimitiveType> ArrayAccessor for &PrimitiveArray<T> {
1188 type Item = T::Native;
1189
1190 fn value(&self, index: usize) -> Self::Item {
1191 PrimitiveArray::value(self, index)
1192 }
1193
1194 #[inline]
1195 unsafe fn value_unchecked(&self, index: usize) -> Self::Item {
1196 PrimitiveArray::value_unchecked(self, index)
1197 }
1198}
1199
1200impl<T: ArrowTemporalType> PrimitiveArray<T>
1201where
1202 i64: From<T::Native>,
1203{
1204 pub fn value_as_datetime(&self, i: usize) -> Option<NaiveDateTime> {
1209 as_datetime::<T>(i64::from(self.value(i)))
1210 }
1211
1212 pub fn value_as_datetime_with_tz(&self, i: usize, tz: Tz) -> Option<DateTime<Tz>> {
1217 as_datetime_with_timezone::<T>(i64::from(self.value(i)), tz)
1218 }
1219
1220 pub fn value_as_date(&self, i: usize) -> Option<NaiveDate> {
1224 self.value_as_datetime(i).map(|datetime| datetime.date())
1225 }
1226
1227 pub fn value_as_time(&self, i: usize) -> Option<NaiveTime> {
1231 as_time::<T>(i64::from(self.value(i)))
1232 }
1233
1234 pub fn value_as_duration(&self, i: usize) -> Option<Duration> {
1238 as_duration::<T>(i64::from(self.value(i)))
1239 }
1240}
1241
1242impl<T: ArrowPrimitiveType> std::fmt::Debug for PrimitiveArray<T> {
1243 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
1244 let data_type = self.data_type();
1245
1246 write!(f, "PrimitiveArray<{data_type:?}>\n[\n")?;
1247 print_long_array(self, f, |array, index, f| match data_type {
1248 DataType::Date32 | DataType::Date64 => {
1249 let v = self.value(index).to_i64().unwrap();
1250 match as_date::<T>(v) {
1251 Some(date) => write!(f, "{date:?}"),
1252 None => {
1253 write!(
1254 f,
1255 "Cast error: Failed to convert {v} to temporal for {data_type:?}"
1256 )
1257 }
1258 }
1259 }
1260 DataType::Time32(_) | DataType::Time64(_) => {
1261 let v = self.value(index).to_i64().unwrap();
1262 match as_time::<T>(v) {
1263 Some(time) => write!(f, "{time:?}"),
1264 None => {
1265 write!(
1266 f,
1267 "Cast error: Failed to convert {v} to temporal for {data_type:?}"
1268 )
1269 }
1270 }
1271 }
1272 DataType::Timestamp(_, tz_string_opt) => {
1273 let v = self.value(index).to_i64().unwrap();
1274 match tz_string_opt {
1275 Some(tz_string) => {
1277 match tz_string.parse::<Tz>() {
1278 Ok(tz) => match as_datetime_with_timezone::<T>(v, tz) {
1280 Some(datetime) => write!(f, "{}", datetime.to_rfc3339()),
1281 None => write!(f, "null"),
1282 },
1283 Err(_) => match as_datetime::<T>(v) {
1285 Some(datetime) => {
1286 write!(f, "{datetime:?} (Unknown Time Zone '{tz_string}')")
1287 }
1288 None => write!(f, "null"),
1289 },
1290 }
1291 }
1292 None => match as_datetime::<T>(v) {
1294 Some(datetime) => write!(f, "{datetime:?}"),
1295 None => write!(f, "null"),
1296 },
1297 }
1298 }
1299 _ => std::fmt::Debug::fmt(&array.value(index), f),
1300 })?;
1301 write!(f, "]")
1302 }
1303}
1304
1305impl<'a, T: ArrowPrimitiveType> IntoIterator for &'a PrimitiveArray<T> {
1306 type Item = Option<<T as ArrowPrimitiveType>::Native>;
1307 type IntoIter = PrimitiveIter<'a, T>;
1308
1309 fn into_iter(self) -> Self::IntoIter {
1310 PrimitiveIter::<'a, T>::new(self)
1311 }
1312}
1313
1314impl<'a, T: ArrowPrimitiveType> PrimitiveArray<T> {
1315 pub fn iter(&'a self) -> PrimitiveIter<'a, T> {
1317 PrimitiveIter::<'a, T>::new(self)
1318 }
1319}
1320
1321#[derive(Debug)]
1328pub struct NativeAdapter<T: ArrowPrimitiveType> {
1329 pub native: Option<T::Native>,
1331}
1332
1333macro_rules! def_from_for_primitive {
1334 ( $ty:ident, $tt:tt) => {
1335 impl From<$tt> for NativeAdapter<$ty> {
1336 fn from(value: $tt) -> Self {
1337 NativeAdapter {
1338 native: Some(value),
1339 }
1340 }
1341 }
1342 };
1343}
1344
1345def_from_for_primitive!(Int8Type, i8);
1346def_from_for_primitive!(Int16Type, i16);
1347def_from_for_primitive!(Int32Type, i32);
1348def_from_for_primitive!(Int64Type, i64);
1349def_from_for_primitive!(UInt8Type, u8);
1350def_from_for_primitive!(UInt16Type, u16);
1351def_from_for_primitive!(UInt32Type, u32);
1352def_from_for_primitive!(UInt64Type, u64);
1353def_from_for_primitive!(Float16Type, f16);
1354def_from_for_primitive!(Float32Type, f32);
1355def_from_for_primitive!(Float64Type, f64);
1356def_from_for_primitive!(Decimal128Type, i128);
1357def_from_for_primitive!(Decimal256Type, i256);
1358
1359impl<T: ArrowPrimitiveType> From<Option<<T as ArrowPrimitiveType>::Native>> for NativeAdapter<T> {
1360 fn from(value: Option<<T as ArrowPrimitiveType>::Native>) -> Self {
1361 NativeAdapter { native: value }
1362 }
1363}
1364
1365impl<T: ArrowPrimitiveType> From<&Option<<T as ArrowPrimitiveType>::Native>> for NativeAdapter<T> {
1366 fn from(value: &Option<<T as ArrowPrimitiveType>::Native>) -> Self {
1367 NativeAdapter { native: *value }
1368 }
1369}
1370
1371impl<T: ArrowPrimitiveType, Ptr: Into<NativeAdapter<T>>> FromIterator<Ptr> for PrimitiveArray<T> {
1372 fn from_iter<I: IntoIterator<Item = Ptr>>(iter: I) -> Self {
1373 let iter = iter.into_iter();
1374 let (lower, _) = iter.size_hint();
1375
1376 let mut null_builder = BooleanBufferBuilder::new(lower);
1377
1378 let buffer: Buffer = iter
1379 .map(|item| {
1380 if let Some(a) = item.into().native {
1381 null_builder.append(true);
1382 a
1383 } else {
1384 null_builder.append(false);
1385 T::Native::default()
1389 }
1390 })
1391 .collect();
1392
1393 let len = null_builder.len();
1394
1395 let data = unsafe {
1396 ArrayData::new_unchecked(
1397 T::DATA_TYPE,
1398 len,
1399 None,
1400 Some(null_builder.into()),
1401 0,
1402 vec![buffer],
1403 vec![],
1404 )
1405 };
1406 PrimitiveArray::from(data)
1407 }
1408}
1409
1410impl<T: ArrowPrimitiveType> PrimitiveArray<T> {
1411 #[inline]
1416 pub unsafe fn from_trusted_len_iter<I, P>(iter: I) -> Self
1417 where
1418 P: std::borrow::Borrow<Option<<T as ArrowPrimitiveType>::Native>>,
1419 I: IntoIterator<Item = P>,
1420 {
1421 let iterator = iter.into_iter();
1422 let (_, upper) = iterator.size_hint();
1423 let len = upper.expect("trusted_len_unzip requires an upper limit");
1424
1425 let (null, buffer) = trusted_len_unzip(iterator);
1426
1427 let data =
1428 ArrayData::new_unchecked(T::DATA_TYPE, len, None, Some(null), 0, vec![buffer], vec![]);
1429 PrimitiveArray::from(data)
1430 }
1431}
1432
1433macro_rules! def_numeric_from_vec {
1437 ( $ty:ident ) => {
1438 impl From<Vec<<$ty as ArrowPrimitiveType>::Native>> for PrimitiveArray<$ty> {
1439 fn from(data: Vec<<$ty as ArrowPrimitiveType>::Native>) -> Self {
1440 let array_data = ArrayData::builder($ty::DATA_TYPE)
1441 .len(data.len())
1442 .add_buffer(Buffer::from_vec(data));
1443 let array_data = unsafe { array_data.build_unchecked() };
1444 PrimitiveArray::from(array_data)
1445 }
1446 }
1447
1448 impl From<Vec<Option<<$ty as ArrowPrimitiveType>::Native>>> for PrimitiveArray<$ty> {
1450 fn from(data: Vec<Option<<$ty as ArrowPrimitiveType>::Native>>) -> Self {
1451 PrimitiveArray::from_iter(data.iter())
1452 }
1453 }
1454 };
1455}
1456
1457def_numeric_from_vec!(Int8Type);
1458def_numeric_from_vec!(Int16Type);
1459def_numeric_from_vec!(Int32Type);
1460def_numeric_from_vec!(Int64Type);
1461def_numeric_from_vec!(UInt8Type);
1462def_numeric_from_vec!(UInt16Type);
1463def_numeric_from_vec!(UInt32Type);
1464def_numeric_from_vec!(UInt64Type);
1465def_numeric_from_vec!(Float16Type);
1466def_numeric_from_vec!(Float32Type);
1467def_numeric_from_vec!(Float64Type);
1468def_numeric_from_vec!(Decimal128Type);
1469def_numeric_from_vec!(Decimal256Type);
1470
1471def_numeric_from_vec!(Date32Type);
1472def_numeric_from_vec!(Date64Type);
1473def_numeric_from_vec!(Time32SecondType);
1474def_numeric_from_vec!(Time32MillisecondType);
1475def_numeric_from_vec!(Time64MicrosecondType);
1476def_numeric_from_vec!(Time64NanosecondType);
1477def_numeric_from_vec!(IntervalYearMonthType);
1478def_numeric_from_vec!(IntervalDayTimeType);
1479def_numeric_from_vec!(IntervalMonthDayNanoType);
1480def_numeric_from_vec!(DurationSecondType);
1481def_numeric_from_vec!(DurationMillisecondType);
1482def_numeric_from_vec!(DurationMicrosecondType);
1483def_numeric_from_vec!(DurationNanosecondType);
1484def_numeric_from_vec!(TimestampSecondType);
1485def_numeric_from_vec!(TimestampMillisecondType);
1486def_numeric_from_vec!(TimestampMicrosecondType);
1487def_numeric_from_vec!(TimestampNanosecondType);
1488
1489impl<T: ArrowTimestampType> PrimitiveArray<T> {
1490 pub fn timezone(&self) -> Option<&str> {
1492 match self.data_type() {
1493 DataType::Timestamp(_, tz) => tz.as_deref(),
1494 _ => unreachable!(),
1495 }
1496 }
1497
1498 pub fn with_timezone(self, timezone: impl Into<Arc<str>>) -> Self {
1500 self.with_timezone_opt(Some(timezone.into()))
1501 }
1502
1503 pub fn with_timezone_utc(self) -> Self {
1505 self.with_timezone("+00:00")
1506 }
1507
1508 pub fn with_timezone_opt<S: Into<Arc<str>>>(self, timezone: Option<S>) -> Self {
1510 Self {
1511 data_type: DataType::Timestamp(T::UNIT, timezone.map(Into::into)),
1512 ..self
1513 }
1514 }
1515}
1516
1517impl<T: ArrowPrimitiveType> From<ArrayData> for PrimitiveArray<T> {
1519 fn from(data: ArrayData) -> Self {
1520 Self::assert_compatible(data.data_type());
1521 assert_eq!(
1522 data.buffers().len(),
1523 1,
1524 "PrimitiveArray data should contain a single buffer only (values buffer)"
1525 );
1526
1527 let values = ScalarBuffer::new(data.buffers()[0].clone(), data.offset(), data.len());
1528 Self {
1529 data_type: data.data_type().clone(),
1530 values,
1531 nulls: data.nulls().cloned(),
1532 }
1533 }
1534}
1535
1536impl<T: DecimalType + ArrowPrimitiveType> PrimitiveArray<T> {
1537 pub fn with_precision_and_scale(self, precision: u8, scale: i8) -> Result<Self, ArrowError> {
1542 validate_decimal_precision_and_scale::<T>(precision, scale)?;
1543 Ok(Self {
1544 data_type: T::TYPE_CONSTRUCTOR(precision, scale),
1545 ..self
1546 })
1547 }
1548
1549 pub fn validate_decimal_precision(&self, precision: u8) -> Result<(), ArrowError> {
1552 (0..self.len()).try_for_each(|idx| {
1553 if self.is_valid(idx) {
1554 let decimal = unsafe { self.value_unchecked(idx) };
1555 T::validate_decimal_precision(decimal, precision)
1556 } else {
1557 Ok(())
1558 }
1559 })
1560 }
1561
1562 pub fn null_if_overflow_precision(&self, precision: u8) -> Self {
1565 self.unary_opt::<_, T>(|v| T::is_valid_decimal_precision(v, precision).then_some(v))
1566 }
1567
1568 pub fn value_as_string(&self, row: usize) -> String {
1570 T::format_decimal(self.value(row), self.precision(), self.scale())
1571 }
1572
1573 pub fn precision(&self) -> u8 {
1575 match T::BYTE_LENGTH {
1576 16 => {
1577 if let DataType::Decimal128(p, _) = self.data_type() {
1578 *p
1579 } else {
1580 unreachable!(
1581 "Decimal128Array datatype is not DataType::Decimal128 but {}",
1582 self.data_type()
1583 )
1584 }
1585 }
1586 32 => {
1587 if let DataType::Decimal256(p, _) = self.data_type() {
1588 *p
1589 } else {
1590 unreachable!(
1591 "Decimal256Array datatype is not DataType::Decimal256 but {}",
1592 self.data_type()
1593 )
1594 }
1595 }
1596 other => unreachable!("Unsupported byte length for decimal array {}", other),
1597 }
1598 }
1599
1600 pub fn scale(&self) -> i8 {
1602 match T::BYTE_LENGTH {
1603 16 => {
1604 if let DataType::Decimal128(_, s) = self.data_type() {
1605 *s
1606 } else {
1607 unreachable!(
1608 "Decimal128Array datatype is not DataType::Decimal128 but {}",
1609 self.data_type()
1610 )
1611 }
1612 }
1613 32 => {
1614 if let DataType::Decimal256(_, s) = self.data_type() {
1615 *s
1616 } else {
1617 unreachable!(
1618 "Decimal256Array datatype is not DataType::Decimal256 but {}",
1619 self.data_type()
1620 )
1621 }
1622 }
1623 other => unreachable!("Unsupported byte length for decimal array {}", other),
1624 }
1625 }
1626}
1627
1628#[cfg(test)]
1629mod tests {
1630 use super::*;
1631 use crate::builder::{Decimal128Builder, Decimal256Builder};
1632 use crate::cast::downcast_array;
1633 use crate::BooleanArray;
1634 use arrow_buffer::{IntervalDayTime, IntervalMonthDayNano};
1635 use arrow_schema::TimeUnit;
1636
1637 #[test]
1638 fn test_primitive_array_from_vec() {
1639 let buf = Buffer::from_slice_ref([0, 1, 2, 3, 4]);
1640 let arr = Int32Array::from(vec![0, 1, 2, 3, 4]);
1641 assert_eq!(&buf, arr.values.inner());
1642 assert_eq!(5, arr.len());
1643 assert_eq!(0, arr.offset());
1644 assert_eq!(0, arr.null_count());
1645 for i in 0..5 {
1646 assert!(!arr.is_null(i));
1647 assert!(arr.is_valid(i));
1648 assert_eq!(i as i32, arr.value(i));
1649 }
1650 }
1651
1652 #[test]
1653 fn test_primitive_array_from_vec_option() {
1654 let arr = Int32Array::from(vec![Some(0), None, Some(2), None, Some(4)]);
1656 assert_eq!(5, arr.len());
1657 assert_eq!(0, arr.offset());
1658 assert_eq!(2, arr.null_count());
1659 for i in 0..5 {
1660 if i % 2 == 0 {
1661 assert!(!arr.is_null(i));
1662 assert!(arr.is_valid(i));
1663 assert_eq!(i as i32, arr.value(i));
1664 } else {
1665 assert!(arr.is_null(i));
1666 assert!(!arr.is_valid(i));
1667 }
1668 }
1669 }
1670
1671 #[test]
1672 fn test_date64_array_from_vec_option() {
1673 let arr: PrimitiveArray<Date64Type> =
1677 vec![Some(1550902545147), None, Some(1550902545147)].into();
1678 assert_eq!(3, arr.len());
1679 assert_eq!(0, arr.offset());
1680 assert_eq!(1, arr.null_count());
1681 for i in 0..3 {
1682 if i % 2 == 0 {
1683 assert!(!arr.is_null(i));
1684 assert!(arr.is_valid(i));
1685 assert_eq!(1550902545147, arr.value(i));
1686 assert_eq!(
1688 1550902545147,
1689 arr.value_as_datetime(i)
1690 .unwrap()
1691 .and_utc()
1692 .timestamp_millis()
1693 );
1694 } else {
1695 assert!(arr.is_null(i));
1696 assert!(!arr.is_valid(i));
1697 }
1698 }
1699 }
1700
1701 #[test]
1702 fn test_time32_millisecond_array_from_vec() {
1703 let arr: PrimitiveArray<Time32MillisecondType> = vec![1, 37_800_005, 86_399_210].into();
1707 assert_eq!(3, arr.len());
1708 assert_eq!(0, arr.offset());
1709 assert_eq!(0, arr.null_count());
1710 let formatted = ["00:00:00.001", "10:30:00.005", "23:59:59.210"];
1711 for (i, formatted) in formatted.iter().enumerate().take(3) {
1712 assert_eq!(None, arr.value_as_datetime(i));
1714 assert_eq!(None, arr.value_as_date(i));
1715 let time = arr.value_as_time(i).unwrap();
1716 assert_eq!(*formatted, time.format("%H:%M:%S%.3f").to_string());
1717 }
1718 }
1719
1720 #[test]
1721 fn test_time64_nanosecond_array_from_vec() {
1722 let arr: PrimitiveArray<Time64NanosecondType> =
1730 vec![1_000_000, 37_800_005_000_000, 86_399_210_000_000].into();
1731 assert_eq!(3, arr.len());
1732 assert_eq!(0, arr.offset());
1733 assert_eq!(0, arr.null_count());
1734 let formatted = ["00:00:00.001", "10:30:00.005", "23:59:59.210"];
1735 for (i, item) in formatted.iter().enumerate().take(3) {
1736 assert_eq!(None, arr.value_as_datetime(i));
1738 assert_eq!(None, arr.value_as_date(i));
1739 let time = arr.value_as_time(i).unwrap();
1740 assert_eq!(*item, time.format("%H:%M:%S%.3f").to_string());
1741 }
1742 }
1743
1744 #[test]
1745 fn test_interval_array_from_vec() {
1746 let arr = IntervalYearMonthArray::from(vec![Some(1), None, Some(-5)]);
1748 assert_eq!(3, arr.len());
1749 assert_eq!(0, arr.offset());
1750 assert_eq!(1, arr.null_count());
1751 assert_eq!(1, arr.value(0));
1752 assert_eq!(1, arr.values()[0]);
1753 assert!(arr.is_null(1));
1754 assert_eq!(-5, arr.value(2));
1755 assert_eq!(-5, arr.values()[2]);
1756
1757 let v0 = IntervalDayTime {
1758 days: 34,
1759 milliseconds: 1,
1760 };
1761 let v2 = IntervalDayTime {
1762 days: -2,
1763 milliseconds: -5,
1764 };
1765
1766 let arr = IntervalDayTimeArray::from(vec![Some(v0), None, Some(v2)]);
1767
1768 assert_eq!(3, arr.len());
1769 assert_eq!(0, arr.offset());
1770 assert_eq!(1, arr.null_count());
1771 assert_eq!(v0, arr.value(0));
1772 assert_eq!(v0, arr.values()[0]);
1773 assert!(arr.is_null(1));
1774 assert_eq!(v2, arr.value(2));
1775 assert_eq!(v2, arr.values()[2]);
1776
1777 let v0 = IntervalMonthDayNano {
1778 months: 2,
1779 days: 34,
1780 nanoseconds: -1,
1781 };
1782 let v2 = IntervalMonthDayNano {
1783 months: -3,
1784 days: -2,
1785 nanoseconds: 4,
1786 };
1787
1788 let arr = IntervalMonthDayNanoArray::from(vec![Some(v0), None, Some(v2)]);
1789 assert_eq!(3, arr.len());
1790 assert_eq!(0, arr.offset());
1791 assert_eq!(1, arr.null_count());
1792 assert_eq!(v0, arr.value(0));
1793 assert_eq!(v0, arr.values()[0]);
1794 assert!(arr.is_null(1));
1795 assert_eq!(v2, arr.value(2));
1796 assert_eq!(v2, arr.values()[2]);
1797 }
1798
1799 #[test]
1800 fn test_duration_array_from_vec() {
1801 let arr = DurationSecondArray::from(vec![Some(1), None, Some(-5)]);
1802 assert_eq!(3, arr.len());
1803 assert_eq!(0, arr.offset());
1804 assert_eq!(1, arr.null_count());
1805 assert_eq!(1, arr.value(0));
1806 assert_eq!(1, arr.values()[0]);
1807 assert!(arr.is_null(1));
1808 assert_eq!(-5, arr.value(2));
1809 assert_eq!(-5, arr.values()[2]);
1810
1811 let arr = DurationMillisecondArray::from(vec![Some(1), None, Some(-5)]);
1812 assert_eq!(3, arr.len());
1813 assert_eq!(0, arr.offset());
1814 assert_eq!(1, arr.null_count());
1815 assert_eq!(1, arr.value(0));
1816 assert_eq!(1, arr.values()[0]);
1817 assert!(arr.is_null(1));
1818 assert_eq!(-5, arr.value(2));
1819 assert_eq!(-5, arr.values()[2]);
1820
1821 let arr = DurationMicrosecondArray::from(vec![Some(1), None, Some(-5)]);
1822 assert_eq!(3, arr.len());
1823 assert_eq!(0, arr.offset());
1824 assert_eq!(1, arr.null_count());
1825 assert_eq!(1, arr.value(0));
1826 assert_eq!(1, arr.values()[0]);
1827 assert!(arr.is_null(1));
1828 assert_eq!(-5, arr.value(2));
1829 assert_eq!(-5, arr.values()[2]);
1830
1831 let arr = DurationNanosecondArray::from(vec![Some(1), None, Some(-5)]);
1832 assert_eq!(3, arr.len());
1833 assert_eq!(0, arr.offset());
1834 assert_eq!(1, arr.null_count());
1835 assert_eq!(1, arr.value(0));
1836 assert_eq!(1, arr.values()[0]);
1837 assert!(arr.is_null(1));
1838 assert_eq!(-5, arr.value(2));
1839 assert_eq!(-5, arr.values()[2]);
1840 }
1841
1842 #[test]
1843 fn test_timestamp_array_from_vec() {
1844 let arr = TimestampSecondArray::from(vec![1, -5]);
1845 assert_eq!(2, arr.len());
1846 assert_eq!(0, arr.offset());
1847 assert_eq!(0, arr.null_count());
1848 assert_eq!(1, arr.value(0));
1849 assert_eq!(-5, arr.value(1));
1850 assert_eq!(&[1, -5], arr.values());
1851
1852 let arr = TimestampMillisecondArray::from(vec![1, -5]);
1853 assert_eq!(2, arr.len());
1854 assert_eq!(0, arr.offset());
1855 assert_eq!(0, arr.null_count());
1856 assert_eq!(1, arr.value(0));
1857 assert_eq!(-5, arr.value(1));
1858 assert_eq!(&[1, -5], arr.values());
1859
1860 let arr = TimestampMicrosecondArray::from(vec![1, -5]);
1861 assert_eq!(2, arr.len());
1862 assert_eq!(0, arr.offset());
1863 assert_eq!(0, arr.null_count());
1864 assert_eq!(1, arr.value(0));
1865 assert_eq!(-5, arr.value(1));
1866 assert_eq!(&[1, -5], arr.values());
1867
1868 let arr = TimestampNanosecondArray::from(vec![1, -5]);
1869 assert_eq!(2, arr.len());
1870 assert_eq!(0, arr.offset());
1871 assert_eq!(0, arr.null_count());
1872 assert_eq!(1, arr.value(0));
1873 assert_eq!(-5, arr.value(1));
1874 assert_eq!(&[1, -5], arr.values());
1875 }
1876
1877 #[test]
1878 fn test_primitive_array_slice() {
1879 let arr = Int32Array::from(vec![
1880 Some(0),
1881 None,
1882 Some(2),
1883 None,
1884 Some(4),
1885 Some(5),
1886 Some(6),
1887 None,
1888 None,
1889 ]);
1890 assert_eq!(9, arr.len());
1891 assert_eq!(0, arr.offset());
1892 assert_eq!(4, arr.null_count());
1893
1894 let arr2 = arr.slice(2, 5);
1895 assert_eq!(5, arr2.len());
1896 assert_eq!(1, arr2.null_count());
1897
1898 for i in 0..arr2.len() {
1899 assert_eq!(i == 1, arr2.is_null(i));
1900 assert_eq!(i != 1, arr2.is_valid(i));
1901 }
1902 let int_arr2 = arr2.as_any().downcast_ref::<Int32Array>().unwrap();
1903 assert_eq!(2, int_arr2.values()[0]);
1904 assert_eq!(&[4, 5, 6], &int_arr2.values()[2..5]);
1905
1906 let arr3 = arr2.slice(2, 3);
1907 assert_eq!(3, arr3.len());
1908 assert_eq!(0, arr3.null_count());
1909
1910 let int_arr3 = arr3.as_any().downcast_ref::<Int32Array>().unwrap();
1911 assert_eq!(&[4, 5, 6], int_arr3.values());
1912 assert_eq!(4, int_arr3.value(0));
1913 assert_eq!(5, int_arr3.value(1));
1914 assert_eq!(6, int_arr3.value(2));
1915 }
1916
1917 #[test]
1918 fn test_boolean_array_slice() {
1919 let arr = BooleanArray::from(vec![
1920 Some(true),
1921 None,
1922 Some(false),
1923 None,
1924 Some(true),
1925 Some(false),
1926 Some(true),
1927 Some(false),
1928 None,
1929 Some(true),
1930 ]);
1931
1932 assert_eq!(10, arr.len());
1933 assert_eq!(0, arr.offset());
1934 assert_eq!(3, arr.null_count());
1935
1936 let arr2 = arr.slice(3, 5);
1937 assert_eq!(5, arr2.len());
1938 assert_eq!(3, arr2.offset());
1939 assert_eq!(1, arr2.null_count());
1940
1941 let bool_arr = arr2.as_any().downcast_ref::<BooleanArray>().unwrap();
1942
1943 assert!(!bool_arr.is_valid(0));
1944
1945 assert!(bool_arr.is_valid(1));
1946 assert!(bool_arr.value(1));
1947
1948 assert!(bool_arr.is_valid(2));
1949 assert!(!bool_arr.value(2));
1950
1951 assert!(bool_arr.is_valid(3));
1952 assert!(bool_arr.value(3));
1953
1954 assert!(bool_arr.is_valid(4));
1955 assert!(!bool_arr.value(4));
1956 }
1957
1958 #[test]
1959 fn test_int32_fmt_debug() {
1960 let arr = Int32Array::from(vec![0, 1, 2, 3, 4]);
1961 assert_eq!(
1962 "PrimitiveArray<Int32>\n[\n 0,\n 1,\n 2,\n 3,\n 4,\n]",
1963 format!("{arr:?}")
1964 );
1965 }
1966
1967 #[test]
1968 fn test_fmt_debug_up_to_20_elements() {
1969 (1..=20).for_each(|i| {
1970 let values = (0..i).collect::<Vec<i16>>();
1971 let array_expected = format!(
1972 "PrimitiveArray<Int16>\n[\n{}\n]",
1973 values
1974 .iter()
1975 .map(|v| { format!(" {v},") })
1976 .collect::<Vec<String>>()
1977 .join("\n")
1978 );
1979 let array = Int16Array::from(values);
1980
1981 assert_eq!(array_expected, format!("{array:?}"));
1982 })
1983 }
1984
1985 #[test]
1986 fn test_int32_with_null_fmt_debug() {
1987 let mut builder = Int32Array::builder(3);
1988 builder.append_slice(&[0, 1]);
1989 builder.append_null();
1990 builder.append_slice(&[3, 4]);
1991 let arr = builder.finish();
1992 assert_eq!(
1993 "PrimitiveArray<Int32>\n[\n 0,\n 1,\n null,\n 3,\n 4,\n]",
1994 format!("{arr:?}")
1995 );
1996 }
1997
1998 #[test]
1999 fn test_timestamp_fmt_debug() {
2000 let arr: PrimitiveArray<TimestampMillisecondType> =
2001 TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000]);
2002 assert_eq!(
2003 "PrimitiveArray<Timestamp(Millisecond, None)>\n[\n 2018-12-31T00:00:00,\n 2018-12-31T00:00:00,\n 1921-01-02T00:00:00,\n]",
2004 format!("{arr:?}")
2005 );
2006 }
2007
2008 #[test]
2009 fn test_timestamp_utc_fmt_debug() {
2010 let arr: PrimitiveArray<TimestampMillisecondType> =
2011 TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2012 .with_timezone_utc();
2013 assert_eq!(
2014 "PrimitiveArray<Timestamp(Millisecond, Some(\"+00:00\"))>\n[\n 2018-12-31T00:00:00+00:00,\n 2018-12-31T00:00:00+00:00,\n 1921-01-02T00:00:00+00:00,\n]",
2015 format!("{arr:?}")
2016 );
2017 }
2018
2019 #[test]
2020 #[cfg(feature = "chrono-tz")]
2021 fn test_timestamp_with_named_tz_fmt_debug() {
2022 let arr: PrimitiveArray<TimestampMillisecondType> =
2023 TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2024 .with_timezone("Asia/Taipei".to_string());
2025 assert_eq!(
2026 "PrimitiveArray<Timestamp(Millisecond, Some(\"Asia/Taipei\"))>\n[\n 2018-12-31T08:00:00+08:00,\n 2018-12-31T08:00:00+08:00,\n 1921-01-02T08:00:00+08:00,\n]",
2027 format!("{:?}", arr)
2028 );
2029 }
2030
2031 #[test]
2032 #[cfg(not(feature = "chrono-tz"))]
2033 fn test_timestamp_with_named_tz_fmt_debug() {
2034 let arr: PrimitiveArray<TimestampMillisecondType> =
2035 TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2036 .with_timezone("Asia/Taipei".to_string());
2037
2038 println!("{arr:?}");
2039
2040 assert_eq!(
2041 "PrimitiveArray<Timestamp(Millisecond, Some(\"Asia/Taipei\"))>\n[\n 2018-12-31T00:00:00 (Unknown Time Zone 'Asia/Taipei'),\n 2018-12-31T00:00:00 (Unknown Time Zone 'Asia/Taipei'),\n 1921-01-02T00:00:00 (Unknown Time Zone 'Asia/Taipei'),\n]",
2042 format!("{arr:?}")
2043 );
2044 }
2045
2046 #[test]
2047 fn test_timestamp_with_fixed_offset_tz_fmt_debug() {
2048 let arr: PrimitiveArray<TimestampMillisecondType> =
2049 TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2050 .with_timezone("+08:00".to_string());
2051 assert_eq!(
2052 "PrimitiveArray<Timestamp(Millisecond, Some(\"+08:00\"))>\n[\n 2018-12-31T08:00:00+08:00,\n 2018-12-31T08:00:00+08:00,\n 1921-01-02T08:00:00+08:00,\n]",
2053 format!("{arr:?}")
2054 );
2055 }
2056
2057 #[test]
2058 fn test_timestamp_with_incorrect_tz_fmt_debug() {
2059 let arr: PrimitiveArray<TimestampMillisecondType> =
2060 TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2061 .with_timezone("xxx".to_string());
2062 assert_eq!(
2063 "PrimitiveArray<Timestamp(Millisecond, Some(\"xxx\"))>\n[\n 2018-12-31T00:00:00 (Unknown Time Zone 'xxx'),\n 2018-12-31T00:00:00 (Unknown Time Zone 'xxx'),\n 1921-01-02T00:00:00 (Unknown Time Zone 'xxx'),\n]",
2064 format!("{arr:?}")
2065 );
2066 }
2067
2068 #[test]
2069 #[cfg(feature = "chrono-tz")]
2070 fn test_timestamp_with_tz_with_daylight_saving_fmt_debug() {
2071 let arr: PrimitiveArray<TimestampMillisecondType> = TimestampMillisecondArray::from(vec![
2072 1647161999000,
2073 1647162000000,
2074 1667717999000,
2075 1667718000000,
2076 ])
2077 .with_timezone("America/Denver".to_string());
2078 assert_eq!(
2079 "PrimitiveArray<Timestamp(Millisecond, Some(\"America/Denver\"))>\n[\n 2022-03-13T01:59:59-07:00,\n 2022-03-13T03:00:00-06:00,\n 2022-11-06T00:59:59-06:00,\n 2022-11-06T01:00:00-06:00,\n]",
2080 format!("{:?}", arr)
2081 );
2082 }
2083
2084 #[test]
2085 fn test_date32_fmt_debug() {
2086 let arr: PrimitiveArray<Date32Type> = vec![12356, 13548, -365].into();
2087 assert_eq!(
2088 "PrimitiveArray<Date32>\n[\n 2003-10-31,\n 2007-02-04,\n 1969-01-01,\n]",
2089 format!("{arr:?}")
2090 );
2091 }
2092
2093 #[test]
2094 fn test_time32second_fmt_debug() {
2095 let arr: PrimitiveArray<Time32SecondType> = vec![7201, 60054].into();
2096 assert_eq!(
2097 "PrimitiveArray<Time32(Second)>\n[\n 02:00:01,\n 16:40:54,\n]",
2098 format!("{arr:?}")
2099 );
2100 }
2101
2102 #[test]
2103 fn test_time32second_invalid_neg() {
2104 let arr: PrimitiveArray<Time32SecondType> = vec![-7201, -60054].into();
2106 assert_eq!(
2107 "PrimitiveArray<Time32(Second)>\n[\n Cast error: Failed to convert -7201 to temporal for Time32(Second),\n Cast error: Failed to convert -60054 to temporal for Time32(Second),\n]",
2108 format!("{arr:?}")
2110 )
2111 }
2112
2113 #[test]
2114 fn test_timestamp_micros_out_of_range() {
2115 let arr: PrimitiveArray<TimestampMicrosecondType> = vec![9065525203050843594].into();
2117 assert_eq!(
2118 "PrimitiveArray<Timestamp(Microsecond, None)>\n[\n null,\n]",
2119 format!("{arr:?}")
2120 )
2121 }
2122
2123 #[test]
2124 fn test_primitive_array_builder() {
2125 let buf = Buffer::from_slice_ref([0i32, 1, 2, 3, 4, 5, 6]);
2127 let buf2 = buf.slice_with_length(8, 20);
2128 let data = ArrayData::builder(DataType::Int32)
2129 .len(5)
2130 .offset(2)
2131 .add_buffer(buf)
2132 .build()
2133 .unwrap();
2134 let arr = Int32Array::from(data);
2135 assert_eq!(&buf2, arr.values.inner());
2136 assert_eq!(5, arr.len());
2137 assert_eq!(0, arr.null_count());
2138 for i in 0..3 {
2139 assert_eq!((i + 2) as i32, arr.value(i));
2140 }
2141 }
2142
2143 #[test]
2144 fn test_primitive_from_iter_values() {
2145 let arr: PrimitiveArray<Int32Type> = PrimitiveArray::from_iter_values(0..10);
2147 assert_eq!(10, arr.len());
2148 assert_eq!(0, arr.null_count());
2149 for i in 0..10i32 {
2150 assert_eq!(i, arr.value(i as usize));
2151 }
2152 }
2153
2154 #[test]
2155 fn test_primitive_array_from_unbound_iter() {
2156 let value_iter = (0..)
2158 .scan(0usize, |pos, i| {
2159 if *pos < 10 {
2160 *pos += 1;
2161 Some(Some(i))
2162 } else {
2163 None
2165 }
2166 })
2167 .take(100);
2169
2170 let (_, upper_size_bound) = value_iter.size_hint();
2171 assert_eq!(upper_size_bound, Some(100));
2173 let primitive_array: PrimitiveArray<Int32Type> = value_iter.collect();
2174 assert_eq!(primitive_array.len(), 10);
2176 }
2177
2178 #[test]
2179 fn test_primitive_array_from_non_null_iter() {
2180 let iter = (0..10_i32).map(Some);
2181 let primitive_array = PrimitiveArray::<Int32Type>::from_iter(iter);
2182 assert_eq!(primitive_array.len(), 10);
2183 assert_eq!(primitive_array.null_count(), 0);
2184 assert!(primitive_array.nulls().is_none());
2185 assert_eq!(primitive_array.values(), &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
2186 }
2187
2188 #[test]
2189 #[should_panic(expected = "PrimitiveArray data should contain a single buffer only \
2190 (values buffer)")]
2191 #[cfg(not(feature = "force_validate"))]
2194 fn test_primitive_array_invalid_buffer_len() {
2195 let buffer = Buffer::from_slice_ref([0i32, 1, 2, 3, 4]);
2196 let data = unsafe {
2197 ArrayData::builder(DataType::Int32)
2198 .add_buffer(buffer.clone())
2199 .add_buffer(buffer)
2200 .len(5)
2201 .build_unchecked()
2202 };
2203
2204 drop(Int32Array::from(data));
2205 }
2206
2207 #[test]
2208 fn test_access_array_concurrently() {
2209 let a = Int32Array::from(vec![5, 6, 7, 8, 9]);
2210 let ret = std::thread::spawn(move || a.value(3)).join();
2211
2212 assert!(ret.is_ok());
2213 assert_eq!(8, ret.ok().unwrap());
2214 }
2215
2216 #[test]
2217 fn test_primitive_array_creation() {
2218 let array1: Int8Array = [10_i8, 11, 12, 13, 14].into_iter().collect();
2219 let array2: Int8Array = [10_i8, 11, 12, 13, 14].into_iter().map(Some).collect();
2220
2221 assert_eq!(array1, array2);
2222 }
2223
2224 #[test]
2225 #[should_panic(
2226 expected = "Trying to access an element at index 4 from a PrimitiveArray of length 3"
2227 )]
2228 fn test_string_array_get_value_index_out_of_bound() {
2229 let array: Int8Array = [10_i8, 11, 12].into_iter().collect();
2230
2231 array.value(4);
2232 }
2233
2234 #[test]
2235 #[should_panic(expected = "PrimitiveArray expected data type Int64 got Int32")]
2236 fn test_from_array_data_validation() {
2237 let foo = PrimitiveArray::<Int32Type>::from_iter([1, 2, 3]);
2238 let _ = PrimitiveArray::<Int64Type>::from(foo.into_data());
2239 }
2240
2241 #[test]
2242 fn test_decimal128() {
2243 let values: Vec<_> = vec![0, 1, -1, i128::MIN, i128::MAX];
2244 let array: PrimitiveArray<Decimal128Type> =
2245 PrimitiveArray::from_iter(values.iter().copied());
2246 assert_eq!(array.values(), &values);
2247
2248 let array: PrimitiveArray<Decimal128Type> =
2249 PrimitiveArray::from_iter_values(values.iter().copied());
2250 assert_eq!(array.values(), &values);
2251
2252 let array = PrimitiveArray::<Decimal128Type>::from(values.clone());
2253 assert_eq!(array.values(), &values);
2254
2255 let array = PrimitiveArray::<Decimal128Type>::from(array.to_data());
2256 assert_eq!(array.values(), &values);
2257 }
2258
2259 #[test]
2260 fn test_decimal256() {
2261 let values: Vec<_> = vec![i256::ZERO, i256::ONE, i256::MINUS_ONE, i256::MIN, i256::MAX];
2262
2263 let array: PrimitiveArray<Decimal256Type> =
2264 PrimitiveArray::from_iter(values.iter().copied());
2265 assert_eq!(array.values(), &values);
2266
2267 let array: PrimitiveArray<Decimal256Type> =
2268 PrimitiveArray::from_iter_values(values.iter().copied());
2269 assert_eq!(array.values(), &values);
2270
2271 let array = PrimitiveArray::<Decimal256Type>::from(values.clone());
2272 assert_eq!(array.values(), &values);
2273
2274 let array = PrimitiveArray::<Decimal256Type>::from(array.to_data());
2275 assert_eq!(array.values(), &values);
2276 }
2277
2278 #[test]
2279 fn test_decimal_array() {
2280 let values: [u8; 32] = [
2283 192, 219, 180, 17, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 36, 75, 238, 253, 255, 255,
2284 255, 255, 255, 255, 255, 255, 255, 255, 255,
2285 ];
2286 let array_data = ArrayData::builder(DataType::Decimal128(38, 6))
2287 .len(2)
2288 .add_buffer(Buffer::from(&values))
2289 .build()
2290 .unwrap();
2291 let decimal_array = Decimal128Array::from(array_data);
2292 assert_eq!(8_887_000_000_i128, decimal_array.value(0));
2293 assert_eq!(-8_887_000_000_i128, decimal_array.value(1));
2294 }
2295
2296 #[test]
2297 fn test_decimal_append_error_value() {
2298 let mut decimal_builder = Decimal128Builder::with_capacity(10);
2299 decimal_builder.append_value(123456);
2300 decimal_builder.append_value(12345);
2301 let result = decimal_builder.finish().with_precision_and_scale(5, 3);
2302 assert!(result.is_ok());
2303 let arr = result.unwrap();
2304 assert_eq!("12.345", arr.value_as_string(1));
2305
2306 let result = arr.validate_decimal_precision(5);
2308 let error = result.unwrap_err();
2309 assert_eq!(
2310 "Invalid argument error: 123456 is too large to store in a Decimal128 of precision 5. Max is 99999",
2311 error.to_string()
2312 );
2313
2314 decimal_builder = Decimal128Builder::new();
2315 decimal_builder.append_value(100);
2316 decimal_builder.append_value(99);
2317 decimal_builder.append_value(-100);
2318 decimal_builder.append_value(-99);
2319 let result = decimal_builder.finish().with_precision_and_scale(2, 1);
2320 assert!(result.is_ok());
2321 let arr = result.unwrap();
2322 assert_eq!("9.9", arr.value_as_string(1));
2323 assert_eq!("-9.9", arr.value_as_string(3));
2324
2325 let result = arr.validate_decimal_precision(2);
2327 let error = result.unwrap_err();
2328 assert_eq!(
2329 "Invalid argument error: 100 is too large to store in a Decimal128 of precision 2. Max is 99",
2330 error.to_string()
2331 );
2332 }
2333
2334 #[test]
2335 fn test_decimal_from_iter_values() {
2336 let array = Decimal128Array::from_iter_values(vec![-100, 0, 101]);
2337 assert_eq!(array.len(), 3);
2338 assert_eq!(array.data_type(), &DataType::Decimal128(38, 10));
2339 assert_eq!(-100_i128, array.value(0));
2340 assert!(!array.is_null(0));
2341 assert_eq!(0_i128, array.value(1));
2342 assert!(!array.is_null(1));
2343 assert_eq!(101_i128, array.value(2));
2344 assert!(!array.is_null(2));
2345 }
2346
2347 #[test]
2348 fn test_decimal_from_iter() {
2349 let array: Decimal128Array = vec![Some(-100), None, Some(101)].into_iter().collect();
2350 assert_eq!(array.len(), 3);
2351 assert_eq!(array.data_type(), &DataType::Decimal128(38, 10));
2352 assert_eq!(-100_i128, array.value(0));
2353 assert!(!array.is_null(0));
2354 assert!(array.is_null(1));
2355 assert_eq!(101_i128, array.value(2));
2356 assert!(!array.is_null(2));
2357 }
2358
2359 #[test]
2360 fn test_decimal_iter_sized() {
2361 let data = vec![Some(-100), None, Some(101)];
2362 let array: Decimal128Array = data.into_iter().collect();
2363 let mut iter = array.into_iter();
2364
2365 assert_eq!(array.len(), 3);
2367
2368 assert_eq!(iter.size_hint(), (3, Some(3)));
2370 iter.next().unwrap();
2371 assert_eq!(iter.size_hint(), (2, Some(2)));
2372 iter.next().unwrap();
2373 iter.next().unwrap();
2374 assert_eq!(iter.size_hint(), (0, Some(0)));
2375 assert!(iter.next().is_none());
2376 assert_eq!(iter.size_hint(), (0, Some(0)));
2377 }
2378
2379 #[test]
2380 fn test_decimal_array_value_as_string() {
2381 let arr = [123450, -123450, 100, -100, 10, -10, 0]
2382 .into_iter()
2383 .map(Some)
2384 .collect::<Decimal128Array>()
2385 .with_precision_and_scale(6, 3)
2386 .unwrap();
2387
2388 assert_eq!("123.450", arr.value_as_string(0));
2389 assert_eq!("-123.450", arr.value_as_string(1));
2390 assert_eq!("0.100", arr.value_as_string(2));
2391 assert_eq!("-0.100", arr.value_as_string(3));
2392 assert_eq!("0.010", arr.value_as_string(4));
2393 assert_eq!("-0.010", arr.value_as_string(5));
2394 assert_eq!("0.000", arr.value_as_string(6));
2395 }
2396
2397 #[test]
2398 fn test_decimal_array_with_precision_and_scale() {
2399 let arr = Decimal128Array::from_iter_values([12345, 456, 7890, -123223423432432])
2400 .with_precision_and_scale(20, 2)
2401 .unwrap();
2402
2403 assert_eq!(arr.data_type(), &DataType::Decimal128(20, 2));
2404 assert_eq!(arr.precision(), 20);
2405 assert_eq!(arr.scale(), 2);
2406
2407 let actual: Vec<_> = (0..arr.len()).map(|i| arr.value_as_string(i)).collect();
2408 let expected = vec!["123.45", "4.56", "78.90", "-1232234234324.32"];
2409
2410 assert_eq!(actual, expected);
2411 }
2412
2413 #[test]
2414 #[should_panic(
2415 expected = "-123223423432432 is too small to store in a Decimal128 of precision 5. Min is -99999"
2416 )]
2417 fn test_decimal_array_with_precision_and_scale_out_of_range() {
2418 let arr = Decimal128Array::from_iter_values([12345, 456, 7890, -123223423432432])
2419 .with_precision_and_scale(5, 2)
2421 .unwrap();
2422 arr.validate_decimal_precision(5).unwrap();
2423 }
2424
2425 #[test]
2426 #[should_panic(expected = "precision cannot be 0, has to be between [1, 38]")]
2427 fn test_decimal_array_with_precision_zero() {
2428 Decimal128Array::from_iter_values([12345, 456])
2429 .with_precision_and_scale(0, 2)
2430 .unwrap();
2431 }
2432
2433 #[test]
2434 #[should_panic(expected = "precision 40 is greater than max 38")]
2435 fn test_decimal_array_with_precision_and_scale_invalid_precision() {
2436 Decimal128Array::from_iter_values([12345, 456])
2437 .with_precision_and_scale(40, 2)
2438 .unwrap();
2439 }
2440
2441 #[test]
2442 #[should_panic(expected = "scale 40 is greater than max 38")]
2443 fn test_decimal_array_with_precision_and_scale_invalid_scale() {
2444 Decimal128Array::from_iter_values([12345, 456])
2445 .with_precision_and_scale(20, 40)
2446 .unwrap();
2447 }
2448
2449 #[test]
2450 #[should_panic(expected = "scale 10 is greater than precision 4")]
2451 fn test_decimal_array_with_precision_and_scale_invalid_precision_and_scale() {
2452 Decimal128Array::from_iter_values([12345, 456])
2453 .with_precision_and_scale(4, 10)
2454 .unwrap();
2455 }
2456
2457 #[test]
2458 fn test_decimal_array_set_null_if_overflow_with_precision() {
2459 let array = Decimal128Array::from(vec![Some(123456), Some(123), None, Some(123456)]);
2460 let result = array.null_if_overflow_precision(5);
2461 let expected = Decimal128Array::from(vec![None, Some(123), None, None]);
2462 assert_eq!(result, expected);
2463 }
2464
2465 #[test]
2466 fn test_decimal256_iter() {
2467 let mut builder = Decimal256Builder::with_capacity(30);
2468 let decimal1 = i256::from_i128(12345);
2469 builder.append_value(decimal1);
2470
2471 builder.append_null();
2472
2473 let decimal2 = i256::from_i128(56789);
2474 builder.append_value(decimal2);
2475
2476 let array: Decimal256Array = builder.finish().with_precision_and_scale(76, 6).unwrap();
2477
2478 let collected: Vec<_> = array.iter().collect();
2479 assert_eq!(vec![Some(decimal1), None, Some(decimal2)], collected);
2480 }
2481
2482 #[test]
2483 fn test_from_iter_decimal256array() {
2484 let value1 = i256::from_i128(12345);
2485 let value2 = i256::from_i128(56789);
2486
2487 let mut array: Decimal256Array =
2488 vec![Some(value1), None, Some(value2)].into_iter().collect();
2489 array = array.with_precision_and_scale(76, 10).unwrap();
2490 assert_eq!(array.len(), 3);
2491 assert_eq!(array.data_type(), &DataType::Decimal256(76, 10));
2492 assert_eq!(value1, array.value(0));
2493 assert!(!array.is_null(0));
2494 assert!(array.is_null(1));
2495 assert_eq!(value2, array.value(2));
2496 assert!(!array.is_null(2));
2497 }
2498
2499 #[test]
2500 fn test_from_iter_decimal128array() {
2501 let mut array: Decimal128Array = vec![Some(-100), None, Some(101)].into_iter().collect();
2502 array = array.with_precision_and_scale(38, 10).unwrap();
2503 assert_eq!(array.len(), 3);
2504 assert_eq!(array.data_type(), &DataType::Decimal128(38, 10));
2505 assert_eq!(-100_i128, array.value(0));
2506 assert!(!array.is_null(0));
2507 assert!(array.is_null(1));
2508 assert_eq!(101_i128, array.value(2));
2509 assert!(!array.is_null(2));
2510 }
2511
2512 #[test]
2513 fn test_unary_opt() {
2514 let array = Int32Array::from(vec![1, 2, 3, 4, 5, 6, 7]);
2515 let r = array.unary_opt::<_, Int32Type>(|x| (x % 2 != 0).then_some(x));
2516
2517 let expected = Int32Array::from(vec![Some(1), None, Some(3), None, Some(5), None, Some(7)]);
2518 assert_eq!(r, expected);
2519
2520 let r = expected.unary_opt::<_, Int32Type>(|x| (x % 3 != 0).then_some(x));
2521 let expected = Int32Array::from(vec![Some(1), None, None, None, Some(5), None, Some(7)]);
2522 assert_eq!(r, expected);
2523 }
2524
2525 #[test]
2526 #[should_panic(
2527 expected = "Trying to access an element at index 4 from a PrimitiveArray of length 3"
2528 )]
2529 fn test_fixed_size_binary_array_get_value_index_out_of_bound() {
2530 let array = Decimal128Array::from(vec![-100, 0, 101]);
2531 array.value(4);
2532 }
2533
2534 #[test]
2535 fn test_into_builder() {
2536 let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2537
2538 let boxed: ArrayRef = Arc::new(array);
2539 let col: Int32Array = downcast_array(&boxed);
2540 drop(boxed);
2541
2542 let mut builder = col.into_builder().unwrap();
2543
2544 let slice = builder.values_slice_mut();
2545 assert_eq!(slice, &[1, 2, 3]);
2546
2547 slice[0] = 4;
2548 slice[1] = 2;
2549 slice[2] = 1;
2550
2551 let expected: Int32Array = vec![Some(4), Some(2), Some(1)].into_iter().collect();
2552
2553 let new_array = builder.finish();
2554 assert_eq!(expected, new_array);
2555 }
2556
2557 #[test]
2558 fn test_into_builder_cloned_array() {
2559 let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2560
2561 let boxed: ArrayRef = Arc::new(array);
2562
2563 let col: Int32Array = PrimitiveArray::<Int32Type>::from(boxed.to_data());
2564 let err = col.into_builder();
2565
2566 match err {
2567 Ok(_) => panic!("Should not get builder from cloned array"),
2568 Err(returned) => {
2569 let expected: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2570 assert_eq!(expected, returned)
2571 }
2572 }
2573 }
2574
2575 #[test]
2576 fn test_into_builder_on_sliced_array() {
2577 let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2578 let slice = array.slice(1, 2);
2579 let col: Int32Array = downcast_array(&slice);
2580
2581 drop(slice);
2582
2583 col.into_builder()
2584 .expect_err("Should not build builder from sliced array");
2585 }
2586
2587 #[test]
2588 fn test_unary_mut() {
2589 let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2590
2591 let c = array.unary_mut(|x| x * 2 + 1).unwrap();
2592 let expected: Int32Array = vec![3, 5, 7].into_iter().map(Some).collect();
2593
2594 assert_eq!(expected, c);
2595
2596 let array: Int32Array = Int32Array::from(vec![Some(5), Some(7), None]);
2597 let c = array.unary_mut(|x| x * 2 + 1).unwrap();
2598 assert_eq!(c, Int32Array::from(vec![Some(11), Some(15), None]));
2599 }
2600
2601 #[test]
2602 #[should_panic(
2603 expected = "PrimitiveArray expected data type Interval(MonthDayNano) got Interval(DayTime)"
2604 )]
2605 fn test_invalid_interval_type() {
2606 let array = IntervalDayTimeArray::from(vec![IntervalDayTime::ZERO]);
2607 let _ = IntervalMonthDayNanoArray::from(array.into_data());
2608 }
2609
2610 #[test]
2611 fn test_timezone() {
2612 let array = TimestampNanosecondArray::from_iter_values([1, 2]);
2613 assert_eq!(array.timezone(), None);
2614
2615 let array = array.with_timezone("+02:00");
2616 assert_eq!(array.timezone(), Some("+02:00"));
2617 }
2618
2619 #[test]
2620 fn test_try_new() {
2621 Int32Array::new(vec![1, 2, 3, 4].into(), None);
2622 Int32Array::new(vec![1, 2, 3, 4].into(), Some(NullBuffer::new_null(4)));
2623
2624 let err = Int32Array::try_new(vec![1, 2, 3, 4].into(), Some(NullBuffer::new_null(3)))
2625 .unwrap_err();
2626
2627 assert_eq!(
2628 err.to_string(),
2629 "Invalid argument error: Incorrect length of null buffer for PrimitiveArray, expected 4 got 3"
2630 );
2631
2632 TimestampNanosecondArray::new(vec![1, 2, 3, 4].into(), None).with_data_type(
2633 DataType::Timestamp(TimeUnit::Nanosecond, Some("03:00".into())),
2634 );
2635 }
2636
2637 #[test]
2638 #[should_panic(expected = "PrimitiveArray expected data type Int32 got Date32")]
2639 fn test_with_data_type() {
2640 Int32Array::new(vec![1, 2, 3, 4].into(), None).with_data_type(DataType::Date32);
2641 }
2642
2643 #[test]
2644 fn test_time_32second_output() {
2645 let array: Time32SecondArray = vec![
2646 Some(-1),
2647 Some(0),
2648 Some(86_399),
2649 Some(86_400),
2650 Some(86_401),
2651 None,
2652 ]
2653 .into();
2654 let debug_str = format!("{:?}", array);
2655 assert_eq!("PrimitiveArray<Time32(Second)>\n[\n Cast error: Failed to convert -1 to temporal for Time32(Second),\n 00:00:00,\n 23:59:59,\n Cast error: Failed to convert 86400 to temporal for Time32(Second),\n Cast error: Failed to convert 86401 to temporal for Time32(Second),\n null,\n]",
2656 debug_str
2657 );
2658 }
2659
2660 #[test]
2661 fn test_time_32millisecond_debug_output() {
2662 let array: Time32MillisecondArray = vec![
2663 Some(-1),
2664 Some(0),
2665 Some(86_399_000),
2666 Some(86_400_000),
2667 Some(86_401_000),
2668 None,
2669 ]
2670 .into();
2671 let debug_str = format!("{:?}", array);
2672 assert_eq!("PrimitiveArray<Time32(Millisecond)>\n[\n Cast error: Failed to convert -1 to temporal for Time32(Millisecond),\n 00:00:00,\n 23:59:59,\n Cast error: Failed to convert 86400000 to temporal for Time32(Millisecond),\n Cast error: Failed to convert 86401000 to temporal for Time32(Millisecond),\n null,\n]",
2673 debug_str
2674 );
2675 }
2676
2677 #[test]
2678 fn test_time_64nanosecond_debug_output() {
2679 let array: Time64NanosecondArray = vec![
2680 Some(-1),
2681 Some(0),
2682 Some(86_399 * 1_000_000_000),
2683 Some(86_400 * 1_000_000_000),
2684 Some(86_401 * 1_000_000_000),
2685 None,
2686 ]
2687 .into();
2688 let debug_str = format!("{:?}", array);
2689 assert_eq!(
2690 "PrimitiveArray<Time64(Nanosecond)>\n[\n Cast error: Failed to convert -1 to temporal for Time64(Nanosecond),\n 00:00:00,\n 23:59:59,\n Cast error: Failed to convert 86400000000000 to temporal for Time64(Nanosecond),\n Cast error: Failed to convert 86401000000000 to temporal for Time64(Nanosecond),\n null,\n]",
2691 debug_str
2692 );
2693 }
2694
2695 #[test]
2696 fn test_time_64microsecond_debug_output() {
2697 let array: Time64MicrosecondArray = vec![
2698 Some(-1),
2699 Some(0),
2700 Some(86_399 * 1_000_000),
2701 Some(86_400 * 1_000_000),
2702 Some(86_401 * 1_000_000),
2703 None,
2704 ]
2705 .into();
2706 let debug_str = format!("{:?}", array);
2707 assert_eq!("PrimitiveArray<Time64(Microsecond)>\n[\n Cast error: Failed to convert -1 to temporal for Time64(Microsecond),\n 00:00:00,\n 23:59:59,\n Cast error: Failed to convert 86400000000 to temporal for Time64(Microsecond),\n Cast error: Failed to convert 86401000000 to temporal for Time64(Microsecond),\n null,\n]", debug_str);
2708 }
2709
2710 #[test]
2711 fn test_primitive_with_nulls_into_builder() {
2712 let array: Int32Array = vec![
2713 Some(1),
2714 None,
2715 Some(3),
2716 Some(4),
2717 None,
2718 Some(7),
2719 None,
2720 Some(8),
2721 ]
2722 .into_iter()
2723 .collect();
2724 let _ = array.into_builder();
2725 }
2726}