vortex_array/stats/
traits.rs1use vortex_dtype::DType;
2use vortex_error::{VortexError, 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 fn len(&self) -> usize;
12
13 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 self.get(stat).map(|v| v.into_scalar(dtype.clone()))
24 }
25
26 fn get_scalar_bound<S: StatType<Scalar>>(&self, dtype: &DType) -> Option<S::Bound> {
27 self.get_scalar(S::STAT, dtype).map(|v| v.bound::<S>())
28 }
29
30 fn get_as<T: for<'a> TryFrom<&'a ScalarValue, Error = VortexError>>(
31 &self,
32 stat: Stat,
33 ) -> Option<Precision<T>> {
34 self.get(stat).map(|v| {
35 v.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
48 fn get_as_bound<S, U>(&self) -> Option<S::Bound>
49 where
50 S: StatType<U>,
51 U: for<'a> TryFrom<&'a ScalarValue, Error = VortexError>,
52 {
53 self.get_as::<U>(S::STAT).map(|v| v.bound::<S>())
54 }
55}