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