Skip to content

Commit 49fb110

Browse files
authored
Scaffolding for layout stats (#1885)
1 parent b706f21 commit 49fb110

File tree

18 files changed

+185
-145
lines changed

18 files changed

+185
-145
lines changed

vortex-file/src/v2/file.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use vortex_array::ContextRef;
1010
use vortex_dtype::DType;
1111
use vortex_error::VortexResult;
1212
use vortex_io::VortexReadAt;
13-
use vortex_layout::{LayoutData, LayoutReader};
13+
use vortex_layout::{ExprEvaluator, LayoutData, LayoutReader};
1414
use vortex_scan::Scan;
1515

1616
use crate::v2::segments::cache::SegmentCache;
@@ -56,7 +56,7 @@ impl<R: VortexReadAt + Unpin> VortexFile<R> {
5656

5757
let eval = scan
5858
.range_scan(row_range)?
59-
.evaluate_async(reader.evaluator());
59+
.evaluate_async(|row_mask, expr| reader.evaluate_expr(row_mask, expr));
6060
pin_mut!(eval);
6161

6262
poll_fn(|cx| {

vortex-layout/src/layouts/chunked/evaluator.rs renamed to vortex-layout/src/layouts/chunked/eval_expr.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,19 @@ use vortex_error::VortexResult;
77
use vortex_expr::pruning::PruningPredicate;
88
use vortex_expr::ExprRef;
99
use vortex_scalar::Scalar;
10-
use vortex_scan::{AsyncEvaluator, RowMask};
10+
use vortex_scan::RowMask;
1111

1212
use crate::layouts::chunked::reader::ChunkedReader;
1313
use crate::reader::LayoutScanExt;
14+
use crate::ExprEvaluator;
1415

1516
#[async_trait(?Send)]
16-
impl AsyncEvaluator for ChunkedReader {
17-
async fn evaluate(self: &Self, row_mask: RowMask, expr: ExprRef) -> VortexResult<ArrayData> {
17+
impl ExprEvaluator for ChunkedReader {
18+
async fn evaluate_expr(
19+
self: &Self,
20+
row_mask: RowMask,
21+
expr: ExprRef,
22+
) -> VortexResult<ArrayData> {
1823
// Compute the result dtype of the expression.
1924
let dtype = expr
2025
.evaluate(&Canonical::empty(self.dtype())?.into_array())?
@@ -74,7 +79,7 @@ impl AsyncEvaluator for ChunkedReader {
7479
.shift(chunk_range.start)?;
7580

7681
let expr = expr.clone();
77-
chunks.push(chunk_reader.evaluate(chunk_mask, expr).boxed_local());
82+
chunks.push(chunk_reader.evaluate_expr(chunk_mask, expr).boxed_local());
7883
}
7984

8085
// Wait for all chunks to be evaluated
@@ -130,7 +135,7 @@ mod test {
130135
let result = layout
131136
.reader(segments, Default::default())
132137
.unwrap()
133-
.evaluate(
138+
.evaluate_expr(
134139
RowMask::new_valid_between(0, layout.row_count()),
135140
Identity::new_expr(),
136141
)
@@ -155,7 +160,7 @@ mod test {
155160
let expr = gt(Identity::new_expr(), lit(7));
156161

157162
let result = reader
158-
.evaluate(RowMask::new_valid_between(0, row_count), expr.clone())
163+
.evaluate_expr(RowMask::new_valid_between(0, row_count), expr.clone())
159164
.await
160165
.unwrap();
161166
let result = ChunkedArray::try_from(result).unwrap();
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use async_trait::async_trait;
2+
use vortex_array::stats::{Stat, StatsSet};
3+
use vortex_dtype::FieldPath;
4+
use vortex_error::VortexResult;
5+
6+
use crate::layouts::chunked::reader::ChunkedReader;
7+
use crate::StatsEvaluator;
8+
9+
#[async_trait(?Send)]
10+
impl StatsEvaluator for ChunkedReader {
11+
async fn evaluate_stats(
12+
&self,
13+
field_paths: &[FieldPath],
14+
_stats: &[Stat],
15+
) -> VortexResult<Vec<StatsSet>> {
16+
Ok(vec![StatsSet::default(); field_paths.len()])
17+
}
18+
}

vortex-layout/src/layouts/chunked/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
mod evaluator;
1+
mod eval_expr;
2+
mod eval_stats;
23
mod reader;
3-
// mod stats;
44
pub mod stats_table;
55
pub mod writer;
66

vortex-layout/src/layouts/chunked/reader.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ use vortex_array::stats::{stats_from_bitset_bytes, Stat};
55
use vortex_array::ContextRef;
66
use vortex_error::{vortex_panic, VortexResult};
77
use vortex_expr::Identity;
8-
use vortex_scan::{AsyncEvaluator, RowMask};
8+
use vortex_scan::RowMask;
99

1010
use crate::layouts::chunked::stats_table::StatsTable;
1111
use crate::layouts::chunked::ChunkedLayout;
1212
use crate::reader::LayoutReader;
1313
use crate::segments::AsyncSegmentReader;
14-
use crate::{LayoutData, LayoutEncoding};
14+
use crate::{ExprEvaluator, LayoutData, LayoutEncoding};
1515

1616
#[derive(Clone)]
1717
pub struct ChunkedReader {
@@ -83,7 +83,7 @@ impl ChunkedReader {
8383

8484
let stats_array = stats_layout
8585
.reader(self.segments.clone(), self.ctx.clone())?
86-
.evaluate(
86+
.evaluate_expr(
8787
RowMask::new_valid_between(0, nchunks as u64),
8888
Identity::new_expr(),
8989
)
@@ -119,8 +119,4 @@ impl LayoutReader for ChunkedReader {
119119
fn layout(&self) -> &LayoutData {
120120
&self.layout
121121
}
122-
123-
fn evaluator(&self) -> &dyn AsyncEvaluator {
124-
self
125-
}
126122
}

vortex-layout/src/layouts/chunked/stats.rs

Lines changed: 0 additions & 40 deletions
This file was deleted.

vortex-layout/src/layouts/flat/evaluator.rs renamed to vortex-layout/src/layouts/flat/eval_expr.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,19 @@ use vortex_array::ArrayData;
77
use vortex_error::{vortex_err, VortexExpect, VortexResult};
88
use vortex_expr::ExprRef;
99
use vortex_flatbuffers::{array as fba, FlatBuffer};
10-
use vortex_scan::{AsyncEvaluator, RowMask};
10+
use vortex_scan::RowMask;
1111

1212
use crate::layouts::flat::reader::FlatReader;
1313
use crate::reader::LayoutScanExt;
14-
use crate::LayoutReader;
14+
use crate::{ExprEvaluator, LayoutReader};
1515

1616
#[async_trait(?Send)]
17-
impl AsyncEvaluator for FlatReader {
18-
async fn evaluate(self: &Self, row_mask: RowMask, expr: ExprRef) -> VortexResult<ArrayData> {
17+
impl ExprEvaluator for FlatReader {
18+
async fn evaluate_expr(
19+
self: &Self,
20+
row_mask: RowMask,
21+
expr: ExprRef,
22+
) -> VortexResult<ArrayData> {
1923
// Fetch all the array buffers.
2024
let mut buffers = try_join_all(
2125
self.layout()
@@ -80,7 +84,7 @@ mod test {
8084
let result = layout
8185
.reader(Arc::new(segments), Default::default())
8286
.unwrap()
83-
.evaluate(
87+
.evaluate_expr(
8488
RowMask::new_valid_between(0, layout.row_count()),
8589
Identity::new_expr(),
8690
)
@@ -106,7 +110,7 @@ mod test {
106110
let result = layout
107111
.reader(Arc::new(segments), Default::default())
108112
.unwrap()
109-
.evaluate(RowMask::new_valid_between(0, layout.row_count()), expr)
113+
.evaluate_expr(RowMask::new_valid_between(0, layout.row_count()), expr)
110114
.await
111115
.unwrap()
112116
.into_bool()
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use async_trait::async_trait;
2+
use vortex_array::stats::{Stat, StatsSet};
3+
use vortex_dtype::FieldPath;
4+
use vortex_error::VortexResult;
5+
6+
use crate::layouts::flat::reader::FlatReader;
7+
use crate::StatsEvaluator;
8+
9+
#[async_trait(?Send)]
10+
impl StatsEvaluator for FlatReader {
11+
async fn evaluate_stats(
12+
&self,
13+
field_paths: &[FieldPath],
14+
_stats: &[Stat],
15+
) -> VortexResult<Vec<StatsSet>> {
16+
Ok(vec![StatsSet::default(); field_paths.len()])
17+
}
18+
}

vortex-layout/src/layouts/flat/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
mod evaluator;
1+
mod eval_expr;
22
mod reader;
33
// mod stats;
4+
mod eval_stats;
45
pub mod writer;
56

67
use std::collections::BTreeSet;

vortex-layout/src/layouts/flat/reader.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use std::sync::Arc;
22

33
use vortex_array::ContextRef;
44
use vortex_error::{vortex_panic, VortexResult};
5-
use vortex_scan::AsyncEvaluator;
65

76
use crate::layouts::flat::FlatLayout;
87
use crate::reader::LayoutReader;
@@ -45,8 +44,4 @@ impl LayoutReader for FlatReader {
4544
fn layout(&self) -> &LayoutData {
4645
&self.layout
4746
}
48-
49-
fn evaluator(&self) -> &dyn AsyncEvaluator {
50-
self
51-
}
5247
}

0 commit comments

Comments
 (0)