From 5c2801d08edbe1573d6c23c55b7333f0aedbdc3c Mon Sep 17 00:00:00 2001 From: Raphael Taylor-Davies <1781103+tustvold@users.noreply.github.com> Date: Tue, 15 Nov 2022 18:20:30 +1300 Subject: [PATCH] Add downcast_array (#2901) (#3117) --- arrow-array/src/cast.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/arrow-array/src/cast.rs b/arrow-array/src/cast.rs index 4569c36812b..02d5432c168 100644 --- a/arrow-array/src/cast.rs +++ b/arrow-array/src/cast.rs @@ -19,6 +19,7 @@ use crate::array::*; use crate::types::*; +use arrow_data::ArrayData; /// Repeats the provided pattern based on the number of comma separated identifiers #[doc(hidden)] @@ -550,6 +551,38 @@ array_downcast_fn!(as_union_array, UnionArray); array_downcast_fn!(as_map_array, MapArray); array_downcast_fn!(as_decimal_array, Decimal128Array); +/// Downcasts a `dyn Array` to a concrete type +/// +/// ``` +/// # use arrow_array::{BooleanArray, Int32Array, RecordBatch, StringArray}; +/// # use arrow_array::cast::downcast_array; +/// struct ConcreteBatch { +/// col1: Int32Array, +/// col2: BooleanArray, +/// col3: StringArray, +/// } +/// +/// impl ConcreteBatch { +/// fn new(batch: &RecordBatch) -> Self { +/// Self { +/// col1: downcast_array(batch.column(0).as_ref()), +/// col2: downcast_array(batch.column(1).as_ref()), +/// col3: downcast_array(batch.column(2).as_ref()), +/// } +/// } +/// } +/// ``` +/// +/// # Panics +/// +/// Panics if array is not of the correct data type +pub fn downcast_array(array: &dyn Array) -> T +where + T: From, +{ + T::from(array.data().clone()) +} + #[cfg(test)] mod tests { use arrow_buffer::i256;