This is an automated email from the ASF dual-hosted git repository.

tustvold pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/master by this push:
     new 5a49cfed4 Add downcast macros (#2635) (#2636)
5a49cfed4 is described below

commit 5a49cfed425f949520f4cb248c79a8d56a0150c5
Author: Raphael Taylor-Davies <[email protected]>
AuthorDate: Fri Sep 2 15:32:44 2022 +0100

    Add downcast macros (#2635) (#2636)
    
    * Add downcast macros (#2635)
    
    * Add Float16 support and trailing commas
    
    * Review feedback
---
 arrow/src/array/cast.rs             | 299 ++++++++++++++++++++++++++++++++++++
 arrow/src/compute/kernels/filter.rs | 125 +--------------
 arrow/src/compute/kernels/take.rs   | 101 ++----------
 3 files changed, 317 insertions(+), 208 deletions(-)

diff --git a/arrow/src/array/cast.rs b/arrow/src/array/cast.rs
index fd57133bc..2b68cbbe6 100644
--- a/arrow/src/array/cast.rs
+++ b/arrow/src/array/cast.rs
@@ -20,6 +20,213 @@
 use crate::array::*;
 use crate::datatypes::*;
 
+/// Downcast an [`Array`] to a [`PrimitiveArray`] based on its [`DataType`], 
accepts
+/// a number of subsequent patterns to match the data type
+///
+/// ```
+/// # use arrow::downcast_primitive_array;
+/// # use arrow::array::Array;
+/// # use arrow::datatypes::DataType;
+/// # use arrow::array::as_string_array;
+///
+/// fn print_primitive(array: &dyn Array) {
+///     downcast_primitive_array!(
+///         array => {
+///             for v in array {
+///                 println!("{:?}", v);
+///             }
+///         }
+///         DataType::Utf8 => {
+///             for v in as_string_array(array) {
+///                 println!("{:?}", v);
+///             }
+///         }
+///         t => println!("Unsupported datatype {}", t)
+///     )
+/// }
+/// ```
+///
+#[macro_export]
+macro_rules! downcast_primitive_array {
+    ($values:ident => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
+        downcast_primitive_array!($values => {$e} $($p => $fallback)*)
+    };
+
+    ($values:ident => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
+        match $values.data_type() {
+            $crate::datatypes::DataType::Int8 => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::Int8Type,
+                >($values);
+                $e
+            }
+            $crate::datatypes::DataType::Int16 => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::Int16Type,
+                >($values);
+                $e
+            }
+            $crate::datatypes::DataType::Int32 => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::Int32Type,
+                >($values);
+                $e
+            }
+            $crate::datatypes::DataType::Int64 => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::Int64Type,
+                >($values);
+                $e
+            }
+            $crate::datatypes::DataType::UInt8 => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::UInt8Type,
+                >($values);
+                $e
+            }
+            $crate::datatypes::DataType::UInt16 => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::UInt16Type,
+                >($values);
+                $e
+            }
+            $crate::datatypes::DataType::UInt32 => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::UInt32Type,
+                >($values);
+                $e
+            }
+            $crate::datatypes::DataType::UInt64 => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::UInt64Type,
+                >($values);
+                $e
+            }
+            $crate::datatypes::DataType::Float16 => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::Float16Type,
+                >($values);
+                $e
+            }
+            $crate::datatypes::DataType::Float32 => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::Float32Type,
+                >($values);
+                $e
+            }
+            $crate::datatypes::DataType::Float64 => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::Float64Type,
+                >($values);
+                $e
+            }
+            $crate::datatypes::DataType::Date32 => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::Date32Type,
+                >($values);
+                $e
+            }
+            $crate::datatypes::DataType::Date64 => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::Date64Type,
+                >($values);
+                $e
+            }
+            
$crate::datatypes::DataType::Time32($crate::datatypes::TimeUnit::Second) => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::Time32SecondType,
+                >($values);
+                $e
+            }
+            
$crate::datatypes::DataType::Time32($crate::datatypes::TimeUnit::Millisecond) 
=> {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::Time32MillisecondType,
+                >($values);
+                $e
+            }
+            
$crate::datatypes::DataType::Time64($crate::datatypes::TimeUnit::Microsecond) 
=> {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::Time64MicrosecondType,
+                >($values);
+                $e
+            }
+            
$crate::datatypes::DataType::Time64($crate::datatypes::TimeUnit::Nanosecond) => 
{
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::Time64NanosecondType,
+                >($values);
+                $e
+            }
+            
$crate::datatypes::DataType::Timestamp($crate::datatypes::TimeUnit::Second, _) 
=> {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::TimestampSecondType,
+                >($values);
+                $e
+            }
+            
$crate::datatypes::DataType::Timestamp($crate::datatypes::TimeUnit::Millisecond,
 _) => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::TimestampMillisecondType,
+                >($values);
+                $e
+            }
+            
$crate::datatypes::DataType::Timestamp($crate::datatypes::TimeUnit::Microsecond,
 _) => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::TimestampMicrosecondType,
+                >($values);
+                $e
+            }
+            
$crate::datatypes::DataType::Timestamp($crate::datatypes::TimeUnit::Nanosecond, 
_) => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::TimestampNanosecondType,
+                >($values);
+                $e
+            }
+            
$crate::datatypes::DataType::Interval($crate::datatypes::IntervalUnit::YearMonth)
 => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::IntervalYearMonthType,
+                >($values);
+                $e
+            }
+            
$crate::datatypes::DataType::Interval($crate::datatypes::IntervalUnit::DayTime) 
=> {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::IntervalDayTimeType,
+                >($values);
+                $e
+            }
+            
$crate::datatypes::DataType::Interval($crate::datatypes::IntervalUnit::MonthDayNano)
 => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::IntervalMonthDayNanoType,
+                >($values);
+                $e
+            }
+            
$crate::datatypes::DataType::Duration($crate::datatypes::TimeUnit::Second) => {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::DurationSecondType,
+                >($values);
+                $e
+            }
+            
$crate::datatypes::DataType::Duration($crate::datatypes::TimeUnit::Millisecond) 
=> {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::DurationMillisecondType,
+                >($values);
+                $e
+            }
+            
$crate::datatypes::DataType::Duration($crate::datatypes::TimeUnit::Microsecond) 
=> {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::DurationMicrosecondType,
+                >($values);
+                $e
+            }
+            
$crate::datatypes::DataType::Duration($crate::datatypes::TimeUnit::Nanosecond) 
=> {
+                let $values = $crate::array::as_primitive_array::<
+                    $crate::datatypes::DurationNanosecondType,
+                >($values);
+                $e
+            }
+            $($p => $fallback,)*
+        }
+    };
+}
+
 /// Force downcast of an [`Array`], such as an [`ArrayRef`], to
 /// [`PrimitiveArray<T>`], panic'ing on failure.
 ///
@@ -53,6 +260,98 @@ where
         .expect("Unable to downcast to primitive array")
 }
 
+/// Downcast an [`Array`] to a [`DictionaryArray`] based on its [`DataType`], 
accepts
+/// a number of subsequent patterns to match the data type
+///
+/// ```
+/// # use arrow::downcast_dictionary_array;
+/// # use arrow::array::{Array, StringArray};
+/// # use arrow::datatypes::DataType;
+/// # use arrow::array::as_string_array;
+///
+/// fn print_strings(array: &dyn Array) {
+///     downcast_dictionary_array!(
+///         array => match array.values().data_type() {
+///             DataType::Utf8 => {
+///                 for v in array.downcast_dict::<StringArray>().unwrap() {
+///                     println!("{:?}", v);
+///                 }
+///             }
+///             t => println!("Unsupported dictionary value type {}", t),
+///         },
+///         DataType::Utf8 => {
+///             for v in as_string_array(array) {
+///                 println!("{:?}", v);
+///             }
+///         }
+///         t => println!("Unsupported datatype {}", t)
+///     )
+/// }
+/// ```
+#[macro_export]
+macro_rules! downcast_dictionary_array {
+    ($values:ident => $e:expr, $($p:pat => $fallback:expr $(,)*)*) => {
+        downcast_dictionary_array!($values => {$e} $($p => $fallback)*)
+    };
+
+    ($values:ident => $e:block $($p:pat => $fallback:expr $(,)*)*) => {
+        match $values.data_type() {
+            $crate::datatypes::DataType::Dictionary(k, _) => match k.as_ref() {
+                $crate::datatypes::DataType::Int8 => {
+                    let $values = $crate::array::as_dictionary_array::<
+                        $crate::datatypes::Int8Type,
+                    >($values);
+                    $e
+                },
+                $crate::datatypes::DataType::Int16 => {
+                    let $values = $crate::array::as_dictionary_array::<
+                        $crate::datatypes::Int16Type,
+                    >($values);
+                    $e
+                },
+                $crate::datatypes::DataType::Int32 => {
+                    let $values = $crate::array::as_dictionary_array::<
+                        $crate::datatypes::Int32Type,
+                    >($values);
+                    $e
+                },
+                $crate::datatypes::DataType::Int64 => {
+                    let $values = $crate::array::as_dictionary_array::<
+                        $crate::datatypes::Int64Type,
+                    >($values);
+                    $e
+                },
+                $crate::datatypes::DataType::UInt8 => {
+                    let $values = $crate::array::as_dictionary_array::<
+                        $crate::datatypes::UInt8Type,
+                    >($values);
+                    $e
+                },
+                $crate::datatypes::DataType::UInt16 => {
+                    let $values = $crate::array::as_dictionary_array::<
+                        $crate::datatypes::UInt16Type,
+                    >($values);
+                    $e
+                },
+                $crate::datatypes::DataType::UInt32 => {
+                    let $values = $crate::array::as_dictionary_array::<
+                        $crate::datatypes::UInt32Type,
+                    >($values);
+                    $e
+                },
+                $crate::datatypes::DataType::UInt64 => {
+                    let $values = $crate::array::as_dictionary_array::<
+                        $crate::datatypes::UInt64Type,
+                    >($values);
+                    $e
+                },
+                k => unreachable!("unsupported dictionary key type: {}", k)
+            }
+            $($p => $fallback,)*
+        }
+    }
+}
+
 /// Force downcast of an [`Array`], such as an [`ArrayRef`] to
 /// [`DictionaryArray<T>`], panic'ing on failure.
 ///
diff --git a/arrow/src/compute/kernels/filter.rs 
b/arrow/src/compute/kernels/filter.rs
index 81be3a1d1..52664a175 100644
--- a/arrow/src/compute/kernels/filter.rs
+++ b/arrow/src/compute/kernels/filter.rs
@@ -22,8 +22,6 @@ use std::sync::Arc;
 
 use num::Zero;
 
-use TimeUnit::*;
-
 use crate::array::*;
 use crate::buffer::{buffer_bin_and, Buffer, MutableBuffer};
 use crate::datatypes::*;
@@ -31,6 +29,7 @@ use crate::error::{ArrowError, Result};
 use crate::record_batch::RecordBatch;
 use crate::util::bit_iterator::{BitIndexIterator, BitSliceIterator};
 use crate::util::bit_util;
+use crate::{downcast_dictionary_array, downcast_primitive_array};
 
 /// If the filter selects more than this fraction of rows, use
 /// [`SlicesIterator`] to copy ranges of values. Otherwise iterate
@@ -40,27 +39,6 @@ use crate::util::bit_util;
 ///
 const FILTER_SLICES_SELECTIVITY_THRESHOLD: f64 = 0.8;
 
-macro_rules! downcast_filter {
-    ($type: ty, $values: expr, $filter: expr) => {{
-        let values = $values
-            .as_any()
-            .downcast_ref::<PrimitiveArray<$type>>()
-            .expect("Unable to downcast to a primitive array");
-
-        Ok(Arc::new(filter_primitive::<$type>(&values, $filter)))
-    }};
-}
-
-macro_rules! downcast_dict_filter {
-    ($type: ty, $values: expr, $filter: expr) => {{
-        let values = $values
-            .as_any()
-            .downcast_ref::<DictionaryArray<$type>>()
-            .expect("Unable to downcast to a dictionary array");
-        Ok(Arc::new(filter_dict::<$type>(values, $filter)))
-    }};
-}
-
 /// An iterator of `(usize, usize)` each representing an interval
 /// `[start, end)` whose slots of a [BooleanArray] are true. Each
 /// interval corresponds to a contiguous region of memory to be
@@ -358,92 +336,12 @@ fn filter_array(values: &dyn Array, predicate: 
&FilterPredicate) -> Result<Array
         IterationStrategy::None => Ok(new_empty_array(values.data_type())),
         IterationStrategy::All => Ok(make_array(values.data().slice(0, 
predicate.count))),
         // actually filter
-        _ => match values.data_type() {
+        _ => downcast_primitive_array! {
+            values => Ok(Arc::new(filter_primitive(values, predicate))),
             DataType::Boolean => {
                 let values = 
values.as_any().downcast_ref::<BooleanArray>().unwrap();
                 Ok(Arc::new(filter_boolean(values, predicate)))
             }
-            DataType::Int8 => {
-                downcast_filter!(Int8Type, values, predicate)
-            }
-            DataType::Int16 => {
-                downcast_filter!(Int16Type, values, predicate)
-            }
-            DataType::Int32 => {
-                downcast_filter!(Int32Type, values, predicate)
-            }
-            DataType::Int64 => {
-                downcast_filter!(Int64Type, values, predicate)
-            }
-            DataType::UInt8 => {
-                downcast_filter!(UInt8Type, values, predicate)
-            }
-            DataType::UInt16 => {
-                downcast_filter!(UInt16Type, values, predicate)
-            }
-            DataType::UInt32 => {
-                downcast_filter!(UInt32Type, values, predicate)
-            }
-            DataType::UInt64 => {
-                downcast_filter!(UInt64Type, values, predicate)
-            }
-            DataType::Float32 => {
-                downcast_filter!(Float32Type, values, predicate)
-            }
-            DataType::Float64 => {
-                downcast_filter!(Float64Type, values, predicate)
-            }
-            DataType::Date32 => {
-                downcast_filter!(Date32Type, values, predicate)
-            }
-            DataType::Date64 => {
-                downcast_filter!(Date64Type, values, predicate)
-            }
-            DataType::Time32(Second) => {
-                downcast_filter!(Time32SecondType, values, predicate)
-            }
-            DataType::Time32(Millisecond) => {
-                downcast_filter!(Time32MillisecondType, values, predicate)
-            }
-            DataType::Time64(Microsecond) => {
-                downcast_filter!(Time64MicrosecondType, values, predicate)
-            }
-            DataType::Time64(Nanosecond) => {
-                downcast_filter!(Time64NanosecondType, values, predicate)
-            }
-            DataType::Timestamp(Second, _) => {
-                downcast_filter!(TimestampSecondType, values, predicate)
-            }
-            DataType::Timestamp(Millisecond, _) => {
-                downcast_filter!(TimestampMillisecondType, values, predicate)
-            }
-            DataType::Timestamp(Microsecond, _) => {
-                downcast_filter!(TimestampMicrosecondType, values, predicate)
-            }
-            DataType::Timestamp(Nanosecond, _) => {
-                downcast_filter!(TimestampNanosecondType, values, predicate)
-            }
-            DataType::Interval(IntervalUnit::YearMonth) => {
-                downcast_filter!(IntervalYearMonthType, values, predicate)
-            }
-            DataType::Interval(IntervalUnit::DayTime) => {
-                downcast_filter!(IntervalDayTimeType, values, predicate)
-            }
-            DataType::Interval(IntervalUnit::MonthDayNano) => {
-                downcast_filter!(IntervalMonthDayNanoType, values, predicate)
-            }
-            DataType::Duration(TimeUnit::Second) => {
-                downcast_filter!(DurationSecondType, values, predicate)
-            }
-            DataType::Duration(TimeUnit::Millisecond) => {
-                downcast_filter!(DurationMillisecondType, values, predicate)
-            }
-            DataType::Duration(TimeUnit::Microsecond) => {
-                downcast_filter!(DurationMicrosecondType, values, predicate)
-            }
-            DataType::Duration(TimeUnit::Nanosecond) => {
-                downcast_filter!(DurationNanosecondType, values, predicate)
-            }
             DataType::Utf8 => {
                 let values = values
                     .as_any()
@@ -458,19 +356,10 @@ fn filter_array(values: &dyn Array, predicate: 
&FilterPredicate) -> Result<Array
                     .unwrap();
                 Ok(Arc::new(filter_string::<i64>(values, predicate)))
             }
-            DataType::Dictionary(key_type, _) => match key_type.as_ref() {
-                DataType::Int8 => downcast_dict_filter!(Int8Type, values, 
predicate),
-                DataType::Int16 => downcast_dict_filter!(Int16Type, values, 
predicate),
-                DataType::Int32 => downcast_dict_filter!(Int32Type, values, 
predicate),
-                DataType::Int64 => downcast_dict_filter!(Int64Type, values, 
predicate),
-                DataType::UInt8 => downcast_dict_filter!(UInt8Type, values, 
predicate),
-                DataType::UInt16 => downcast_dict_filter!(UInt16Type, values, 
predicate),
-                DataType::UInt32 => downcast_dict_filter!(UInt32Type, values, 
predicate),
-                DataType::UInt64 => downcast_dict_filter!(UInt64Type, values, 
predicate),
-                t => {
-                    unimplemented!("Filter not supported for dictionary key 
type {:?}", t)
-                }
-            },
+            DataType::Dictionary(_, _) => downcast_dictionary_array! {
+                values => Ok(Arc::new(filter_dict(values, predicate))),
+                t => unimplemented!("Filter not supported for dictionary type 
{:?}", t)
+            }
             _ => {
                 // fallback to using MutableArrayData
                 let mut mutable = MutableArrayData::new(
diff --git a/arrow/src/compute/kernels/take.rs 
b/arrow/src/compute/kernels/take.rs
index 3272c8454..19eb1b17c 100644
--- a/arrow/src/compute/kernels/take.rs
+++ b/arrow/src/compute/kernels/take.rs
@@ -26,30 +26,11 @@ use crate::compute::util::{
 use crate::datatypes::*;
 use crate::error::{ArrowError, Result};
 use crate::util::bit_util;
-use crate::{array::*, buffer::buffer_bin_and};
+use crate::{
+    array::*, buffer::buffer_bin_and, downcast_dictionary_array, 
downcast_primitive_array,
+};
 
 use num::{ToPrimitive, Zero};
-use TimeUnit::*;
-
-macro_rules! downcast_take {
-    ($type: ty, $values: expr, $indices: expr) => {{
-        let values = $values
-            .as_any()
-            .downcast_ref::<PrimitiveArray<$type>>()
-            .expect("Unable to downcast to a primitive array");
-        Ok(Arc::new(take_primitive::<$type, _>(&values, $indices)?))
-    }};
-}
-
-macro_rules! downcast_dict_take {
-    ($type: ty, $values: expr, $indices: expr) => {{
-        let values = $values
-            .as_any()
-            .downcast_ref::<DictionaryArray<$type>>()
-            .expect("Unable to downcast to a dictionary array");
-        Ok(Arc::new(take_dict::<$type, _>(values, $indices)?))
-    }};
-}
 
 /// Take elements by index from [Array], creating a new [Array] from those 
indexes.
 ///
@@ -141,7 +122,9 @@ where
             })?
         }
     }
-    match values.data_type() {
+
+    downcast_primitive_array! {
+        values => Ok(Arc::new(take_primitive(values, indices)?)),
         DataType::Boolean => {
             let values = 
values.as_any().downcast_ref::<BooleanArray>().unwrap();
             Ok(Arc::new(take_boolean(values, indices)?))
@@ -151,61 +134,6 @@ where
                 values.as_any().downcast_ref::<Decimal128Array>().unwrap();
             Ok(Arc::new(take_decimal128(decimal_values, indices)?))
         }
-        DataType::Int8 => downcast_take!(Int8Type, values, indices),
-        DataType::Int16 => downcast_take!(Int16Type, values, indices),
-        DataType::Int32 => downcast_take!(Int32Type, values, indices),
-        DataType::Int64 => downcast_take!(Int64Type, values, indices),
-        DataType::UInt8 => downcast_take!(UInt8Type, values, indices),
-        DataType::UInt16 => downcast_take!(UInt16Type, values, indices),
-        DataType::UInt32 => downcast_take!(UInt32Type, values, indices),
-        DataType::UInt64 => downcast_take!(UInt64Type, values, indices),
-        DataType::Float32 => downcast_take!(Float32Type, values, indices),
-        DataType::Float64 => downcast_take!(Float64Type, values, indices),
-        DataType::Date32 => downcast_take!(Date32Type, values, indices),
-        DataType::Date64 => downcast_take!(Date64Type, values, indices),
-        DataType::Time32(Second) => downcast_take!(Time32SecondType, values, 
indices),
-        DataType::Time32(Millisecond) => {
-            downcast_take!(Time32MillisecondType, values, indices)
-        }
-        DataType::Time64(Microsecond) => {
-            downcast_take!(Time64MicrosecondType, values, indices)
-        }
-        DataType::Time64(Nanosecond) => {
-            downcast_take!(Time64NanosecondType, values, indices)
-        }
-        DataType::Timestamp(Second, _) => {
-            downcast_take!(TimestampSecondType, values, indices)
-        }
-        DataType::Timestamp(Millisecond, _) => {
-            downcast_take!(TimestampMillisecondType, values, indices)
-        }
-        DataType::Timestamp(Microsecond, _) => {
-            downcast_take!(TimestampMicrosecondType, values, indices)
-        }
-        DataType::Timestamp(Nanosecond, _) => {
-            downcast_take!(TimestampNanosecondType, values, indices)
-        }
-        DataType::Interval(IntervalUnit::YearMonth) => {
-            downcast_take!(IntervalYearMonthType, values, indices)
-        }
-        DataType::Interval(IntervalUnit::DayTime) => {
-            downcast_take!(IntervalDayTimeType, values, indices)
-        }
-        DataType::Interval(IntervalUnit::MonthDayNano) => {
-            downcast_take!(IntervalMonthDayNanoType, values, indices)
-        }
-        DataType::Duration(TimeUnit::Second) => {
-            downcast_take!(DurationSecondType, values, indices)
-        }
-        DataType::Duration(TimeUnit::Millisecond) => {
-            downcast_take!(DurationMillisecondType, values, indices)
-        }
-        DataType::Duration(TimeUnit::Microsecond) => {
-            downcast_take!(DurationMicrosecondType, values, indices)
-        }
-        DataType::Duration(TimeUnit::Nanosecond) => {
-            downcast_take!(DurationNanosecondType, values, indices)
-        }
         DataType::Utf8 => {
             let values = values
                 .as_any()
@@ -271,17 +199,10 @@ where
 
             Ok(Arc::new(StructArray::from((fields, is_valid))) as ArrayRef)
         }
-        DataType::Dictionary(key_type, _) => match key_type.as_ref() {
-            DataType::Int8 => downcast_dict_take!(Int8Type, values, indices),
-            DataType::Int16 => downcast_dict_take!(Int16Type, values, indices),
-            DataType::Int32 => downcast_dict_take!(Int32Type, values, indices),
-            DataType::Int64 => downcast_dict_take!(Int64Type, values, indices),
-            DataType::UInt8 => downcast_dict_take!(UInt8Type, values, indices),
-            DataType::UInt16 => downcast_dict_take!(UInt16Type, values, 
indices),
-            DataType::UInt32 => downcast_dict_take!(UInt32Type, values, 
indices),
-            DataType::UInt64 => downcast_dict_take!(UInt64Type, values, 
indices),
-            t => unimplemented!("Take not supported for dictionary key type 
{:?}", t),
-        },
+        DataType::Dictionary(_, _) => downcast_dictionary_array! {
+            values => Ok(Arc::new(take_dict(values, indices)?)),
+            t => unimplemented!("Take not supported for dictionary type {:?}", 
t)
+        }
         DataType::Binary => {
             let values = values
                 .as_any()
@@ -314,7 +235,7 @@ where
                 Ok(new_null_array(&DataType::Null, indices.len()))
             }
         }
-        t => unimplemented!("Take not supported for data type {:?}", t),
+        t => unimplemented!("Take not supported for data type {:?}", t)
     }
 }
 

Reply via email to