1use arrow::array::{ArrayRef, AsArray};
16use arrow::datatypes::{
17 DataType, DurationMicrosecondType, DurationMillisecondType, DurationNanosecondType,
18 DurationSecondType, Int8Type, Int16Type, Int32Type, Int64Type, Time32MillisecondType,
19 Time32SecondType, Time64MicrosecondType, Time64NanosecondType, TimeUnit,
20 TimestampMicrosecondType, TimestampMillisecondType, TimestampNanosecondType,
21 TimestampSecondType, UInt8Type, UInt16Type, UInt32Type, UInt64Type,
22};
23use arrow_array::Array;
24use common_time::time::Time;
25use common_time::{Duration, Timestamp};
26
27pub type BinaryArray = arrow::array::BinaryArray;
28pub type LargeBinaryArray = arrow::array::LargeBinaryArray;
29pub type MutableBinaryArray = arrow::array::BinaryBuilder;
30pub type BinaryViewArray = arrow::array::BinaryViewArray;
31pub type MutableBinaryViewArray = arrow::array::BinaryViewBuilder;
32pub type StringArray = arrow::array::StringArray;
33pub type MutableStringArray = arrow::array::StringBuilder;
34pub type LargeStringArray = arrow::array::LargeStringArray;
35pub type MutableLargeStringArray = arrow::array::LargeStringBuilder;
36pub type StringViewArray = arrow::array::StringViewArray;
37pub type MutableStringViewArray = arrow::array::StringViewBuilder;
38
39pub fn timestamp_array_value(array: &ArrayRef, i: usize) -> Timestamp {
48 let DataType::Timestamp(time_unit, _) = &array.data_type() else {
49 unreachable!()
50 };
51 let v = match time_unit {
52 TimeUnit::Second => {
53 let array = array.as_primitive::<TimestampSecondType>();
54 array.value(i)
55 }
56 TimeUnit::Millisecond => {
57 let array = array.as_primitive::<TimestampMillisecondType>();
58 array.value(i)
59 }
60 TimeUnit::Microsecond => {
61 let array = array.as_primitive::<TimestampMicrosecondType>();
62 array.value(i)
63 }
64 TimeUnit::Nanosecond => {
65 let array = array.as_primitive::<TimestampNanosecondType>();
66 array.value(i)
67 }
68 };
69 Timestamp::new(v, time_unit.into())
70}
71
72pub fn time_array_value(array: &ArrayRef, i: usize) -> Time {
81 match array.data_type() {
82 DataType::Time32(time_unit) | DataType::Time64(time_unit) => match time_unit {
83 TimeUnit::Second => {
84 let array = array.as_primitive::<Time32SecondType>();
85 Time::new_second(array.value(i) as i64)
86 }
87 TimeUnit::Millisecond => {
88 let array = array.as_primitive::<Time32MillisecondType>();
89 Time::new_millisecond(array.value(i) as i64)
90 }
91 TimeUnit::Microsecond => {
92 let array = array.as_primitive::<Time64MicrosecondType>();
93 Time::new_microsecond(array.value(i))
94 }
95 TimeUnit::Nanosecond => {
96 let array = array.as_primitive::<Time64NanosecondType>();
97 Time::new_nanosecond(array.value(i))
98 }
99 },
100 _ => unreachable!(),
101 }
102}
103
104pub fn duration_array_value(array: &ArrayRef, i: usize) -> Duration {
113 let DataType::Duration(time_unit) = array.data_type() else {
114 unreachable!();
115 };
116 let v = match time_unit {
117 TimeUnit::Second => {
118 let array = array.as_primitive::<DurationSecondType>();
119 array.value(i)
120 }
121 TimeUnit::Millisecond => {
122 let array = array.as_primitive::<DurationMillisecondType>();
123 array.value(i)
124 }
125 TimeUnit::Microsecond => {
126 let array = array.as_primitive::<DurationMicrosecondType>();
127 array.value(i)
128 }
129 TimeUnit::Nanosecond => {
130 let array = array.as_primitive::<DurationNanosecondType>();
131 array.value(i)
132 }
133 };
134 Duration::new(v, time_unit.into())
135}
136
137pub fn string_array_value_at_index(array: &ArrayRef, i: usize) -> Option<&str> {
145 match array.data_type() {
146 DataType::Utf8 => {
147 let array = array.as_string::<i32>();
148 array.is_valid(i).then(|| array.value(i))
149 }
150 DataType::LargeUtf8 => {
151 let array = array.as_string::<i64>();
152 array.is_valid(i).then(|| array.value(i))
153 }
154 DataType::Utf8View => {
155 let array = array.as_string_view();
156 array.is_valid(i).then(|| array.value(i))
157 }
158 _ => None,
159 }
160}
161
162pub fn string_array_value(array: &ArrayRef, i: usize) -> &str {
171 match array.data_type() {
172 DataType::Utf8 => array.as_string::<i32>().value(i),
173 DataType::LargeUtf8 => array.as_string::<i64>().value(i),
174 DataType::Utf8View => array.as_string_view().value(i),
175 _ => unreachable!(),
176 }
177}
178
179pub fn binary_array_value(array: &ArrayRef, i: usize) -> &[u8] {
188 match array.data_type() {
189 DataType::Binary => array.as_binary::<i32>().value(i),
190 DataType::LargeBinary => array.as_binary::<i64>().value(i),
191 DataType::BinaryView => array.as_binary_view().value(i),
192 _ => unreachable!(),
193 }
194}
195
196pub fn int_array_value_at_index(array: &ArrayRef, i: usize) -> Option<i64> {
208 match array.data_type() {
209 DataType::Int8 => {
210 let array = array.as_primitive::<Int8Type>();
211 array.is_valid(i).then(|| array.value(i) as i64)
212 }
213 DataType::Int16 => {
214 let array = array.as_primitive::<Int16Type>();
215 array.is_valid(i).then(|| array.value(i) as i64)
216 }
217 DataType::Int32 => {
218 let array = array.as_primitive::<Int32Type>();
219 array.is_valid(i).then(|| array.value(i) as i64)
220 }
221 DataType::Int64 => {
222 let array = array.as_primitive::<Int64Type>();
223 array.is_valid(i).then(|| array.value(i))
224 }
225 DataType::UInt8 => {
226 let array = array.as_primitive::<UInt8Type>();
227 array.is_valid(i).then(|| array.value(i) as i64)
228 }
229 DataType::UInt16 => {
230 let array = array.as_primitive::<UInt16Type>();
231 array.is_valid(i).then(|| array.value(i) as i64)
232 }
233 DataType::UInt32 => {
234 let array = array.as_primitive::<UInt32Type>();
235 array.is_valid(i).then(|| array.value(i) as i64)
236 }
237 DataType::UInt64 => {
238 let array = array.as_primitive::<UInt64Type>();
239 array
240 .is_valid(i)
241 .then(|| {
242 let i = array.value(i);
243 if i <= i64::MAX as u64 {
244 Some(i as i64)
245 } else {
246 None
247 }
248 })
249 .flatten()
250 }
251 _ => None,
252 }
253}