From abc62576b9386e730174f598260ed0aa5b43a1c0 Mon Sep 17 00:00:00 2001 From: Ritchie Vink Date: Sat, 8 Jan 2022 21:54:43 +0100 Subject: [PATCH] Parquet: add as_any and null_count to dyn Statistics (#743) --- src/io/parquet/read/statistics/binary.rs | 17 +++++++++++++++++ src/io/parquet/read/statistics/boolean.rs | 9 +++++++++ src/io/parquet/read/statistics/fixlen.rs | 9 +++++++++ src/io/parquet/read/statistics/mod.rs | 7 +++++++ src/io/parquet/read/statistics/primitive.rs | 9 +++++++++ 5 files changed, 51 insertions(+) diff --git a/src/io/parquet/read/statistics/binary.rs b/src/io/parquet/read/statistics/binary.rs index db0e40276ab..e8f272cc24a 100644 --- a/src/io/parquet/read/statistics/binary.rs +++ b/src/io/parquet/read/statistics/binary.rs @@ -1,3 +1,4 @@ +use std::any::Any; use std::convert::TryFrom; use crate::datatypes::DataType; @@ -20,6 +21,14 @@ impl Statistics for BinaryStatistics { fn data_type(&self) -> &DataType { &DataType::Binary } + + fn as_any(&self) -> &dyn Any { + self + } + + fn null_count(&self) -> Option { + self.null_count + } } impl From<&ParquetByteArrayStatistics> for BinaryStatistics { @@ -45,6 +54,14 @@ impl Statistics for Utf8Statistics { fn data_type(&self) -> &DataType { &DataType::Utf8 } + + fn as_any(&self) -> &dyn Any { + self + } + + fn null_count(&self) -> Option { + self.null_count + } } impl TryFrom<&ParquetByteArrayStatistics> for Utf8Statistics { diff --git a/src/io/parquet/read/statistics/boolean.rs b/src/io/parquet/read/statistics/boolean.rs index 946591c8c4a..4817dbde3b3 100644 --- a/src/io/parquet/read/statistics/boolean.rs +++ b/src/io/parquet/read/statistics/boolean.rs @@ -1,5 +1,6 @@ use crate::datatypes::DataType; use parquet2::statistics::BooleanStatistics as ParquetBooleanStatistics; +use std::any::Any; use super::Statistics; @@ -15,6 +16,14 @@ impl Statistics for BooleanStatistics { fn data_type(&self) -> &DataType { &DataType::Boolean } + + fn as_any(&self) -> &dyn Any { + self + } + + fn null_count(&self) -> Option { + self.null_count + } } impl From<&ParquetBooleanStatistics> for BooleanStatistics { diff --git a/src/io/parquet/read/statistics/fixlen.rs b/src/io/parquet/read/statistics/fixlen.rs index 6bd3e960021..867c7e84e09 100644 --- a/src/io/parquet/read/statistics/fixlen.rs +++ b/src/io/parquet/read/statistics/fixlen.rs @@ -1,3 +1,4 @@ +use std::any::Any; use std::convert::{TryFrom, TryInto}; use super::super::schema; @@ -27,6 +28,14 @@ impl Statistics for FixedLenStatistics { fn data_type(&self) -> &DataType { &self.data_type } + + fn as_any(&self) -> &dyn Any { + self + } + + fn null_count(&self) -> Option { + self.null_count + } } impl From<&ParquetFixedLenStatistics> for FixedLenStatistics { diff --git a/src/io/parquet/read/statistics/mod.rs b/src/io/parquet/read/statistics/mod.rs index 2b3d97a17f3..0e720097443 100644 --- a/src/io/parquet/read/statistics/mod.rs +++ b/src/io/parquet/read/statistics/mod.rs @@ -4,6 +4,7 @@ use crate::error::ArrowError; use parquet2::schema::types::PhysicalType; use parquet2::statistics::PrimitiveStatistics as ParquetPrimitiveStatistics; use parquet2::statistics::Statistics as ParquetStatistics; +use std::any::Any; use crate::error::Result; @@ -20,6 +21,12 @@ pub use fixlen::*; pub trait Statistics: std::fmt::Debug { /// returns the [`DataType`] of the statistics. fn data_type(&self) -> &DataType; + + /// Returns `dyn Any` can used to downcast to a physical type. + fn as_any(&self) -> &dyn Any; + + /// Return the null count statistic + fn null_count(&self) -> Option; } impl PartialEq for &dyn Statistics { diff --git a/src/io/parquet/read/statistics/primitive.rs b/src/io/parquet/read/statistics/primitive.rs index f807754ea0d..14c90901bc1 100644 --- a/src/io/parquet/read/statistics/primitive.rs +++ b/src/io/parquet/read/statistics/primitive.rs @@ -2,6 +2,7 @@ use crate::{datatypes::DataType, types::NativeType}; use parquet2::schema::types::ParquetType; use parquet2::statistics::PrimitiveStatistics as ParquetPrimitiveStatistics; use parquet2::types::NativeType as ParquetNativeType; +use std::any::Any; use super::super::schema; use super::Statistics; @@ -20,6 +21,14 @@ impl Statistics for PrimitiveStatistics { fn data_type(&self) -> &DataType { &self.data_type } + + fn as_any(&self) -> &dyn Any { + self + } + + fn null_count(&self) -> Option { + self.null_count + } } impl From<(&ParquetPrimitiveStatistics, DataType)> for PrimitiveStatistics