vortex_array/expr/stats/
provider.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_error::VortexError;
5use vortex_error::vortex_panic;
6use vortex_scalar::Scalar;
7
8use super::StatType;
9use crate::expr::stats::Precision;
10use crate::expr::stats::Stat;
11
12pub trait StatsProvider {
13    fn get(&self, stat: Stat) -> Option<Precision<Scalar>>;
14
15    /// Count of stored stats with known values.
16    fn len(&self) -> usize;
17
18    /// Predicate equivalent to a [len][Self::len] of zero.
19    fn is_empty(&self) -> bool {
20        self.len() == 0
21    }
22}
23
24impl<S> StatsProviderExt for S where S: StatsProvider {}
25
26pub trait StatsProviderExt: StatsProvider {
27    fn get_scalar_bound<S: StatType<Scalar>>(&self) -> Option<S::Bound> {
28        self.get(S::STAT).map(|v| v.bound::<S>())
29    }
30
31    fn get_as<T: for<'a> TryFrom<&'a Scalar, Error = VortexError>>(
32        &self,
33        stat: Stat,
34    ) -> Option<Precision<T>> {
35        self.get(stat).map(|v| {
36            v.map(|v| {
37                T::try_from(&v).unwrap_or_else(|err| {
38                    vortex_panic!(
39                        err,
40                        "Failed to get stat {} as {}",
41                        stat,
42                        std::any::type_name::<T>()
43                    )
44                })
45            })
46        })
47    }
48
49    fn get_as_bound<S, U>(&self) -> Option<S::Bound>
50    where
51        S: StatType<U>,
52        U: for<'a> TryFrom<&'a Scalar, Error = VortexError>,
53    {
54        self.get_as::<U>(S::STAT).map(|v| v.bound::<S>())
55    }
56}