vortex_array/stats/
traits.rs

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