datafusion_common/
cast.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
18//! This module provides DataFusion specific casting functions
19//! that provide error handling. They are intended to "never fail"
20//! but provide an error message rather than a panic, as the corresponding
21//! kernels in arrow-rs such as `as_boolean_array` do.
22
23use crate::{downcast_value, Result};
24use arrow::array::{
25    BinaryViewArray, DurationMicrosecondArray, DurationMillisecondArray,
26    DurationNanosecondArray, DurationSecondArray, Float16Array, Int16Array, Int8Array,
27    LargeBinaryArray, LargeStringArray, StringViewArray, UInt16Array,
28};
29use arrow::{
30    array::{
31        Array, BinaryArray, BooleanArray, Date32Array, Date64Array, Decimal128Array,
32        Decimal256Array, DictionaryArray, FixedSizeBinaryArray, FixedSizeListArray,
33        Float32Array, Float64Array, GenericBinaryArray, GenericListArray,
34        GenericStringArray, Int32Array, Int64Array, IntervalDayTimeArray,
35        IntervalMonthDayNanoArray, IntervalYearMonthArray, LargeListArray, ListArray,
36        MapArray, NullArray, OffsetSizeTrait, PrimitiveArray, StringArray, StructArray,
37        Time32MillisecondArray, Time32SecondArray, Time64MicrosecondArray,
38        Time64NanosecondArray, TimestampMicrosecondArray, TimestampMillisecondArray,
39        TimestampNanosecondArray, TimestampSecondArray, UInt32Array, UInt64Array,
40        UInt8Array, UnionArray,
41    },
42    datatypes::{ArrowDictionaryKeyType, ArrowPrimitiveType},
43};
44
45// Downcast Array to Date32Array
46pub fn as_date32_array(array: &dyn Array) -> Result<&Date32Array> {
47    Ok(downcast_value!(array, Date32Array))
48}
49
50// Downcast Array to Date64Array
51pub fn as_date64_array(array: &dyn Array) -> Result<&Date64Array> {
52    Ok(downcast_value!(array, Date64Array))
53}
54
55// Downcast Array to StructArray
56pub fn as_struct_array(array: &dyn Array) -> Result<&StructArray> {
57    Ok(downcast_value!(array, StructArray))
58}
59
60// Downcast Array to Int8Array
61pub fn as_int8_array(array: &dyn Array) -> Result<&Int8Array> {
62    Ok(downcast_value!(array, Int8Array))
63}
64
65// Downcast Array to UInt8Array
66pub fn as_uint8_array(array: &dyn Array) -> Result<&UInt8Array> {
67    Ok(downcast_value!(array, UInt8Array))
68}
69
70// Downcast Array to Int16Array
71pub fn as_int16_array(array: &dyn Array) -> Result<&Int16Array> {
72    Ok(downcast_value!(array, Int16Array))
73}
74
75// Downcast Array to UInt16Array
76pub fn as_uint16_array(array: &dyn Array) -> Result<&UInt16Array> {
77    Ok(downcast_value!(array, UInt16Array))
78}
79
80// Downcast Array to Int32Array
81pub fn as_int32_array(array: &dyn Array) -> Result<&Int32Array> {
82    Ok(downcast_value!(array, Int32Array))
83}
84
85// Downcast Array to UInt32Array
86pub fn as_uint32_array(array: &dyn Array) -> Result<&UInt32Array> {
87    Ok(downcast_value!(array, UInt32Array))
88}
89
90// Downcast Array to Int64Array
91pub fn as_int64_array(array: &dyn Array) -> Result<&Int64Array> {
92    Ok(downcast_value!(array, Int64Array))
93}
94
95// Downcast Array to UInt64Array
96pub fn as_uint64_array(array: &dyn Array) -> Result<&UInt64Array> {
97    Ok(downcast_value!(array, UInt64Array))
98}
99
100// Downcast Array to Decimal128Array
101pub fn as_decimal128_array(array: &dyn Array) -> Result<&Decimal128Array> {
102    Ok(downcast_value!(array, Decimal128Array))
103}
104
105// Downcast Array to Decimal256Array
106pub fn as_decimal256_array(array: &dyn Array) -> Result<&Decimal256Array> {
107    Ok(downcast_value!(array, Decimal256Array))
108}
109
110// Downcast Array to Float16Array
111pub fn as_float16_array(array: &dyn Array) -> Result<&Float16Array> {
112    Ok(downcast_value!(array, Float16Array))
113}
114
115// Downcast Array to Float32Array
116pub fn as_float32_array(array: &dyn Array) -> Result<&Float32Array> {
117    Ok(downcast_value!(array, Float32Array))
118}
119
120// Downcast Array to Float64Array
121pub fn as_float64_array(array: &dyn Array) -> Result<&Float64Array> {
122    Ok(downcast_value!(array, Float64Array))
123}
124
125// Downcast Array to StringArray
126pub fn as_string_array(array: &dyn Array) -> Result<&StringArray> {
127    Ok(downcast_value!(array, StringArray))
128}
129
130// Downcast Array to StringViewArray
131pub fn as_string_view_array(array: &dyn Array) -> Result<&StringViewArray> {
132    Ok(downcast_value!(array, StringViewArray))
133}
134
135// Downcast Array to LargeStringArray
136pub fn as_large_string_array(array: &dyn Array) -> Result<&LargeStringArray> {
137    Ok(downcast_value!(array, LargeStringArray))
138}
139
140// Downcast Array to BooleanArray
141pub fn as_boolean_array(array: &dyn Array) -> Result<&BooleanArray> {
142    Ok(downcast_value!(array, BooleanArray))
143}
144
145// Downcast Array to ListArray
146pub fn as_list_array(array: &dyn Array) -> Result<&ListArray> {
147    Ok(downcast_value!(array, ListArray))
148}
149
150// Downcast Array to DictionaryArray
151pub fn as_dictionary_array<T: ArrowDictionaryKeyType>(
152    array: &dyn Array,
153) -> Result<&DictionaryArray<T>> {
154    Ok(downcast_value!(array, DictionaryArray, T))
155}
156
157// Downcast Array to GenericBinaryArray
158pub fn as_generic_binary_array<T: OffsetSizeTrait>(
159    array: &dyn Array,
160) -> Result<&GenericBinaryArray<T>> {
161    Ok(downcast_value!(array, GenericBinaryArray, T))
162}
163
164// Downcast Array to GenericListArray
165pub fn as_generic_list_array<T: OffsetSizeTrait>(
166    array: &dyn Array,
167) -> Result<&GenericListArray<T>> {
168    Ok(downcast_value!(array, GenericListArray, T))
169}
170
171// Downcast Array to LargeListArray
172pub fn as_large_list_array(array: &dyn Array) -> Result<&LargeListArray> {
173    Ok(downcast_value!(array, LargeListArray))
174}
175
176// Downcast Array to PrimitiveArray
177pub fn as_primitive_array<T: ArrowPrimitiveType>(
178    array: &dyn Array,
179) -> Result<&PrimitiveArray<T>> {
180    Ok(downcast_value!(array, PrimitiveArray, T))
181}
182
183// Downcast Array to MapArray
184pub fn as_map_array(array: &dyn Array) -> Result<&MapArray> {
185    Ok(downcast_value!(array, MapArray))
186}
187
188// Downcast Array to NullArray
189pub fn as_null_array(array: &dyn Array) -> Result<&NullArray> {
190    Ok(downcast_value!(array, NullArray))
191}
192
193// Downcast Array to NullArray
194pub fn as_union_array(array: &dyn Array) -> Result<&UnionArray> {
195    Ok(downcast_value!(array, UnionArray))
196}
197
198// Downcast Array to Time32SecondArray
199pub fn as_time32_second_array(array: &dyn Array) -> Result<&Time32SecondArray> {
200    Ok(downcast_value!(array, Time32SecondArray))
201}
202
203// Downcast Array to Time32MillisecondArray
204pub fn as_time32_millisecond_array(array: &dyn Array) -> Result<&Time32MillisecondArray> {
205    Ok(downcast_value!(array, Time32MillisecondArray))
206}
207
208// Downcast Array to Time64MicrosecondArray
209pub fn as_time64_microsecond_array(array: &dyn Array) -> Result<&Time64MicrosecondArray> {
210    Ok(downcast_value!(array, Time64MicrosecondArray))
211}
212
213// Downcast Array to Time64NanosecondArray
214pub fn as_time64_nanosecond_array(array: &dyn Array) -> Result<&Time64NanosecondArray> {
215    Ok(downcast_value!(array, Time64NanosecondArray))
216}
217
218// Downcast Array to TimestampNanosecondArray
219pub fn as_timestamp_nanosecond_array(
220    array: &dyn Array,
221) -> Result<&TimestampNanosecondArray> {
222    Ok(downcast_value!(array, TimestampNanosecondArray))
223}
224
225// Downcast Array to TimestampMillisecondArray
226pub fn as_timestamp_millisecond_array(
227    array: &dyn Array,
228) -> Result<&TimestampMillisecondArray> {
229    Ok(downcast_value!(array, TimestampMillisecondArray))
230}
231
232// Downcast Array to TimestampMicrosecondArray
233pub fn as_timestamp_microsecond_array(
234    array: &dyn Array,
235) -> Result<&TimestampMicrosecondArray> {
236    Ok(downcast_value!(array, TimestampMicrosecondArray))
237}
238
239// Downcast Array to TimestampSecondArray
240pub fn as_timestamp_second_array(array: &dyn Array) -> Result<&TimestampSecondArray> {
241    Ok(downcast_value!(array, TimestampSecondArray))
242}
243
244// Downcast Array to IntervalYearMonthArray
245pub fn as_interval_ym_array(array: &dyn Array) -> Result<&IntervalYearMonthArray> {
246    Ok(downcast_value!(array, IntervalYearMonthArray))
247}
248
249// Downcast Array to IntervalDayTimeArray
250pub fn as_interval_dt_array(array: &dyn Array) -> Result<&IntervalDayTimeArray> {
251    Ok(downcast_value!(array, IntervalDayTimeArray))
252}
253
254// Downcast Array to IntervalMonthDayNanoArray
255pub fn as_interval_mdn_array(array: &dyn Array) -> Result<&IntervalMonthDayNanoArray> {
256    Ok(downcast_value!(array, IntervalMonthDayNanoArray))
257}
258
259// Downcast Array to DurationSecondArray
260pub fn as_duration_second_array(array: &dyn Array) -> Result<&DurationSecondArray> {
261    Ok(downcast_value!(array, DurationSecondArray))
262}
263
264// Downcast Array to DurationMillisecondArray
265pub fn as_duration_millisecond_array(
266    array: &dyn Array,
267) -> Result<&DurationMillisecondArray> {
268    Ok(downcast_value!(array, DurationMillisecondArray))
269}
270
271// Downcast Array to DurationMicrosecondArray
272pub fn as_duration_microsecond_array(
273    array: &dyn Array,
274) -> Result<&DurationMicrosecondArray> {
275    Ok(downcast_value!(array, DurationMicrosecondArray))
276}
277
278// Downcast Array to DurationNanosecondArray
279pub fn as_duration_nanosecond_array(
280    array: &dyn Array,
281) -> Result<&DurationNanosecondArray> {
282    Ok(downcast_value!(array, DurationNanosecondArray))
283}
284
285// Downcast Array to BinaryArray
286pub fn as_binary_array(array: &dyn Array) -> Result<&BinaryArray> {
287    Ok(downcast_value!(array, BinaryArray))
288}
289
290// Downcast Array to BinaryViewArray
291pub fn as_binary_view_array(array: &dyn Array) -> Result<&BinaryViewArray> {
292    Ok(downcast_value!(array, BinaryViewArray))
293}
294
295// Downcast Array to LargeBinaryArray
296pub fn as_large_binary_array(array: &dyn Array) -> Result<&LargeBinaryArray> {
297    Ok(downcast_value!(array, LargeBinaryArray))
298}
299
300// Downcast Array to FixedSizeListArray
301pub fn as_fixed_size_list_array(array: &dyn Array) -> Result<&FixedSizeListArray> {
302    Ok(downcast_value!(array, FixedSizeListArray))
303}
304
305// Downcast Array to FixedSizeListArray
306pub fn as_fixed_size_binary_array(array: &dyn Array) -> Result<&FixedSizeBinaryArray> {
307    Ok(downcast_value!(array, FixedSizeBinaryArray))
308}
309
310// Downcast Array to GenericBinaryArray
311pub fn as_generic_string_array<T: OffsetSizeTrait>(
312    array: &dyn Array,
313) -> Result<&GenericStringArray<T>> {
314    Ok(downcast_value!(array, GenericStringArray, T))
315}