vortex_array/stats/
traits.rs

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