1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
use vortex_array::stats::{ArrayStatistics, Stat, StatisticsVTable, StatsSet};
use vortex_error::VortexResult;

use crate::{DictArray, DictEncoding};

impl StatisticsVTable<DictArray> for DictEncoding {
    fn compute_statistics(&self, array: &DictArray, stat: Stat) -> VortexResult<StatsSet> {
        let mut stats = StatsSet::default();

        match stat {
            Stat::RunCount => {
                if let Some(rc) = array.codes().statistics().compute(Stat::RunCount) {
                    stats.set(Stat::RunCount, rc);
                }
            }
            Stat::Min => {
                if let Some(min) = array.values().statistics().compute(Stat::Min) {
                    stats.set(Stat::Min, min);
                }
            }
            Stat::Max => {
                if let Some(max) = array.values().statistics().compute(Stat::Max) {
                    stats.set(Stat::Max, max);
                }
            }
            Stat::IsConstant => {
                if let Some(is_constant) = array.codes().statistics().compute(Stat::IsConstant) {
                    stats.set(Stat::IsConstant, is_constant);
                }
            }
            Stat::NullCount => {
                if let Some(null_count) = array.codes().statistics().compute(Stat::NullCount) {
                    stats.set(Stat::NullCount, null_count);
                }
            }
            Stat::IsSorted | Stat::IsStrictSorted => {
                // if dictionary is sorted
                if array
                    .values()
                    .statistics()
                    .compute_is_sorted()
                    .unwrap_or(false)
                {
                    if let Some(codes_are_sorted) =
                        array.codes().statistics().compute(Stat::IsSorted)
                    {
                        stats.set(Stat::IsSorted, codes_are_sorted);
                    }

                    if let Some(codes_are_strict_sorted) =
                        array.codes().statistics().compute(Stat::IsStrictSorted)
                    {
                        stats.set(Stat::IsStrictSorted, codes_are_strict_sorted);
                    }
                }
            }
            _ => {}
        }

        Ok(stats)
    }
}