From a71b592ec524f97feda8947853092688cf1ffb63 Mon Sep 17 00:00:00 2001 From: cancaicai <2356672992@qq.com> Date: Sat, 14 Feb 2026 22:57:18 +0800 Subject: [PATCH] perf(layout): add empty-range fast paths in chunked reader Signed-off-by: cancaicai <2356672992@qq.com> --- vortex-layout/src/layouts/chunked/reader.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/vortex-layout/src/layouts/chunked/reader.rs b/vortex-layout/src/layouts/chunked/reader.rs index e4d26c7e808..9c23738d54c 100644 --- a/vortex-layout/src/layouts/chunked/reader.rs +++ b/vortex-layout/src/layouts/chunked/reader.rs @@ -166,6 +166,10 @@ impl LayoutReader for ChunkedReader { row_range: &Range, splits: &mut BTreeSet, ) -> VortexResult<()> { + if row_range.is_empty() { + return Ok(()); + } + for (index, (&start, &end)) in self .chunk_offsets .iter() @@ -201,6 +205,10 @@ impl LayoutReader for ChunkedReader { expr: &Expression, mask: Mask, ) -> VortexResult { + if row_range.is_empty() { + return Ok(MaskFuture::ready(mask)); + } + let mut chunk_evals = vec![]; for (chunk_idx, chunk_range, mask_range) in self.ranges(row_range) { @@ -243,6 +251,10 @@ impl LayoutReader for ChunkedReader { expr: &Expression, mask: MaskFuture, ) -> VortexResult { + if row_range.is_empty() { + return Ok(mask); + } + let mut chunk_evals = vec![]; for (chunk_idx, chunk_range, mask_range) in self.ranges(row_range) { @@ -279,6 +291,10 @@ impl LayoutReader for ChunkedReader { mask: MaskFuture, ) -> VortexResult>> { let dtype = expr.return_dtype(self.dtype())?; + if row_range.is_empty() { + return Ok(async move { Ok(ChunkedArray::try_new(vec![], dtype)?.to_array()) }.boxed()); + } + let mut chunk_evals = vec![]; for (chunk_idx, chunk_range, mask_range) in self.ranges(row_range) {