vortex_array/expr/stats/
provider.rs1use vortex_error::VortexError;
5use vortex_error::vortex_panic;
6
7use super::StatType;
8use crate::expr::stats::Precision;
9use crate::expr::stats::Stat;
10use crate::scalar::Scalar;
11
12pub trait StatsProvider {
13 fn get(&self, stat: Stat) -> Precision<Scalar>;
14
15 fn len(&self) -> usize;
17
18 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).bound::<S>()
29 }
30
31 fn get_as<T: for<'a> TryFrom<&'a Scalar, Error = VortexError>>(
32 &self,
33 stat: Stat,
34 ) -> Precision<T> {
35 self.get(stat).map(|v| {
36 T::try_from(&v).unwrap_or_else(|err| {
37 vortex_panic!(
38 err,
39 "Failed to get stat {} as {}",
40 stat,
41 std::any::type_name::<T>()
42 )
43 })
44 })
45 }
46
47 fn get_as_bound<S, U>(&self) -> Option<S::Bound>
48 where
49 S: StatType<U>,
50 U: for<'a> TryFrom<&'a Scalar, Error = VortexError>,
51 {
52 self.get_as::<U>(S::STAT).bound::<S>()
53 }
54}