Skip to main content

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