Skip to main content

arrow_array/array/
primitive_array.rs

1// Licensed to the Apache Software Foundation (ASF) under one
2// or more contributor license agreements.  See the NOTICE file
3// distributed with this work for additional information
4// regarding copyright ownership.  The ASF licenses this file
5// to you under the Apache License, Version 2.0 (the
6// "License"); you may not use this file except in compliance
7// with the License.  You may obtain a copy of the License at
8//
9//   http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing,
12// software distributed under the License is distributed on an
13// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14// KIND, either express or implied.  See the License for the
15// specific language governing permissions and limitations
16// under the License.
17
18use crate::array::print_long_array;
19use crate::builder::{BooleanBufferBuilder, BufferBuilder, PrimitiveBuilder};
20use crate::iterator::PrimitiveIter;
21use crate::temporal_conversions::{
22    as_date, as_datetime, as_datetime_with_timezone, as_duration, as_time,
23};
24use crate::timezone::Tz;
25use crate::trusted_len::trusted_len_unzip;
26use crate::types::*;
27use crate::{Array, ArrayAccessor, ArrayRef, Scalar};
28use arrow_buffer::{ArrowNativeType, Buffer, NullBuffer, ScalarBuffer, i256};
29use arrow_data::bit_iterator::try_for_each_valid_idx;
30use arrow_data::{ArrayData, ArrayDataBuilder};
31use arrow_schema::{ArrowError, DataType};
32use chrono::{DateTime, Duration, NaiveDate, NaiveDateTime, NaiveTime};
33use half::f16;
34use std::any::Any;
35use std::sync::Arc;
36
37/// A [`PrimitiveArray`] of `i8`
38///
39/// # Examples
40///
41/// Construction
42///
43/// ```
44/// # use arrow_array::Int8Array;
45/// // Create from Vec<Option<i8>>
46/// let arr = Int8Array::from(vec![Some(1), None, Some(2)]);
47/// // Create from Vec<i8>
48/// let arr = Int8Array::from(vec![1, 2, 3]);
49/// // Create iter/collect
50/// let arr: Int8Array = std::iter::repeat(42).take(10).collect();
51/// ```
52///
53/// See [`PrimitiveArray`] for more information and examples
54pub type Int8Array = PrimitiveArray<Int8Type>;
55
56/// A [`PrimitiveArray`] of `i16`
57///
58/// # Examples
59///
60/// Construction
61///
62/// ```
63/// # use arrow_array::Int16Array;
64/// // Create from Vec<Option<i16>>
65/// let arr = Int16Array::from(vec![Some(1), None, Some(2)]);
66/// // Create from Vec<i16>
67/// let arr = Int16Array::from(vec![1, 2, 3]);
68/// // Create iter/collect
69/// let arr: Int16Array = std::iter::repeat(42).take(10).collect();
70/// ```
71///
72/// See [`PrimitiveArray`] for more information and examples
73pub type Int16Array = PrimitiveArray<Int16Type>;
74
75/// A [`PrimitiveArray`] of `i32`
76///
77/// # Examples
78///
79/// Construction
80///
81/// ```
82/// # use arrow_array::Int32Array;
83/// // Create from Vec<Option<i32>>
84/// let arr = Int32Array::from(vec![Some(1), None, Some(2)]);
85/// // Create from Vec<i32>
86/// let arr = Int32Array::from(vec![1, 2, 3]);
87/// // Create iter/collect
88/// let arr: Int32Array = std::iter::repeat(42).take(10).collect();
89/// ```
90///
91/// See [`PrimitiveArray`] for more information and examples
92pub type Int32Array = PrimitiveArray<Int32Type>;
93
94/// A [`PrimitiveArray`] of `i64`
95///
96/// # Examples
97///
98/// Construction
99///
100/// ```
101/// # use arrow_array::Int64Array;
102/// // Create from Vec<Option<i64>>
103/// let arr = Int64Array::from(vec![Some(1), None, Some(2)]);
104/// // Create from Vec<i64>
105/// let arr = Int64Array::from(vec![1, 2, 3]);
106/// // Create iter/collect
107/// let arr: Int64Array = std::iter::repeat(42).take(10).collect();
108/// ```
109///
110/// See [`PrimitiveArray`] for more information and examples
111pub type Int64Array = PrimitiveArray<Int64Type>;
112
113/// A [`PrimitiveArray`] of `u8`
114///
115/// # Examples
116///
117/// Construction
118///
119/// ```
120/// # use arrow_array::UInt8Array;
121/// // Create from Vec<Option<u8>>
122/// let arr = UInt8Array::from(vec![Some(1), None, Some(2)]);
123/// // Create from Vec<u8>
124/// let arr = UInt8Array::from(vec![1, 2, 3]);
125/// // Create iter/collect
126/// let arr: UInt8Array = std::iter::repeat(42).take(10).collect();
127/// ```
128///
129/// See [`PrimitiveArray`] for more information and examples
130pub type UInt8Array = PrimitiveArray<UInt8Type>;
131
132/// A [`PrimitiveArray`] of `u16`
133///
134/// # Examples
135///
136/// Construction
137///
138/// ```
139/// # use arrow_array::UInt16Array;
140/// // Create from Vec<Option<u16>>
141/// let arr = UInt16Array::from(vec![Some(1), None, Some(2)]);
142/// // Create from Vec<u16>
143/// let arr = UInt16Array::from(vec![1, 2, 3]);
144/// // Create iter/collect
145/// let arr: UInt16Array = std::iter::repeat(42).take(10).collect();
146/// ```
147///
148/// See [`PrimitiveArray`] for more information and examples
149pub type UInt16Array = PrimitiveArray<UInt16Type>;
150
151/// A [`PrimitiveArray`] of `u32`
152///
153/// # Examples
154///
155/// Construction
156///
157/// ```
158/// # use arrow_array::UInt32Array;
159/// // Create from Vec<Option<u32>>
160/// let arr = UInt32Array::from(vec![Some(1), None, Some(2)]);
161/// // Create from Vec<u32>
162/// let arr = UInt32Array::from(vec![1, 2, 3]);
163/// // Create iter/collect
164/// let arr: UInt32Array = std::iter::repeat(42).take(10).collect();
165/// ```
166///
167/// See [`PrimitiveArray`] for more information and examples
168pub type UInt32Array = PrimitiveArray<UInt32Type>;
169
170/// A [`PrimitiveArray`] of `u64`
171///
172/// # Examples
173///
174/// Construction
175///
176/// ```
177/// # use arrow_array::UInt64Array;
178/// // Create from Vec<Option<u64>>
179/// let arr = UInt64Array::from(vec![Some(1), None, Some(2)]);
180/// // Create from Vec<u64>
181/// let arr = UInt64Array::from(vec![1, 2, 3]);
182/// // Create iter/collect
183/// let arr: UInt64Array = std::iter::repeat(42).take(10).collect();
184/// ```
185///
186/// See [`PrimitiveArray`] for more information and examples
187pub type UInt64Array = PrimitiveArray<UInt64Type>;
188
189/// A [`PrimitiveArray`] of `f16`
190///
191/// # Examples
192///
193/// Construction
194///
195/// ```
196/// # use arrow_array::Float16Array;
197/// use half::f16;
198/// // Create from Vec<Option<f16>>
199/// let arr = Float16Array::from(vec![Some(f16::from_f64(1.0)), Some(f16::from_f64(2.0))]);
200/// // Create from Vec<i8>
201/// let arr = Float16Array::from(vec![f16::from_f64(1.0), f16::from_f64(2.0), f16::from_f64(3.0)]);
202/// // Create iter/collect
203/// let arr: Float16Array = std::iter::repeat(f16::from_f64(1.0)).take(10).collect();
204/// ```
205///
206/// # Example: Using `collect`
207/// ```
208/// # use arrow_array::Float16Array;
209/// use half::f16;
210/// let arr : Float16Array = [Some(f16::from_f64(1.0)), Some(f16::from_f64(2.0))].into_iter().collect();
211/// ```
212///
213/// See [`PrimitiveArray`] for more information and examples
214pub type Float16Array = PrimitiveArray<Float16Type>;
215
216/// A [`PrimitiveArray`] of `f32`
217///
218/// # Examples
219///
220/// Construction
221///
222/// ```
223/// # use arrow_array::Float32Array;
224/// // Create from Vec<Option<f32>>
225/// let arr = Float32Array::from(vec![Some(1.0), None, Some(2.0)]);
226/// // Create from Vec<f32>
227/// let arr = Float32Array::from(vec![1.0, 2.0, 3.0]);
228/// // Create iter/collect
229/// let arr: Float32Array = std::iter::repeat(42.0).take(10).collect();
230/// ```
231///
232/// See [`PrimitiveArray`] for more information and examples
233pub type Float32Array = PrimitiveArray<Float32Type>;
234
235/// A [`PrimitiveArray`] of `f64`
236///
237/// # Examples
238///
239/// Construction
240///
241/// ```
242/// # use arrow_array::Float64Array;
243/// // Create from Vec<Option<f32>>
244/// let arr = Float64Array::from(vec![Some(1.0), None, Some(2.0)]);
245/// // Create from Vec<f32>
246/// let arr = Float64Array::from(vec![1.0, 2.0, 3.0]);
247/// // Create iter/collect
248/// let arr: Float64Array = std::iter::repeat(42.0).take(10).collect();
249/// ```
250///
251/// See [`PrimitiveArray`] for more information and examples
252pub type Float64Array = PrimitiveArray<Float64Type>;
253
254/// A [`PrimitiveArray`] of seconds since UNIX epoch stored as `i64`
255///
256/// This type is similar to the [`chrono::DateTime`] type and can hold
257/// values such as `1970-05-09 14:25:11 +01:00`
258///
259/// See also [`Timestamp`](arrow_schema::DataType::Timestamp).
260///
261/// # Example: UTC timestamps post epoch
262/// ```
263/// # use arrow_array::TimestampSecondArray;
264/// use arrow_array::timezone::Tz;
265/// // Corresponds to single element array with entry 1970-05-09T14:25:11+0:00
266/// let arr = TimestampSecondArray::from(vec![11111111]);
267/// // OR
268/// let arr = TimestampSecondArray::from(vec![Some(11111111)]);
269/// let utc_tz: Tz = "+00:00".parse().unwrap();
270///
271/// assert_eq!(arr.value_as_datetime_with_tz(0, utc_tz).map(|v| v.to_string()).unwrap(), "1970-05-09 14:25:11 +00:00")
272/// ```
273///
274/// # Example: UTC timestamps pre epoch
275/// ```
276/// # use arrow_array::TimestampSecondArray;
277/// use arrow_array::timezone::Tz;
278/// // Corresponds to single element array with entry 1969-08-25T09:34:49+0:00
279/// let arr = TimestampSecondArray::from(vec![-11111111]);
280/// // OR
281/// let arr = TimestampSecondArray::from(vec![Some(-11111111)]);
282/// let utc_tz: Tz = "+00:00".parse().unwrap();
283///
284/// assert_eq!(arr.value_as_datetime_with_tz(0, utc_tz).map(|v| v.to_string()).unwrap(), "1969-08-25 09:34:49 +00:00")
285/// ```
286///
287/// # Example: With timezone specified
288/// ```
289/// # use arrow_array::TimestampSecondArray;
290/// use arrow_array::timezone::Tz;
291/// // Corresponds to single element array with entry 1970-05-10T00:25:11+10:00
292/// let arr = TimestampSecondArray::from(vec![11111111]).with_timezone("+10:00".to_string());
293/// // OR
294/// let arr = TimestampSecondArray::from(vec![Some(11111111)]).with_timezone("+10:00".to_string());
295/// let sydney_tz: Tz = "+10:00".parse().unwrap();
296///
297/// assert_eq!(arr.value_as_datetime_with_tz(0, sydney_tz).map(|v| v.to_string()).unwrap(), "1970-05-10 00:25:11 +10:00")
298/// ```
299///
300/// See [`PrimitiveArray`] for more information and examples
301pub type TimestampSecondArray = PrimitiveArray<TimestampSecondType>;
302
303/// A [`PrimitiveArray`] of milliseconds since UNIX epoch stored as `i64`
304///
305/// See examples for [`TimestampSecondArray`]
306pub type TimestampMillisecondArray = PrimitiveArray<TimestampMillisecondType>;
307
308/// A [`PrimitiveArray`] of microseconds since UNIX epoch stored as `i64`
309///
310/// See examples for [`TimestampSecondArray`]
311pub type TimestampMicrosecondArray = PrimitiveArray<TimestampMicrosecondType>;
312
313/// A [`PrimitiveArray`] of nanoseconds since UNIX epoch stored as `i64`
314///
315/// See examples for [`TimestampSecondArray`]
316pub type TimestampNanosecondArray = PrimitiveArray<TimestampNanosecondType>;
317
318/// A [`PrimitiveArray`] of days since UNIX epoch stored as `i32`
319///
320/// This type is similar to the [`chrono::NaiveDate`] type and can hold
321/// values such as `2018-11-13`
322pub type Date32Array = PrimitiveArray<Date32Type>;
323
324/// A [`PrimitiveArray`] of milliseconds since UNIX epoch stored as `i64`
325///
326/// This type is similar to the [`chrono::NaiveDate`] type and can hold
327/// values such as `2018-11-13`
328pub type Date64Array = PrimitiveArray<Date64Type>;
329
330/// A [`PrimitiveArray`] of seconds since midnight stored as `i32`
331///
332/// This type is similar to the [`chrono::NaiveTime`] type and can
333/// hold values such as `00:02:00`
334pub type Time32SecondArray = PrimitiveArray<Time32SecondType>;
335
336/// A [`PrimitiveArray`] of milliseconds since midnight stored as `i32`
337///
338/// This type is similar to the [`chrono::NaiveTime`] type and can
339/// hold values such as `00:02:00.123`
340pub type Time32MillisecondArray = PrimitiveArray<Time32MillisecondType>;
341
342/// A [`PrimitiveArray`] of microseconds since midnight stored as `i64`
343///
344/// This type is similar to the [`chrono::NaiveTime`] type and can
345/// hold values such as `00:02:00.123456`
346pub type Time64MicrosecondArray = PrimitiveArray<Time64MicrosecondType>;
347
348/// A [`PrimitiveArray`] of nanoseconds since midnight stored as `i64`
349///
350/// This type is similar to the [`chrono::NaiveTime`] type and can
351/// hold values such as `00:02:00.123456789`
352pub type Time64NanosecondArray = PrimitiveArray<Time64NanosecondType>;
353
354/// A [`PrimitiveArray`] of “calendar” intervals in whole months
355///
356/// See [`IntervalYearMonthType`] for details on representation and caveats.
357///
358/// # Example
359/// ```
360/// # use arrow_array::IntervalYearMonthArray;
361/// let array = IntervalYearMonthArray::from(vec![
362///   2,  // 2 months
363///   25, // 2 years and 1 month
364///   -1  // -1 months
365/// ]);
366/// ```
367pub type IntervalYearMonthArray = PrimitiveArray<IntervalYearMonthType>;
368
369/// A [`PrimitiveArray`] of “calendar” intervals in days and milliseconds
370///
371/// See [`IntervalDayTime`] for details on representation and caveats.
372///
373/// # Example
374/// ```
375/// # use arrow_array::IntervalDayTimeArray;
376/// use arrow_array::types::IntervalDayTime;
377/// let array = IntervalDayTimeArray::from(vec![
378///   IntervalDayTime::new(1, 1000),                 // 1 day, 1000 milliseconds
379///   IntervalDayTime::new(33, 0),                  // 33 days, 0 milliseconds
380///   IntervalDayTime::new(0, 12 * 60 * 60 * 1000), // 0 days, 12 hours
381/// ]);
382/// ```
383pub type IntervalDayTimeArray = PrimitiveArray<IntervalDayTimeType>;
384
385/// A [`PrimitiveArray`] of “calendar” intervals in  months, days, and nanoseconds.
386///
387/// See [`IntervalMonthDayNano`] for details on representation and caveats.
388///
389/// # Example
390/// ```
391/// # use arrow_array::IntervalMonthDayNanoArray;
392/// use arrow_array::types::IntervalMonthDayNano;
393/// let array = IntervalMonthDayNanoArray::from(vec![
394///   IntervalMonthDayNano::new(1, 2, 1000),             // 1 month, 2 days, 1 nanosecond
395///   IntervalMonthDayNano::new(12, 1, 0),               // 12 months, 1 days, 0 nanoseconds
396///   IntervalMonthDayNano::new(0, 0, 12 * 1000 * 1000), // 0 days, 12 milliseconds
397/// ]);
398/// ```
399pub type IntervalMonthDayNanoArray = PrimitiveArray<IntervalMonthDayNanoType>;
400
401/// A [`PrimitiveArray`] of elapsed durations in seconds
402pub type DurationSecondArray = PrimitiveArray<DurationSecondType>;
403
404/// A [`PrimitiveArray`] of elapsed durations in milliseconds
405pub type DurationMillisecondArray = PrimitiveArray<DurationMillisecondType>;
406
407/// A [`PrimitiveArray`] of elapsed durations in microseconds
408pub type DurationMicrosecondArray = PrimitiveArray<DurationMicrosecondType>;
409
410/// A [`PrimitiveArray`] of elapsed durations in nanoseconds
411pub type DurationNanosecondArray = PrimitiveArray<DurationNanosecondType>;
412
413/// A [`PrimitiveArray`] of 32-bit fixed point decimals
414///
415/// # Examples
416///
417/// Construction
418///
419/// ```
420/// # use arrow_array::Decimal32Array;
421/// // Create from Vec<Option<i32>>
422/// let arr = Decimal32Array::from(vec![Some(1), None, Some(2)]);
423/// // Create from Vec<i32>
424/// let arr = Decimal32Array::from(vec![1, 2, 3]);
425/// // Create iter/collect
426/// let arr: Decimal32Array = std::iter::repeat(42).take(10).collect();
427/// ```
428///
429/// See [`PrimitiveArray`] for more information and examples
430pub type Decimal32Array = PrimitiveArray<Decimal32Type>;
431
432/// A [`PrimitiveArray`] of 64-bit fixed point decimals
433///
434/// # Examples
435///
436/// Construction
437///
438/// ```
439/// # use arrow_array::Decimal64Array;
440/// // Create from Vec<Option<i64>>
441/// let arr = Decimal64Array::from(vec![Some(1), None, Some(2)]);
442/// // Create from Vec<i64>
443/// let arr = Decimal64Array::from(vec![1, 2, 3]);
444/// // Create iter/collect
445/// let arr: Decimal64Array = std::iter::repeat(42).take(10).collect();
446/// ```
447///
448/// See [`PrimitiveArray`] for more information and examples
449pub type Decimal64Array = PrimitiveArray<Decimal64Type>;
450
451/// A [`PrimitiveArray`] of 128-bit fixed point decimals
452///
453/// # Examples
454///
455/// Construction
456///
457/// ```
458/// # use arrow_array::Decimal128Array;
459/// // Create from Vec<Option<i128>>
460/// let arr = Decimal128Array::from(vec![Some(1), None, Some(2)]);
461/// // Create from Vec<i128>
462/// let arr = Decimal128Array::from(vec![1, 2, 3]);
463/// // Create iter/collect
464/// let arr: Decimal128Array = std::iter::repeat(42).take(10).collect();
465/// ```
466///
467/// See [`PrimitiveArray`] for more information and examples
468pub type Decimal128Array = PrimitiveArray<Decimal128Type>;
469
470/// A [`PrimitiveArray`] of 256-bit fixed point decimals
471///
472/// # Examples
473///
474/// Construction
475///
476/// ```
477/// # use arrow_array::Decimal256Array;
478/// use arrow_buffer::i256;
479/// // Create from Vec<Option<i256>>
480/// let arr = Decimal256Array::from(vec![Some(i256::from(1)), None, Some(i256::from(2))]);
481/// // Create from Vec<i256>
482/// let arr = Decimal256Array::from(vec![i256::from(1), i256::from(2), i256::from(3)]);
483/// // Create iter/collect
484/// let arr: Decimal256Array = std::iter::repeat(i256::from(42)).take(10).collect();
485/// ```
486///
487/// See [`PrimitiveArray`] for more information and examples
488pub type Decimal256Array = PrimitiveArray<Decimal256Type>;
489
490pub use crate::types::ArrowPrimitiveType;
491
492/// An array of primitive values, of type [`ArrowPrimitiveType`]
493///
494/// # Example: From a Vec
495///
496/// *Note*: Converting a `Vec` to a `PrimitiveArray` does not copy the data.
497/// The new `PrimitiveArray` uses the same underlying allocation from the `Vec`.
498///
499/// ```
500/// # use arrow_array::{Array, PrimitiveArray, types::Int32Type};
501/// let arr: PrimitiveArray<Int32Type> = vec![1, 2, 3, 4].into();
502/// assert_eq!(4, arr.len());
503/// assert_eq!(0, arr.null_count());
504/// assert_eq!(arr.values(), &[1, 2, 3, 4])
505/// ```
506///
507/// # Example: To a `Vec<T>`
508///
509/// *Note*: In some cases, converting `PrimitiveArray` to a `Vec` is zero-copy
510/// and does not copy the data (see [`Buffer::into_vec`] for conditions). In
511/// such cases, the `Vec` will use the same underlying memory allocation from
512/// the `PrimitiveArray`.
513///
514/// The Rust compiler generates highly optimized code for operations on
515/// Vec, so using a Vec can often be faster than using a PrimitiveArray directly.
516///
517/// ```
518/// # use arrow_array::{Array, PrimitiveArray, types::Int32Type};
519/// let arr = PrimitiveArray::<Int32Type>::from(vec![1, 2, 3, 4]);
520/// let starting_ptr = arr.values().as_ptr();
521/// // split into its parts
522/// let (datatype, buffer, nulls) = arr.into_parts();
523/// // Convert the buffer to a Vec<i32> (zero copy)
524/// // (note this requires that there are no other references)
525/// let mut vec: Vec<i32> = buffer.into();
526/// vec[2] = 300;
527/// // put the parts back together
528/// let arr = PrimitiveArray::<Int32Type>::try_new(vec.into(), nulls).unwrap();
529/// assert_eq!(arr.values(), &[1, 2, 300, 4]);
530/// // The same allocation was used
531/// assert_eq!(starting_ptr, arr.values().as_ptr());
532/// ```
533///
534/// # Example: From an optional Vec
535///
536/// ```
537/// # use arrow_array::{Array, PrimitiveArray, types::Int32Type};
538/// let arr: PrimitiveArray<Int32Type> = vec![Some(1), None, Some(3), None].into();
539/// assert_eq!(4, arr.len());
540/// assert_eq!(2, arr.null_count());
541/// // Note: values for null indexes are arbitrary
542/// assert_eq!(arr.values(), &[1, 0, 3, 0])
543/// ```
544///
545/// # Example: From an iterator of values
546///
547/// ```
548/// # use arrow_array::{Array, PrimitiveArray, types::Int32Type};
549/// let arr: PrimitiveArray<Int32Type> = (0..10).map(|x| x + 1).collect();
550/// assert_eq!(10, arr.len());
551/// assert_eq!(0, arr.null_count());
552/// for i in 0..10i32 {
553///     assert_eq!(i + 1, arr.value(i as usize));
554/// }
555/// ```
556///
557/// # Example: From an iterator of option
558///
559/// ```
560/// # use arrow_array::{Array, PrimitiveArray, types::Int32Type};
561/// let arr: PrimitiveArray<Int32Type> = (0..10).map(|x| (x % 2 == 0).then_some(x)).collect();
562/// assert_eq!(10, arr.len());
563/// assert_eq!(5, arr.null_count());
564/// // Note: values for null indexes are arbitrary
565/// assert_eq!(arr.values(), &[0, 0, 2, 0, 4, 0, 6, 0, 8, 0])
566/// ```
567///
568/// # Example: Using Builder
569///
570/// ```
571/// # use arrow_array::Array;
572/// # use arrow_array::builder::PrimitiveBuilder;
573/// # use arrow_array::types::Int32Type;
574/// let mut builder = PrimitiveBuilder::<Int32Type>::new();
575/// builder.append_value(1);
576/// builder.append_null();
577/// builder.append_value(2);
578/// let array = builder.finish();
579/// // Note: values for null indexes are arbitrary
580/// assert_eq!(array.values(), &[1, 0, 2]);
581/// assert!(array.is_null(1));
582/// ```
583///
584/// # Example: Get a `PrimitiveArray` from an [`ArrayRef`]
585/// ```
586/// # use std::sync::Arc;
587/// # use arrow_array::{Array, cast::AsArray, ArrayRef, Float32Array, PrimitiveArray};
588/// # use arrow_array::types::{Float32Type};
589/// # use arrow_schema::DataType;
590/// # let array: ArrayRef =  Arc::new(Float32Array::from(vec![1.2, 2.3]));
591/// // will panic if the array is not a Float32Array
592/// assert_eq!(&DataType::Float32, array.data_type());
593/// let f32_array: Float32Array  = array.as_primitive().clone();
594/// assert_eq!(f32_array, Float32Array::from(vec![1.2, 2.3]));
595/// ```
596pub struct PrimitiveArray<T: ArrowPrimitiveType> {
597    data_type: DataType,
598    /// Values data
599    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    /// Create a new [`PrimitiveArray`] from the provided values and nulls
615    ///
616    /// # Panics
617    ///
618    /// Panics if [`Self::try_new`] returns an error
619    ///
620    /// # Example
621    ///
622    /// Creating a [`PrimitiveArray`] directly from a [`ScalarBuffer`] and [`NullBuffer`] using
623    /// this constructor is the most performant approach, avoiding any additional allocations
624    ///
625    /// ```
626    /// # use arrow_array::Int32Array;
627    /// # use arrow_array::types::Int32Type;
628    /// # use arrow_buffer::NullBuffer;
629    /// // [1, 2, 3, 4]
630    /// let array = Int32Array::new(vec![1, 2, 3, 4].into(), None);
631    /// // [1, null, 3, 4]
632    /// let nulls = NullBuffer::from(vec![true, false, true, true]);
633    /// let array = Int32Array::new(vec![1, 2, 3, 4].into(), Some(nulls));
634    /// ```
635    pub fn new(values: ScalarBuffer<T::Native>, nulls: Option<NullBuffer>) -> Self {
636        Self::try_new(values, nulls).unwrap()
637    }
638
639    /// Create a new [`PrimitiveArray`] of the given length where all values are null
640    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    /// Create a new [`PrimitiveArray`] from the provided values and nulls
649    ///
650    /// # Errors
651    ///
652    /// Errors if:
653    /// - `values.len() != nulls.len()`
654    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    /// Create a new [`Scalar`] from `value`
676    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    /// Deconstruct this array into its constituent parts
685    pub fn into_parts(self) -> (DataType, ScalarBuffer<T::Native>, Option<NullBuffer>) {
686        (self.data_type, self.values, self.nulls)
687    }
688
689    /// Overrides the [`DataType`] of this [`PrimitiveArray`]
690    ///
691    /// Prefer using [`Self::with_timezone`] or [`Self::with_precision_and_scale`] where
692    /// the primitive type is suitably constrained, as these cannot panic
693    ///
694    /// # Panics
695    ///
696    /// Panics if ![Self::is_compatible]
697    pub fn with_data_type(self, data_type: DataType) -> Self {
698        Self::assert_compatible(&data_type);
699        Self { data_type, ..self }
700    }
701
702    /// Asserts that `data_type` is compatible with `Self`
703    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    /// Returns the length of this array.
713    #[inline]
714    pub fn len(&self) -> usize {
715        self.values.len()
716    }
717
718    /// Returns whether this array is empty.
719    pub fn is_empty(&self) -> bool {
720        self.values.is_empty()
721    }
722
723    /// Returns the values of this array
724    #[inline]
725    pub fn values(&self) -> &ScalarBuffer<T::Native> {
726        &self.values
727    }
728
729    /// Returns a new primitive array builder
730    pub fn builder(capacity: usize) -> PrimitiveBuilder<T> {
731        PrimitiveBuilder::<T>::with_capacity(capacity)
732    }
733
734    /// Returns if this [`PrimitiveArray`] is compatible with the provided [`DataType`]
735    ///
736    /// This is equivalent to `data_type == T::DATA_TYPE`, however ignores timestamp
737    /// timezones and decimal precision and scale
738    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    /// Returns the primitive value at index `i`.
752    ///
753    /// Note: This method does not check for nulls and the value is arbitrary
754    /// if [`is_null`](Self::is_null) returns true for the index.
755    ///
756    /// # Safety
757    ///
758    /// caller must ensure that the passed in offset is less than the array len()
759    #[inline]
760    pub unsafe fn value_unchecked(&self, i: usize) -> T::Native {
761        unsafe { *self.values.get_unchecked(i) }
762    }
763
764    /// Returns the primitive value at index `i`.
765    ///
766    /// Note: This method does not check for nulls and the value is arbitrary
767    /// if [`is_null`](Self::is_null) returns true for the index.
768    ///
769    /// # Panics
770    /// Panics if index `i` is out of bounds
771    #[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    /// Creates a PrimitiveArray based on an iterator of values without nulls
783    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    /// Creates a PrimitiveArray based on an iterator of values with provided nulls
794    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    /// Creates a PrimitiveArray based on a constant value with `count` elements
808    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    /// Returns an iterator that returns the values of `array.value(i)` for an iterator with each element `i`
814    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    /// Returns an iterator that returns the values of `array.value(i)` for an iterator with each element `i`
822    /// # Safety
823    ///
824    /// caller must ensure that the offsets in the iterator are less than the array len()
825    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    /// Returns a zero-copy slice of this array with the indicated offset and length.
833    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    /// Reinterprets this array's contents as a different data type without copying
842    ///
843    /// This can be used to efficiently convert between primitive arrays with the
844    /// same underlying representation
845    ///
846    /// Note: this will not modify the underlying values, and therefore may change
847    /// the semantic values of the array, e.g. 100 milliseconds in a [`TimestampNanosecondArray`]
848    /// will become 100 seconds in a [`TimestampSecondArray`].
849    ///
850    /// For casts that preserve the semantic value, check out the
851    /// [compute kernels](https://docs.rs/arrow/latest/arrow/compute/kernels/cast/index.html).
852    ///
853    /// ```
854    /// # use arrow_array::{Int64Array, TimestampNanosecondArray};
855    /// let a = Int64Array::from_iter_values([1, 2, 3, 4]);
856    /// let b: TimestampNanosecondArray = a.reinterpret_cast();
857    /// ```
858    pub fn reinterpret_cast<K>(&self) -> PrimitiveArray<K>
859    where
860        K: ArrowPrimitiveType<Native = T::Native>,
861    {
862        let d = self.to_data().into_builder().data_type(K::DATA_TYPE);
863
864        // SAFETY:
865        // Native type is the same
866        PrimitiveArray::from(unsafe { d.build_unchecked() })
867    }
868
869    /// Applies a unary infallible function to a primitive array, producing a
870    /// new array of potentially different type.
871    ///
872    /// This is the fastest way to perform an operation on a primitive array
873    /// when the benefits of a vectorized operation outweigh the cost of
874    /// branching nulls and non-nulls.
875    ///
876    /// See also
877    /// * [`Self::unary_mut`] for in place modification.
878    /// * [`Self::try_unary`] for fallible operations.
879    /// * [`arrow::compute::binary`] for binary operations
880    ///
881    /// [`arrow::compute::binary`]: https://docs.rs/arrow/latest/arrow/compute/fn.binary.html
882    /// # Null Handling
883    ///
884    /// Applies the function for all values, including those on null slots. This
885    /// will often allow the compiler to generate faster vectorized code, but
886    /// requires that the operation must be infallible (not error/panic) for any
887    /// value of the corresponding type or this function may panic.
888    ///
889    /// # Example
890    /// ```rust
891    /// # use arrow_array::{Int32Array, Float32Array, types::Int32Type};
892    /// # fn main() {
893    /// let array = Int32Array::from(vec![Some(5), Some(7), None]);
894    /// // Create a new array with the value of applying sqrt
895    /// let c = array.unary(|x| f32::sqrt(x as f32));
896    /// assert_eq!(c, Float32Array::from(vec![Some(2.236068), Some(2.6457512), None]));
897    /// # }
898    /// ```
899    pub fn unary<F, O>(&self, op: F) -> PrimitiveArray<O>
900    where
901        O: ArrowPrimitiveType,
902        F: Fn(T::Native) -> O::Native,
903    {
904        let nulls = self.nulls().cloned();
905        let values = self.values().into_iter().map(|v| op(*v));
906        let buffer: Vec<_> = values.collect();
907        PrimitiveArray::new(buffer.into(), nulls)
908    }
909
910    /// Applies a unary and infallible function to the array in place if possible.
911    ///
912    /// # Buffer Reuse
913    ///
914    /// If the underlying buffers are not shared with other arrays,  mutates the
915    /// underlying buffer in place, without allocating.
916    ///
917    /// If the underlying buffer is shared, returns Err(self)
918    ///
919    /// # Null Handling
920    ///
921    /// See [`Self::unary`] for more information on null handling.
922    ///
923    /// # Example
924    ///
925    /// ```rust
926    /// # use arrow_array::{Int32Array, types::Int32Type};
927    /// let array = Int32Array::from(vec![Some(5), Some(7), None]);
928    /// // Apply x*2+1 to the data in place, no allocations
929    /// let c = array.unary_mut(|x| x * 2 + 1).unwrap();
930    /// assert_eq!(c, Int32Array::from(vec![Some(11), Some(15), None]));
931    /// ```
932    ///
933    /// # Example: modify [`ArrayRef`] in place, if not shared
934    ///
935    /// It is also possible to modify an [`ArrayRef`] if there are no other
936    /// references to the underlying buffer.
937    ///
938    /// ```rust
939    /// # use std::sync::Arc;
940    /// # use arrow_array::{Array, cast::AsArray, ArrayRef, Int32Array, PrimitiveArray, types::Int32Type};
941    /// # let array: ArrayRef = Arc::new(Int32Array::from(vec![Some(5), Some(7), None]));
942    /// // Convert to Int32Array (panic's if array.data_type is not Int32)
943    /// let a = array.as_primitive::<Int32Type>().clone();
944    /// // Try to apply x*2+1 to the data in place, fails because array is still shared
945    /// a.unary_mut(|x| x * 2 + 1).unwrap_err();
946    /// // Try again, this time dropping the last remaining reference
947    /// let a = array.as_primitive::<Int32Type>().clone();
948    /// drop(array);
949    /// // Now we can apply the operation in place
950    /// let c = a.unary_mut(|x| x * 2 + 1).unwrap();
951    /// assert_eq!(c, Int32Array::from(vec![Some(11), Some(15), None]));
952    /// ```
953    pub fn unary_mut<F>(self, op: F) -> Result<PrimitiveArray<T>, PrimitiveArray<T>>
954    where
955        F: Fn(T::Native) -> T::Native,
956    {
957        let mut builder = self.into_builder()?;
958        builder
959            .values_slice_mut()
960            .iter_mut()
961            .for_each(|v| *v = op(*v));
962        Ok(builder.finish())
963    }
964
965    /// Applies a unary fallible function to all valid values in a primitive
966    /// array, producing a new array of potentially different type.
967    ///
968    /// Applies `op` to only rows that are valid, which is often significantly
969    /// slower than [`Self::unary`], which should be preferred if `op` is
970    /// fallible.
971    ///
972    /// Note: LLVM is currently unable to effectively vectorize fallible operations
973    pub fn try_unary<F, O, E>(&self, op: F) -> Result<PrimitiveArray<O>, E>
974    where
975        O: ArrowPrimitiveType,
976        F: Fn(T::Native) -> Result<O::Native, E>,
977    {
978        let len = self.len();
979
980        let nulls = self.nulls().cloned();
981        let mut buffer = BufferBuilder::<O::Native>::new(len);
982        buffer.append_n_zeroed(len);
983        let slice = buffer.as_slice_mut();
984
985        let f = |idx| {
986            unsafe { *slice.get_unchecked_mut(idx) = op(self.value_unchecked(idx))? };
987            Ok::<_, E>(())
988        };
989
990        match &nulls {
991            Some(nulls) => nulls.try_for_each_valid_idx(f)?,
992            None => (0..len).try_for_each(f)?,
993        }
994
995        let values = buffer.finish().into();
996        Ok(PrimitiveArray::new(values, nulls))
997    }
998
999    /// Applies a unary fallible function to all valid values in a mutable
1000    /// primitive array.
1001    ///
1002    /// # Null Handling
1003    ///
1004    /// See [`Self::try_unary`] for more information on null handling.
1005    ///
1006    /// # Buffer Reuse
1007    ///
1008    /// See [`Self::unary_mut`] for more information on buffer reuse.
1009    ///
1010    /// This returns an `Err` when the input array is shared buffer with other
1011    /// array. In the case, returned `Err` wraps input array. If the function
1012    /// encounters an error during applying on values. In the case, this returns an `Err` within
1013    /// an `Ok` which wraps the actual error.
1014    ///
1015    /// Note: LLVM is currently unable to effectively vectorize fallible operations
1016    pub fn try_unary_mut<F, E>(
1017        self,
1018        op: F,
1019    ) -> Result<Result<PrimitiveArray<T>, E>, PrimitiveArray<T>>
1020    where
1021        F: Fn(T::Native) -> Result<T::Native, E>,
1022    {
1023        let len = self.len();
1024        let null_count = self.null_count();
1025        let mut builder = self.into_builder()?;
1026
1027        let (slice, null_buffer) = builder.slices_mut();
1028
1029        let r = try_for_each_valid_idx(len, 0, null_count, null_buffer.as_deref(), |idx| {
1030            unsafe { *slice.get_unchecked_mut(idx) = op(*slice.get_unchecked(idx))? };
1031            Ok::<_, E>(())
1032        });
1033
1034        if let Err(err) = r {
1035            return Ok(Err(err));
1036        }
1037
1038        Ok(Ok(builder.finish()))
1039    }
1040
1041    /// Applies a unary and nullable function to all valid values in a primitive array
1042    ///
1043    /// Applies `op` to only rows that are valid, which is often significantly
1044    /// slower than [`Self::unary`], which should be preferred if `op` is
1045    /// fallible.
1046    ///
1047    /// Note: LLVM is currently unable to effectively vectorize fallible operations
1048    pub fn unary_opt<F, O>(&self, op: F) -> PrimitiveArray<O>
1049    where
1050        O: ArrowPrimitiveType,
1051        F: Fn(T::Native) -> Option<O::Native>,
1052    {
1053        let len = self.len();
1054        let (nulls, null_count, offset) = match self.nulls() {
1055            Some(n) => (Some(n.validity()), n.null_count(), n.offset()),
1056            None => (None, 0, 0),
1057        };
1058
1059        let mut null_builder = BooleanBufferBuilder::new(len);
1060        match nulls {
1061            Some(b) => null_builder.append_packed_range(offset..offset + len, b),
1062            None => null_builder.append_n(len, true),
1063        }
1064
1065        let mut buffer = BufferBuilder::<O::Native>::new(len);
1066        buffer.append_n_zeroed(len);
1067        let slice = buffer.as_slice_mut();
1068
1069        let mut out_null_count = null_count;
1070
1071        let _ = try_for_each_valid_idx(len, offset, null_count, nulls, |idx| {
1072            match op(unsafe { self.value_unchecked(idx) }) {
1073                Some(v) => unsafe { *slice.get_unchecked_mut(idx) = v },
1074                None => {
1075                    out_null_count += 1;
1076                    null_builder.set_bit(idx, false);
1077                }
1078            }
1079            Ok::<_, ()>(())
1080        });
1081
1082        let nulls = null_builder.finish();
1083        let values = buffer.finish().into();
1084        let nulls = unsafe { NullBuffer::new_unchecked(nulls, out_null_count) };
1085        PrimitiveArray::new(values, Some(nulls))
1086    }
1087
1088    /// Applies a unary infallible function to each value in an array, producing a
1089    /// new primitive array.
1090    ///
1091    /// # Null Handling
1092    ///
1093    /// See [`Self::unary`] for more information on null handling.
1094    ///
1095    /// # Example: create an [`Int16Array`] from an [`ArrayAccessor`] with item type `&[u8]`
1096    /// ```
1097    /// use arrow_array::{Array, FixedSizeBinaryArray, Int16Array};
1098    /// let input_arg = vec![ vec![1, 0], vec![2, 0], vec![3, 0] ];
1099    /// let arr = FixedSizeBinaryArray::try_from_iter(input_arg.into_iter()).unwrap();
1100    /// let c = Int16Array::from_unary(&arr, |x| i16::from_le_bytes(x[..2].try_into().unwrap()));
1101    /// assert_eq!(c, Int16Array::from(vec![Some(1i16), Some(2i16), Some(3i16)]));
1102    /// ```
1103    pub fn from_unary<U: ArrayAccessor, F>(left: U, mut op: F) -> Self
1104    where
1105        F: FnMut(U::Item) -> T::Native,
1106    {
1107        let nulls = left.logical_nulls();
1108        let buffer: Vec<_> = (0..left.len())
1109            // SAFETY: i in range 0..left.len()
1110            .map(|i| op(unsafe { left.value_unchecked(i) }))
1111            .collect();
1112        PrimitiveArray::new(buffer.into(), nulls)
1113    }
1114
1115    /// Returns a `PrimitiveBuilder` for this array, suitable for mutating values
1116    /// in place.
1117    ///
1118    /// # Buffer Reuse
1119    ///
1120    /// If the underlying data buffer has no other outstanding references, the
1121    /// buffer is used without copying.
1122    ///
1123    /// If the underlying data buffer does have outstanding references, returns
1124    /// `Err(self)`
1125    pub fn into_builder(self) -> Result<PrimitiveBuilder<T>, Self> {
1126        let len = self.len();
1127        let data = self.into_data();
1128        let null_bit_buffer = data.nulls().map(|b| b.inner().sliced());
1129
1130        let element_len = std::mem::size_of::<T::Native>();
1131        let buffer =
1132            data.buffers()[0].slice_with_length(data.offset() * element_len, len * element_len);
1133
1134        drop(data);
1135
1136        let try_mutable_null_buffer = match null_bit_buffer {
1137            None => Ok(None),
1138            Some(null_buffer) => {
1139                // Null buffer exists, tries to make it mutable
1140                null_buffer.into_mutable().map(Some)
1141            }
1142        };
1143
1144        let try_mutable_buffers = match try_mutable_null_buffer {
1145            Ok(mutable_null_buffer) => {
1146                // Got mutable null buffer, tries to get mutable value buffer
1147                let try_mutable_buffer = buffer.into_mutable();
1148
1149                // try_mutable_buffer.map(...).map_err(...) doesn't work as the compiler complains
1150                // mutable_null_buffer is moved into map closure.
1151                match try_mutable_buffer {
1152                    Ok(mutable_buffer) => Ok(PrimitiveBuilder::<T>::new_from_buffer(
1153                        mutable_buffer,
1154                        mutable_null_buffer,
1155                    )),
1156                    Err(buffer) => Err((buffer, mutable_null_buffer.map(|b| b.into()))),
1157                }
1158            }
1159            Err(mutable_null_buffer) => {
1160                // Unable to get mutable null buffer
1161                Err((buffer, Some(mutable_null_buffer)))
1162            }
1163        };
1164
1165        match try_mutable_buffers {
1166            Ok(builder) => Ok(builder),
1167            Err((buffer, null_bit_buffer)) => {
1168                let builder = ArrayData::builder(T::DATA_TYPE)
1169                    .len(len)
1170                    .add_buffer(buffer)
1171                    .null_bit_buffer(null_bit_buffer);
1172
1173                let array_data = unsafe { builder.build_unchecked() };
1174                let array = PrimitiveArray::<T>::from(array_data);
1175
1176                Err(array)
1177            }
1178        }
1179    }
1180}
1181
1182impl<T: ArrowPrimitiveType> From<PrimitiveArray<T>> for ArrayData {
1183    fn from(array: PrimitiveArray<T>) -> Self {
1184        let builder = ArrayDataBuilder::new(array.data_type)
1185            .len(array.values.len())
1186            .nulls(array.nulls)
1187            .buffers(vec![array.values.into_inner()]);
1188
1189        unsafe { builder.build_unchecked() }
1190    }
1191}
1192
1193/// SAFETY: Correctly implements the contract of Arrow Arrays
1194unsafe impl<T: ArrowPrimitiveType> Array for PrimitiveArray<T> {
1195    fn as_any(&self) -> &dyn Any {
1196        self
1197    }
1198
1199    fn to_data(&self) -> ArrayData {
1200        self.clone().into()
1201    }
1202
1203    fn into_data(self) -> ArrayData {
1204        self.into()
1205    }
1206
1207    fn data_type(&self) -> &DataType {
1208        &self.data_type
1209    }
1210
1211    fn slice(&self, offset: usize, length: usize) -> ArrayRef {
1212        Arc::new(self.slice(offset, length))
1213    }
1214
1215    fn len(&self) -> usize {
1216        self.values.len()
1217    }
1218
1219    fn is_empty(&self) -> bool {
1220        self.values.is_empty()
1221    }
1222
1223    fn shrink_to_fit(&mut self) {
1224        self.values.shrink_to_fit();
1225        if let Some(nulls) = &mut self.nulls {
1226            nulls.shrink_to_fit();
1227        }
1228    }
1229
1230    fn offset(&self) -> usize {
1231        0
1232    }
1233
1234    fn nulls(&self) -> Option<&NullBuffer> {
1235        self.nulls.as_ref()
1236    }
1237
1238    fn logical_null_count(&self) -> usize {
1239        self.null_count()
1240    }
1241
1242    fn get_buffer_memory_size(&self) -> usize {
1243        let mut size = self.values.inner().capacity();
1244        if let Some(n) = self.nulls.as_ref() {
1245            size += n.buffer().capacity();
1246        }
1247        size
1248    }
1249
1250    fn get_array_memory_size(&self) -> usize {
1251        std::mem::size_of::<Self>() + self.get_buffer_memory_size()
1252    }
1253}
1254
1255impl<T: ArrowPrimitiveType> ArrayAccessor for &PrimitiveArray<T> {
1256    type Item = T::Native;
1257
1258    fn value(&self, index: usize) -> Self::Item {
1259        PrimitiveArray::value(self, index)
1260    }
1261
1262    #[inline]
1263    unsafe fn value_unchecked(&self, index: usize) -> Self::Item {
1264        unsafe { PrimitiveArray::value_unchecked(self, index) }
1265    }
1266}
1267
1268impl<T: ArrowTemporalType> PrimitiveArray<T>
1269where
1270    i64: From<T::Native>,
1271{
1272    /// Returns value as a chrono `NaiveDateTime`, handling time resolution
1273    ///
1274    /// If a data type cannot be converted to `NaiveDateTime`, a `None` is returned.
1275    /// A valid value is expected, thus the user should first check for validity.
1276    ///
1277    /// See notes on [`PrimitiveArray::value`] regarding nulls and panics
1278    pub fn value_as_datetime(&self, i: usize) -> Option<NaiveDateTime> {
1279        as_datetime::<T>(i64::from(self.value(i)))
1280    }
1281
1282    /// Returns value as a chrono `NaiveDateTime`, handling time resolution with the provided tz
1283    ///
1284    /// functionally it is same as `value_as_datetime`, however it adds
1285    /// the passed tz to the to-be-returned NaiveDateTime
1286    ///
1287    /// See notes on [`PrimitiveArray::value`] regarding nulls and panics
1288    pub fn value_as_datetime_with_tz(&self, i: usize, tz: Tz) -> Option<DateTime<Tz>> {
1289        as_datetime_with_timezone::<T>(i64::from(self.value(i)), tz)
1290    }
1291
1292    /// Returns value as a chrono `NaiveDate` by using `Self::datetime()`
1293    ///
1294    /// If a data type cannot be converted to `NaiveDate`, a `None` is returned
1295    ///
1296    /// See notes on [`PrimitiveArray::value`] regarding nulls and panics
1297    pub fn value_as_date(&self, i: usize) -> Option<NaiveDate> {
1298        self.value_as_datetime(i).map(|datetime| datetime.date())
1299    }
1300
1301    /// Returns a value as a chrono `NaiveTime`
1302    ///
1303    /// `Date32` and `Date64` return UTC midnight as they do not have time resolution
1304    ///
1305    /// See notes on [`PrimitiveArray::value`] regarding nulls and panics
1306    pub fn value_as_time(&self, i: usize) -> Option<NaiveTime> {
1307        as_time::<T>(i64::from(self.value(i)))
1308    }
1309
1310    /// Returns a value as a chrono `Duration`
1311    ///
1312    /// If a data type cannot be converted to `Duration`, a `None` is returned
1313    ///
1314    /// See notes on [`PrimitiveArray::value`] regarding nulls and panics
1315    pub fn value_as_duration(&self, i: usize) -> Option<Duration> {
1316        as_duration::<T>(i64::from(self.value(i)))
1317    }
1318}
1319
1320impl<T: ArrowPrimitiveType> std::fmt::Debug for PrimitiveArray<T> {
1321    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
1322        let data_type = self.data_type();
1323
1324        write!(f, "PrimitiveArray<{data_type}>\n[\n")?;
1325        print_long_array(self, f, |array, index, f| match data_type {
1326            DataType::Date32 | DataType::Date64 => {
1327                let v = self.value(index).to_i64().unwrap();
1328                match as_date::<T>(v) {
1329                    Some(date) => write!(f, "{date:?}"),
1330                    None => {
1331                        write!(
1332                            f,
1333                            "Cast error: Failed to convert {v} to temporal for {data_type}"
1334                        )
1335                    }
1336                }
1337            }
1338            DataType::Time32(_) | DataType::Time64(_) => {
1339                let v = self.value(index).to_i64().unwrap();
1340                match as_time::<T>(v) {
1341                    Some(time) => write!(f, "{time:?}"),
1342                    None => {
1343                        write!(
1344                            f,
1345                            "Cast error: Failed to convert {v} to temporal for {data_type}"
1346                        )
1347                    }
1348                }
1349            }
1350            DataType::Timestamp(_, tz_string_opt) => {
1351                let v = self.value(index).to_i64().unwrap();
1352                match tz_string_opt {
1353                    // for Timestamp with TimeZone
1354                    Some(tz_string) => {
1355                        match tz_string.parse::<Tz>() {
1356                            // if the time zone is valid, construct a DateTime<Tz> and format it as rfc3339
1357                            Ok(tz) => match as_datetime_with_timezone::<T>(v, tz) {
1358                                Some(datetime) => write!(f, "{}", datetime.to_rfc3339()),
1359                                None => write!(f, "null"),
1360                            },
1361                            // if the time zone is invalid, shows NaiveDateTime with an error message
1362                            Err(_) => match as_datetime::<T>(v) {
1363                                Some(datetime) => {
1364                                    write!(f, "{datetime:?} (Unknown Time Zone '{tz_string}')")
1365                                }
1366                                None => write!(f, "null"),
1367                            },
1368                        }
1369                    }
1370                    // for Timestamp without TimeZone
1371                    None => match as_datetime::<T>(v) {
1372                        Some(datetime) => write!(f, "{datetime:?}"),
1373                        None => write!(f, "null"),
1374                    },
1375                }
1376            }
1377            _ => std::fmt::Debug::fmt(&array.value(index), f),
1378        })?;
1379        write!(f, "]")
1380    }
1381}
1382
1383impl<'a, T: ArrowPrimitiveType> IntoIterator for &'a PrimitiveArray<T> {
1384    type Item = Option<<T as ArrowPrimitiveType>::Native>;
1385    type IntoIter = PrimitiveIter<'a, T>;
1386
1387    fn into_iter(self) -> Self::IntoIter {
1388        PrimitiveIter::<'a, T>::new(self)
1389    }
1390}
1391
1392impl<'a, T: ArrowPrimitiveType> PrimitiveArray<T> {
1393    /// constructs a new iterator
1394    pub fn iter(&'a self) -> PrimitiveIter<'a, T> {
1395        PrimitiveIter::<'a, T>::new(self)
1396    }
1397}
1398
1399/// An optional primitive value
1400///
1401/// This struct is used as an adapter when creating `PrimitiveArray` from an iterator.
1402/// `FromIterator` for `PrimitiveArray` takes an iterator where the elements can be `into`
1403/// this struct. So once implementing `From` or `Into` trait for a type, an iterator of
1404/// the type can be collected to `PrimitiveArray`.
1405#[derive(Debug)]
1406pub struct NativeAdapter<T: ArrowPrimitiveType> {
1407    /// Corresponding Rust native type if available
1408    pub native: Option<T::Native>,
1409}
1410
1411macro_rules! def_from_for_primitive {
1412    ( $ty:ident, $tt:tt) => {
1413        impl From<$tt> for NativeAdapter<$ty> {
1414            fn from(value: $tt) -> Self {
1415                NativeAdapter {
1416                    native: Some(value),
1417                }
1418            }
1419        }
1420    };
1421}
1422
1423def_from_for_primitive!(Int8Type, i8);
1424def_from_for_primitive!(Int16Type, i16);
1425def_from_for_primitive!(Int32Type, i32);
1426def_from_for_primitive!(Int64Type, i64);
1427def_from_for_primitive!(UInt8Type, u8);
1428def_from_for_primitive!(UInt16Type, u16);
1429def_from_for_primitive!(UInt32Type, u32);
1430def_from_for_primitive!(UInt64Type, u64);
1431def_from_for_primitive!(Float16Type, f16);
1432def_from_for_primitive!(Float32Type, f32);
1433def_from_for_primitive!(Float64Type, f64);
1434def_from_for_primitive!(Decimal32Type, i32);
1435def_from_for_primitive!(Decimal64Type, i64);
1436def_from_for_primitive!(Decimal128Type, i128);
1437def_from_for_primitive!(Decimal256Type, i256);
1438
1439impl<T: ArrowPrimitiveType> From<Option<<T as ArrowPrimitiveType>::Native>> for NativeAdapter<T> {
1440    fn from(value: Option<<T as ArrowPrimitiveType>::Native>) -> Self {
1441        NativeAdapter { native: value }
1442    }
1443}
1444
1445impl<T: ArrowPrimitiveType> From<&Option<<T as ArrowPrimitiveType>::Native>> for NativeAdapter<T> {
1446    fn from(value: &Option<<T as ArrowPrimitiveType>::Native>) -> Self {
1447        NativeAdapter { native: *value }
1448    }
1449}
1450
1451impl<T: ArrowPrimitiveType, Ptr: Into<NativeAdapter<T>>> FromIterator<Ptr> for PrimitiveArray<T> {
1452    fn from_iter<I: IntoIterator<Item = Ptr>>(iter: I) -> Self {
1453        let iter = iter.into_iter();
1454        let (lower, _) = iter.size_hint();
1455
1456        let mut null_builder = BooleanBufferBuilder::new(lower);
1457
1458        let buffer: Buffer = iter
1459            .map(|item| {
1460                if let Some(a) = item.into().native {
1461                    null_builder.append(true);
1462                    a
1463                } else {
1464                    null_builder.append(false);
1465                    // this ensures that null items on the buffer are not arbitrary.
1466                    // This is important because fallible operations can use null values (e.g. a vectorized "add")
1467                    // which may panic (e.g. overflow if the number on the slots happen to be very large).
1468                    T::Native::default()
1469                }
1470            })
1471            .collect();
1472
1473        let len = null_builder.len();
1474
1475        let data = unsafe {
1476            ArrayData::new_unchecked(
1477                T::DATA_TYPE,
1478                len,
1479                None,
1480                Some(null_builder.into()),
1481                0,
1482                vec![buffer],
1483                vec![],
1484            )
1485        };
1486        PrimitiveArray::from(data)
1487    }
1488}
1489
1490impl<T: ArrowPrimitiveType> PrimitiveArray<T> {
1491    /// Creates a [`PrimitiveArray`] from an iterator of trusted length.
1492    /// # Safety
1493    /// The iterator must be [`TrustedLen`](https://doc.rust-lang.org/std/iter/trait.TrustedLen.html).
1494    /// I.e. that `size_hint().1` correctly reports its length.
1495    #[inline]
1496    pub unsafe fn from_trusted_len_iter<I, P>(iter: I) -> Self
1497    where
1498        P: std::borrow::Borrow<Option<<T as ArrowPrimitiveType>::Native>>,
1499        I: IntoIterator<Item = P>,
1500    {
1501        let iterator = iter.into_iter();
1502        let (_, upper) = iterator.size_hint();
1503        let len = upper.expect("trusted_len_unzip requires an upper limit");
1504
1505        let (null, buffer) = unsafe { trusted_len_unzip(iterator) };
1506
1507        let data = unsafe {
1508            ArrayData::new_unchecked(T::DATA_TYPE, len, None, Some(null), 0, vec![buffer], vec![])
1509        };
1510        PrimitiveArray::from(data)
1511    }
1512}
1513
1514// TODO: the macro is needed here because we'd get "conflicting implementations" error
1515// otherwise with both `From<Vec<T::Native>>` and `From<Vec<Option<T::Native>>>`.
1516// We should revisit this in future.
1517macro_rules! def_numeric_from_vec {
1518    ( $ty:ident ) => {
1519        impl From<Vec<<$ty as ArrowPrimitiveType>::Native>> for PrimitiveArray<$ty> {
1520            fn from(data: Vec<<$ty as ArrowPrimitiveType>::Native>) -> Self {
1521                let array_data = ArrayData::builder($ty::DATA_TYPE)
1522                    .len(data.len())
1523                    .add_buffer(Buffer::from_vec(data));
1524                let array_data = unsafe { array_data.build_unchecked() };
1525                PrimitiveArray::from(array_data)
1526            }
1527        }
1528
1529        // Constructs a primitive array from a vector. Should only be used for testing.
1530        impl From<Vec<Option<<$ty as ArrowPrimitiveType>::Native>>> for PrimitiveArray<$ty> {
1531            fn from(data: Vec<Option<<$ty as ArrowPrimitiveType>::Native>>) -> Self {
1532                PrimitiveArray::from_iter(data.iter())
1533            }
1534        }
1535    };
1536}
1537
1538def_numeric_from_vec!(Int8Type);
1539def_numeric_from_vec!(Int16Type);
1540def_numeric_from_vec!(Int32Type);
1541def_numeric_from_vec!(Int64Type);
1542def_numeric_from_vec!(UInt8Type);
1543def_numeric_from_vec!(UInt16Type);
1544def_numeric_from_vec!(UInt32Type);
1545def_numeric_from_vec!(UInt64Type);
1546def_numeric_from_vec!(Float16Type);
1547def_numeric_from_vec!(Float32Type);
1548def_numeric_from_vec!(Float64Type);
1549def_numeric_from_vec!(Decimal32Type);
1550def_numeric_from_vec!(Decimal64Type);
1551def_numeric_from_vec!(Decimal128Type);
1552def_numeric_from_vec!(Decimal256Type);
1553
1554def_numeric_from_vec!(Date32Type);
1555def_numeric_from_vec!(Date64Type);
1556def_numeric_from_vec!(Time32SecondType);
1557def_numeric_from_vec!(Time32MillisecondType);
1558def_numeric_from_vec!(Time64MicrosecondType);
1559def_numeric_from_vec!(Time64NanosecondType);
1560def_numeric_from_vec!(IntervalYearMonthType);
1561def_numeric_from_vec!(IntervalDayTimeType);
1562def_numeric_from_vec!(IntervalMonthDayNanoType);
1563def_numeric_from_vec!(DurationSecondType);
1564def_numeric_from_vec!(DurationMillisecondType);
1565def_numeric_from_vec!(DurationMicrosecondType);
1566def_numeric_from_vec!(DurationNanosecondType);
1567def_numeric_from_vec!(TimestampSecondType);
1568def_numeric_from_vec!(TimestampMillisecondType);
1569def_numeric_from_vec!(TimestampMicrosecondType);
1570def_numeric_from_vec!(TimestampNanosecondType);
1571
1572impl<T: ArrowTimestampType> PrimitiveArray<T> {
1573    /// Returns the timezone of this array if any
1574    pub fn timezone(&self) -> Option<&str> {
1575        match self.data_type() {
1576            DataType::Timestamp(_, tz) => tz.as_deref(),
1577            _ => unreachable!(),
1578        }
1579    }
1580
1581    /// Construct a timestamp array with new timezone
1582    pub fn with_timezone(self, timezone: impl Into<Arc<str>>) -> Self {
1583        self.with_timezone_opt(Some(timezone.into()))
1584    }
1585
1586    /// Construct a timestamp array with UTC
1587    pub fn with_timezone_utc(self) -> Self {
1588        self.with_timezone("+00:00")
1589    }
1590
1591    /// Construct a timestamp array with an optional timezone
1592    pub fn with_timezone_opt<S: Into<Arc<str>>>(self, timezone: Option<S>) -> Self {
1593        Self {
1594            data_type: DataType::Timestamp(T::UNIT, timezone.map(Into::into)),
1595            ..self
1596        }
1597    }
1598}
1599
1600/// Constructs a `PrimitiveArray` from an array data reference.
1601impl<T: ArrowPrimitiveType> From<ArrayData> for PrimitiveArray<T> {
1602    fn from(data: ArrayData) -> Self {
1603        Self::assert_compatible(data.data_type());
1604        assert_eq!(
1605            data.buffers().len(),
1606            1,
1607            "PrimitiveArray data should contain a single buffer only (values buffer)"
1608        );
1609
1610        let values = ScalarBuffer::new(data.buffers()[0].clone(), data.offset(), data.len());
1611        Self {
1612            data_type: data.data_type().clone(),
1613            values,
1614            nulls: data.nulls().cloned(),
1615        }
1616    }
1617}
1618
1619impl<T: DecimalType + ArrowPrimitiveType> PrimitiveArray<T> {
1620    /// Returns a Decimal array with the same data as self, with the
1621    /// specified precision and scale.
1622    ///
1623    /// See [`validate_decimal_precision_and_scale`]
1624    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    /// Validates values in this array can be properly interpreted
1633    /// with the specified precision.
1634    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    /// Validates the Decimal Array, if the value of slot is overflow for the specified precision, and
1652    /// will be casted to Null
1653    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    /// Returns [`Self::value`] formatted as a string
1658    pub fn value_as_string(&self, row: usize) -> String {
1659        T::format_decimal(self.value(row), self.precision(), self.scale())
1660    }
1661
1662    /// Returns the decimal precision of this array
1663    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    /// Returns the decimal scale of this array
1710    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        // Test building a primitive array with null values
1786        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        // Test building a primitive array with null values
1805        // we use Int32 and Int64 as a backing array, so all Int32 and Int64 conventions
1806        // work
1807        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                // roundtrip to and from datetime
1818                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        // 1:        00:00:00.001
1835        // 37800005: 10:30:00.005
1836        // 86399210: 23:59:59.210
1837        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            // check that we can't create dates or datetimes from time instances
1844            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        // Test building a primitive array with null values
1854        // we use Int32 and Int64 as a backing array, so all Int32 and Int64 conventions
1855        // work
1856
1857        // 1e6:        00:00:00.001
1858        // 37800005e6: 10:30:00.005
1859        // 86399210e6: 23:59:59.210
1860        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            // check that we can't create dates or datetimes from time instances
1868            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        // intervals are currently not treated specially, but are Int32 and Int64 arrays
1878        let arr = IntervalYearMonthArray::from(vec![Some(1), None, Some(-5)]);
1879        assert_eq!(3, arr.len());
1880        assert_eq!(0, arr.offset());
1881        assert_eq!(1, arr.null_count());
1882        assert_eq!(1, arr.value(0));
1883        assert_eq!(1, arr.values()[0]);
1884        assert!(arr.is_null(1));
1885        assert_eq!(-5, arr.value(2));
1886        assert_eq!(-5, arr.values()[2]);
1887
1888        let v0 = IntervalDayTime {
1889            days: 34,
1890            milliseconds: 1,
1891        };
1892        let v2 = IntervalDayTime {
1893            days: -2,
1894            milliseconds: -5,
1895        };
1896
1897        let arr = IntervalDayTimeArray::from(vec![Some(v0), None, Some(v2)]);
1898
1899        assert_eq!(3, arr.len());
1900        assert_eq!(0, arr.offset());
1901        assert_eq!(1, arr.null_count());
1902        assert_eq!(v0, arr.value(0));
1903        assert_eq!(v0, arr.values()[0]);
1904        assert!(arr.is_null(1));
1905        assert_eq!(v2, arr.value(2));
1906        assert_eq!(v2, arr.values()[2]);
1907
1908        let v0 = IntervalMonthDayNano {
1909            months: 2,
1910            days: 34,
1911            nanoseconds: -1,
1912        };
1913        let v2 = IntervalMonthDayNano {
1914            months: -3,
1915            days: -2,
1916            nanoseconds: 4,
1917        };
1918
1919        let arr = IntervalMonthDayNanoArray::from(vec![Some(v0), None, Some(v2)]);
1920        assert_eq!(3, arr.len());
1921        assert_eq!(0, arr.offset());
1922        assert_eq!(1, arr.null_count());
1923        assert_eq!(v0, arr.value(0));
1924        assert_eq!(v0, arr.values()[0]);
1925        assert!(arr.is_null(1));
1926        assert_eq!(v2, arr.value(2));
1927        assert_eq!(v2, arr.values()[2]);
1928    }
1929
1930    #[test]
1931    fn test_duration_array_from_vec() {
1932        let arr = DurationSecondArray::from(vec![Some(1), None, Some(-5)]);
1933        assert_eq!(3, arr.len());
1934        assert_eq!(0, arr.offset());
1935        assert_eq!(1, arr.null_count());
1936        assert_eq!(1, arr.value(0));
1937        assert_eq!(1, arr.values()[0]);
1938        assert!(arr.is_null(1));
1939        assert_eq!(-5, arr.value(2));
1940        assert_eq!(-5, arr.values()[2]);
1941
1942        let arr = DurationMillisecondArray::from(vec![Some(1), None, Some(-5)]);
1943        assert_eq!(3, arr.len());
1944        assert_eq!(0, arr.offset());
1945        assert_eq!(1, arr.null_count());
1946        assert_eq!(1, arr.value(0));
1947        assert_eq!(1, arr.values()[0]);
1948        assert!(arr.is_null(1));
1949        assert_eq!(-5, arr.value(2));
1950        assert_eq!(-5, arr.values()[2]);
1951
1952        let arr = DurationMicrosecondArray::from(vec![Some(1), None, Some(-5)]);
1953        assert_eq!(3, arr.len());
1954        assert_eq!(0, arr.offset());
1955        assert_eq!(1, arr.null_count());
1956        assert_eq!(1, arr.value(0));
1957        assert_eq!(1, arr.values()[0]);
1958        assert!(arr.is_null(1));
1959        assert_eq!(-5, arr.value(2));
1960        assert_eq!(-5, arr.values()[2]);
1961
1962        let arr = DurationNanosecondArray::from(vec![Some(1), None, Some(-5)]);
1963        assert_eq!(3, arr.len());
1964        assert_eq!(0, arr.offset());
1965        assert_eq!(1, arr.null_count());
1966        assert_eq!(1, arr.value(0));
1967        assert_eq!(1, arr.values()[0]);
1968        assert!(arr.is_null(1));
1969        assert_eq!(-5, arr.value(2));
1970        assert_eq!(-5, arr.values()[2]);
1971    }
1972
1973    #[test]
1974    fn test_timestamp_array_from_vec() {
1975        let arr = TimestampSecondArray::from(vec![1, -5]);
1976        assert_eq!(2, arr.len());
1977        assert_eq!(0, arr.offset());
1978        assert_eq!(0, arr.null_count());
1979        assert_eq!(1, arr.value(0));
1980        assert_eq!(-5, arr.value(1));
1981        assert_eq!(&[1, -5], arr.values());
1982
1983        let arr = TimestampMillisecondArray::from(vec![1, -5]);
1984        assert_eq!(2, arr.len());
1985        assert_eq!(0, arr.offset());
1986        assert_eq!(0, arr.null_count());
1987        assert_eq!(1, arr.value(0));
1988        assert_eq!(-5, arr.value(1));
1989        assert_eq!(&[1, -5], arr.values());
1990
1991        let arr = TimestampMicrosecondArray::from(vec![1, -5]);
1992        assert_eq!(2, arr.len());
1993        assert_eq!(0, arr.offset());
1994        assert_eq!(0, arr.null_count());
1995        assert_eq!(1, arr.value(0));
1996        assert_eq!(-5, arr.value(1));
1997        assert_eq!(&[1, -5], arr.values());
1998
1999        let arr = TimestampNanosecondArray::from(vec![1, -5]);
2000        assert_eq!(2, arr.len());
2001        assert_eq!(0, arr.offset());
2002        assert_eq!(0, arr.null_count());
2003        assert_eq!(1, arr.value(0));
2004        assert_eq!(-5, arr.value(1));
2005        assert_eq!(&[1, -5], arr.values());
2006    }
2007
2008    #[test]
2009    fn test_primitive_array_slice() {
2010        let arr = Int32Array::from(vec![
2011            Some(0),
2012            None,
2013            Some(2),
2014            None,
2015            Some(4),
2016            Some(5),
2017            Some(6),
2018            None,
2019            None,
2020        ]);
2021        assert_eq!(9, arr.len());
2022        assert_eq!(0, arr.offset());
2023        assert_eq!(4, arr.null_count());
2024
2025        let arr2 = arr.slice(2, 5);
2026        assert_eq!(5, arr2.len());
2027        assert_eq!(1, arr2.null_count());
2028
2029        for i in 0..arr2.len() {
2030            assert_eq!(i == 1, arr2.is_null(i));
2031            assert_eq!(i != 1, arr2.is_valid(i));
2032        }
2033        let int_arr2 = arr2.as_any().downcast_ref::<Int32Array>().unwrap();
2034        assert_eq!(2, int_arr2.values()[0]);
2035        assert_eq!(&[4, 5, 6], &int_arr2.values()[2..5]);
2036
2037        let arr3 = arr2.slice(2, 3);
2038        assert_eq!(3, arr3.len());
2039        assert_eq!(0, arr3.null_count());
2040
2041        let int_arr3 = arr3.as_any().downcast_ref::<Int32Array>().unwrap();
2042        assert_eq!(&[4, 5, 6], int_arr3.values());
2043        assert_eq!(4, int_arr3.value(0));
2044        assert_eq!(5, int_arr3.value(1));
2045        assert_eq!(6, int_arr3.value(2));
2046    }
2047
2048    #[test]
2049    fn test_boolean_array_slice() {
2050        let arr = BooleanArray::from(vec![
2051            Some(true),
2052            None,
2053            Some(false),
2054            None,
2055            Some(true),
2056            Some(false),
2057            Some(true),
2058            Some(false),
2059            None,
2060            Some(true),
2061        ]);
2062
2063        assert_eq!(10, arr.len());
2064        assert_eq!(0, arr.offset());
2065        assert_eq!(3, arr.null_count());
2066
2067        let arr2 = arr.slice(3, 5);
2068        assert_eq!(5, arr2.len());
2069        assert_eq!(3, arr2.offset());
2070        assert_eq!(1, arr2.null_count());
2071
2072        let bool_arr = arr2.as_any().downcast_ref::<BooleanArray>().unwrap();
2073
2074        assert!(!bool_arr.is_valid(0));
2075
2076        assert!(bool_arr.is_valid(1));
2077        assert!(bool_arr.value(1));
2078
2079        assert!(bool_arr.is_valid(2));
2080        assert!(!bool_arr.value(2));
2081
2082        assert!(bool_arr.is_valid(3));
2083        assert!(bool_arr.value(3));
2084
2085        assert!(bool_arr.is_valid(4));
2086        assert!(!bool_arr.value(4));
2087    }
2088
2089    #[test]
2090    fn test_int32_fmt_debug() {
2091        let arr = Int32Array::from(vec![0, 1, 2, 3, 4]);
2092        assert_eq!(
2093            "PrimitiveArray<Int32>\n[\n  0,\n  1,\n  2,\n  3,\n  4,\n]",
2094            format!("{arr:?}")
2095        );
2096    }
2097
2098    #[test]
2099    fn test_fmt_debug_up_to_20_elements() {
2100        (1..=20).for_each(|i| {
2101            let values = (0..i).collect::<Vec<i16>>();
2102            let array_expected = format!(
2103                "PrimitiveArray<Int16>\n[\n{}\n]",
2104                values
2105                    .iter()
2106                    .map(|v| { format!("  {v},") })
2107                    .collect::<Vec<String>>()
2108                    .join("\n")
2109            );
2110            let array = Int16Array::from(values);
2111
2112            assert_eq!(array_expected, format!("{array:?}"));
2113        })
2114    }
2115
2116    #[test]
2117    fn test_int32_with_null_fmt_debug() {
2118        let mut builder = Int32Array::builder(3);
2119        builder.append_slice(&[0, 1]);
2120        builder.append_null();
2121        builder.append_slice(&[3, 4]);
2122        let arr = builder.finish();
2123        assert_eq!(
2124            "PrimitiveArray<Int32>\n[\n  0,\n  1,\n  null,\n  3,\n  4,\n]",
2125            format!("{arr:?}")
2126        );
2127    }
2128
2129    #[test]
2130    fn test_timestamp_fmt_debug() {
2131        let arr: PrimitiveArray<TimestampMillisecondType> =
2132            TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000]);
2133        assert_eq!(
2134            "PrimitiveArray<Timestamp(ms)>\n[\n  2018-12-31T00:00:00,\n  2018-12-31T00:00:00,\n  1921-01-02T00:00:00,\n]",
2135            format!("{arr:?}")
2136        );
2137    }
2138
2139    #[test]
2140    fn test_timestamp_utc_fmt_debug() {
2141        let arr: PrimitiveArray<TimestampMillisecondType> =
2142            TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2143                .with_timezone_utc();
2144        assert_eq!(
2145            "PrimitiveArray<Timestamp(ms, \"+00:00\")>\n[\n  2018-12-31T00:00:00+00:00,\n  2018-12-31T00:00:00+00:00,\n  1921-01-02T00:00:00+00:00,\n]",
2146            format!("{arr:?}")
2147        );
2148    }
2149
2150    #[test]
2151    #[cfg(feature = "chrono-tz")]
2152    fn test_timestamp_with_named_tz_fmt_debug() {
2153        let arr: PrimitiveArray<TimestampMillisecondType> =
2154            TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2155                .with_timezone("Asia/Taipei".to_string());
2156        assert_eq!(
2157            "PrimitiveArray<Timestamp(ms, \"Asia/Taipei\")>\n[\n  2018-12-31T08:00:00+08:00,\n  2018-12-31T08:00:00+08:00,\n  1921-01-02T08:00:00+08:00,\n]",
2158            format!("{arr:?}")
2159        );
2160    }
2161
2162    #[test]
2163    #[cfg(not(feature = "chrono-tz"))]
2164    fn test_timestamp_with_named_tz_fmt_debug() {
2165        let arr: PrimitiveArray<TimestampMillisecondType> =
2166            TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2167                .with_timezone("Asia/Taipei".to_string());
2168
2169        println!("{arr:?}");
2170
2171        assert_eq!(
2172            "PrimitiveArray<Timestamp(ms, \"Asia/Taipei\")>\n[\n  2018-12-31T00:00:00 (Unknown Time Zone 'Asia/Taipei'),\n  2018-12-31T00:00:00 (Unknown Time Zone 'Asia/Taipei'),\n  1921-01-02T00:00:00 (Unknown Time Zone 'Asia/Taipei'),\n]",
2173            format!("{arr:?}")
2174        );
2175    }
2176
2177    #[test]
2178    fn test_timestamp_with_fixed_offset_tz_fmt_debug() {
2179        let arr: PrimitiveArray<TimestampMillisecondType> =
2180            TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2181                .with_timezone("+08:00".to_string());
2182        assert_eq!(
2183            "PrimitiveArray<Timestamp(ms, \"+08:00\")>\n[\n  2018-12-31T08:00:00+08:00,\n  2018-12-31T08:00:00+08:00,\n  1921-01-02T08:00:00+08:00,\n]",
2184            format!("{arr:?}")
2185        );
2186    }
2187
2188    #[test]
2189    fn test_timestamp_with_incorrect_tz_fmt_debug() {
2190        let arr: PrimitiveArray<TimestampMillisecondType> =
2191            TimestampMillisecondArray::from(vec![1546214400000, 1546214400000, -1546214400000])
2192                .with_timezone("xxx".to_string());
2193        assert_eq!(
2194            "PrimitiveArray<Timestamp(ms, \"xxx\")>\n[\n  2018-12-31T00:00:00 (Unknown Time Zone 'xxx'),\n  2018-12-31T00:00:00 (Unknown Time Zone 'xxx'),\n  1921-01-02T00:00:00 (Unknown Time Zone 'xxx'),\n]",
2195            format!("{arr:?}")
2196        );
2197    }
2198
2199    #[test]
2200    #[cfg(feature = "chrono-tz")]
2201    fn test_timestamp_with_tz_with_daylight_saving_fmt_debug() {
2202        let arr: PrimitiveArray<TimestampMillisecondType> = TimestampMillisecondArray::from(vec![
2203            1647161999000,
2204            1647162000000,
2205            1667717999000,
2206            1667718000000,
2207        ])
2208        .with_timezone("America/Denver".to_string());
2209        assert_eq!(
2210            "PrimitiveArray<Timestamp(ms, \"America/Denver\")>\n[\n  2022-03-13T01:59:59-07:00,\n  2022-03-13T03:00:00-06:00,\n  2022-11-06T00:59:59-06:00,\n  2022-11-06T01:00:00-06:00,\n]",
2211            format!("{arr:?}")
2212        );
2213    }
2214
2215    #[test]
2216    fn test_date32_fmt_debug() {
2217        let arr: PrimitiveArray<Date32Type> = vec![12356, 13548, -365].into();
2218        assert_eq!(
2219            "PrimitiveArray<Date32>\n[\n  2003-10-31,\n  2007-02-04,\n  1969-01-01,\n]",
2220            format!("{arr:?}")
2221        );
2222    }
2223
2224    #[test]
2225    fn test_time32second_fmt_debug() {
2226        let arr: PrimitiveArray<Time32SecondType> = vec![7201, 60054].into();
2227        assert_eq!(
2228            "PrimitiveArray<Time32(s)>\n[\n  02:00:01,\n  16:40:54,\n]",
2229            format!("{arr:?}")
2230        );
2231    }
2232
2233    #[test]
2234    fn test_time32second_invalid_neg() {
2235        // chrono::NaiveDatetime::from_timestamp_opt returns None while input is invalid
2236        let arr: PrimitiveArray<Time32SecondType> = vec![-7201, -60054].into();
2237        assert_eq!(
2238            "PrimitiveArray<Time32(s)>\n[\n  Cast error: Failed to convert -7201 to temporal for Time32(s),\n  Cast error: Failed to convert -60054 to temporal for Time32(s),\n]",
2239            // "PrimitiveArray<Time32(s)>\n[\n  null,\n  null,\n]",
2240            format!("{arr:?}")
2241        )
2242    }
2243
2244    #[test]
2245    fn test_timestamp_micros_out_of_range() {
2246        // replicate the issue from https://github.com/apache/arrow-datafusion/issues/3832
2247        let arr: PrimitiveArray<TimestampMicrosecondType> = vec![9065525203050843594].into();
2248        assert_eq!(
2249            "PrimitiveArray<Timestamp(µs)>\n[\n  null,\n]",
2250            format!("{arr:?}")
2251        )
2252    }
2253
2254    #[test]
2255    fn test_primitive_array_builder() {
2256        // Test building a primitive array with ArrayData builder and offset
2257        let buf = Buffer::from_slice_ref([0i32, 1, 2, 3, 4, 5, 6]);
2258        let buf2 = buf.slice_with_length(8, 20);
2259        let data = ArrayData::builder(DataType::Int32)
2260            .len(5)
2261            .offset(2)
2262            .add_buffer(buf)
2263            .build()
2264            .unwrap();
2265        let arr = Int32Array::from(data);
2266        assert_eq!(&buf2, arr.values.inner());
2267        assert_eq!(5, arr.len());
2268        assert_eq!(0, arr.null_count());
2269        for i in 0..3 {
2270            assert_eq!((i + 2) as i32, arr.value(i));
2271        }
2272    }
2273
2274    #[test]
2275    fn test_primitive_from_iter_values() {
2276        // Test building a primitive array with from_iter_values
2277        let arr: PrimitiveArray<Int32Type> = PrimitiveArray::from_iter_values(0..10);
2278        assert_eq!(10, arr.len());
2279        assert_eq!(0, arr.null_count());
2280        for i in 0..10i32 {
2281            assert_eq!(i, arr.value(i as usize));
2282        }
2283    }
2284
2285    #[test]
2286    fn test_primitive_array_from_unbound_iter() {
2287        // iterator that doesn't declare (upper) size bound
2288        let value_iter = (0..)
2289            .scan(0usize, |pos, i| {
2290                if *pos < 10 {
2291                    *pos += 1;
2292                    Some(Some(i))
2293                } else {
2294                    // actually returns up to 10 values
2295                    None
2296                }
2297            })
2298            // limited using take()
2299            .take(100);
2300
2301        let (_, upper_size_bound) = value_iter.size_hint();
2302        // the upper bound, defined by take above, is 100
2303        assert_eq!(upper_size_bound, Some(100));
2304        let primitive_array: PrimitiveArray<Int32Type> = value_iter.collect();
2305        // but the actual number of items in the array should be 10
2306        assert_eq!(primitive_array.len(), 10);
2307    }
2308
2309    #[test]
2310    fn test_primitive_array_from_non_null_iter() {
2311        let iter = (0..10_i32).map(Some);
2312        let primitive_array = PrimitiveArray::<Int32Type>::from_iter(iter);
2313        assert_eq!(primitive_array.len(), 10);
2314        assert_eq!(primitive_array.null_count(), 0);
2315        assert!(primitive_array.nulls().is_none());
2316        assert_eq!(primitive_array.values(), &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
2317    }
2318
2319    #[test]
2320    #[should_panic(expected = "PrimitiveArray data should contain a single buffer only \
2321                               (values buffer)")]
2322    // Different error messages, so skip for now
2323    // https://github.com/apache/arrow-rs/issues/1545
2324    #[cfg(not(feature = "force_validate"))]
2325    fn test_primitive_array_invalid_buffer_len() {
2326        let buffer = Buffer::from_slice_ref([0i32, 1, 2, 3, 4]);
2327        let data = unsafe {
2328            ArrayData::builder(DataType::Int32)
2329                .add_buffer(buffer.clone())
2330                .add_buffer(buffer)
2331                .len(5)
2332                .build_unchecked()
2333        };
2334
2335        drop(Int32Array::from(data));
2336    }
2337
2338    #[test]
2339    fn test_access_array_concurrently() {
2340        let a = Int32Array::from(vec![5, 6, 7, 8, 9]);
2341        let ret = std::thread::spawn(move || a.value(3)).join();
2342
2343        assert!(ret.is_ok());
2344        assert_eq!(8, ret.ok().unwrap());
2345    }
2346
2347    #[test]
2348    fn test_primitive_array_creation() {
2349        let array1: Int8Array = [10_i8, 11, 12, 13, 14].into_iter().collect();
2350        let array2: Int8Array = [10_i8, 11, 12, 13, 14].into_iter().map(Some).collect();
2351
2352        assert_eq!(array1, array2);
2353    }
2354
2355    #[test]
2356    #[should_panic(
2357        expected = "Trying to access an element at index 4 from a PrimitiveArray of length 3"
2358    )]
2359    fn test_string_array_get_value_index_out_of_bound() {
2360        let array: Int8Array = [10_i8, 11, 12].into_iter().collect();
2361
2362        array.value(4);
2363    }
2364
2365    #[test]
2366    #[should_panic(expected = "PrimitiveArray expected data type Int64 got Int32")]
2367    fn test_from_array_data_validation() {
2368        let foo = PrimitiveArray::<Int32Type>::from_iter([1, 2, 3]);
2369        let _ = PrimitiveArray::<Int64Type>::from(foo.into_data());
2370    }
2371
2372    #[test]
2373    fn test_decimal32() {
2374        let values: Vec<_> = vec![0, 1, -1, i32::MIN, i32::MAX];
2375        let array: PrimitiveArray<Decimal32Type> =
2376            PrimitiveArray::from_iter(values.iter().copied());
2377        assert_eq!(array.values(), &values);
2378
2379        let array: PrimitiveArray<Decimal32Type> =
2380            PrimitiveArray::from_iter_values(values.iter().copied());
2381        assert_eq!(array.values(), &values);
2382
2383        let array = PrimitiveArray::<Decimal32Type>::from(values.clone());
2384        assert_eq!(array.values(), &values);
2385
2386        let array = PrimitiveArray::<Decimal32Type>::from(array.to_data());
2387        assert_eq!(array.values(), &values);
2388    }
2389
2390    #[test]
2391    fn test_decimal64() {
2392        let values: Vec<_> = vec![0, 1, -1, i64::MIN, i64::MAX];
2393        let array: PrimitiveArray<Decimal64Type> =
2394            PrimitiveArray::from_iter(values.iter().copied());
2395        assert_eq!(array.values(), &values);
2396
2397        let array: PrimitiveArray<Decimal64Type> =
2398            PrimitiveArray::from_iter_values(values.iter().copied());
2399        assert_eq!(array.values(), &values);
2400
2401        let array = PrimitiveArray::<Decimal64Type>::from(values.clone());
2402        assert_eq!(array.values(), &values);
2403
2404        let array = PrimitiveArray::<Decimal64Type>::from(array.to_data());
2405        assert_eq!(array.values(), &values);
2406    }
2407
2408    #[test]
2409    fn test_decimal128() {
2410        let values: Vec<_> = vec![0, 1, -1, i128::MIN, i128::MAX];
2411        let array: PrimitiveArray<Decimal128Type> =
2412            PrimitiveArray::from_iter(values.iter().copied());
2413        assert_eq!(array.values(), &values);
2414
2415        let array: PrimitiveArray<Decimal128Type> =
2416            PrimitiveArray::from_iter_values(values.iter().copied());
2417        assert_eq!(array.values(), &values);
2418
2419        let array = PrimitiveArray::<Decimal128Type>::from(values.clone());
2420        assert_eq!(array.values(), &values);
2421
2422        let array = PrimitiveArray::<Decimal128Type>::from(array.to_data());
2423        assert_eq!(array.values(), &values);
2424    }
2425
2426    #[test]
2427    fn test_decimal256() {
2428        let values: Vec<_> = vec![i256::ZERO, i256::ONE, i256::MINUS_ONE, i256::MIN, i256::MAX];
2429
2430        let array: PrimitiveArray<Decimal256Type> =
2431            PrimitiveArray::from_iter(values.iter().copied());
2432        assert_eq!(array.values(), &values);
2433
2434        let array: PrimitiveArray<Decimal256Type> =
2435            PrimitiveArray::from_iter_values(values.iter().copied());
2436        assert_eq!(array.values(), &values);
2437
2438        let array = PrimitiveArray::<Decimal256Type>::from(values.clone());
2439        assert_eq!(array.values(), &values);
2440
2441        let array = PrimitiveArray::<Decimal256Type>::from(array.to_data());
2442        assert_eq!(array.values(), &values);
2443    }
2444
2445    #[test]
2446    fn test_decimal_array() {
2447        // let val_8887: [u8; 16] = [192, 219, 180, 17, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
2448        // let val_neg_8887: [u8; 16] = [64, 36, 75, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255];
2449        let values: [u8; 32] = [
2450            192, 219, 180, 17, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 36, 75, 238, 253, 255, 255,
2451            255, 255, 255, 255, 255, 255, 255, 255, 255,
2452        ];
2453        let array_data = ArrayData::builder(DataType::Decimal128(38, 6))
2454            .len(2)
2455            .add_buffer(Buffer::from(&values))
2456            .build()
2457            .unwrap();
2458        let decimal_array = Decimal128Array::from(array_data);
2459        assert_eq!(8_887_000_000_i128, decimal_array.value(0));
2460        assert_eq!(-8_887_000_000_i128, decimal_array.value(1));
2461    }
2462
2463    #[test]
2464    fn test_decimal_append_error_value() {
2465        let mut decimal_builder = Decimal128Builder::with_capacity(10);
2466        decimal_builder.append_value(123456);
2467        decimal_builder.append_value(12345);
2468        let result = decimal_builder.finish().with_precision_and_scale(5, 3);
2469        assert!(result.is_ok());
2470        let arr = result.unwrap();
2471        assert_eq!("12.345", arr.value_as_string(1));
2472
2473        // Validate it explicitly
2474        let result = arr.validate_decimal_precision(5);
2475        let error = result.unwrap_err();
2476        assert_eq!(
2477            "Invalid argument error: 123.456 is too large to store in a Decimal128 of precision 5. Max is 99.999",
2478            error.to_string()
2479        );
2480
2481        decimal_builder = Decimal128Builder::new();
2482        decimal_builder.append_value(100);
2483        decimal_builder.append_value(99);
2484        decimal_builder.append_value(-100);
2485        decimal_builder.append_value(-99);
2486        let result = decimal_builder.finish().with_precision_and_scale(2, 1);
2487        assert!(result.is_ok());
2488        let arr = result.unwrap();
2489        assert_eq!("9.9", arr.value_as_string(1));
2490        assert_eq!("-9.9", arr.value_as_string(3));
2491
2492        // Validate it explicitly
2493        let result = arr.validate_decimal_precision(2);
2494        let error = result.unwrap_err();
2495        assert_eq!(
2496            "Invalid argument error: 10.0 is too large to store in a Decimal128 of precision 2. Max is 9.9",
2497            error.to_string()
2498        );
2499    }
2500
2501    #[test]
2502    fn test_decimal_from_iter_values() {
2503        let array = Decimal128Array::from_iter_values(vec![-100, 0, 101]);
2504        assert_eq!(array.len(), 3);
2505        assert_eq!(array.data_type(), &DataType::Decimal128(38, 10));
2506        assert_eq!(-100_i128, array.value(0));
2507        assert!(!array.is_null(0));
2508        assert_eq!(0_i128, array.value(1));
2509        assert!(!array.is_null(1));
2510        assert_eq!(101_i128, array.value(2));
2511        assert!(!array.is_null(2));
2512    }
2513
2514    #[test]
2515    fn test_decimal_from_iter() {
2516        let array: Decimal128Array = vec![Some(-100), None, Some(101)].into_iter().collect();
2517        assert_eq!(array.len(), 3);
2518        assert_eq!(array.data_type(), &DataType::Decimal128(38, 10));
2519        assert_eq!(-100_i128, array.value(0));
2520        assert!(!array.is_null(0));
2521        assert!(array.is_null(1));
2522        assert_eq!(101_i128, array.value(2));
2523        assert!(!array.is_null(2));
2524    }
2525
2526    #[test]
2527    fn test_decimal_iter_sized() {
2528        let data = vec![Some(-100), None, Some(101)];
2529        let array: Decimal128Array = data.into_iter().collect();
2530        let mut iter = array.into_iter();
2531
2532        // is exact sized
2533        assert_eq!(array.len(), 3);
2534
2535        // size_hint is reported correctly
2536        assert_eq!(iter.size_hint(), (3, Some(3)));
2537        iter.next().unwrap();
2538        assert_eq!(iter.size_hint(), (2, Some(2)));
2539        iter.next().unwrap();
2540        iter.next().unwrap();
2541        assert_eq!(iter.size_hint(), (0, Some(0)));
2542        assert!(iter.next().is_none());
2543        assert_eq!(iter.size_hint(), (0, Some(0)));
2544    }
2545
2546    #[test]
2547    fn test_decimal_array_value_as_string() {
2548        let arr = [123450, -123450, 100, -100, 10, -10, 0]
2549            .into_iter()
2550            .map(Some)
2551            .collect::<Decimal128Array>()
2552            .with_precision_and_scale(6, 3)
2553            .unwrap();
2554
2555        assert_eq!("123.450", arr.value_as_string(0));
2556        assert_eq!("-123.450", arr.value_as_string(1));
2557        assert_eq!("0.100", arr.value_as_string(2));
2558        assert_eq!("-0.100", arr.value_as_string(3));
2559        assert_eq!("0.010", arr.value_as_string(4));
2560        assert_eq!("-0.010", arr.value_as_string(5));
2561        assert_eq!("0.000", arr.value_as_string(6));
2562    }
2563
2564    #[test]
2565    fn test_decimal_array_with_precision_and_scale() {
2566        let arr = Decimal128Array::from_iter_values([12345, 456, 7890, -123223423432432])
2567            .with_precision_and_scale(20, 2)
2568            .unwrap();
2569
2570        assert_eq!(arr.data_type(), &DataType::Decimal128(20, 2));
2571        assert_eq!(arr.precision(), 20);
2572        assert_eq!(arr.scale(), 2);
2573
2574        let actual: Vec<_> = (0..arr.len()).map(|i| arr.value_as_string(i)).collect();
2575        let expected = vec!["123.45", "4.56", "78.90", "-1232234234324.32"];
2576
2577        assert_eq!(actual, expected);
2578    }
2579
2580    #[test]
2581    #[should_panic(
2582        expected = "-1232234234324.32 is too small to store in a Decimal128 of precision 5. Min is -999.99"
2583    )]
2584    fn test_decimal_array_with_precision_and_scale_out_of_range() {
2585        let arr = Decimal128Array::from_iter_values([12345, 456, 7890, -123223423432432])
2586            // precision is too small to hold value
2587            .with_precision_and_scale(5, 2)
2588            .unwrap();
2589        arr.validate_decimal_precision(5).unwrap();
2590    }
2591
2592    #[test]
2593    #[should_panic(expected = "precision cannot be 0, has to be between [1, 38]")]
2594    fn test_decimal_array_with_precision_zero() {
2595        Decimal128Array::from_iter_values([12345, 456])
2596            .with_precision_and_scale(0, 2)
2597            .unwrap();
2598    }
2599
2600    #[test]
2601    #[should_panic(expected = "precision 40 is greater than max 38")]
2602    fn test_decimal_array_with_precision_and_scale_invalid_precision() {
2603        Decimal128Array::from_iter_values([12345, 456])
2604            .with_precision_and_scale(40, 2)
2605            .unwrap();
2606    }
2607
2608    #[test]
2609    #[should_panic(expected = "scale 40 is greater than max 38")]
2610    fn test_decimal_array_with_precision_and_scale_invalid_scale() {
2611        Decimal128Array::from_iter_values([12345, 456])
2612            .with_precision_and_scale(20, 40)
2613            .unwrap();
2614    }
2615
2616    #[test]
2617    #[should_panic(expected = "scale 10 is greater than precision 4")]
2618    fn test_decimal_array_with_precision_and_scale_invalid_precision_and_scale() {
2619        Decimal128Array::from_iter_values([12345, 456])
2620            .with_precision_and_scale(4, 10)
2621            .unwrap();
2622    }
2623
2624    #[test]
2625    fn test_decimal_array_set_null_if_overflow_with_precision() {
2626        let array = Decimal128Array::from(vec![Some(123456), Some(123), None, Some(123456)]);
2627        let result = array.null_if_overflow_precision(5);
2628        let expected = Decimal128Array::from(vec![None, Some(123), None, None]);
2629        assert_eq!(result, expected);
2630    }
2631
2632    #[test]
2633    fn test_decimal256_iter() {
2634        let mut builder = Decimal256Builder::with_capacity(30);
2635        let decimal1 = i256::from_i128(12345);
2636        builder.append_value(decimal1);
2637
2638        builder.append_null();
2639
2640        let decimal2 = i256::from_i128(56789);
2641        builder.append_value(decimal2);
2642
2643        let array: Decimal256Array = builder.finish().with_precision_and_scale(76, 6).unwrap();
2644
2645        let collected: Vec<_> = array.iter().collect();
2646        assert_eq!(vec![Some(decimal1), None, Some(decimal2)], collected);
2647    }
2648
2649    #[test]
2650    fn test_from_iter_decimal256array() {
2651        let value1 = i256::from_i128(12345);
2652        let value2 = i256::from_i128(56789);
2653
2654        let mut array: Decimal256Array =
2655            vec![Some(value1), None, Some(value2)].into_iter().collect();
2656        array = array.with_precision_and_scale(76, 10).unwrap();
2657        assert_eq!(array.len(), 3);
2658        assert_eq!(array.data_type(), &DataType::Decimal256(76, 10));
2659        assert_eq!(value1, array.value(0));
2660        assert!(!array.is_null(0));
2661        assert!(array.is_null(1));
2662        assert_eq!(value2, array.value(2));
2663        assert!(!array.is_null(2));
2664    }
2665
2666    #[test]
2667    fn test_from_iter_decimal128array() {
2668        let mut array: Decimal128Array = vec![Some(-100), None, Some(101)].into_iter().collect();
2669        array = array.with_precision_and_scale(38, 10).unwrap();
2670        assert_eq!(array.len(), 3);
2671        assert_eq!(array.data_type(), &DataType::Decimal128(38, 10));
2672        assert_eq!(-100_i128, array.value(0));
2673        assert!(!array.is_null(0));
2674        assert!(array.is_null(1));
2675        assert_eq!(101_i128, array.value(2));
2676        assert!(!array.is_null(2));
2677    }
2678
2679    #[test]
2680    fn test_decimal64_iter() {
2681        let mut builder = Decimal64Builder::with_capacity(30);
2682        let decimal1 = 12345;
2683        builder.append_value(decimal1);
2684
2685        builder.append_null();
2686
2687        let decimal2 = 56789;
2688        builder.append_value(decimal2);
2689
2690        let array: Decimal64Array = builder.finish().with_precision_and_scale(18, 4).unwrap();
2691
2692        let collected: Vec<_> = array.iter().collect();
2693        assert_eq!(vec![Some(decimal1), None, Some(decimal2)], collected);
2694    }
2695
2696    #[test]
2697    fn test_from_iter_decimal64array() {
2698        let value1 = 12345;
2699        let value2 = 56789;
2700
2701        let mut array: Decimal64Array =
2702            vec![Some(value1), None, Some(value2)].into_iter().collect();
2703        array = array.with_precision_and_scale(18, 4).unwrap();
2704        assert_eq!(array.len(), 3);
2705        assert_eq!(array.data_type(), &DataType::Decimal64(18, 4));
2706        assert_eq!(value1, array.value(0));
2707        assert!(!array.is_null(0));
2708        assert!(array.is_null(1));
2709        assert_eq!(value2, array.value(2));
2710        assert!(!array.is_null(2));
2711    }
2712
2713    #[test]
2714    fn test_decimal32_iter() {
2715        let mut builder = Decimal32Builder::with_capacity(30);
2716        let decimal1 = 12345;
2717        builder.append_value(decimal1);
2718
2719        builder.append_null();
2720
2721        let decimal2 = 56789;
2722        builder.append_value(decimal2);
2723
2724        let array: Decimal32Array = builder.finish().with_precision_and_scale(9, 2).unwrap();
2725
2726        let collected: Vec<_> = array.iter().collect();
2727        assert_eq!(vec![Some(decimal1), None, Some(decimal2)], collected);
2728    }
2729
2730    #[test]
2731    fn test_from_iter_decimal32array() {
2732        let value1 = 12345;
2733        let value2 = 56789;
2734
2735        let mut array: Decimal32Array =
2736            vec![Some(value1), None, Some(value2)].into_iter().collect();
2737        array = array.with_precision_and_scale(9, 2).unwrap();
2738        assert_eq!(array.len(), 3);
2739        assert_eq!(array.data_type(), &DataType::Decimal32(9, 2));
2740        assert_eq!(value1, array.value(0));
2741        assert!(!array.is_null(0));
2742        assert!(array.is_null(1));
2743        assert_eq!(value2, array.value(2));
2744        assert!(!array.is_null(2));
2745    }
2746
2747    #[test]
2748    fn test_unary_opt() {
2749        let array = Int32Array::from(vec![1, 2, 3, 4, 5, 6, 7]);
2750        let r = array.unary_opt::<_, Int32Type>(|x| (x % 2 != 0).then_some(x));
2751
2752        let expected = Int32Array::from(vec![Some(1), None, Some(3), None, Some(5), None, Some(7)]);
2753        assert_eq!(r, expected);
2754
2755        let r = expected.unary_opt::<_, Int32Type>(|x| (x % 3 != 0).then_some(x));
2756        let expected = Int32Array::from(vec![Some(1), None, None, None, Some(5), None, Some(7)]);
2757        assert_eq!(r, expected);
2758    }
2759
2760    #[test]
2761    #[should_panic(
2762        expected = "Trying to access an element at index 4 from a PrimitiveArray of length 3"
2763    )]
2764    fn test_fixed_size_binary_array_get_value_index_out_of_bound() {
2765        let array = Decimal128Array::from(vec![-100, 0, 101]);
2766        array.value(4);
2767    }
2768
2769    #[test]
2770    fn test_into_builder() {
2771        let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2772
2773        let boxed: ArrayRef = Arc::new(array);
2774        let col: Int32Array = downcast_array(&boxed);
2775        drop(boxed);
2776
2777        let mut builder = col.into_builder().unwrap();
2778
2779        let slice = builder.values_slice_mut();
2780        assert_eq!(slice, &[1, 2, 3]);
2781
2782        slice[0] = 4;
2783        slice[1] = 2;
2784        slice[2] = 1;
2785
2786        let expected: Int32Array = vec![Some(4), Some(2), Some(1)].into_iter().collect();
2787
2788        let new_array = builder.finish();
2789        assert_eq!(expected, new_array);
2790    }
2791
2792    #[test]
2793    fn test_into_builder_cloned_array() {
2794        let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2795
2796        let boxed: ArrayRef = Arc::new(array);
2797
2798        let col: Int32Array = PrimitiveArray::<Int32Type>::from(boxed.to_data());
2799        let err = col.into_builder();
2800
2801        match err {
2802            Ok(_) => panic!("Should not get builder from cloned array"),
2803            Err(returned) => {
2804                let expected: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2805                assert_eq!(expected, returned)
2806            }
2807        }
2808    }
2809
2810    #[test]
2811    fn test_into_builder_on_sliced_array() {
2812        let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2813        let slice = array.slice(1, 2);
2814        let col: Int32Array = downcast_array(&slice);
2815
2816        drop(slice);
2817
2818        col.into_builder()
2819            .expect_err("Should not build builder from sliced array");
2820    }
2821
2822    #[test]
2823    fn test_unary_mut() {
2824        let array: Int32Array = vec![1, 2, 3].into_iter().map(Some).collect();
2825
2826        let c = array.unary_mut(|x| x * 2 + 1).unwrap();
2827        let expected: Int32Array = vec![3, 5, 7].into_iter().map(Some).collect();
2828
2829        assert_eq!(expected, c);
2830
2831        let array: Int32Array = Int32Array::from(vec![Some(5), Some(7), None]);
2832        let c = array.unary_mut(|x| x * 2 + 1).unwrap();
2833        assert_eq!(c, Int32Array::from(vec![Some(11), Some(15), None]));
2834    }
2835
2836    #[test]
2837    #[should_panic(
2838        expected = "PrimitiveArray expected data type Interval(MonthDayNano) got Interval(DayTime)"
2839    )]
2840    fn test_invalid_interval_type() {
2841        let array = IntervalDayTimeArray::from(vec![IntervalDayTime::ZERO]);
2842        let _ = IntervalMonthDayNanoArray::from(array.into_data());
2843    }
2844
2845    #[test]
2846    fn test_timezone() {
2847        let array = TimestampNanosecondArray::from_iter_values([1, 2]);
2848        assert_eq!(array.timezone(), None);
2849
2850        let array = array.with_timezone("+02:00");
2851        assert_eq!(array.timezone(), Some("+02:00"));
2852    }
2853
2854    #[test]
2855    fn test_try_new() {
2856        Int32Array::new(vec![1, 2, 3, 4].into(), None);
2857        Int32Array::new(vec![1, 2, 3, 4].into(), Some(NullBuffer::new_null(4)));
2858
2859        let err = Int32Array::try_new(vec![1, 2, 3, 4].into(), Some(NullBuffer::new_null(3)))
2860            .unwrap_err();
2861
2862        assert_eq!(
2863            err.to_string(),
2864            "Invalid argument error: Incorrect length of null buffer for PrimitiveArray, expected 4 got 3"
2865        );
2866
2867        TimestampNanosecondArray::new(vec![1, 2, 3, 4].into(), None).with_data_type(
2868            DataType::Timestamp(TimeUnit::Nanosecond, Some("03:00".into())),
2869        );
2870    }
2871
2872    #[test]
2873    #[should_panic(expected = "PrimitiveArray expected data type Int32 got Date32")]
2874    fn test_with_data_type() {
2875        Int32Array::new(vec![1, 2, 3, 4].into(), None).with_data_type(DataType::Date32);
2876    }
2877
2878    #[test]
2879    fn test_time_32second_output() {
2880        let array: Time32SecondArray = vec![
2881            Some(-1),
2882            Some(0),
2883            Some(86_399),
2884            Some(86_400),
2885            Some(86_401),
2886            None,
2887        ]
2888        .into();
2889        let debug_str = format!("{array:?}");
2890        assert_eq!(
2891            "PrimitiveArray<Time32(s)>\n[\n  Cast error: Failed to convert -1 to temporal for Time32(s),\n  00:00:00,\n  23:59:59,\n  Cast error: Failed to convert 86400 to temporal for Time32(s),\n  Cast error: Failed to convert 86401 to temporal for Time32(s),\n  null,\n]",
2892            debug_str
2893        );
2894    }
2895
2896    #[test]
2897    fn test_time_32millisecond_debug_output() {
2898        let array: Time32MillisecondArray = vec![
2899            Some(-1),
2900            Some(0),
2901            Some(86_399_000),
2902            Some(86_400_000),
2903            Some(86_401_000),
2904            None,
2905        ]
2906        .into();
2907        let debug_str = format!("{array:?}");
2908        assert_eq!(
2909            "PrimitiveArray<Time32(ms)>\n[\n  Cast error: Failed to convert -1 to temporal for Time32(ms),\n  00:00:00,\n  23:59:59,\n  Cast error: Failed to convert 86400000 to temporal for Time32(ms),\n  Cast error: Failed to convert 86401000 to temporal for Time32(ms),\n  null,\n]",
2910            debug_str
2911        );
2912    }
2913
2914    #[test]
2915    fn test_time_64nanosecond_debug_output() {
2916        let array: Time64NanosecondArray = vec![
2917            Some(-1),
2918            Some(0),
2919            Some(86_399 * 1_000_000_000),
2920            Some(86_400 * 1_000_000_000),
2921            Some(86_401 * 1_000_000_000),
2922            None,
2923        ]
2924        .into();
2925        let debug_str = format!("{array:?}");
2926        assert_eq!(
2927            "PrimitiveArray<Time64(ns)>\n[\n  Cast error: Failed to convert -1 to temporal for Time64(ns),\n  00:00:00,\n  23:59:59,\n  Cast error: Failed to convert 86400000000000 to temporal for Time64(ns),\n  Cast error: Failed to convert 86401000000000 to temporal for Time64(ns),\n  null,\n]",
2928            debug_str
2929        );
2930    }
2931
2932    #[test]
2933    fn test_time_64microsecond_debug_output() {
2934        let array: Time64MicrosecondArray = vec![
2935            Some(-1),
2936            Some(0),
2937            Some(86_399 * 1_000_000),
2938            Some(86_400 * 1_000_000),
2939            Some(86_401 * 1_000_000),
2940            None,
2941        ]
2942        .into();
2943        let debug_str = format!("{array:?}");
2944        assert_eq!(
2945            "PrimitiveArray<Time64(µs)>\n[\n  Cast error: Failed to convert -1 to temporal for Time64(µs),\n  00:00:00,\n  23:59:59,\n  Cast error: Failed to convert 86400000000 to temporal for Time64(µs),\n  Cast error: Failed to convert 86401000000 to temporal for Time64(µs),\n  null,\n]",
2946            debug_str
2947        );
2948    }
2949
2950    #[test]
2951    fn test_primitive_with_nulls_into_builder() {
2952        let array: Int32Array = vec![
2953            Some(1),
2954            None,
2955            Some(3),
2956            Some(4),
2957            None,
2958            Some(7),
2959            None,
2960            Some(8),
2961        ]
2962        .into_iter()
2963        .collect();
2964        let _ = array.into_builder();
2965    }
2966}