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