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