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