vortex_layout/layouts/stats/
mod.rs

1mod eval_expr;
2mod reader;
3pub mod stats_table;
4pub mod writer;
5
6use std::collections::BTreeSet;
7use std::sync::Arc;
8
9use vortex_array::ArrayContext;
10use vortex_dtype::FieldMask;
11use vortex_error::VortexResult;
12
13use crate::data::Layout;
14use crate::layouts::stats::reader::StatsReader;
15use crate::reader::{LayoutReader, LayoutReaderExt};
16use crate::segments::{AsyncSegmentReader, RequiredSegmentKind, SegmentCollector};
17use crate::vtable::LayoutVTable;
18use crate::{LayoutId, STATS_LAYOUT_ID};
19
20#[derive(Default, Debug)]
21pub struct StatsLayout;
22
23/// First child contains the data, second child contains the statistics table.
24impl LayoutVTable for StatsLayout {
25    fn id(&self) -> LayoutId {
26        STATS_LAYOUT_ID
27    }
28
29    fn reader(
30        &self,
31        layout: Layout,
32        ctx: ArrayContext,
33        segment_reader: Arc<dyn AsyncSegmentReader>,
34    ) -> VortexResult<Arc<dyn LayoutReader>> {
35        Ok(StatsReader::try_new(layout, ctx, segment_reader)?.into_arc())
36    }
37
38    fn register_splits(
39        &self,
40        layout: &Layout,
41        field_mask: &[FieldMask],
42        row_offset: u64,
43        splits: &mut BTreeSet<u64>,
44    ) -> VortexResult<()> {
45        layout
46            .child(0, layout.dtype().clone(), "data")?
47            .register_splits(field_mask, row_offset, splits)
48    }
49
50    fn required_segments(
51        &self,
52        layout: &Layout,
53        row_offset: u64,
54        filter_field_mask: &[FieldMask],
55        projection_field_mask: &[FieldMask],
56        segments_collector: &mut SegmentCollector,
57    ) -> VortexResult<()> {
58        if !filter_field_mask.is_empty() {
59            layout
60                .child(1, layout.dtype().clone(), "stats_table")?
61                .required_segments(
62                    row_offset,
63                    filter_field_mask,
64                    projection_field_mask,
65                    &mut segments_collector.with_priority_hint(RequiredSegmentKind::Pruning),
66                )?;
67        }
68        layout
69            .child(0, layout.dtype().clone(), "data")?
70            .required_segments(
71                row_offset,
72                filter_field_mask,
73                projection_field_mask,
74                segments_collector,
75            )
76    }
77}