vortex_layout/layouts/chunked/
mod.rs1mod 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::{AsyncSegmentReader, SegmentCollector};
16use crate::vtable::LayoutVTable;
17use crate::{CHUNKED_LAYOUT_ID, LayoutId};
18
19#[derive(Default, Debug)]
20pub struct ChunkedLayout;
21
22impl LayoutVTable for ChunkedLayout {
24 fn id(&self) -> LayoutId {
25 CHUNKED_LAYOUT_ID
26 }
27
28 fn reader(
29 &self,
30 layout: Layout,
31 ctx: ArrayContext,
32 segment_reader: Arc<dyn AsyncSegmentReader>,
33 ) -> VortexResult<Arc<dyn LayoutReader>> {
34 Ok(ChunkedReader::try_new(layout, ctx, segment_reader)?.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
54 fn required_segments(
55 &self,
56 layout: &Layout,
57 row_offset: u64,
58 filter_field_mask: &[FieldMask],
59 projection_field_mask: &[FieldMask],
60 segments: &mut SegmentCollector,
61 ) -> VortexResult<()> {
62 let mut offset = row_offset;
63 for i in 0..layout.nchildren() {
64 let child = layout.child(i, layout.dtype().clone(), format!("[{i}]"))?;
65 child.required_segments(offset, filter_field_mask, projection_field_mask, segments)?;
66 offset += child.row_count();
67 }
68 Ok(())
69 }
70}