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::{ArrowNativeType, Buffer, NullBuffer, ScalarBuffer, i256};
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 Decimal32Array = PrimitiveArray<Decimal32Type>;
431
432pub type Decimal64Array = PrimitiveArray<Decimal64Type>;
450
451pub type Decimal128Array = PrimitiveArray<Decimal128Type>;
469
470pub type Decimal256Array = PrimitiveArray<Decimal256Type>;
489
490pub use crate::types::ArrowPrimitiveType;
491
492pub struct PrimitiveArray<T: ArrowPrimitiveType> {
597 data_type: DataType,
598 values: ScalarBuffer<T::Native>,
600 nulls: Option<NullBuffer>,
601}
602
603impl<T: ArrowPrimitiveType> Clone for PrimitiveArray<T> {
604 fn clone(&self) -> Self {
605 Self {
606 data_type: self.data_type.clone(),
607 values: self.values.clone(),
608 nulls: self.nulls.clone(),
609 }
610 }
611}
612
613impl<T: ArrowPrimitiveType> PrimitiveArray<T> {
614 pub fn new(values: ScalarBuffer<T::Native>, nulls: Option<NullBuffer>) -> Self {
636 Self::try_new(values, nulls).unwrap()
637 }
638
639 pub fn new_null(length: usize) -> Self {
641 Self {
642 data_type: T::DATA_TYPE,
643 values: vec![T::Native::usize_as(0); length].into(),
644 nulls: Some(NullBuffer::new_null(length)),
645 }
646 }
647
648 pub fn try_new(
655 values: ScalarBuffer<T::Native>,
656 nulls: Option<NullBuffer>,
657 ) -> Result<Self, ArrowError> {
658 if let Some(n) = nulls.as_ref() {
659 if n.len() != values.len() {
660 return Err(ArrowError::InvalidArgumentError(format!(
661 "Incorrect length of null buffer for PrimitiveArray, expected {} got {}",
662 values.len(),
663 n.len(),
664 )));
665 }
666 }
667
668 Ok(Self {
669 data_type: T::DATA_TYPE,
670 values,
671 nulls,
672 })
673 }
674
675 pub fn new_scalar(value: T::Native) -> Scalar<Self> {
677 Scalar::new(Self {
678 data_type: T::DATA_TYPE,
679 values: vec![value].into(),
680 nulls: None,
681 })
682 }
683
684 pub fn into_parts(self) -> (DataType, ScalarBuffer<T::Native>, Option<NullBuffer>) {
686 (self.data_type, self.values, self.nulls)
687 }
688
689 pub fn with_data_type(self, data_type: DataType) -> Self {
698 Self::assert_compatible(&data_type);
699 Self { data_type, ..self }
700 }
701
702 fn assert_compatible(data_type: &DataType) {
704 assert!(
705 Self::is_compatible(data_type),
706 "PrimitiveArray expected data type {} got {}",
707 T::DATA_TYPE,
708 data_type
709 );
710 }
711
712 #[inline]
714 pub fn len(&self) -> usize {
715 self.values.len()
716 }
717
718 pub fn is_empty(&self) -> bool {
720 self.values.is_empty()
721 }
722
723 #[inline]
725 pub fn values(&self) -> &ScalarBuffer<T::Native> {
726 &self.values
727 }
728
729 pub fn builder(capacity: usize) -> PrimitiveBuilder<T> {
731 PrimitiveBuilder::<T>::with_capacity(capacity)
732 }
733
734 pub fn is_compatible(data_type: &DataType) -> bool {
739 match T::DATA_TYPE {
740 DataType::Timestamp(t1, _) => {
741 matches!(data_type, DataType::Timestamp(t2, _) if &t1 == t2)
742 }
743 DataType::Decimal32(_, _) => matches!(data_type, DataType::Decimal32(_, _)),
744 DataType::Decimal64(_, _) => matches!(data_type, DataType::Decimal64(_, _)),
745 DataType::Decimal128(_, _) => matches!(data_type, DataType::Decimal128(_, _)),
746 DataType::Decimal256(_, _) => matches!(data_type, DataType::Decimal256(_, _)),
747 _ => T::DATA_TYPE.eq(data_type),
748 }
749 }
750
751 #[inline]
760 pub unsafe fn value_unchecked(&self, i: usize) -> T::Native {
761 unsafe { *self.values.get_unchecked(i) }
762 }
763
764 #[inline]
772 pub fn value(&self, i: usize) -> T::Native {
773 assert!(
774 i < self.len(),
775 "Trying to access an element at index {} from a PrimitiveArray of length {}",
776 i,
777 self.len()
778 );
779 unsafe { self.value_unchecked(i) }
780 }
781
782 pub fn from_iter_values<I: IntoIterator<Item = T::Native>>(iter: I) -> Self {
784 let val_buf: Buffer = iter.into_iter().collect();
785 let len = val_buf.len() / std::mem::size_of::<T::Native>();
786 Self {
787 data_type: T::DATA_TYPE,
788 values: ScalarBuffer::new(val_buf, 0, len),
789 nulls: None,
790 }
791 }
792
793 pub fn from_iter_values_with_nulls<I: IntoIterator<Item = T::Native>>(
795 iter: I,
796 nulls: Option<NullBuffer>,
797 ) -> Self {
798 let val_buf: Buffer = iter.into_iter().collect();
799 let len = val_buf.len() / std::mem::size_of::<T::Native>();
800 Self {
801 data_type: T::DATA_TYPE,
802 values: ScalarBuffer::new(val_buf, 0, len),
803 nulls,
804 }
805 }
806
807 pub fn from_value(value: T::Native, count: usize) -> Self {
809 let val_buf: Vec<_> = vec![value; count];
810 Self::new(val_buf.into(), None)
811 }
812
813 pub fn take_iter<'a>(
815 &'a self,
816 indexes: impl Iterator<Item = Option<usize>> + 'a,
817 ) -> impl Iterator<Item = Option<T::Native>> + 'a {
818 indexes.map(|opt_index| opt_index.map(|index| self.value(index)))
819 }
820
821 pub unsafe fn take_iter_unchecked<'a>(
826 &'a self,
827 indexes: impl Iterator<Item = Option<usize>> + 'a,
828 ) -> impl Iterator<Item = Option<T::Native>> + 'a {
829 indexes.map(|opt_index| opt_index.map(|index| unsafe { self.value_unchecked(index) }))
830 }
831
832 pub fn slice(&self, offset: usize, length: usize) -> Self {
834 Self {
835 data_type: self.data_type.clone(),
836 values: self.values.slice(offset, length),
837 nulls: self.nulls.as_ref().map(|n| n.slice(offset, length)),
838 }
839 }
840
841 pub fn reinterpret_cast<K>(&self) -> PrimitiveArray<K>
859 where
860 K: ArrowPrimitiveType<Native = T::Native>,
861 {
862 let d = self.to_data().into_builder().data_type(K::DATA_TYPE);
863
864 PrimitiveArray::from(unsafe { d.build_unchecked() })
867 }
868
869 pub fn unary<F, O>(&self, op: F) -> PrimitiveArray<O>
900 where
901 O: ArrowPrimitiveType,
902 F: Fn(T::Native) -> O::Native,
903 {
904 let nulls = self.nulls().cloned();
905 let values = self.values().into_iter().map(|v| op(*v));
906 let buffer: Vec<_> = values.collect();
907 PrimitiveArray::new(buffer.into(), nulls)
908 }
909
910 pub fn unary_mut<F>(self, op: F) -> Result<PrimitiveArray<T>, PrimitiveArray<T>>
954 where
955 F: Fn(T::Native) -> T::Native,
956 {
957 let mut builder = self.into_builder()?;
958 builder
959 .values_slice_mut()
960 .iter_mut()
961 .for_each(|v| *v = op(*v));
962 Ok(builder.finish())
963 }
964
965 pub fn try_unary<F, O, E>(&self, op: F) -> Result<PrimitiveArray<O>, E>
974 where
975 O: ArrowPrimitiveType,
976 F: Fn(T::Native) -> Result<O::Native, E>,
977 {
978 let len = self.len();
979
980 let nulls = self.nulls().cloned();
981 let mut buffer = BufferBuilder::<O::Native>::new(len);
982 buffer.append_n_zeroed(len);
983 let slice = buffer.as_slice_mut();
984
985 let f = |idx| {
986 unsafe { *slice.get_unchecked_mut(idx) = op(self.value_unchecked(idx))? };
987 Ok::<_, E>(())
988 };
989
990 match &nulls {
991 Some(nulls) => nulls.try_for_each_valid_idx(f)?,
992 None => (0..len).try_for_each(f)?,
993 }
994
995 let values = buffer.finish().into();
996 Ok(PrimitiveArray::new(values, nulls))
997 }
998
999 pub fn try_unary_mut<F, E>(
1017 self,
1018 op: F,
1019 ) -> Result<Result<PrimitiveArray<T>, E>, PrimitiveArray<T>>
1020 where
1021 F: Fn(T::Native) -> Result<T::Native, E>,
1022 {
1023 let len = self.len();
1024 let null_count = self.null_count();
1025 let mut builder = self.into_builder()?;
1026
1027 let (slice, null_buffer) = builder.slices_mut();
1028
1029 let r = try_for_each_valid_idx(len, 0, null_count, null_buffer.as_deref(), |idx| {
1030 unsafe { *slice.get_unchecked_mut(idx) = op(*slice.get_unchecked(idx))? };
1031 Ok::<_, E>(())
1032 });
1033
1034 if let Err(err) = r {
1035 return Ok(Err(err));
1036 }
1037
1038 Ok(Ok(builder.finish()))
1039 }
1040
1041 pub fn unary_opt<F, O>(&self, op: F) -> PrimitiveArray<O>
1049 where
1050 O: ArrowPrimitiveType,
1051 F: Fn(T::Native) -> Option<O::Native>,
1052 {
1053 let len = self.len();
1054 let (nulls, null_count, offset) = match self.nulls() {
1055 Some(n) => (Some(n.validity()), n.null_count(), n.offset()),
1056 None => (None, 0, 0),
1057 };
1058
1059 let mut null_builder = BooleanBufferBuilder::new(len);
1060 match nulls {
1061 Some(b) => null_builder.append_packed_range(offset..offset + len, b),
1062 None => null_builder.append_n(len, true),
1063 }
1064
1065 let mut buffer = BufferBuilder::<O::Native>::new(len);
1066 buffer.append_n_zeroed(len);
1067 let slice = buffer.as_slice_mut();
1068
1069 let mut out_null_count = null_count;
1070
1071 let _ = try_for_each_valid_idx(len, offset, null_count, nulls, |idx| {
1072 match op(unsafe { self.value_unchecked(idx) }) {
1073 Some(v) => unsafe { *slice.get_unchecked_mut(idx) = v },
1074 None => {
1075 out_null_count += 1;
1076 null_builder.set_bit(idx, false);
1077 }
1078 }
1079 Ok::<_, ()>(())
1080 });
1081
1082 let nulls = null_builder.finish();
1083 let values = buffer.finish().into();
1084 let nulls = unsafe { NullBuffer::new_unchecked(nulls, out_null_count) };
1085 PrimitiveArray::new(values, Some(nulls))
1086 }
1087
1088 pub fn from_unary<U: ArrayAccessor, F>(left: U, mut op: F) -> Self
1104 where
1105 F: FnMut(U::Item) -> T::Native,
1106 {
1107 let nulls = left.logical_nulls();
1108 let buffer: Vec<_> = (0..left.len())
1109 .map(|i| op(unsafe { left.value_unchecked(i) }))
1111 .collect();
1112 PrimitiveArray::new(buffer.into(), nulls)
1113 }
1114
1115 pub fn into_builder(self) -> Result<PrimitiveBuilder<T>, Self> {
1126 let len = self.len();
1127 let data = self.into_data();
1128 let null_bit_buffer = data.nulls().map(|b| b.inner().sliced());
1129
1130 let element_len = std::mem::size_of::<T::Native>();
1131 let buffer =
1132 data.buffers()[0].slice_with_length(data.offset() * element_len, len * element_len);
1133
1134 drop(data);
1135
1136 let try_mutable_null_buffer = match null_bit_buffer {
1137 None => Ok(None),
1138 Some(null_buffer) => {
1139 null_buffer.into_mutable().map(Some)
1141 }
1142 };
1143
1144 let try_mutable_buffers = match try_mutable_null_buffer {
1145 Ok(mutable_null_buffer) => {
1146 let try_mutable_buffer = buffer.into_mutable();
1148
1149 match try_mutable_buffer {
1152 Ok(mutable_buffer) => Ok(PrimitiveBuilder::<T>::new_from_buffer(
1153 mutable_buffer,
1154 mutable_null_buffer,
1155 )),
1156 Err(buffer) => Err((buffer, mutable_null_buffer.map(|b| b.into()))),
1157 }
1158 }
1159 Err(mutable_null_buffer) => {
1160 Err((buffer, Some(mutable_null_buffer)))
1162 }
1163 };
1164
1165 match try_mutable_buffers {
1166 Ok(builder) => Ok(builder),
1167 Err((buffer, null_bit_buffer)) => {
1168 let builder = ArrayData::builder(T::DATA_TYPE)
1169 .len(len)
1170 .add_buffer(buffer)
1171 .null_bit_buffer(null_bit_buffer);
1172
1173 let array_data = unsafe { builder.build_unchecked() };
1174 let array = PrimitiveArray::<T>::from(array_data);
1175
1176 Err(array)
1177 }
1178 }
1179 }
1180}
1181
1182impl<T: ArrowPrimitiveType> From<PrimitiveArray<T>> for ArrayData {
1183 fn from(array: PrimitiveArray<T>) -> Self {
1184 let builder = ArrayDataBuilder::new(array.data_type)
1185 .len(array.values.len())
1186 .nulls(array.nulls)
1187 .buffers(vec![array.values.into_inner()]);
1188
1189 unsafe { builder.build_unchecked() }
1190 }
1191}
1192
1193unsafe impl<T: ArrowPrimitiveType> Array for PrimitiveArray<T> {
1195 fn as_any(&self) -> &dyn Any {
1196 self
1197 }
1198
1199 fn to_data(&self) -> ArrayData {
1200 self.clone().into()
1201 }
1202
1203 fn into_data(self) -> ArrayData {
1204 self.into()
1205 }
1206
1207 fn data_type(&self) -> &DataType {
1208 &self.data_type
1209 }
1210
1211 fn slice(&self, offset: usize, length: usize) -> ArrayRef {
1212 Arc::new(self.slice(offset, length))
1213 }
1214
1215 fn len(&self) -> usize {
1216 self.values.len()
1217 }
1218
1219 fn is_empty(&self) -> bool {
1220 self.values.is_empty()
1221 }
1222
1223 fn shrink_to_fit(&mut self) {
1224 self.values.shrink_to_fit();
1225 if let Some(nulls) = &mut self.nulls {
1226 nulls.shrink_to_fit();
1227 }
1228 }
1229
1230 fn offset(&self) -> usize {
1231 0
1232 }
1233
1234 fn nulls(&self) -> Option<&NullBuffer> {
1235 self.nulls.as_ref()
1236 }
1237
1238 fn logical_null_count(&self) -> usize {
1239 self.null_count()
1240 }
1241
1242 fn get_buffer_memory_size(&self) -> usize {
1243 let mut size = self.values.inner().capacity();
1244 if let Some(n) = self.nulls.as_ref() {
1245 size += n.buffer().capacity();
1246 }
1247 size
1248 }
1249
1250 fn get_array_memory_size(&self) -> usize {
1251 std::mem::size_of::<Self>() + self.get_buffer_memory_size()
1252 }
1253}
1254
1255impl<T: ArrowPrimitiveType> ArrayAccessor for &PrimitiveArray<T> {
1256 type Item = T::Native;
1257
1258 fn value(&self, index: usize) -> Self::Item {
1259 PrimitiveArray::value(self, index)
1260 }
1261
1262 #[inline]
1263 unsafe fn value_unchecked(&self, index: usize) -> Self::Item {
1264 unsafe { PrimitiveArray::value_unchecked(self, index) }
1265 }
1266}
1267
1268impl<T: ArrowTemporalType> PrimitiveArray<T>
1269where
1270 i64: From<T::Native>,
1271{
1272 pub fn value_as_datetime(&self, i: usize) -> Option<NaiveDateTime> {
1279 as_datetime::<T>(i64::from(self.value(i)))
1280 }
1281
1282 pub fn value_as_datetime_with_tz(&self, i: usize, tz: Tz) -> Option<DateTime<Tz>> {
1289 as_datetime_with_timezone::<T>(i64::from(self.value(i)), tz)
1290 }
1291
1292 pub fn value_as_date(&self, i: usize) -> Option<NaiveDate> {
1298 self.value_as_datetime(i).map(|datetime| datetime.date())
1299 }
1300
1301 pub fn value_as_time(&self, i: usize) -> Option<NaiveTime> {
1307 as_time::<T>(i64::from(self.value(i)))
1308 }
1309
1310 pub fn value_as_duration(&self, i: usize) -> Option<Duration> {
1316 as_duration::<T>(i64::from(self.value(i)))
1317 }
1318}
1319
1320impl<T: ArrowPrimitiveType> std::fmt::Debug for PrimitiveArray<T> {
1321 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
1322 let data_type = self.data_type();
1323
1324 write!(f, "PrimitiveArray<{data_type}>\n[\n")?;
1325 print_long_array(self, f, |array, index, f| match data_type {
1326 DataType::Date32 | DataType::Date64 => {
1327 let v = self.value(index).to_i64().unwrap();
1328 match as_date::<T>(v) {
1329 Some(date) => write!(f, "{date:?}"),
1330 None => {
1331 write!(
1332 f,
1333 "Cast error: Failed to convert {v} to temporal for {data_type}"
1334 )
1335 }
1336 }
1337 }
1338 DataType::Time32(_) | DataType::Time64(_) => {
1339 let v = self.value(index).to_i64().unwrap();
1340 match as_time::<T>(v) {
1341 Some(time) => write!(f, "{time:?}"),
1342 None => {
1343 write!(
1344 f,
1345 "Cast error: Failed to convert {v} to temporal for {data_type}"
1346 )
1347 }
1348 }
1349 }
1350 DataType::Timestamp(_, tz_string_opt) => {
1351 let v = self.value(index).to_i64().unwrap();
1352 match tz_string_opt {
1353 Some(tz_string) => {
1355 match tz_string.parse::<Tz>() {
1356 Ok(tz) => match as_datetime_with_timezone::<T>(v, tz) {
1358 Some(datetime) => write!(f, "{}", datetime.to_rfc3339()),
1359 None => write!(f, "null"),
1360 },
1361 Err(_) => match as_datetime::<T>(v) {
1363 Some(datetime) => {
1364 write!(f, "{datetime:?} (Unknown Time Zone '{tz_string}')")
1365 }
1366 None => write!(f, "null"),
1367 },
1368 }
1369 }
1370 None => match as_datetime::<T>(v) {
1372 Some(datetime) => write!(f, "{datetime:?}"),
1373 None => write!(f, "null"),
1374 },
1375 }
1376 }
1377 _ => std::fmt::Debug::fmt(&array.value(index), f),
1378 })?;
1379 write!(f, "]")
1380 }
1381}
1382
1383impl<'a, T: ArrowPrimitiveType> IntoIterator for &'a PrimitiveArray<T> {
1384 type Item = Option<<T as ArrowPrimitiveType>::Native>;
1385 type IntoIter = PrimitiveIter<'a, T>;
1386
1387 fn into_iter(self) -> Self::IntoIter {
1388 PrimitiveIter::<'a, T>::new(self)
1389 }
1390}
1391
1392impl<'a, T: ArrowPrimitiveType> PrimitiveArray<T> {
1393 pub fn iter(&'a self) -> PrimitiveIter<'a, T> {
1395 PrimitiveIter::<'a, T>::new(self)
1396 }
1397}
1398
1399#[derive(Debug)]
1406pub struct NativeAdapter<T: ArrowPrimitiveType> {
1407 pub native: Option<T::Native>,
1409}
1410
1411macro_rules! def_from_for_primitive {
1412 ( $ty:ident, $tt:tt) => {
1413 impl From<$tt> for NativeAdapter<$ty> {
1414 fn from(value: $tt) -> Self {
1415 NativeAdapter {
1416 native: Some(value),
1417 }
1418 }
1419 }
1420 };
1421}
1422
1423def_from_for_primitive!(Int8Type, i8);
1424def_from_for_primitive!(Int16Type, i16);
1425def_from_for_primitive!(Int32Type, i32);
1426def_from_for_primitive!(Int64Type, i64);
1427def_from_for_primitive!(UInt8Type, u8);
1428def_from_for_primitive!(UInt16Type, u16);
1429def_from_for_primitive!(UInt32Type, u32);
1430def_from_for_primitive!(UInt64Type, u64);
1431def_from_for_primitive!(Float16Type, f16);
1432def_from_for_primitive!(Float32Type, f32);
1433def_from_for_primitive!(Float64Type, f64);
1434def_from_for_primitive!(Decimal32Type, i32);
1435def_from_for_primitive!(Decimal64Type, i64);
1436def_from_for_primitive!(Decimal128Type, i128);
1437def_from_for_primitive!(Decimal256Type, i256);
1438
1439impl<T: ArrowPrimitiveType> From<Option<<T as ArrowPrimitiveType>::Native>> for NativeAdapter<T> {
1440 fn from(value: Option<<T as ArrowPrimitiveType>::Native>) -> Self {
1441 NativeAdapter { native: value }
1442 }
1443}
1444
1445impl<T: ArrowPrimitiveType> From<&Option<<T as ArrowPrimitiveType>::Native>> for NativeAdapter<T> {
1446 fn from(value: &Option<<T as ArrowPrimitiveType>::Native>) -> Self {
1447 NativeAdapter { native: *value }
1448 }
1449}
1450
1451impl<T: ArrowPrimitiveType, Ptr: Into<NativeAdapter<T>>> FromIterator<Ptr> for PrimitiveArray<T> {
1452 fn from_iter<I: IntoIterator<Item = Ptr>>(iter: I) -> Self {
1453 let iter = iter.into_iter();
1454 let (lower, _) = iter.size_hint();
1455
1456 let mut null_builder = BooleanBufferBuilder::new(lower);
1457
1458 let buffer: Buffer = iter
1459 .map(|item| {
1460 if let Some(a) = item.into().native {
1461 null_builder.append(true);
1462 a
1463 } else {
1464 null_builder.append(false);
1465 T::Native::default()
1469 }
1470 })
1471 .collect();
1472
1473 let len = null_builder.len();
1474
1475 let data = unsafe {
1476 ArrayData::new_unchecked(
1477 T::DATA_TYPE,
1478 len,
1479 None,
1480 Some(null_builder.into()),
1481 0,
1482 vec![buffer],
1483 vec![],
1484 )
1485 };
1486 PrimitiveArray::from(data)
1487 }
1488}
1489
1490impl<T: ArrowPrimitiveType> PrimitiveArray<T> {
1491 #[inline]
1496 pub unsafe fn from_trusted_len_iter<I, P>(iter: I) -> Self
1497 where
1498 P: std::borrow::Borrow<Option<<T as ArrowPrimitiveType>::Native>>,
1499 I: IntoIterator<Item = P>,
1500 {
1501 let iterator = iter.into_iter();
1502 let (_, upper) = iterator.size_hint();
1503 let len = upper.expect("trusted_len_unzip requires an upper limit");
1504
1505 let (null, buffer) = unsafe { trusted_len_unzip(iterator) };
1506
1507 let data = unsafe {
1508 ArrayData::new_unchecked(T::DATA_TYPE, len, None, Some(null), 0, vec![buffer], vec![])
1509 };
1510 PrimitiveArray::from(data)
1511 }
1512}
1513
1514macro_rules! def_numeric_from_vec {
1518 ( $ty:ident ) => {
1519 impl From<Vec<<$ty as ArrowPrimitiveType>::Native>> for PrimitiveArray<$ty> {
1520 fn from(data: Vec<<$ty as ArrowPrimitiveType>::Native>) -> Self {
1521 let array_data = ArrayData::builder($ty::DATA_TYPE)
1522 .len(data.len())
1523 .add_buffer(Buffer::from_vec(data));
1524 let array_data = unsafe { array_data.build_unchecked() };
1525 PrimitiveArray::from(array_data)
1526 }
1527 }
1528
1529 impl From<Vec<Option<<$ty as ArrowPrimitiveType>::Native>>> for PrimitiveArray<$ty> {
1531 fn from(data: Vec<Option<<$ty as ArrowPrimitiveType>::Native>>) -> Self {
1532 PrimitiveArray::from_iter(data.iter())
1533 }
1534 }
1535 };
1536}
1537
1538def_numeric_from_vec!(Int8Type);
1539def_numeric_from_vec!(Int16Type);
1540def_numeric_from_vec!(Int32Type);
1541def_numeric_from_vec!(Int64Type);
1542def_numeric_from_vec!(UInt8Type);
1543def_numeric_from_vec!(UInt16Type);
1544def_numeric_from_vec!(UInt32Type);
1545def_numeric_from_vec!(UInt64Type);
1546def_numeric_from_vec!(Float16Type);
1547def_numeric_from_vec!(Float32Type);
1548def_numeric_from_vec!(Float64Type);
1549def_numeric_from_vec!(Decimal32Type);
1550def_numeric_from_vec!(Decimal64Type);
1551def_numeric_from_vec!(Decimal128Type);
1552def_numeric_from_vec!(Decimal256Type);
1553
1554def_numeric_from_vec!(Date32Type);
1555def_numeric_from_vec!(Date64Type);
1556def_numeric_from_vec!(Time32SecondType);
1557def_numeric_from_vec!(Time32MillisecondType);
1558def_numeric_from_vec!(Time64MicrosecondType);
1559def_numeric_from_vec!(Time64NanosecondType);
1560def_numeric_from_vec!(IntervalYearMonthType);
1561def_numeric_from_vec!(IntervalDayTimeType);
1562def_numeric_from_vec!(IntervalMonthDayNanoType);
1563def_numeric_from_vec!(DurationSecondType);
1564def_numeric_from_vec!(DurationMillisecondType);
1565def_numeric_from_vec!(DurationMicrosecondType);
1566def_numeric_from_vec!(DurationNanosecondType);
1567def_numeric_from_vec!(TimestampSecondType);
1568def_numeric_from_vec!(TimestampMillisecondType);
1569def_numeric_from_vec!(TimestampMicrosecondType);
1570def_numeric_from_vec!(TimestampNanosecondType);
1571
1572impl<T: ArrowTimestampType> PrimitiveArray<T> {
1573 pub fn timezone(&self) -> Option<&str> {
1575 match self.data_type() {
1576 DataType::Timestamp(_, tz) => tz.as_deref(),
1577 _ => unreachable!(),
1578 }
1579 }
1580
1581 pub fn with_timezone(self, timezone: impl Into<Arc<str>>) -> Self {
1583 self.with_timezone_opt(Some(timezone.into()))
1584 }
1585
1586 pub fn with_timezone_utc(self) -> Self {
1588 self.with_timezone("+00:00")
1589 }
1590
1591 pub fn with_timezone_opt<S: Into<Arc<str>>>(self, timezone: Option<S>) -> Self {
1593 Self {
1594 data_type: DataType::Timestamp(T::UNIT, timezone.map(Into::into)),
1595 ..self
1596 }
1597 }
1598}
1599
1600impl<T: ArrowPrimitiveType> From<ArrayData> for PrimitiveArray<T> {
1602 fn from(data: ArrayData) -> Self {
1603 Self::assert_compatible(data.data_type());
1604 assert_eq!(
1605 data.buffers().len(),
1606 1,
1607 "PrimitiveArray data should contain a single buffer only (values buffer)"
1608 );
1609
1610 let values = ScalarBuffer::new(data.buffers()[0].clone(), data.offset(), data.len());
1611 Self {
1612 data_type: data.data_type().clone(),
1613 values,
1614 nulls: data.nulls().cloned(),
1615 }
1616 }
1617}
1618
1619impl<T: DecimalType + ArrowPrimitiveType> PrimitiveArray<T> {
1620 pub fn with_precision_and_scale(self, precision: u8, scale: i8) -> Result<Self, ArrowError> {
1625 validate_decimal_precision_and_scale::<T>(precision, scale)?;
1626 Ok(Self {
1627 data_type: T::TYPE_CONSTRUCTOR(precision, scale),
1628 ..self
1629 })
1630 }
1631
1632 pub fn validate_decimal_precision(&self, precision: u8) -> Result<(), ArrowError> {
1635 if precision < self.scale() as u8 {
1636 return Err(ArrowError::InvalidArgumentError(format!(
1637 "Decimal precision {precision} is less than scale {}",
1638 self.scale()
1639 )));
1640 }
1641 (0..self.len()).try_for_each(|idx| {
1642 if self.is_valid(idx) {
1643 let decimal = unsafe { self.value_unchecked(idx) };
1644 T::validate_decimal_precision(decimal, precision, self.scale())
1645 } else {
1646 Ok(())
1647 }
1648 })
1649 }
1650
1651 pub fn null_if_overflow_precision(&self, precision: u8) -> Self {
1654 self.unary_opt::<_, T>(|v| T::is_valid_decimal_precision(v, precision).then_some(v))
1655 }
1656
1657 pub fn value_as_string(&self, row: usize) -> String {
1659 T::format_decimal(self.value(row), self.precision(), self.scale())
1660 }
1661
1662 pub fn precision(&self) -> u8 {
1664 match T::BYTE_LENGTH {
1665 4 => {
1666 if let DataType::Decimal32(p, _) = self.data_type() {
1667 *p
1668 } else {
1669 unreachable!(
1670 "Decimal32Array datatype is not DataType::Decimal32 but {}",
1671 self.data_type()
1672 )
1673 }
1674 }
1675 8 => {
1676 if let DataType::Decimal64(p, _) = self.data_type() {
1677 *p
1678 } else {
1679 unreachable!(
1680 "Decimal64Array datatype is not DataType::Decimal64 but {}",
1681 self.data_type()
1682 )
1683 }
1684 }
1685 16 => {
1686 if let DataType::Decimal128(p, _) = self.data_type() {
1687 *p
1688 } else {
1689 unreachable!(
1690 "Decimal128Array datatype is not DataType::Decimal128 but {}",
1691 self.data_type()
1692 )
1693 }
1694 }
1695 32 => {
1696 if let DataType::Decimal256(p, _) = self.data_type() {
1697 *p
1698 } else {
1699 unreachable!(
1700 "Decimal256Array datatype is not DataType::Decimal256 but {}",
1701 self.data_type()
1702 )
1703 }
1704 }
1705 other => unreachable!("Unsupported byte length for decimal array {}", other),
1706 }
1707 }
1708
1709 pub fn scale(&self) -> i8 {
1711 match T::BYTE_LENGTH {
1712 4 => {
1713 if let DataType::Decimal32(_, s) = self.data_type() {
1714 *s
1715 } else {
1716 unreachable!(
1717 "Decimal32Array datatype is not DataType::Decimal32 but {}",
1718 self.data_type()
1719 )
1720 }
1721 }
1722 8 => {
1723 if let DataType::Decimal64(_, s) = self.data_type() {
1724 *s
1725 } else {
1726 unreachable!(
1727 "Decimal64Array datatype is not DataType::Decimal64 but {}",
1728 self.data_type()
1729 )
1730 }
1731 }
1732 16 => {
1733 if let DataType::Decimal128(_, s) = self.data_type() {
1734 *s
1735 } else {
1736 unreachable!(
1737 "Decimal128Array datatype is not DataType::Decimal128 but {}",
1738 self.data_type()
1739 )
1740 }
1741 }
1742 32 => {
1743 if let DataType::Decimal256(_, s) = self.data_type() {
1744 *s
1745 } else {
1746 unreachable!(
1747 "Decimal256Array datatype is not DataType::Decimal256 but {}",
1748 self.data_type()
1749 )
1750 }
1751 }
1752 other => unreachable!("Unsupported byte length for decimal array {}", other),
1753 }
1754 }
1755}
1756
1757#[cfg(test)]
1758mod tests {
1759 use super::*;
1760 use crate::BooleanArray;
1761 use crate::builder::{
1762 Decimal32Builder, Decimal64Builder, Decimal128Builder, Decimal256Builder,
1763 };
1764 use crate::cast::downcast_array;
1765 use arrow_buffer::{IntervalDayTime, IntervalMonthDayNano};
1766 use arrow_schema::TimeUnit;
1767
1768 #[test]
1769 fn test_primitive_array_from_vec() {
1770 let buf = Buffer::from_slice_ref([0, 1, 2, 3, 4]);
1771 let arr = Int32Array::from(vec![0, 1, 2, 3, 4]);
1772 assert_eq!(&buf, arr.values.inner());
1773 assert_eq!(5, arr.len());
1774 assert_eq!(0, arr.offset());
1775 assert_eq!(0, arr.null_count());
1776 for i in 0..5 {
1777 assert!(!arr.is_null(i));
1778 assert!(arr.is_valid(i));
1779 assert_eq!(i as i32, arr.value(i));
1780 }
1781 }
1782
1783 #[test]
1784 fn test_primitive_array_from_vec_option() {
1785 let arr = Int32Array::from(vec![Some(0), None, Some(2), None, Some(4)]);
1787 assert_eq!(5, arr.len());
1788 assert_eq!(0, arr.offset());
1789 assert_eq!(2, arr.null_count());
1790 for i in 0..5 {
1791 if i % 2 == 0 {
1792 assert!(!arr.is_null(i));
1793 assert!(arr.is_valid(i));
1794 assert_eq!(i as i32, arr.value(i));
1795 } else {
1796 assert!(arr.is_null(i));
1797 assert!(!arr.is_valid(i));
1798 }
1799 }
1800 }
1801
1802 #[test]
1803 fn test_date64_array_from_vec_option() {
1804 let arr: PrimitiveArray<Date64Type> =
1808 vec![Some(1550902545147), None, Some(1550902545147)].into();
1809 assert_eq!(3, arr.len());
1810 assert_eq!(0, arr.offset());
1811 assert_eq!(1, arr.null_count());
1812 for i in 0..3 {
1813 if i % 2 == 0 {
1814 assert!(!arr.is_null(i));
1815 assert!(arr.is_valid(i));
1816 assert_eq!(1550902545147, arr.value(i));
1817 assert_eq!(
1819 1550902545147,
1820 arr.value_as_datetime(i)
1821 .unwrap()
1822 .and_utc()
1823 .timestamp_millis()
1824 );
1825 } else {
1826 assert!(arr.is_null(i));
1827 assert!(!arr.is_valid(i));
1828 }
1829 }
1830 }
1831
1832 #[test]
1833 fn test_time32_millisecond_array_from_vec() {
1834 let arr: PrimitiveArray<Time32MillisecondType> = vec![1, 37_800_005, 86_399_210].into();
1838 assert_eq!(3, arr.len());
1839 assert_eq!(0, arr.offset());
1840 assert_eq!(0, arr.null_count());
1841 let formatted = ["00:00:00.001", "10:30:00.005", "23:59:59.210"];
1842 for (i, formatted) in formatted.iter().enumerate().take(3) {
1843 assert_eq!(None, arr.value_as_datetime(i));
1845 assert_eq!(None, arr.value_as_date(i));
1846 let time = arr.value_as_time(i).unwrap();
1847 assert_eq!(*formatted, time.format("%H:%M:%S%.3f").to_string());
1848 }
1849 }
1850
1851 #[test]
1852 fn test_time64_nanosecond_array_from_vec() {
1853 let arr: PrimitiveArray<Time64NanosecondType> =
1861 vec![1_000_000, 37_800_005_000_000, 86_399_210_000_000].into();
1862 assert_eq!(3, arr.len());
1863 assert_eq!(0, arr.offset());
1864 assert_eq!(0, arr.null_count());
1865 let formatted = ["00:00:00.001", "10:30:00.005", "23:59:59.210"];
1866 for (i, item) in formatted.iter().enumerate().take(3) {
1867 assert_eq!(None, arr.value_as_datetime(i));
1869 assert_eq!(None, arr.value_as_date(i));
1870 let time = arr.value_as_time(i).unwrap();
1871 assert_eq!(*item, time.format("%H:%M:%S%.3f").to_string());
1872 }
1873 }
1874
1875 #[test]
1876 fn test_interval_array_from_vec() {
1877 let arr = IntervalYearMonthArray::from(vec![Some(1), None, Some(-5)]);
1879 assert_eq!(3, arr.len());
1880 assert_eq!(0, arr.offset());
1881 assert_eq!(1, arr.null_count());
1882 assert_eq!(1, arr.value(0));
1883 assert_eq!(1, arr.values()[0]);
1884 assert!(arr.is_null(1));
1885 assert_eq!(-5, arr.value(2));
1886 assert_eq!(-5, arr.values()[2]);
1887
1888 let v0 = IntervalDayTime {
1889 days: 34,
1890 milliseconds: 1,
1891 };
1892 let v2 = IntervalDayTime {
1893 days: -2,
1894 milliseconds: -5,
1895 };
1896
1897 let arr = IntervalDayTimeArray::from(vec![Some(v0), None, Some(v2)]);
1898
1899 assert_eq!(3, arr.len());
1900 assert_eq!(0, arr.offset());
1901 assert_eq!(1, arr.null_count());
1902 assert_eq!(v0, arr.value(0));
1903 assert_eq!(v0, arr.values()[0]);
1904 assert!(arr.is_null(1));
1905 assert_eq!(v2, arr.value(2));
1906 assert_eq!(v2, arr.values()[2]);
1907
1908 let v0 = IntervalMonthDayNano {
1909 months: 2,
1910 days: 34,
1911 nanoseconds: -1,
1912 };
1913 let v2 = IntervalMonthDayNano {
1914 months: -3,
1915 days: -2,
1916 nanoseconds: 4,
1917 };
1918
1919 let arr = IntervalMonthDayNanoArray::from(vec![Some(v0), None, Some(v2)]);
1920 assert_eq!(3, arr.len());
1921 assert_eq!(0, arr.offset());
1922 assert_eq!(1, arr.null_count());
1923 assert_eq!(v0, arr.value(0));
1924 assert_eq!(v0, arr.values()[0]);
1925 assert!(arr.is_null(1));
1926 assert_eq!(v2, arr.value(2));
1927 assert_eq!(v2, arr.values()[2]);
1928 }
1929
1930 #[test]
1931 fn test_duration_array_from_vec() {
1932 let arr = DurationSecondArray::from(vec![Some(1), None, Some(-5)]);
1933 assert_eq!(3, arr.len());
1934 assert_eq!(0, arr.offset());
1935 assert_eq!(1, arr.null_count());
1936 assert_eq!(1, arr.value(0));
1937 assert_eq!(1, arr.values()[0]);
1938 assert!(arr.is_null(1));
1939 assert_eq!(-5, arr.value(2));
1940 assert_eq!(-5, arr.values()[2]);
1941
1942 let arr = DurationMillisecondArray::from(vec![Some(1), None, Some(-5)]);
1943 assert_eq!(3, arr.len());
1944 assert_eq!(0, arr.offset());
1945 assert_eq!(1, arr.null_count());
1946 assert_eq!(1, arr.value(0));
1947 assert_eq!(1, arr.values()[0]);
1948 assert!(arr.is_null(1));
1949 assert_eq!(-5, arr.value(2));
1950 assert_eq!(-5, arr.values()[2]);
1951
1952 let arr = DurationMicrosecondArray::from(vec![Some(1), None, Some(-5)]);
1953 assert_eq!(3, arr.len());
1954 assert_eq!(0, arr.offset());
1955 assert_eq!(1, arr.null_count());
1956 assert_eq!(1, arr.value(0));
1957 assert_eq!(1, arr.values()[0]);
1958 assert!(arr.is_null(1));
1959 assert_eq!(-5, arr.value(2));
1960 assert_eq!(-5, arr.values()[2]);
1961
1962 let arr = DurationNanosecondArray::from(vec![Some(1), None, Some(-5)]);
1963 assert_eq!(3, arr.len());
1964 assert_eq!(0, arr.offset());
1965 assert_eq!(1, arr.null_count());
1966 assert_eq!(1, arr.value(0));
1967 assert_eq!(1, arr.values()[0]);
1968 assert!(arr.is_null(1));
1969 assert_eq!(-5, arr.value(2));
1970 assert_eq!(-5, arr.values()[2]);
1971 }
1972
1973 #[test]
1974 fn test_timestamp_array_from_vec() {
1975 let arr = TimestampSecondArray::from(vec![1, -5]);
1976 assert_eq!(2, arr.len());
1977 assert_eq!(0, arr.offset());
1978 assert_eq!(0, arr.null_count());
1979 assert_eq!(1, arr.value(0));
1980 assert_eq!(-5, arr.value(1));
1981 assert_eq!(&[1, -5], arr.values());
1982
1983 let arr = TimestampMillisecondArray::from(vec![1, -5]);
1984 assert_eq!(2, arr.len());
1985 assert_eq!(0, arr.offset());
1986 assert_eq!(0, arr.null_count());
1987 assert_eq!(1, arr.value(0));
1988 assert_eq!(-5, arr.value(1));
1989 assert_eq!(&[1, -5], arr.values());
1990
1991 let arr = TimestampMicrosecondArray::from(vec![1, -5]);
1992 assert_eq!(2, arr.len());
1993 assert_eq!(0, arr.offset());
1994 assert_eq!(0, arr.null_count());
1995 assert_eq!(1, arr.value(0));
1996 assert_eq!(-5, arr.value(1));
1997 assert_eq!(&[1, -5], arr.values());
1998
1999 let arr = TimestampNanosecondArray::from(vec![1, -5]);
2000 assert_eq!(2, arr.len());
2001 assert_eq!(0, arr.offset());
2002 assert_eq!(0, arr.null_count());
2003 assert_eq!(1, arr.value(0));
2004 assert_eq!(-5, arr.value(1));
2005 assert_eq!(&[1, -5], arr.values());
2006 }
2007
2008 #[test]
2009 fn test_primitive_array_slice() {
2010 let arr = Int32Array::from(vec![
2011 Some(0),
2012 None,
2013 Some(2),
2014 None,
2015 Some(4),
2016 Some(5),
2017 Some(6),
2018 None,
2019 None,
2020 ]);
2021 assert_eq!(9, arr.len());
2022 assert_eq!(0, arr.offset());
2023 assert_eq!(4, arr.null_count());
2024
2025 let arr2 = arr.slice(2, 5);
2026 assert_eq!(5, arr2.len());
2027 assert_eq!(1, arr2.null_count());
2028
2029 for i in 0..arr2.len() {
2030 assert_eq!(i == 1, arr2.is_null(i));
2031 assert_eq!(i != 1, arr2.is_valid(i));
2032 }
2033 let int_arr2 = arr2.as_any().downcast_ref::<Int32Array>().unwrap();
2034 assert_eq!(2, int_arr2.values()[0]);
2035 assert_eq!(&[4, 5, 6], &int_arr2.values()[2..5]);
2036
2037 let arr3 = arr2.slice(2, 3);
2038 assert_eq!(3, arr3.len());
2039 assert_eq!(0, arr3.null_count());
2040
2041 let int_arr3 = arr3.as_any().downcast_ref::<Int32Array>().unwrap();
2042 assert_eq!(&[4, 5, 6], int_arr3.values());
2043 assert_eq!(4, int_arr3.value(0));
2044 assert_eq!(5, int_arr3.value(1));
2045 assert_eq!(6, int_arr3.value(2));
2046 }
2047
2048 #[test]
2049 fn test_boolean_array_slice() {
2050 let arr = BooleanArray::from(vec![
2051 Some(true),
2052 None,
2053 Some(false),
2054 None,
2055 Some(true),
2056 Some(false),
2057 Some(true),
2058 Some(false),
2059 None,
2060 Some(true),
2061 ]);
2062
2063 assert_eq!(10, arr.len());
2064 assert_eq!(0, arr.offset());
2065 assert_eq!(3, arr.null_count());
2066
2067 let arr2 = arr.slice(3, 5);
2068 assert_eq!(5, arr2.len());
2069 assert_eq!(3, arr2.offset());
2070 assert_eq!(1, arr2.null_count());
2071
2072 let bool_arr = arr2.as_any().downcast_ref::<BooleanArray>().unwrap();
2073
2074 assert!(!bool_arr.is_valid(0));
2075
2076 assert!(bool_arr.is_valid(1));
2077 assert!(bool_arr.value(1));
2078
2079 assert!(bool_arr.is_valid(2));
2080 assert!(!bool_arr.value(2));
2081
2082 assert!(bool_arr.is_valid(3));
2083 assert!(bool_arr.value(3));
2084
2085 assert!(bool_arr.is_valid(4));
2086 assert!(!bool_arr.value(4));
2087 }
2088
2089 #[test]
2090 fn test_int32_fmt_debug() {
2091 let arr = Int32Array::from(vec![0, 1, 2, 3, 4]);
2092 assert_eq!(
2093 "PrimitiveArray<Int32>\n[\n 0,\n 1,\n 2,\n 3,\n 4,\n]",
2094 format!("{arr:?}")
2095 );
2096 }
2097
2098 #[test]
2099 fn test_fmt_debug_up_to_20_elements() {
2100 (1..=20).for_each(|i| {
2101 let values = (0..i).collect::<Vec<i16>>();
2102 let array_expected = format!(
2103 "PrimitiveArray<Int16>\n[\n{}\n]",
2104 values
2105 .iter()
2106 .map(|v| { format!(" {v},") })
2107 .collect::<Vec<String>>()
2108 .join("\n")
2109 );
2110 let array = Int16Array::from(values);
2111
2112 assert_eq!(array_expected, format!("{array:?}"));
2113 })
2114 }
2115
2116 #[test]
2117 fn test_int32_with_null_fmt_debug() {
2118 let mut builder = Int32Array::builder(3);
2119 builder.append_slice(&[0, 1]);
2120 builder.append_null();
2121 builder.append_slice(&[3, 4]);
2122 let arr = builder.finish();
2123 assert_eq!(
2124 "PrimitiveArray<Int32>\n[\n 0,\n 1,\n null,\n 3,\n 4,\n]",
2125 format!("{arr:?}")
2126 );
2127 }
2128
2129 #[test]
2130 fn test_timestamp_fmt_debug() {
2131 let arr: PrimitiveArray<TimestampMillisecondType> =
2132 TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000]);
2133 assert_eq!(
2134 "PrimitiveArray<Timestamp(ms)>\n[\n 2018-12-31T00:00:00,\n 2018-12-31T00:00:00,\n 1921-01-02T00:00:00,\n]",
2135 format!("{arr:?}")
2136 );
2137 }
2138
2139 #[test]
2140 fn test_timestamp_utc_fmt_debug() {
2141 let arr: PrimitiveArray<TimestampMillisecondType> =
2142 TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2143 .with_timezone_utc();
2144 assert_eq!(
2145 "PrimitiveArray<Timestamp(ms, \"+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]",
2146 format!("{arr:?}")
2147 );
2148 }
2149
2150 #[test]
2151 #[cfg(feature = "chrono-tz")]
2152 fn test_timestamp_with_named_tz_fmt_debug() {
2153 let arr: PrimitiveArray<TimestampMillisecondType> =
2154 TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2155 .with_timezone("Asia/Taipei".to_string());
2156 assert_eq!(
2157 "PrimitiveArray<Timestamp(ms, \"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]",
2158 format!("{arr:?}")
2159 );
2160 }
2161
2162 #[test]
2163 #[cfg(not(feature = "chrono-tz"))]
2164 fn test_timestamp_with_named_tz_fmt_debug() {
2165 let arr: PrimitiveArray<TimestampMillisecondType> =
2166 TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2167 .with_timezone("Asia/Taipei".to_string());
2168
2169 println!("{arr:?}");
2170
2171 assert_eq!(
2172 "PrimitiveArray<Timestamp(ms, \"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]",
2173 format!("{arr:?}")
2174 );
2175 }
2176
2177 #[test]
2178 fn test_timestamp_with_fixed_offset_tz_fmt_debug() {
2179 let arr: PrimitiveArray<TimestampMillisecondType> =
2180 TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2181 .with_timezone("+08:00".to_string());
2182 assert_eq!(
2183 "PrimitiveArray<Timestamp(ms, \"+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]",
2184 format!("{arr:?}")
2185 );
2186 }
2187
2188 #[test]
2189 fn test_timestamp_with_incorrect_tz_fmt_debug() {
2190 let arr: PrimitiveArray<TimestampMillisecondType> =
2191 TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2192 .with_timezone("xxx".to_string());
2193 assert_eq!(
2194 "PrimitiveArray<Timestamp(ms, \"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]",
2195 format!("{arr:?}")
2196 );
2197 }
2198
2199 #[test]
2200 #[cfg(feature = "chrono-tz")]
2201 fn test_timestamp_with_tz_with_daylight_saving_fmt_debug() {
2202 let arr: PrimitiveArray<TimestampMillisecondType> = TimestampMillisecondArray::from(vec![
2203 1647161999000,
2204 1647162000000,
2205 1667717999000,
2206 1667718000000,
2207 ])
2208 .with_timezone("America/Denver".to_string());
2209 assert_eq!(
2210 "PrimitiveArray<Timestamp(ms, \"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]",
2211 format!("{arr:?}")
2212 );
2213 }
2214
2215 #[test]
2216 fn test_date32_fmt_debug() {
2217 let arr: PrimitiveArray<Date32Type> = vec![12356, 13548, -365].into();
2218 assert_eq!(
2219 "PrimitiveArray<Date32>\n[\n 2003-10-31,\n 2007-02-04,\n 1969-01-01,\n]",
2220 format!("{arr:?}")
2221 );
2222 }
2223
2224 #[test]
2225 fn test_time32second_fmt_debug() {
2226 let arr: PrimitiveArray<Time32SecondType> = vec![7201, 60054].into();
2227 assert_eq!(
2228 "PrimitiveArray<Time32(s)>\n[\n 02:00:01,\n 16:40:54,\n]",
2229 format!("{arr:?}")
2230 );
2231 }
2232
2233 #[test]
2234 fn test_time32second_invalid_neg() {
2235 let arr: PrimitiveArray<Time32SecondType> = vec![-7201, -60054].into();
2237 assert_eq!(
2238 "PrimitiveArray<Time32(s)>\n[\n Cast error: Failed to convert -7201 to temporal for Time32(s),\n Cast error: Failed to convert -60054 to temporal for Time32(s),\n]",
2239 format!("{arr:?}")
2241 )
2242 }
2243
2244 #[test]
2245 fn test_timestamp_micros_out_of_range() {
2246 let arr: PrimitiveArray<TimestampMicrosecondType> = vec![9065525203050843594].into();
2248 assert_eq!(
2249 "PrimitiveArray<Timestamp(µs)>\n[\n null,\n]",
2250 format!("{arr:?}")
2251 )
2252 }
2253
2254 #[test]
2255 fn test_primitive_array_builder() {
2256 let buf = Buffer::from_slice_ref([0i32, 1, 2, 3, 4, 5, 6]);
2258 let buf2 = buf.slice_with_length(8, 20);
2259 let data = ArrayData::builder(DataType::Int32)
2260 .len(5)
2261 .offset(2)
2262 .add_buffer(buf)
2263 .build()
2264 .unwrap();
2265 let arr = Int32Array::from(data);
2266 assert_eq!(&buf2, arr.values.inner());
2267 assert_eq!(5, arr.len());
2268 assert_eq!(0, arr.null_count());
2269 for i in 0..3 {
2270 assert_eq!((i + 2) as i32, arr.value(i));
2271 }
2272 }
2273
2274 #[test]
2275 fn test_primitive_from_iter_values() {
2276 let arr: PrimitiveArray<Int32Type> = PrimitiveArray::from_iter_values(0..10);
2278 assert_eq!(10, arr.len());
2279 assert_eq!(0, arr.null_count());
2280 for i in 0..10i32 {
2281 assert_eq!(i, arr.value(i as usize));
2282 }
2283 }
2284
2285 #[test]
2286 fn test_primitive_array_from_unbound_iter() {
2287 let value_iter = (0..)
2289 .scan(0usize, |pos, i| {
2290 if *pos < 10 {
2291 *pos += 1;
2292 Some(Some(i))
2293 } else {
2294 None
2296 }
2297 })
2298 .take(100);
2300
2301 let (_, upper_size_bound) = value_iter.size_hint();
2302 assert_eq!(upper_size_bound, Some(100));
2304 let primitive_array: PrimitiveArray<Int32Type> = value_iter.collect();
2305 assert_eq!(primitive_array.len(), 10);
2307 }
2308
2309 #[test]
2310 fn test_primitive_array_from_non_null_iter() {
2311 let iter = (0..10_i32).map(Some);
2312 let primitive_array = PrimitiveArray::<Int32Type>::from_iter(iter);
2313 assert_eq!(primitive_array.len(), 10);
2314 assert_eq!(primitive_array.null_count(), 0);
2315 assert!(primitive_array.nulls().is_none());
2316 assert_eq!(primitive_array.values(), &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
2317 }
2318
2319 #[test]
2320 #[should_panic(expected = "PrimitiveArray data should contain a single buffer only \
2321 (values buffer)")]
2322 #[cfg(not(feature = "force_validate"))]
2325 fn test_primitive_array_invalid_buffer_len() {
2326 let buffer = Buffer::from_slice_ref([0i32, 1, 2, 3, 4]);
2327 let data = unsafe {
2328 ArrayData::builder(DataType::Int32)
2329 .add_buffer(buffer.clone())
2330 .add_buffer(buffer)
2331 .len(5)
2332 .build_unchecked()
2333 };
2334
2335 drop(Int32Array::from(data));
2336 }
2337
2338 #[test]
2339 fn test_access_array_concurrently() {
2340 let a = Int32Array::from(vec![5, 6, 7, 8, 9]);
2341 let ret = std::thread::spawn(move || a.value(3)).join();
2342
2343 assert!(ret.is_ok());
2344 assert_eq!(8, ret.ok().unwrap());
2345 }
2346
2347 #[test]
2348 fn test_primitive_array_creation() {
2349 let array1: Int8Array = [10_i8, 11, 12, 13, 14].into_iter().collect();
2350 let array2: Int8Array = [10_i8, 11, 12, 13, 14].into_iter().map(Some).collect();
2351
2352 assert_eq!(array1, array2);
2353 }
2354
2355 #[test]
2356 #[should_panic(
2357 expected = "Trying to access an element at index 4 from a PrimitiveArray of length 3"
2358 )]
2359 fn test_string_array_get_value_index_out_of_bound() {
2360 let array: Int8Array = [10_i8, 11, 12].into_iter().collect();
2361
2362 array.value(4);
2363 }
2364
2365 #[test]
2366 #[should_panic(expected = "PrimitiveArray expected data type Int64 got Int32")]
2367 fn test_from_array_data_validation() {
2368 let foo = PrimitiveArray::<Int32Type>::from_iter([1, 2, 3]);
2369 let _ = PrimitiveArray::<Int64Type>::from(foo.into_data());
2370 }
2371
2372 #[test]
2373 fn test_decimal32() {
2374 let values: Vec<_> = vec![0, 1, -1, i32::MIN, i32::MAX];
2375 let array: PrimitiveArray<Decimal32Type> =
2376 PrimitiveArray::from_iter(values.iter().copied());
2377 assert_eq!(array.values(), &values);
2378
2379 let array: PrimitiveArray<Decimal32Type> =
2380 PrimitiveArray::from_iter_values(values.iter().copied());
2381 assert_eq!(array.values(), &values);
2382
2383 let array = PrimitiveArray::<Decimal32Type>::from(values.clone());
2384 assert_eq!(array.values(), &values);
2385
2386 let array = PrimitiveArray::<Decimal32Type>::from(array.to_data());
2387 assert_eq!(array.values(), &values);
2388 }
2389
2390 #[test]
2391 fn test_decimal64() {
2392 let values: Vec<_> = vec![0, 1, -1, i64::MIN, i64::MAX];
2393 let array: PrimitiveArray<Decimal64Type> =
2394 PrimitiveArray::from_iter(values.iter().copied());
2395 assert_eq!(array.values(), &values);
2396
2397 let array: PrimitiveArray<Decimal64Type> =
2398 PrimitiveArray::from_iter_values(values.iter().copied());
2399 assert_eq!(array.values(), &values);
2400
2401 let array = PrimitiveArray::<Decimal64Type>::from(values.clone());
2402 assert_eq!(array.values(), &values);
2403
2404 let array = PrimitiveArray::<Decimal64Type>::from(array.to_data());
2405 assert_eq!(array.values(), &values);
2406 }
2407
2408 #[test]
2409 fn test_decimal128() {
2410 let values: Vec<_> = vec![0, 1, -1, i128::MIN, i128::MAX];
2411 let array: PrimitiveArray<Decimal128Type> =
2412 PrimitiveArray::from_iter(values.iter().copied());
2413 assert_eq!(array.values(), &values);
2414
2415 let array: PrimitiveArray<Decimal128Type> =
2416 PrimitiveArray::from_iter_values(values.iter().copied());
2417 assert_eq!(array.values(), &values);
2418
2419 let array = PrimitiveArray::<Decimal128Type>::from(values.clone());
2420 assert_eq!(array.values(), &values);
2421
2422 let array = PrimitiveArray::<Decimal128Type>::from(array.to_data());
2423 assert_eq!(array.values(), &values);
2424 }
2425
2426 #[test]
2427 fn test_decimal256() {
2428 let values: Vec<_> = vec![i256::ZERO, i256::ONE, i256::MINUS_ONE, i256::MIN, i256::MAX];
2429
2430 let array: PrimitiveArray<Decimal256Type> =
2431 PrimitiveArray::from_iter(values.iter().copied());
2432 assert_eq!(array.values(), &values);
2433
2434 let array: PrimitiveArray<Decimal256Type> =
2435 PrimitiveArray::from_iter_values(values.iter().copied());
2436 assert_eq!(array.values(), &values);
2437
2438 let array = PrimitiveArray::<Decimal256Type>::from(values.clone());
2439 assert_eq!(array.values(), &values);
2440
2441 let array = PrimitiveArray::<Decimal256Type>::from(array.to_data());
2442 assert_eq!(array.values(), &values);
2443 }
2444
2445 #[test]
2446 fn test_decimal_array() {
2447 let values: [u8; 32] = [
2450 192, 219, 180, 17, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 36, 75, 238, 253, 255, 255,
2451 255, 255, 255, 255, 255, 255, 255, 255, 255,
2452 ];
2453 let array_data = ArrayData::builder(DataType::Decimal128(38, 6))
2454 .len(2)
2455 .add_buffer(Buffer::from(&values))
2456 .build()
2457 .unwrap();
2458 let decimal_array = Decimal128Array::from(array_data);
2459 assert_eq!(8_887_000_000_i128, decimal_array.value(0));
2460 assert_eq!(-8_887_000_000_i128, decimal_array.value(1));
2461 }
2462
2463 #[test]
2464 fn test_decimal_append_error_value() {
2465 let mut decimal_builder = Decimal128Builder::with_capacity(10);
2466 decimal_builder.append_value(123456);
2467 decimal_builder.append_value(12345);
2468 let result = decimal_builder.finish().with_precision_and_scale(5, 3);
2469 assert!(result.is_ok());
2470 let arr = result.unwrap();
2471 assert_eq!("12.345", arr.value_as_string(1));
2472
2473 let result = arr.validate_decimal_precision(5);
2475 let error = result.unwrap_err();
2476 assert_eq!(
2477 "Invalid argument error: 123.456 is too large to store in a Decimal128 of precision 5. Max is 99.999",
2478 error.to_string()
2479 );
2480
2481 decimal_builder = Decimal128Builder::new();
2482 decimal_builder.append_value(100);
2483 decimal_builder.append_value(99);
2484 decimal_builder.append_value(-100);
2485 decimal_builder.append_value(-99);
2486 let result = decimal_builder.finish().with_precision_and_scale(2, 1);
2487 assert!(result.is_ok());
2488 let arr = result.unwrap();
2489 assert_eq!("9.9", arr.value_as_string(1));
2490 assert_eq!("-9.9", arr.value_as_string(3));
2491
2492 let result = arr.validate_decimal_precision(2);
2494 let error = result.unwrap_err();
2495 assert_eq!(
2496 "Invalid argument error: 10.0 is too large to store in a Decimal128 of precision 2. Max is 9.9",
2497 error.to_string()
2498 );
2499 }
2500
2501 #[test]
2502 fn test_decimal_from_iter_values() {
2503 let array = Decimal128Array::from_iter_values(vec![-100, 0, 101]);
2504 assert_eq!(array.len(), 3);
2505 assert_eq!(array.data_type(), &DataType::Decimal128(38, 10));
2506 assert_eq!(-100_i128, array.value(0));
2507 assert!(!array.is_null(0));
2508 assert_eq!(0_i128, array.value(1));
2509 assert!(!array.is_null(1));
2510 assert_eq!(101_i128, array.value(2));
2511 assert!(!array.is_null(2));
2512 }
2513
2514 #[test]
2515 fn test_decimal_from_iter() {
2516 let array: Decimal128Array = vec![Some(-100), None, Some(101)].into_iter().collect();
2517 assert_eq!(array.len(), 3);
2518 assert_eq!(array.data_type(), &DataType::Decimal128(38, 10));
2519 assert_eq!(-100_i128, array.value(0));
2520 assert!(!array.is_null(0));
2521 assert!(array.is_null(1));
2522 assert_eq!(101_i128, array.value(2));
2523 assert!(!array.is_null(2));
2524 }
2525
2526 #[test]
2527 fn test_decimal_iter_sized() {
2528 let data = vec![Some(-100), None, Some(101)];
2529 let array: Decimal128Array = data.into_iter().collect();
2530 let mut iter = array.into_iter();
2531
2532 assert_eq!(array.len(), 3);
2534
2535 assert_eq!(iter.size_hint(), (3, Some(3)));
2537 iter.next().unwrap();
2538 assert_eq!(iter.size_hint(), (2, Some(2)));
2539 iter.next().unwrap();
2540 iter.next().unwrap();
2541 assert_eq!(iter.size_hint(), (0, Some(0)));
2542 assert!(iter.next().is_none());
2543 assert_eq!(iter.size_hint(), (0, Some(0)));
2544 }
2545
2546 #[test]
2547 fn test_decimal_array_value_as_string() {
2548 let arr = [123450, -123450, 100, -100, 10, -10, 0]
2549 .into_iter()
2550 .map(Some)
2551 .collect::<Decimal128Array>()
2552 .with_precision_and_scale(6, 3)
2553 .unwrap();
2554
2555 assert_eq!("123.450", arr.value_as_string(0));
2556 assert_eq!("-123.450", arr.value_as_string(1));
2557 assert_eq!("0.100", arr.value_as_string(2));
2558 assert_eq!("-0.100", arr.value_as_string(3));
2559 assert_eq!("0.010", arr.value_as_string(4));
2560 assert_eq!("-0.010", arr.value_as_string(5));
2561 assert_eq!("0.000", arr.value_as_string(6));
2562 }
2563
2564 #[test]
2565 fn test_decimal_array_with_precision_and_scale() {
2566 let arr = Decimal128Array::from_iter_values([12345, 456, 7890, -123223423432432])
2567 .with_precision_and_scale(20, 2)
2568 .unwrap();
2569
2570 assert_eq!(arr.data_type(), &DataType::Decimal128(20, 2));
2571 assert_eq!(arr.precision(), 20);
2572 assert_eq!(arr.scale(), 2);
2573
2574 let actual: Vec<_> = (0..arr.len()).map(|i| arr.value_as_string(i)).collect();
2575 let expected = vec!["123.45", "4.56", "78.90", "-1232234234324.32"];
2576
2577 assert_eq!(actual, expected);
2578 }
2579
2580 #[test]
2581 #[should_panic(
2582 expected = "-1232234234324.32 is too small to store in a Decimal128 of precision 5. Min is -999.99"
2583 )]
2584 fn test_decimal_array_with_precision_and_scale_out_of_range() {
2585 let arr = Decimal128Array::from_iter_values([12345, 456, 7890, -123223423432432])
2586 .with_precision_and_scale(5, 2)
2588 .unwrap();
2589 arr.validate_decimal_precision(5).unwrap();
2590 }
2591
2592 #[test]
2593 #[should_panic(expected = "precision cannot be 0, has to be between [1, 38]")]
2594 fn test_decimal_array_with_precision_zero() {
2595 Decimal128Array::from_iter_values([12345, 456])
2596 .with_precision_and_scale(0, 2)
2597 .unwrap();
2598 }
2599
2600 #[test]
2601 #[should_panic(expected = "precision 40 is greater than max 38")]
2602 fn test_decimal_array_with_precision_and_scale_invalid_precision() {
2603 Decimal128Array::from_iter_values([12345, 456])
2604 .with_precision_and_scale(40, 2)
2605 .unwrap();
2606 }
2607
2608 #[test]
2609 #[should_panic(expected = "scale 40 is greater than max 38")]
2610 fn test_decimal_array_with_precision_and_scale_invalid_scale() {
2611 Decimal128Array::from_iter_values([12345, 456])
2612 .with_precision_and_scale(20, 40)
2613 .unwrap();
2614 }
2615
2616 #[test]
2617 #[should_panic(expected = "scale 10 is greater than precision 4")]
2618 fn test_decimal_array_with_precision_and_scale_invalid_precision_and_scale() {
2619 Decimal128Array::from_iter_values([12345, 456])
2620 .with_precision_and_scale(4, 10)
2621 .unwrap();
2622 }
2623
2624 #[test]
2625 fn test_decimal_array_set_null_if_overflow_with_precision() {
2626 let array = Decimal128Array::from(vec![Some(123456), Some(123), None, Some(123456)]);
2627 let result = array.null_if_overflow_precision(5);
2628 let expected = Decimal128Array::from(vec![None, Some(123), None, None]);
2629 assert_eq!(result, expected);
2630 }
2631
2632 #[test]
2633 fn test_decimal256_iter() {
2634 let mut builder = Decimal256Builder::with_capacity(30);
2635 let decimal1 = i256::from_i128(12345);
2636 builder.append_value(decimal1);
2637
2638 builder.append_null();
2639
2640 let decimal2 = i256::from_i128(56789);
2641 builder.append_value(decimal2);
2642
2643 let array: Decimal256Array = builder.finish().with_precision_and_scale(76, 6).unwrap();
2644
2645 let collected: Vec<_> = array.iter().collect();
2646 assert_eq!(vec![Some(decimal1), None, Some(decimal2)], collected);
2647 }
2648
2649 #[test]
2650 fn test_from_iter_decimal256array() {
2651 let value1 = i256::from_i128(12345);
2652 let value2 = i256::from_i128(56789);
2653
2654 let mut array: Decimal256Array =
2655 vec![Some(value1), None, Some(value2)].into_iter().collect();
2656 array = array.with_precision_and_scale(76, 10).unwrap();
2657 assert_eq!(array.len(), 3);
2658 assert_eq!(array.data_type(), &DataType::Decimal256(76, 10));
2659 assert_eq!(value1, array.value(0));
2660 assert!(!array.is_null(0));
2661 assert!(array.is_null(1));
2662 assert_eq!(value2, array.value(2));
2663 assert!(!array.is_null(2));
2664 }
2665
2666 #[test]
2667 fn test_from_iter_decimal128array() {
2668 let mut array: Decimal128Array = vec![Some(-100), None, Some(101)].into_iter().collect();
2669 array = array.with_precision_and_scale(38, 10).unwrap();
2670 assert_eq!(array.len(), 3);
2671 assert_eq!(array.data_type(), &DataType::Decimal128(38, 10));
2672 assert_eq!(-100_i128, array.value(0));
2673 assert!(!array.is_null(0));
2674 assert!(array.is_null(1));
2675 assert_eq!(101_i128, array.value(2));
2676 assert!(!array.is_null(2));
2677 }
2678
2679 #[test]
2680 fn test_decimal64_iter() {
2681 let mut builder = Decimal64Builder::with_capacity(30);
2682 let decimal1 = 12345;
2683 builder.append_value(decimal1);
2684
2685 builder.append_null();
2686
2687 let decimal2 = 56789;
2688 builder.append_value(decimal2);
2689
2690 let array: Decimal64Array = builder.finish().with_precision_and_scale(18, 4).unwrap();
2691
2692 let collected: Vec<_> = array.iter().collect();
2693 assert_eq!(vec![Some(decimal1), None, Some(decimal2)], collected);
2694 }
2695
2696 #[test]
2697 fn test_from_iter_decimal64array() {
2698 let value1 = 12345;
2699 let value2 = 56789;
2700
2701 let mut array: Decimal64Array =
2702 vec![Some(value1), None, Some(value2)].into_iter().collect();
2703 array = array.with_precision_and_scale(18, 4).unwrap();
2704 assert_eq!(array.len(), 3);
2705 assert_eq!(array.data_type(), &DataType::Decimal64(18, 4));
2706 assert_eq!(value1, array.value(0));
2707 assert!(!array.is_null(0));
2708 assert!(array.is_null(1));
2709 assert_eq!(value2, array.value(2));
2710 assert!(!array.is_null(2));
2711 }
2712
2713 #[test]
2714 fn test_decimal32_iter() {
2715 let mut builder = Decimal32Builder::with_capacity(30);
2716 let decimal1 = 12345;
2717 builder.append_value(decimal1);
2718
2719 builder.append_null();
2720
2721 let decimal2 = 56789;
2722 builder.append_value(decimal2);
2723
2724 let array: Decimal32Array = builder.finish().with_precision_and_scale(9, 2).unwrap();
2725
2726 let collected: Vec<_> = array.iter().collect();
2727 assert_eq!(vec![Some(decimal1), None, Some(decimal2)], collected);
2728 }
2729
2730 #[test]
2731 fn test_from_iter_decimal32array() {
2732 let value1 = 12345;
2733 let value2 = 56789;
2734
2735 let mut array: Decimal32Array =
2736 vec![Some(value1), None, Some(value2)].into_iter().collect();
2737 array = array.with_precision_and_scale(9, 2).unwrap();
2738 assert_eq!(array.len(), 3);
2739 assert_eq!(array.data_type(), &DataType::Decimal32(9, 2));
2740 assert_eq!(value1, array.value(0));
2741 assert!(!array.is_null(0));
2742 assert!(array.is_null(1));
2743 assert_eq!(value2, array.value(2));
2744 assert!(!array.is_null(2));
2745 }
2746
2747 #[test]
2748 fn test_unary_opt() {
2749 let array = Int32Array::from(vec![1, 2, 3, 4, 5, 6, 7]);
2750 let r = array.unary_opt::<_, Int32Type>(|x| (x % 2 != 0).then_some(x));
2751
2752 let expected = Int32Array::from(vec![Some(1), None, Some(3), None, Some(5), None, Some(7)]);
2753 assert_eq!(r, expected);
2754
2755 let r = expected.unary_opt::<_, Int32Type>(|x| (x % 3 != 0).then_some(x));
2756 let expected = Int32Array::from(vec![Some(1), None, None, None, Some(5), None, Some(7)]);
2757 assert_eq!(r, expected);
2758 }
2759
2760 #[test]
2761 #[should_panic(
2762 expected = "Trying to access an element at index 4 from a PrimitiveArray of length 3"
2763 )]
2764 fn test_fixed_size_binary_array_get_value_index_out_of_bound() {
2765 let array = Decimal128Array::from(vec![-100, 0, 101]);
2766 array.value(4);
2767 }
2768
2769 #[test]
2770 fn test_into_builder() {
2771 let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2772
2773 let boxed: ArrayRef = Arc::new(array);
2774 let col: Int32Array = downcast_array(&boxed);
2775 drop(boxed);
2776
2777 let mut builder = col.into_builder().unwrap();
2778
2779 let slice = builder.values_slice_mut();
2780 assert_eq!(slice, &[1, 2, 3]);
2781
2782 slice[0] = 4;
2783 slice[1] = 2;
2784 slice[2] = 1;
2785
2786 let expected: Int32Array = vec![Some(4), Some(2), Some(1)].into_iter().collect();
2787
2788 let new_array = builder.finish();
2789 assert_eq!(expected, new_array);
2790 }
2791
2792 #[test]
2793 fn test_into_builder_cloned_array() {
2794 let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2795
2796 let boxed: ArrayRef = Arc::new(array);
2797
2798 let col: Int32Array = PrimitiveArray::<Int32Type>::from(boxed.to_data());
2799 let err = col.into_builder();
2800
2801 match err {
2802 Ok(_) => panic!("Should not get builder from cloned array"),
2803 Err(returned) => {
2804 let expected: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2805 assert_eq!(expected, returned)
2806 }
2807 }
2808 }
2809
2810 #[test]
2811 fn test_into_builder_on_sliced_array() {
2812 let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2813 let slice = array.slice(1, 2);
2814 let col: Int32Array = downcast_array(&slice);
2815
2816 drop(slice);
2817
2818 col.into_builder()
2819 .expect_err("Should not build builder from sliced array");
2820 }
2821
2822 #[test]
2823 fn test_unary_mut() {
2824 let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2825
2826 let c = array.unary_mut(|x| x * 2 + 1).unwrap();
2827 let expected: Int32Array = vec![3, 5, 7].into_iter().map(Some).collect();
2828
2829 assert_eq!(expected, c);
2830
2831 let array: Int32Array = Int32Array::from(vec![Some(5), Some(7), None]);
2832 let c = array.unary_mut(|x| x * 2 + 1).unwrap();
2833 assert_eq!(c, Int32Array::from(vec![Some(11), Some(15), None]));
2834 }
2835
2836 #[test]
2837 #[should_panic(
2838 expected = "PrimitiveArray expected data type Interval(MonthDayNano) got Interval(DayTime)"
2839 )]
2840 fn test_invalid_interval_type() {
2841 let array = IntervalDayTimeArray::from(vec![IntervalDayTime::ZERO]);
2842 let _ = IntervalMonthDayNanoArray::from(array.into_data());
2843 }
2844
2845 #[test]
2846 fn test_timezone() {
2847 let array = TimestampNanosecondArray::from_iter_values([1, 2]);
2848 assert_eq!(array.timezone(), None);
2849
2850 let array = array.with_timezone("+02:00");
2851 assert_eq!(array.timezone(), Some("+02:00"));
2852 }
2853
2854 #[test]
2855 fn test_try_new() {
2856 Int32Array::new(vec![1, 2, 3, 4].into(), None);
2857 Int32Array::new(vec![1, 2, 3, 4].into(), Some(NullBuffer::new_null(4)));
2858
2859 let err = Int32Array::try_new(vec![1, 2, 3, 4].into(), Some(NullBuffer::new_null(3)))
2860 .unwrap_err();
2861
2862 assert_eq!(
2863 err.to_string(),
2864 "Invalid argument error: Incorrect length of null buffer for PrimitiveArray, expected 4 got 3"
2865 );
2866
2867 TimestampNanosecondArray::new(vec![1, 2, 3, 4].into(), None).with_data_type(
2868 DataType::Timestamp(TimeUnit::Nanosecond, Some("03:00".into())),
2869 );
2870 }
2871
2872 #[test]
2873 #[should_panic(expected = "PrimitiveArray expected data type Int32 got Date32")]
2874 fn test_with_data_type() {
2875 Int32Array::new(vec![1, 2, 3, 4].into(), None).with_data_type(DataType::Date32);
2876 }
2877
2878 #[test]
2879 fn test_time_32second_output() {
2880 let array: Time32SecondArray = vec![
2881 Some(-1),
2882 Some(0),
2883 Some(86_399),
2884 Some(86_400),
2885 Some(86_401),
2886 None,
2887 ]
2888 .into();
2889 let debug_str = format!("{array:?}");
2890 assert_eq!(
2891 "PrimitiveArray<Time32(s)>\n[\n Cast error: Failed to convert -1 to temporal for Time32(s),\n 00:00:00,\n 23:59:59,\n Cast error: Failed to convert 86400 to temporal for Time32(s),\n Cast error: Failed to convert 86401 to temporal for Time32(s),\n null,\n]",
2892 debug_str
2893 );
2894 }
2895
2896 #[test]
2897 fn test_time_32millisecond_debug_output() {
2898 let array: Time32MillisecondArray = vec![
2899 Some(-1),
2900 Some(0),
2901 Some(86_399_000),
2902 Some(86_400_000),
2903 Some(86_401_000),
2904 None,
2905 ]
2906 .into();
2907 let debug_str = format!("{array:?}");
2908 assert_eq!(
2909 "PrimitiveArray<Time32(ms)>\n[\n Cast error: Failed to convert -1 to temporal for Time32(ms),\n 00:00:00,\n 23:59:59,\n Cast error: Failed to convert 86400000 to temporal for Time32(ms),\n Cast error: Failed to convert 86401000 to temporal for Time32(ms),\n null,\n]",
2910 debug_str
2911 );
2912 }
2913
2914 #[test]
2915 fn test_time_64nanosecond_debug_output() {
2916 let array: Time64NanosecondArray = vec![
2917 Some(-1),
2918 Some(0),
2919 Some(86_399 * 1_000_000_000),
2920 Some(86_400 * 1_000_000_000),
2921 Some(86_401 * 1_000_000_000),
2922 None,
2923 ]
2924 .into();
2925 let debug_str = format!("{array:?}");
2926 assert_eq!(
2927 "PrimitiveArray<Time64(ns)>\n[\n Cast error: Failed to convert -1 to temporal for Time64(ns),\n 00:00:00,\n 23:59:59,\n Cast error: Failed to convert 86400000000000 to temporal for Time64(ns),\n Cast error: Failed to convert 86401000000000 to temporal for Time64(ns),\n null,\n]",
2928 debug_str
2929 );
2930 }
2931
2932 #[test]
2933 fn test_time_64microsecond_debug_output() {
2934 let array: Time64MicrosecondArray = vec![
2935 Some(-1),
2936 Some(0),
2937 Some(86_399 * 1_000_000),
2938 Some(86_400 * 1_000_000),
2939 Some(86_401 * 1_000_000),
2940 None,
2941 ]
2942 .into();
2943 let debug_str = format!("{array:?}");
2944 assert_eq!(
2945 "PrimitiveArray<Time64(µs)>\n[\n Cast error: Failed to convert -1 to temporal for Time64(µs),\n 00:00:00,\n 23:59:59,\n Cast error: Failed to convert 86400000000 to temporal for Time64(µs),\n Cast error: Failed to convert 86401000000 to temporal for Time64(µs),\n null,\n]",
2946 debug_str
2947 );
2948 }
2949
2950 #[test]
2951 fn test_primitive_with_nulls_into_builder() {
2952 let array: Int32Array = vec![
2953 Some(1),
2954 None,
2955 Some(3),
2956 Some(4),
2957 None,
2958 Some(7),
2959 None,
2960 Some(8),
2961 ]
2962 .into_iter()
2963 .collect();
2964 let _ = array.into_builder();
2965 }
2966}