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, NullBufferBuilder, 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 PrimitiveArray::new(self.values.clone(), self.nulls.clone())
863 }
864
865 pub fn unary<F, O>(&self, op: F) -> PrimitiveArray<O>
896 where
897 O: ArrowPrimitiveType,
898 F: Fn(T::Native) -> O::Native,
899 {
900 let nulls = self.nulls().cloned();
901 let values = self.values().into_iter().map(|v| op(*v));
902 let buffer: Vec<_> = values.collect();
903 PrimitiveArray::new(buffer.into(), nulls)
904 }
905
906 pub fn unary_mut<F>(self, op: F) -> Result<PrimitiveArray<T>, PrimitiveArray<T>>
950 where
951 F: Fn(T::Native) -> T::Native,
952 {
953 let mut builder = self.into_builder()?;
954 builder
955 .values_slice_mut()
956 .iter_mut()
957 .for_each(|v| *v = op(*v));
958 Ok(builder.finish())
959 }
960
961 pub fn try_unary<F, O, E>(&self, op: F) -> Result<PrimitiveArray<O>, E>
970 where
971 O: ArrowPrimitiveType,
972 F: Fn(T::Native) -> Result<O::Native, E>,
973 {
974 let len = self.len();
975
976 let nulls = self.nulls().cloned();
977 let mut buffer = BufferBuilder::<O::Native>::new(len);
978 buffer.append_n_zeroed(len);
979 let slice = buffer.as_slice_mut();
980
981 let f = |idx| {
982 unsafe { *slice.get_unchecked_mut(idx) = op(self.value_unchecked(idx))? };
983 Ok::<_, E>(())
984 };
985
986 match &nulls {
987 Some(nulls) => nulls.try_for_each_valid_idx(f)?,
988 None => (0..len).try_for_each(f)?,
989 }
990
991 let values = buffer.finish().into();
992 Ok(PrimitiveArray::new(values, nulls))
993 }
994
995 pub fn try_unary_mut<F, E>(
1013 self,
1014 op: F,
1015 ) -> Result<Result<PrimitiveArray<T>, E>, PrimitiveArray<T>>
1016 where
1017 F: Fn(T::Native) -> Result<T::Native, E>,
1018 {
1019 let len = self.len();
1020 let null_count = self.null_count();
1021 let mut builder = self.into_builder()?;
1022
1023 let (slice, null_buffer) = builder.slices_mut();
1024
1025 let r = try_for_each_valid_idx(len, 0, null_count, null_buffer.as_deref(), |idx| {
1026 unsafe { *slice.get_unchecked_mut(idx) = op(*slice.get_unchecked(idx))? };
1027 Ok::<_, E>(())
1028 });
1029
1030 if let Err(err) = r {
1031 return Ok(Err(err));
1032 }
1033
1034 Ok(Ok(builder.finish()))
1035 }
1036
1037 pub fn unary_opt<F, O>(&self, op: F) -> PrimitiveArray<O>
1045 where
1046 O: ArrowPrimitiveType,
1047 F: Fn(T::Native) -> Option<O::Native>,
1048 {
1049 let len = self.len();
1050 let (nulls, null_count, offset) = match self.nulls() {
1051 Some(n) => (Some(n.validity()), n.null_count(), n.offset()),
1052 None => (None, 0, 0),
1053 };
1054
1055 let mut null_builder = BooleanBufferBuilder::new(len);
1056 match nulls {
1057 Some(b) => null_builder.append_packed_range(offset..offset + len, b),
1058 None => null_builder.append_n(len, true),
1059 }
1060
1061 let mut buffer = BufferBuilder::<O::Native>::new(len);
1062 buffer.append_n_zeroed(len);
1063 let slice = buffer.as_slice_mut();
1064
1065 let mut out_null_count = null_count;
1066
1067 let _ = try_for_each_valid_idx(len, offset, null_count, nulls, |idx| {
1068 match op(unsafe { self.value_unchecked(idx) }) {
1069 Some(v) => unsafe { *slice.get_unchecked_mut(idx) = v },
1070 None => {
1071 out_null_count += 1;
1072 null_builder.set_bit(idx, false);
1073 }
1074 }
1075 Ok::<_, ()>(())
1076 });
1077
1078 let nulls = null_builder.finish();
1079 let values = buffer.finish().into();
1080 let nulls = unsafe { NullBuffer::new_unchecked(nulls, out_null_count) };
1081 PrimitiveArray::new(values, Some(nulls))
1082 }
1083
1084 pub fn from_unary<U: ArrayAccessor, F>(left: U, mut op: F) -> Self
1100 where
1101 F: FnMut(U::Item) -> T::Native,
1102 {
1103 let nulls = left.logical_nulls();
1104 let buffer: Vec<_> = (0..left.len())
1105 .map(|i| op(unsafe { left.value_unchecked(i) }))
1107 .collect();
1108 PrimitiveArray::new(buffer.into(), nulls)
1109 }
1110
1111 pub fn into_builder(self) -> Result<PrimitiveBuilder<T>, Self> {
1122 let len = self.len();
1123 let data = self.into_data();
1124 let null_bit_buffer = data.nulls().map(|b| b.inner().sliced());
1125
1126 let element_len = std::mem::size_of::<T::Native>();
1127 let buffer =
1128 data.buffers()[0].slice_with_length(data.offset() * element_len, len * element_len);
1129
1130 drop(data);
1131
1132 let try_mutable_null_buffer = match null_bit_buffer {
1133 None => Ok(None),
1134 Some(null_buffer) => {
1135 null_buffer.into_mutable().map(Some)
1137 }
1138 };
1139
1140 let try_mutable_buffers = match try_mutable_null_buffer {
1141 Ok(mutable_null_buffer) => {
1142 let try_mutable_buffer = buffer.into_mutable();
1144
1145 match try_mutable_buffer {
1148 Ok(mutable_buffer) => Ok(PrimitiveBuilder::<T>::new_from_buffer(
1149 mutable_buffer,
1150 mutable_null_buffer,
1151 )),
1152 Err(buffer) => Err((buffer, mutable_null_buffer.map(|b| b.into()))),
1153 }
1154 }
1155 Err(mutable_null_buffer) => {
1156 Err((buffer, Some(mutable_null_buffer)))
1158 }
1159 };
1160
1161 match try_mutable_buffers {
1162 Ok(builder) => Ok(builder),
1163 Err((buffer, null_bit_buffer)) => {
1164 let builder = ArrayData::builder(T::DATA_TYPE)
1165 .len(len)
1166 .add_buffer(buffer)
1167 .null_bit_buffer(null_bit_buffer);
1168
1169 let array_data = unsafe { builder.build_unchecked() };
1170 let array = PrimitiveArray::<T>::from(array_data);
1171
1172 Err(array)
1173 }
1174 }
1175 }
1176}
1177
1178impl<T: ArrowPrimitiveType> From<PrimitiveArray<T>> for ArrayData {
1179 fn from(array: PrimitiveArray<T>) -> Self {
1180 let builder = ArrayDataBuilder::new(array.data_type)
1181 .len(array.values.len())
1182 .nulls(array.nulls)
1183 .buffers(vec![array.values.into_inner()]);
1184
1185 unsafe { builder.build_unchecked() }
1186 }
1187}
1188
1189unsafe impl<T: ArrowPrimitiveType> Array for PrimitiveArray<T> {
1191 fn as_any(&self) -> &dyn Any {
1192 self
1193 }
1194
1195 fn to_data(&self) -> ArrayData {
1196 self.clone().into()
1197 }
1198
1199 fn into_data(self) -> ArrayData {
1200 self.into()
1201 }
1202
1203 fn data_type(&self) -> &DataType {
1204 &self.data_type
1205 }
1206
1207 fn slice(&self, offset: usize, length: usize) -> ArrayRef {
1208 Arc::new(self.slice(offset, length))
1209 }
1210
1211 fn len(&self) -> usize {
1212 self.values.len()
1213 }
1214
1215 fn is_empty(&self) -> bool {
1216 self.values.is_empty()
1217 }
1218
1219 fn shrink_to_fit(&mut self) {
1220 self.values.shrink_to_fit();
1221 if let Some(nulls) = &mut self.nulls {
1222 nulls.shrink_to_fit();
1223 }
1224 }
1225
1226 fn offset(&self) -> usize {
1227 0
1228 }
1229
1230 fn nulls(&self) -> Option<&NullBuffer> {
1231 self.nulls.as_ref()
1232 }
1233
1234 fn logical_null_count(&self) -> usize {
1235 self.null_count()
1236 }
1237
1238 fn get_buffer_memory_size(&self) -> usize {
1239 let mut size = self.values.inner().capacity();
1240 if let Some(n) = self.nulls.as_ref() {
1241 size += n.buffer().capacity();
1242 }
1243 size
1244 }
1245
1246 fn get_array_memory_size(&self) -> usize {
1247 std::mem::size_of::<Self>() + self.get_buffer_memory_size()
1248 }
1249
1250 #[cfg(feature = "pool")]
1251 fn claim(&self, pool: &dyn arrow_buffer::MemoryPool) {
1252 self.values.claim(pool);
1253 if let Some(nulls) = &self.nulls {
1254 nulls.claim(pool);
1255 }
1256 }
1257}
1258
1259impl<T: ArrowPrimitiveType> ArrayAccessor for &PrimitiveArray<T> {
1260 type Item = T::Native;
1261
1262 fn value(&self, index: usize) -> Self::Item {
1263 PrimitiveArray::value(self, index)
1264 }
1265
1266 #[inline]
1267 unsafe fn value_unchecked(&self, index: usize) -> Self::Item {
1268 unsafe { PrimitiveArray::value_unchecked(self, index) }
1269 }
1270}
1271
1272impl<T: ArrowTemporalType> PrimitiveArray<T>
1273where
1274 i64: From<T::Native>,
1275{
1276 pub fn value_as_datetime(&self, i: usize) -> Option<NaiveDateTime> {
1283 as_datetime::<T>(i64::from(self.value(i)))
1284 }
1285
1286 pub fn value_as_datetime_with_tz(&self, i: usize, tz: Tz) -> Option<DateTime<Tz>> {
1293 as_datetime_with_timezone::<T>(i64::from(self.value(i)), tz)
1294 }
1295
1296 pub fn value_as_date(&self, i: usize) -> Option<NaiveDate> {
1302 self.value_as_datetime(i).map(|datetime| datetime.date())
1303 }
1304
1305 pub fn value_as_time(&self, i: usize) -> Option<NaiveTime> {
1311 as_time::<T>(i64::from(self.value(i)))
1312 }
1313
1314 pub fn value_as_duration(&self, i: usize) -> Option<Duration> {
1320 as_duration::<T>(i64::from(self.value(i)))
1321 }
1322}
1323
1324impl<T: ArrowPrimitiveType> std::fmt::Debug for PrimitiveArray<T> {
1325 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
1326 let data_type = self.data_type();
1327
1328 write!(f, "PrimitiveArray<{data_type}>\n[\n")?;
1329 print_long_array(self, f, |array, index, f| match data_type {
1330 DataType::Date32 | DataType::Date64 => {
1331 let v = self.value(index).to_i64().unwrap();
1332 match as_date::<T>(v) {
1333 Some(date) => write!(f, "{date:?}"),
1334 None => {
1335 write!(
1336 f,
1337 "Cast error: Failed to convert {v} to temporal for {data_type}"
1338 )
1339 }
1340 }
1341 }
1342 DataType::Time32(_) | DataType::Time64(_) => {
1343 let v = self.value(index).to_i64().unwrap();
1344 match as_time::<T>(v) {
1345 Some(time) => write!(f, "{time:?}"),
1346 None => {
1347 write!(
1348 f,
1349 "Cast error: Failed to convert {v} to temporal for {data_type}"
1350 )
1351 }
1352 }
1353 }
1354 DataType::Timestamp(_, tz_string_opt) => {
1355 let v = self.value(index).to_i64().unwrap();
1356 match tz_string_opt {
1357 Some(tz_string) => {
1359 match tz_string.parse::<Tz>() {
1360 Ok(tz) => match as_datetime_with_timezone::<T>(v, tz) {
1362 Some(datetime) => write!(f, "{}", datetime.to_rfc3339()),
1363 None => write!(
1364 f,
1365 "Cast error: Failed to convert {v} to timestamp for {data_type}"
1366 ),
1367 },
1368 Err(_) => match as_datetime::<T>(v) {
1370 Some(datetime) => {
1371 write!(f, "{datetime:?} (Unknown Time Zone '{tz_string}')")
1372 }
1373 None => write!(
1374 f,
1375 "Cast error: Failed to convert {v} to timestamp for {data_type}"
1376 ),
1377 },
1378 }
1379 }
1380 None => match as_datetime::<T>(v) {
1382 Some(datetime) => write!(f, "{datetime:?}"),
1383 None => write!(
1384 f,
1385 "Cast error: Failed to convert {v} to timestamp for {data_type}"
1386 ),
1387 },
1388 }
1389 }
1390 _ => std::fmt::Debug::fmt(&array.value(index), f),
1391 })?;
1392 write!(f, "]")
1393 }
1394}
1395
1396impl<'a, T: ArrowPrimitiveType> IntoIterator for &'a PrimitiveArray<T> {
1397 type Item = Option<<T as ArrowPrimitiveType>::Native>;
1398 type IntoIter = PrimitiveIter<'a, T>;
1399
1400 fn into_iter(self) -> Self::IntoIter {
1401 PrimitiveIter::<'a, T>::new(self)
1402 }
1403}
1404
1405impl<'a, T: ArrowPrimitiveType> PrimitiveArray<T> {
1406 pub fn iter(&'a self) -> PrimitiveIter<'a, T> {
1408 PrimitiveIter::<'a, T>::new(self)
1409 }
1410}
1411
1412#[derive(Debug)]
1419pub struct NativeAdapter<T: ArrowPrimitiveType> {
1420 pub native: Option<T::Native>,
1422}
1423
1424macro_rules! def_from_for_primitive {
1425 ( $ty:ident, $tt:tt) => {
1426 impl From<$tt> for NativeAdapter<$ty> {
1427 fn from(value: $tt) -> Self {
1428 NativeAdapter {
1429 native: Some(value),
1430 }
1431 }
1432 }
1433 };
1434}
1435
1436def_from_for_primitive!(Int8Type, i8);
1437def_from_for_primitive!(Int16Type, i16);
1438def_from_for_primitive!(Int32Type, i32);
1439def_from_for_primitive!(Int64Type, i64);
1440def_from_for_primitive!(UInt8Type, u8);
1441def_from_for_primitive!(UInt16Type, u16);
1442def_from_for_primitive!(UInt32Type, u32);
1443def_from_for_primitive!(UInt64Type, u64);
1444def_from_for_primitive!(Float16Type, f16);
1445def_from_for_primitive!(Float32Type, f32);
1446def_from_for_primitive!(Float64Type, f64);
1447def_from_for_primitive!(Decimal32Type, i32);
1448def_from_for_primitive!(Decimal64Type, i64);
1449def_from_for_primitive!(Decimal128Type, i128);
1450def_from_for_primitive!(Decimal256Type, i256);
1451
1452impl<T: ArrowPrimitiveType> From<Option<<T as ArrowPrimitiveType>::Native>> for NativeAdapter<T> {
1453 fn from(value: Option<<T as ArrowPrimitiveType>::Native>) -> Self {
1454 NativeAdapter { native: value }
1455 }
1456}
1457
1458impl<T: ArrowPrimitiveType> From<&Option<<T as ArrowPrimitiveType>::Native>> for NativeAdapter<T> {
1459 fn from(value: &Option<<T as ArrowPrimitiveType>::Native>) -> Self {
1460 NativeAdapter { native: *value }
1461 }
1462}
1463
1464impl<T: ArrowPrimitiveType, Ptr: Into<NativeAdapter<T>>> FromIterator<Ptr> for PrimitiveArray<T> {
1465 fn from_iter<I: IntoIterator<Item = Ptr>>(iter: I) -> Self {
1466 let iter = iter.into_iter();
1467 let (lower, _) = iter.size_hint();
1468
1469 let mut null_builder = NullBufferBuilder::new(lower);
1470
1471 let buffer: Buffer = iter
1472 .map(|item| {
1473 if let Some(a) = item.into().native {
1474 null_builder.append_non_null();
1475 a
1476 } else {
1477 null_builder.append_null();
1478 T::Native::default()
1482 }
1483 })
1484 .collect();
1485
1486 let maybe_nulls = null_builder.finish();
1487 PrimitiveArray::new(ScalarBuffer::from(buffer), maybe_nulls)
1488 }
1489}
1490
1491impl<T: ArrowPrimitiveType> PrimitiveArray<T> {
1492 #[inline]
1497 pub unsafe fn from_trusted_len_iter<I, P>(iter: I) -> Self
1498 where
1499 P: std::borrow::Borrow<Option<<T as ArrowPrimitiveType>::Native>>,
1500 I: IntoIterator<Item = P>,
1501 {
1502 let iterator = iter.into_iter();
1503 let (_, upper) = iterator.size_hint();
1504 let len = upper.expect("trusted_len_unzip requires an upper limit");
1505
1506 let (null, buffer) = unsafe { trusted_len_unzip(iterator) };
1507
1508 let nulls = NullBuffer::from_unsliced_buffer(null, len);
1509 PrimitiveArray::new(ScalarBuffer::from(buffer), nulls)
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 buffer = ScalarBuffer::from(Buffer::from_vec(data));
1521 let nulls = None;
1522 PrimitiveArray::new(buffer, nulls)
1523 }
1524 }
1525
1526 impl From<Vec<Option<<$ty as ArrowPrimitiveType>::Native>>> for PrimitiveArray<$ty> {
1528 fn from(data: Vec<Option<<$ty as ArrowPrimitiveType>::Native>>) -> Self {
1529 PrimitiveArray::from_iter(data.iter())
1530 }
1531 }
1532 };
1533}
1534
1535def_numeric_from_vec!(Int8Type);
1536def_numeric_from_vec!(Int16Type);
1537def_numeric_from_vec!(Int32Type);
1538def_numeric_from_vec!(Int64Type);
1539def_numeric_from_vec!(UInt8Type);
1540def_numeric_from_vec!(UInt16Type);
1541def_numeric_from_vec!(UInt32Type);
1542def_numeric_from_vec!(UInt64Type);
1543def_numeric_from_vec!(Float16Type);
1544def_numeric_from_vec!(Float32Type);
1545def_numeric_from_vec!(Float64Type);
1546def_numeric_from_vec!(Decimal32Type);
1547def_numeric_from_vec!(Decimal64Type);
1548def_numeric_from_vec!(Decimal128Type);
1549def_numeric_from_vec!(Decimal256Type);
1550
1551def_numeric_from_vec!(Date32Type);
1552def_numeric_from_vec!(Date64Type);
1553def_numeric_from_vec!(Time32SecondType);
1554def_numeric_from_vec!(Time32MillisecondType);
1555def_numeric_from_vec!(Time64MicrosecondType);
1556def_numeric_from_vec!(Time64NanosecondType);
1557def_numeric_from_vec!(IntervalYearMonthType);
1558def_numeric_from_vec!(IntervalDayTimeType);
1559def_numeric_from_vec!(IntervalMonthDayNanoType);
1560def_numeric_from_vec!(DurationSecondType);
1561def_numeric_from_vec!(DurationMillisecondType);
1562def_numeric_from_vec!(DurationMicrosecondType);
1563def_numeric_from_vec!(DurationNanosecondType);
1564def_numeric_from_vec!(TimestampSecondType);
1565def_numeric_from_vec!(TimestampMillisecondType);
1566def_numeric_from_vec!(TimestampMicrosecondType);
1567def_numeric_from_vec!(TimestampNanosecondType);
1568
1569impl<T: ArrowTimestampType> PrimitiveArray<T> {
1570 pub fn timezone(&self) -> Option<&str> {
1572 match self.data_type() {
1573 DataType::Timestamp(_, tz) => tz.as_deref(),
1574 _ => unreachable!(),
1575 }
1576 }
1577
1578 pub fn with_timezone(self, timezone: impl Into<Arc<str>>) -> Self {
1580 self.with_timezone_opt(Some(timezone.into()))
1581 }
1582
1583 pub fn with_timezone_utc(self) -> Self {
1585 self.with_timezone("+00:00")
1586 }
1587
1588 pub fn with_timezone_opt<S: Into<Arc<str>>>(self, timezone: Option<S>) -> Self {
1590 Self {
1591 data_type: DataType::Timestamp(T::UNIT, timezone.map(Into::into)),
1592 ..self
1593 }
1594 }
1595}
1596
1597impl<T: ArrowPrimitiveType> From<ArrayData> for PrimitiveArray<T> {
1599 fn from(data: ArrayData) -> Self {
1600 let (data_type, len, nulls, offset, mut buffers, _child_data) = data.into_parts();
1601
1602 Self::assert_compatible(&data_type);
1603 assert_eq!(
1604 buffers.len(),
1605 1,
1606 "PrimitiveArray data should contain a single buffer only (values buffer)"
1607 );
1608 let buffer = buffers.pop().expect("checked above");
1609
1610 let values = ScalarBuffer::new(buffer, offset, len);
1611 Self {
1612 data_type,
1613 values,
1614 nulls,
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_fmt_debug_out_of_range() {
2141 let data = Int64Array::new(
2143 vec![i64::MAX, i64::MIN, i64::MAX].into(),
2144 Some(vec![true, true, false].into()),
2145 );
2146
2147 let arr = data.reinterpret_cast::<TimestampSecondType>();
2148 assert_eq!(
2149 "PrimitiveArray<Timestamp(s)>
2150[
2151 Cast error: Failed to convert 9223372036854775807 to timestamp for Timestamp(s),
2152 Cast error: Failed to convert -9223372036854775808 to timestamp for Timestamp(s),
2153 null,
2154]",
2155 format!("{arr:?}")
2156 );
2157
2158 let arr = data.reinterpret_cast::<TimestampMillisecondType>();
2159 assert_eq!(
2160 "PrimitiveArray<Timestamp(ms)>
2161[
2162 Cast error: Failed to convert 9223372036854775807 to timestamp for Timestamp(ms),
2163 Cast error: Failed to convert -9223372036854775808 to timestamp for Timestamp(ms),
2164 null,
2165]",
2166 format!("{arr:?}")
2167 );
2168
2169 let arr = data.reinterpret_cast::<TimestampMicrosecondType>();
2170 assert_eq!(
2171 "PrimitiveArray<Timestamp(µs)>
2172[
2173 Cast error: Failed to convert 9223372036854775807 to timestamp for Timestamp(µs),
2174 Cast error: Failed to convert -9223372036854775808 to timestamp for Timestamp(µs),
2175 null,
2176]",
2177 format!("{arr:?}")
2178 );
2179
2180 let arr = data.reinterpret_cast::<TimestampNanosecondType>();
2182 assert_eq!(
2183 "PrimitiveArray<Timestamp(ns)>
2184[
2185 2262-04-11T23:47:16.854775807,
2186 1677-09-21T00:12:43.145224192,
2187 null,
2188]",
2189 format!("{arr:?}")
2190 );
2191 }
2192
2193 #[test]
2194 fn test_timestamp_utc_fmt_debug() {
2195 let arr: PrimitiveArray<TimestampMillisecondType> =
2196 TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2197 .with_timezone_utc();
2198 assert_eq!(
2199 "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]",
2200 format!("{arr:?}")
2201 );
2202 }
2203
2204 #[test]
2205 #[cfg(feature = "chrono-tz")]
2206 fn test_timestamp_with_named_tz_fmt_debug() {
2207 let arr: PrimitiveArray<TimestampMillisecondType> =
2208 TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2209 .with_timezone("Asia/Taipei".to_string());
2210 assert_eq!(
2211 "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]",
2212 format!("{arr:?}")
2213 );
2214 }
2215
2216 #[test]
2217 #[cfg(not(feature = "chrono-tz"))]
2218 fn test_timestamp_with_named_tz_fmt_debug() {
2219 let arr: PrimitiveArray<TimestampMillisecondType> =
2220 TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2221 .with_timezone("Asia/Taipei".to_string());
2222
2223 println!("{arr:?}");
2224
2225 assert_eq!(
2226 "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]",
2227 format!("{arr:?}")
2228 );
2229 }
2230
2231 #[test]
2232 fn test_timestamp_with_fixed_offset_tz_fmt_debug() {
2233 let arr: PrimitiveArray<TimestampMillisecondType> =
2234 TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2235 .with_timezone("+08:00".to_string());
2236 assert_eq!(
2237 "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]",
2238 format!("{arr:?}")
2239 );
2240 }
2241
2242 #[test]
2243 fn test_timestamp_with_incorrect_tz_fmt_debug() {
2244 let arr: PrimitiveArray<TimestampMillisecondType> =
2245 TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2246 .with_timezone("xxx".to_string());
2247 assert_eq!(
2248 "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]",
2249 format!("{arr:?}")
2250 );
2251 }
2252
2253 #[test]
2254 #[cfg(feature = "chrono-tz")]
2255 fn test_timestamp_with_tz_with_daylight_saving_fmt_debug() {
2256 let arr: PrimitiveArray<TimestampMillisecondType> = TimestampMillisecondArray::from(vec![
2257 1647161999000,
2258 1647162000000,
2259 1667717999000,
2260 1667718000000,
2261 ])
2262 .with_timezone("America/Denver".to_string());
2263 assert_eq!(
2264 "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]",
2265 format!("{arr:?}")
2266 );
2267 }
2268
2269 #[test]
2270 fn test_date32_fmt_debug() {
2271 let arr: PrimitiveArray<Date32Type> = vec![12356, 13548, -365].into();
2272 assert_eq!(
2273 "PrimitiveArray<Date32>\n[\n 2003-10-31,\n 2007-02-04,\n 1969-01-01,\n]",
2274 format!("{arr:?}")
2275 );
2276 }
2277
2278 #[test]
2279 fn test_time32second_fmt_debug() {
2280 let arr: PrimitiveArray<Time32SecondType> = vec![7201, 60054].into();
2281 assert_eq!(
2282 "PrimitiveArray<Time32(s)>\n[\n 02:00:01,\n 16:40:54,\n]",
2283 format!("{arr:?}")
2284 );
2285 }
2286
2287 #[test]
2288 fn test_time32second_invalid_neg() {
2289 let arr: PrimitiveArray<Time32SecondType> = vec![-7201, -60054].into();
2291 assert_eq!(
2292 "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]",
2293 format!("{arr:?}")
2295 )
2296 }
2297
2298 #[test]
2299 fn test_primitive_array_builder() {
2300 let buf = Buffer::from_slice_ref([0i32, 1, 2, 3, 4, 5, 6]);
2302 let buf2 = buf.slice_with_length(8, 20);
2303 let data = ArrayData::builder(DataType::Int32)
2304 .len(5)
2305 .offset(2)
2306 .add_buffer(buf)
2307 .build()
2308 .unwrap();
2309 let arr = Int32Array::from(data);
2310 assert_eq!(&buf2, arr.values.inner());
2311 assert_eq!(5, arr.len());
2312 assert_eq!(0, arr.null_count());
2313 for i in 0..3 {
2314 assert_eq!((i + 2) as i32, arr.value(i));
2315 }
2316 }
2317
2318 #[test]
2319 fn test_primitive_from_iter_values() {
2320 let arr: PrimitiveArray<Int32Type> = PrimitiveArray::from_iter_values(0..10);
2322 assert_eq!(10, arr.len());
2323 assert_eq!(0, arr.null_count());
2324 for i in 0..10i32 {
2325 assert_eq!(i, arr.value(i as usize));
2326 }
2327 }
2328
2329 #[test]
2330 fn test_primitive_array_from_unbound_iter() {
2331 let value_iter = (0..)
2333 .scan(0usize, |pos, i| {
2334 if *pos < 10 {
2335 *pos += 1;
2336 Some(Some(i))
2337 } else {
2338 None
2340 }
2341 })
2342 .take(100);
2344
2345 let (_, upper_size_bound) = value_iter.size_hint();
2346 assert_eq!(upper_size_bound, Some(100));
2348 let primitive_array: PrimitiveArray<Int32Type> = value_iter.collect();
2349 assert_eq!(primitive_array.len(), 10);
2351 }
2352
2353 #[test]
2354 fn test_primitive_array_from_non_null_iter() {
2355 let iter = (0..10_i32).map(Some);
2356 let primitive_array = PrimitiveArray::<Int32Type>::from_iter(iter);
2357 assert_eq!(primitive_array.len(), 10);
2358 assert_eq!(primitive_array.null_count(), 0);
2359 assert!(primitive_array.nulls().is_none());
2360 assert_eq!(primitive_array.values(), &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
2361 }
2362
2363 #[test]
2364 #[should_panic(expected = "PrimitiveArray data should contain a single buffer only \
2365 (values buffer)")]
2366 #[cfg(not(feature = "force_validate"))]
2369 fn test_primitive_array_invalid_buffer_len() {
2370 let buffer = Buffer::from_slice_ref([0i32, 1, 2, 3, 4]);
2371 let data = unsafe {
2372 ArrayData::builder(DataType::Int32)
2373 .add_buffer(buffer.clone())
2374 .add_buffer(buffer)
2375 .len(5)
2376 .build_unchecked()
2377 };
2378
2379 drop(Int32Array::from(data));
2380 }
2381
2382 #[test]
2383 fn test_access_array_concurrently() {
2384 let a = Int32Array::from(vec![5, 6, 7, 8, 9]);
2385 let ret = std::thread::spawn(move || a.value(3)).join();
2386
2387 assert!(ret.is_ok());
2388 assert_eq!(8, ret.ok().unwrap());
2389 }
2390
2391 #[test]
2392 fn test_primitive_array_creation() {
2393 let array1: Int8Array = [10_i8, 11, 12, 13, 14].into_iter().collect();
2394 let array2: Int8Array = [10_i8, 11, 12, 13, 14].into_iter().map(Some).collect();
2395
2396 assert_eq!(array1, array2);
2397 }
2398
2399 #[test]
2400 #[should_panic(
2401 expected = "Trying to access an element at index 4 from a PrimitiveArray of length 3"
2402 )]
2403 fn test_string_array_get_value_index_out_of_bound() {
2404 let array: Int8Array = [10_i8, 11, 12].into_iter().collect();
2405
2406 array.value(4);
2407 }
2408
2409 #[test]
2410 #[should_panic(expected = "PrimitiveArray expected data type Int64 got Int32")]
2411 fn test_from_array_data_validation() {
2412 let foo = PrimitiveArray::<Int32Type>::from_iter([1, 2, 3]);
2413 let _ = PrimitiveArray::<Int64Type>::from(foo.into_data());
2414 }
2415
2416 #[test]
2417 fn test_decimal32() {
2418 let values: Vec<_> = vec![0, 1, -1, i32::MIN, i32::MAX];
2419 let array: PrimitiveArray<Decimal32Type> =
2420 PrimitiveArray::from_iter(values.iter().copied());
2421 assert_eq!(array.values(), &values);
2422
2423 let array: PrimitiveArray<Decimal32Type> =
2424 PrimitiveArray::from_iter_values(values.iter().copied());
2425 assert_eq!(array.values(), &values);
2426
2427 let array = PrimitiveArray::<Decimal32Type>::from(values.clone());
2428 assert_eq!(array.values(), &values);
2429
2430 let array = PrimitiveArray::<Decimal32Type>::from(array.to_data());
2431 assert_eq!(array.values(), &values);
2432 }
2433
2434 #[test]
2435 fn test_decimal64() {
2436 let values: Vec<_> = vec![0, 1, -1, i64::MIN, i64::MAX];
2437 let array: PrimitiveArray<Decimal64Type> =
2438 PrimitiveArray::from_iter(values.iter().copied());
2439 assert_eq!(array.values(), &values);
2440
2441 let array: PrimitiveArray<Decimal64Type> =
2442 PrimitiveArray::from_iter_values(values.iter().copied());
2443 assert_eq!(array.values(), &values);
2444
2445 let array = PrimitiveArray::<Decimal64Type>::from(values.clone());
2446 assert_eq!(array.values(), &values);
2447
2448 let array = PrimitiveArray::<Decimal64Type>::from(array.to_data());
2449 assert_eq!(array.values(), &values);
2450 }
2451
2452 #[test]
2453 fn test_decimal128() {
2454 let values: Vec<_> = vec![0, 1, -1, i128::MIN, i128::MAX];
2455 let array: PrimitiveArray<Decimal128Type> =
2456 PrimitiveArray::from_iter(values.iter().copied());
2457 assert_eq!(array.values(), &values);
2458
2459 let array: PrimitiveArray<Decimal128Type> =
2460 PrimitiveArray::from_iter_values(values.iter().copied());
2461 assert_eq!(array.values(), &values);
2462
2463 let array = PrimitiveArray::<Decimal128Type>::from(values.clone());
2464 assert_eq!(array.values(), &values);
2465
2466 let array = PrimitiveArray::<Decimal128Type>::from(array.to_data());
2467 assert_eq!(array.values(), &values);
2468 }
2469
2470 #[test]
2471 fn test_decimal256() {
2472 let values: Vec<_> = vec![i256::ZERO, i256::ONE, i256::MINUS_ONE, i256::MIN, i256::MAX];
2473
2474 let array: PrimitiveArray<Decimal256Type> =
2475 PrimitiveArray::from_iter(values.iter().copied());
2476 assert_eq!(array.values(), &values);
2477
2478 let array: PrimitiveArray<Decimal256Type> =
2479 PrimitiveArray::from_iter_values(values.iter().copied());
2480 assert_eq!(array.values(), &values);
2481
2482 let array = PrimitiveArray::<Decimal256Type>::from(values.clone());
2483 assert_eq!(array.values(), &values);
2484
2485 let array = PrimitiveArray::<Decimal256Type>::from(array.to_data());
2486 assert_eq!(array.values(), &values);
2487 }
2488
2489 #[test]
2490 fn test_decimal_array() {
2491 let values: [u8; 32] = [
2494 192, 219, 180, 17, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 36, 75, 238, 253, 255, 255,
2495 255, 255, 255, 255, 255, 255, 255, 255, 255,
2496 ];
2497 let array_data = ArrayData::builder(DataType::Decimal128(38, 6))
2498 .len(2)
2499 .add_buffer(Buffer::from(&values))
2500 .build()
2501 .unwrap();
2502 let decimal_array = Decimal128Array::from(array_data);
2503 assert_eq!(8_887_000_000_i128, decimal_array.value(0));
2504 assert_eq!(-8_887_000_000_i128, decimal_array.value(1));
2505 }
2506
2507 #[test]
2508 fn test_decimal_append_error_value() {
2509 let mut decimal_builder = Decimal128Builder::with_capacity(10);
2510 decimal_builder.append_value(123456);
2511 decimal_builder.append_value(12345);
2512 let result = decimal_builder.finish().with_precision_and_scale(5, 3);
2513 assert!(result.is_ok());
2514 let arr = result.unwrap();
2515 assert_eq!("12.345", arr.value_as_string(1));
2516
2517 let result = arr.validate_decimal_precision(5);
2519 let error = result.unwrap_err();
2520 assert_eq!(
2521 "Invalid argument error: 123.456 is too large to store in a Decimal128 of precision 5. Max is 99.999",
2522 error.to_string()
2523 );
2524
2525 decimal_builder = Decimal128Builder::new();
2526 decimal_builder.append_value(100);
2527 decimal_builder.append_value(99);
2528 decimal_builder.append_value(-100);
2529 decimal_builder.append_value(-99);
2530 let result = decimal_builder.finish().with_precision_and_scale(2, 1);
2531 assert!(result.is_ok());
2532 let arr = result.unwrap();
2533 assert_eq!("9.9", arr.value_as_string(1));
2534 assert_eq!("-9.9", arr.value_as_string(3));
2535
2536 let result = arr.validate_decimal_precision(2);
2538 let error = result.unwrap_err();
2539 assert_eq!(
2540 "Invalid argument error: 10.0 is too large to store in a Decimal128 of precision 2. Max is 9.9",
2541 error.to_string()
2542 );
2543 }
2544
2545 #[test]
2546 fn test_decimal_from_iter_values() {
2547 let array = Decimal128Array::from_iter_values(vec![-100, 0, 101]);
2548 assert_eq!(array.len(), 3);
2549 assert_eq!(array.data_type(), &DataType::Decimal128(38, 10));
2550 assert_eq!(-100_i128, array.value(0));
2551 assert!(!array.is_null(0));
2552 assert_eq!(0_i128, array.value(1));
2553 assert!(!array.is_null(1));
2554 assert_eq!(101_i128, array.value(2));
2555 assert!(!array.is_null(2));
2556 }
2557
2558 #[test]
2559 fn test_decimal_from_iter() {
2560 let array: Decimal128Array = vec![Some(-100), None, Some(101)].into_iter().collect();
2561 assert_eq!(array.len(), 3);
2562 assert_eq!(array.data_type(), &DataType::Decimal128(38, 10));
2563 assert_eq!(-100_i128, array.value(0));
2564 assert!(!array.is_null(0));
2565 assert!(array.is_null(1));
2566 assert_eq!(101_i128, array.value(2));
2567 assert!(!array.is_null(2));
2568 }
2569
2570 #[test]
2571 fn test_decimal_iter_sized() {
2572 let data = vec![Some(-100), None, Some(101)];
2573 let array: Decimal128Array = data.into_iter().collect();
2574 let mut iter = array.into_iter();
2575
2576 assert_eq!(array.len(), 3);
2578
2579 assert_eq!(iter.size_hint(), (3, Some(3)));
2581 iter.next().unwrap();
2582 assert_eq!(iter.size_hint(), (2, Some(2)));
2583 iter.next().unwrap();
2584 iter.next().unwrap();
2585 assert_eq!(iter.size_hint(), (0, Some(0)));
2586 assert!(iter.next().is_none());
2587 assert_eq!(iter.size_hint(), (0, Some(0)));
2588 }
2589
2590 #[test]
2591 fn test_decimal_array_value_as_string() {
2592 let arr = [123450, -123450, 100, -100, 10, -10, 0]
2593 .into_iter()
2594 .map(Some)
2595 .collect::<Decimal128Array>()
2596 .with_precision_and_scale(6, 3)
2597 .unwrap();
2598
2599 assert_eq!("123.450", arr.value_as_string(0));
2600 assert_eq!("-123.450", arr.value_as_string(1));
2601 assert_eq!("0.100", arr.value_as_string(2));
2602 assert_eq!("-0.100", arr.value_as_string(3));
2603 assert_eq!("0.010", arr.value_as_string(4));
2604 assert_eq!("-0.010", arr.value_as_string(5));
2605 assert_eq!("0.000", arr.value_as_string(6));
2606 }
2607
2608 #[test]
2609 fn test_decimal_array_with_precision_and_scale() {
2610 let arr = Decimal128Array::from_iter_values([12345, 456, 7890, -123223423432432])
2611 .with_precision_and_scale(20, 2)
2612 .unwrap();
2613
2614 assert_eq!(arr.data_type(), &DataType::Decimal128(20, 2));
2615 assert_eq!(arr.precision(), 20);
2616 assert_eq!(arr.scale(), 2);
2617
2618 let actual: Vec<_> = (0..arr.len()).map(|i| arr.value_as_string(i)).collect();
2619 let expected = vec!["123.45", "4.56", "78.90", "-1232234234324.32"];
2620
2621 assert_eq!(actual, expected);
2622 }
2623
2624 #[test]
2625 #[should_panic(
2626 expected = "-1232234234324.32 is too small to store in a Decimal128 of precision 5. Min is -999.99"
2627 )]
2628 fn test_decimal_array_with_precision_and_scale_out_of_range() {
2629 let arr = Decimal128Array::from_iter_values([12345, 456, 7890, -123223423432432])
2630 .with_precision_and_scale(5, 2)
2632 .unwrap();
2633 arr.validate_decimal_precision(5).unwrap();
2634 }
2635
2636 #[test]
2637 #[should_panic(expected = "precision cannot be 0, has to be between [1, 38]")]
2638 fn test_decimal_array_with_precision_zero() {
2639 Decimal128Array::from_iter_values([12345, 456])
2640 .with_precision_and_scale(0, 2)
2641 .unwrap();
2642 }
2643
2644 #[test]
2645 #[should_panic(expected = "precision 40 is greater than max 38")]
2646 fn test_decimal_array_with_precision_and_scale_invalid_precision() {
2647 Decimal128Array::from_iter_values([12345, 456])
2648 .with_precision_and_scale(40, 2)
2649 .unwrap();
2650 }
2651
2652 #[test]
2653 #[should_panic(expected = "scale 40 is greater than max 38")]
2654 fn test_decimal_array_with_precision_and_scale_invalid_scale() {
2655 Decimal128Array::from_iter_values([12345, 456])
2656 .with_precision_and_scale(20, 40)
2657 .unwrap();
2658 }
2659
2660 #[test]
2661 #[should_panic(expected = "scale 10 is greater than precision 4")]
2662 fn test_decimal_array_with_precision_and_scale_invalid_precision_and_scale() {
2663 Decimal128Array::from_iter_values([12345, 456])
2664 .with_precision_and_scale(4, 10)
2665 .unwrap();
2666 }
2667
2668 #[test]
2669 fn test_decimal_array_set_null_if_overflow_with_precision() {
2670 let array = Decimal128Array::from(vec![Some(123456), Some(123), None, Some(123456)]);
2671 let result = array.null_if_overflow_precision(5);
2672 let expected = Decimal128Array::from(vec![None, Some(123), None, None]);
2673 assert_eq!(result, expected);
2674 }
2675
2676 #[test]
2677 fn test_decimal256_iter() {
2678 let mut builder = Decimal256Builder::with_capacity(30);
2679 let decimal1 = i256::from_i128(12345);
2680 builder.append_value(decimal1);
2681
2682 builder.append_null();
2683
2684 let decimal2 = i256::from_i128(56789);
2685 builder.append_value(decimal2);
2686
2687 let array: Decimal256Array = builder.finish().with_precision_and_scale(76, 6).unwrap();
2688
2689 let collected: Vec<_> = array.iter().collect();
2690 assert_eq!(vec![Some(decimal1), None, Some(decimal2)], collected);
2691 }
2692
2693 #[test]
2694 fn test_from_iter_decimal256array() {
2695 let value1 = i256::from_i128(12345);
2696 let value2 = i256::from_i128(56789);
2697
2698 let mut array: Decimal256Array =
2699 vec![Some(value1), None, Some(value2)].into_iter().collect();
2700 array = array.with_precision_and_scale(76, 10).unwrap();
2701 assert_eq!(array.len(), 3);
2702 assert_eq!(array.data_type(), &DataType::Decimal256(76, 10));
2703 assert_eq!(value1, array.value(0));
2704 assert!(!array.is_null(0));
2705 assert!(array.is_null(1));
2706 assert_eq!(value2, array.value(2));
2707 assert!(!array.is_null(2));
2708 }
2709
2710 #[test]
2711 fn test_from_iter_decimal128array() {
2712 let mut array: Decimal128Array = vec![Some(-100), None, Some(101)].into_iter().collect();
2713 array = array.with_precision_and_scale(38, 10).unwrap();
2714 assert_eq!(array.len(), 3);
2715 assert_eq!(array.data_type(), &DataType::Decimal128(38, 10));
2716 assert_eq!(-100_i128, array.value(0));
2717 assert!(!array.is_null(0));
2718 assert!(array.is_null(1));
2719 assert_eq!(101_i128, array.value(2));
2720 assert!(!array.is_null(2));
2721 }
2722
2723 #[test]
2724 fn test_decimal64_iter() {
2725 let mut builder = Decimal64Builder::with_capacity(30);
2726 let decimal1 = 12345;
2727 builder.append_value(decimal1);
2728
2729 builder.append_null();
2730
2731 let decimal2 = 56789;
2732 builder.append_value(decimal2);
2733
2734 let array: Decimal64Array = builder.finish().with_precision_and_scale(18, 4).unwrap();
2735
2736 let collected: Vec<_> = array.iter().collect();
2737 assert_eq!(vec![Some(decimal1), None, Some(decimal2)], collected);
2738 }
2739
2740 #[test]
2741 fn test_from_iter_decimal64array() {
2742 let value1 = 12345;
2743 let value2 = 56789;
2744
2745 let mut array: Decimal64Array =
2746 vec![Some(value1), None, Some(value2)].into_iter().collect();
2747 array = array.with_precision_and_scale(18, 4).unwrap();
2748 assert_eq!(array.len(), 3);
2749 assert_eq!(array.data_type(), &DataType::Decimal64(18, 4));
2750 assert_eq!(value1, array.value(0));
2751 assert!(!array.is_null(0));
2752 assert!(array.is_null(1));
2753 assert_eq!(value2, array.value(2));
2754 assert!(!array.is_null(2));
2755 }
2756
2757 #[test]
2758 fn test_decimal32_iter() {
2759 let mut builder = Decimal32Builder::with_capacity(30);
2760 let decimal1 = 12345;
2761 builder.append_value(decimal1);
2762
2763 builder.append_null();
2764
2765 let decimal2 = 56789;
2766 builder.append_value(decimal2);
2767
2768 let array: Decimal32Array = builder.finish().with_precision_and_scale(9, 2).unwrap();
2769
2770 let collected: Vec<_> = array.iter().collect();
2771 assert_eq!(vec![Some(decimal1), None, Some(decimal2)], collected);
2772 }
2773
2774 #[test]
2775 fn test_from_iter_decimal32array() {
2776 let value1 = 12345;
2777 let value2 = 56789;
2778
2779 let mut array: Decimal32Array =
2780 vec![Some(value1), None, Some(value2)].into_iter().collect();
2781 array = array.with_precision_and_scale(9, 2).unwrap();
2782 assert_eq!(array.len(), 3);
2783 assert_eq!(array.data_type(), &DataType::Decimal32(9, 2));
2784 assert_eq!(value1, array.value(0));
2785 assert!(!array.is_null(0));
2786 assert!(array.is_null(1));
2787 assert_eq!(value2, array.value(2));
2788 assert!(!array.is_null(2));
2789 }
2790
2791 #[test]
2792 fn test_unary_opt() {
2793 let array = Int32Array::from(vec![1, 2, 3, 4, 5, 6, 7]);
2794 let r = array.unary_opt::<_, Int32Type>(|x| (x % 2 != 0).then_some(x));
2795
2796 let expected = Int32Array::from(vec![Some(1), None, Some(3), None, Some(5), None, Some(7)]);
2797 assert_eq!(r, expected);
2798
2799 let r = expected.unary_opt::<_, Int32Type>(|x| (x % 3 != 0).then_some(x));
2800 let expected = Int32Array::from(vec![Some(1), None, None, None, Some(5), None, Some(7)]);
2801 assert_eq!(r, expected);
2802 }
2803
2804 #[test]
2805 #[should_panic(
2806 expected = "Trying to access an element at index 4 from a PrimitiveArray of length 3"
2807 )]
2808 fn test_fixed_size_binary_array_get_value_index_out_of_bound() {
2809 let array = Decimal128Array::from(vec![-100, 0, 101]);
2810 array.value(4);
2811 }
2812
2813 #[test]
2814 fn test_into_builder() {
2815 let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2816
2817 let boxed: ArrayRef = Arc::new(array);
2818 let col: Int32Array = downcast_array(&boxed);
2819 drop(boxed);
2820
2821 let mut builder = col.into_builder().unwrap();
2822
2823 let slice = builder.values_slice_mut();
2824 assert_eq!(slice, &[1, 2, 3]);
2825
2826 slice[0] = 4;
2827 slice[1] = 2;
2828 slice[2] = 1;
2829
2830 let expected: Int32Array = vec![Some(4), Some(2), Some(1)].into_iter().collect();
2831
2832 let new_array = builder.finish();
2833 assert_eq!(expected, new_array);
2834 }
2835
2836 #[test]
2837 fn test_into_builder_cloned_array() {
2838 let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2839
2840 let boxed: ArrayRef = Arc::new(array);
2841
2842 let col: Int32Array = PrimitiveArray::<Int32Type>::from(boxed.to_data());
2843 let err = col.into_builder();
2844
2845 match err {
2846 Ok(_) => panic!("Should not get builder from cloned array"),
2847 Err(returned) => {
2848 let expected: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2849 assert_eq!(expected, returned)
2850 }
2851 }
2852 }
2853
2854 #[test]
2855 fn test_into_builder_on_sliced_array() {
2856 let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2857 let slice = array.slice(1, 2);
2858 let col: Int32Array = downcast_array(&slice);
2859
2860 drop(slice);
2861
2862 col.into_builder()
2863 .expect_err("Should not build builder from sliced array");
2864 }
2865
2866 #[test]
2867 fn test_unary_mut() {
2868 let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2869
2870 let c = array.unary_mut(|x| x * 2 + 1).unwrap();
2871 let expected: Int32Array = vec![3, 5, 7].into_iter().map(Some).collect();
2872
2873 assert_eq!(expected, c);
2874
2875 let array: Int32Array = Int32Array::from(vec![Some(5), Some(7), None]);
2876 let c = array.unary_mut(|x| x * 2 + 1).unwrap();
2877 assert_eq!(c, Int32Array::from(vec![Some(11), Some(15), None]));
2878 }
2879
2880 #[test]
2881 #[should_panic(
2882 expected = "PrimitiveArray expected data type Interval(MonthDayNano) got Interval(DayTime)"
2883 )]
2884 fn test_invalid_interval_type() {
2885 let array = IntervalDayTimeArray::from(vec![IntervalDayTime::ZERO]);
2886 let _ = IntervalMonthDayNanoArray::from(array.into_data());
2887 }
2888
2889 #[test]
2890 fn test_timezone() {
2891 let array = TimestampNanosecondArray::from_iter_values([1, 2]);
2892 assert_eq!(array.timezone(), None);
2893
2894 let array = array.with_timezone("+02:00");
2895 assert_eq!(array.timezone(), Some("+02:00"));
2896 }
2897
2898 #[test]
2899 fn test_try_new() {
2900 Int32Array::new(vec![1, 2, 3, 4].into(), None);
2901 Int32Array::new(vec![1, 2, 3, 4].into(), Some(NullBuffer::new_null(4)));
2902
2903 let err = Int32Array::try_new(vec![1, 2, 3, 4].into(), Some(NullBuffer::new_null(3)))
2904 .unwrap_err();
2905
2906 assert_eq!(
2907 err.to_string(),
2908 "Invalid argument error: Incorrect length of null buffer for PrimitiveArray, expected 4 got 3"
2909 );
2910
2911 TimestampNanosecondArray::new(vec![1, 2, 3, 4].into(), None).with_data_type(
2912 DataType::Timestamp(TimeUnit::Nanosecond, Some("03:00".into())),
2913 );
2914 }
2915
2916 #[test]
2917 #[should_panic(expected = "PrimitiveArray expected data type Int32 got Date32")]
2918 fn test_with_data_type() {
2919 Int32Array::new(vec![1, 2, 3, 4].into(), None).with_data_type(DataType::Date32);
2920 }
2921
2922 #[test]
2923 fn test_time_32second_output() {
2924 let array: Time32SecondArray = vec![
2925 Some(-1),
2926 Some(0),
2927 Some(86_399),
2928 Some(86_400),
2929 Some(86_401),
2930 None,
2931 ]
2932 .into();
2933 let debug_str = format!("{array:?}");
2934 assert_eq!(
2935 "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]",
2936 debug_str
2937 );
2938 }
2939
2940 #[test]
2941 fn test_time_32millisecond_debug_output() {
2942 let array: Time32MillisecondArray = vec![
2943 Some(-1),
2944 Some(0),
2945 Some(86_399_000),
2946 Some(86_400_000),
2947 Some(86_401_000),
2948 None,
2949 ]
2950 .into();
2951 let debug_str = format!("{array:?}");
2952 assert_eq!(
2953 "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]",
2954 debug_str
2955 );
2956 }
2957
2958 #[test]
2959 fn test_time_64nanosecond_debug_output() {
2960 let array: Time64NanosecondArray = vec![
2961 Some(-1),
2962 Some(0),
2963 Some(86_399 * 1_000_000_000),
2964 Some(86_400 * 1_000_000_000),
2965 Some(86_401 * 1_000_000_000),
2966 None,
2967 ]
2968 .into();
2969 let debug_str = format!("{array:?}");
2970 assert_eq!(
2971 "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]",
2972 debug_str
2973 );
2974 }
2975
2976 #[test]
2977 fn test_time_64microsecond_debug_output() {
2978 let array: Time64MicrosecondArray = vec![
2979 Some(-1),
2980 Some(0),
2981 Some(86_399 * 1_000_000),
2982 Some(86_400 * 1_000_000),
2983 Some(86_401 * 1_000_000),
2984 None,
2985 ]
2986 .into();
2987 let debug_str = format!("{array:?}");
2988 assert_eq!(
2989 "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]",
2990 debug_str
2991 );
2992 }
2993
2994 #[test]
2995 fn test_primitive_with_nulls_into_builder() {
2996 let array: Int32Array = vec![
2997 Some(1),
2998 None,
2999 Some(3),
3000 Some(4),
3001 None,
3002 Some(7),
3003 None,
3004 Some(8),
3005 ]
3006 .into_iter()
3007 .collect();
3008 let _ = array.into_builder();
3009 }
3010}