vortex_layout/layouts/chunked/
mod.rs

1mod eval_expr;
2mod reader;
3pub mod writer;
4
5use std::collections::BTreeSet;
6use std::sync::Arc;
7
8use vortex_array::ArrayContext;
9use vortex_dtype::FieldMask;
10use vortex_error::VortexResult;
11
12use crate::data::Layout;
13use crate::layouts::chunked::reader::ChunkedReader;
14use crate::reader::{LayoutReader, LayoutReaderExt};
15use crate::segments::SegmentSource;
16use crate::vtable::LayoutVTable;
17use crate::{CHUNKED_LAYOUT_ID, LayoutId};
18
19#[derive(Default, Debug)]
20pub struct ChunkedLayout;
21
22/// In-memory representation of Chunked layout.
23impl LayoutVTable for ChunkedLayout {
24    fn id(&self) -> LayoutId {
25        CHUNKED_LAYOUT_ID
26    }
27
28    fn reader(
29        &self,
30        layout: Layout,
31        segment_source: &Arc<dyn SegmentSource>,
32        ctx: &ArrayContext,
33    ) -> VortexResult<Arc<dyn LayoutReader>> {
34        Ok(ChunkedReader::try_new(layout, segment_source.clone(), ctx.clone())?.into_arc())
35    }
36
37    fn register_splits(
38        &self,
39        layout: &Layout,
40        field_mask: &[FieldMask],
41        row_offset: u64,
42        splits: &mut BTreeSet<u64>,
43    ) -> VortexResult<()> {
44        let mut offset = row_offset;
45        for i in 0..layout.nchildren() {
46            let child = layout.child(i, layout.dtype().clone(), format!("[{}]", i))?;
47            child.register_splits(field_mask, offset, splits)?;
48            offset += child.row_count();
49            splits.insert(offset);
50        }
51        Ok(())
52    }
53}