Skip to content

Commit f7a9031

Browse files
committed
update
Signed-off-by: Joe Isaacs <[email protected]>
1 parent e5a0227 commit f7a9031

File tree

6 files changed

+35
-33
lines changed

6 files changed

+35
-33
lines changed

vortex-array/src/expr/transform/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@ pub use optimizer::*;
1616
pub use partition::*;
1717
pub use replace::*;
1818
pub use rules::*;
19-
pub use simplify::*;
20-
pub use simplify_typed::*;
19+
pub(crate) use simplify::*;
20+
pub(crate) use simplify_typed::*;

vortex-array/src/expr/transform/optimizer.rs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,29 @@ use crate::expr::session::ExprSession;
99
use crate::expr::transform::{simplify, simplify_typed};
1010

1111
/// A unified optimizer for expressions that can work with or without type information.
12-
pub struct ExprOptimizer {
13-
session: ExprSession,
14-
dtype: Option<DType>,
12+
pub struct ExprOptimizer<'a> {
13+
session: &'a ExprSession,
1514
}
1615

17-
impl ExprOptimizer {
16+
impl<'a> ExprOptimizer<'a> {
1817
/// Create a new untyped optimizer.
1918
///
2019
/// This optimizer will use untyped simplification rules only.
21-
pub fn new(session: ExprSession) -> Self {
22-
Self {
23-
session,
24-
dtype: None,
25-
}
20+
pub fn new(session: &'a ExprSession) -> Self {
21+
Self { session }
2622
}
2723

2824
/// Optimize the given expression.
2925
///
3026
/// If this optimizer was created with a dtype, this will perform typed optimization.
3127
/// Otherwise, it will perform untyped optimization.
3228
pub fn optimize(&self, expr: Expression) -> VortexResult<Expression> {
33-
simplify(expr, &self.session)
29+
simplify(expr, self.session)
3430
}
3531

3632
/// Apply optimize rules to the expression, with a known dtype. This will also apply rules
3733
/// in `optimize`.
3834
pub fn optimize_typed(&self, expr: Expression, dtype: &DType) -> VortexResult<Expression> {
39-
simplify_typed(expr, dtype, &self.session)
35+
simplify_typed(expr, dtype, self.session)
4036
}
4137
}

vortex-array/src/expr/transform/partition.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,8 @@ mod tests {
234234
#[rstest]
235235
fn test_expr_top_level_ref(dtype: DType) {
236236
let fields = dtype.as_struct_fields_opt().unwrap();
237-
let optimizer = ExprOptimizer::new(ExprSession::default());
237+
let session = ExprSession::default();
238+
let optimizer = ExprOptimizer::new(&session);
238239

239240
let expr = root();
240241
let partitioned = partition(
@@ -260,7 +261,8 @@ mod tests {
260261
#[rstest]
261262
fn test_expr_top_level_ref_get_item_and_split(dtype: DType) {
262263
let fields = dtype.as_struct_fields_opt().unwrap();
263-
let optimizer = ExprOptimizer::new(ExprSession::default());
264+
let session = ExprSession::default();
265+
let optimizer = ExprOptimizer::new(&session);
264266

265267
let expr = get_item("y", get_item("a", root()));
266268

@@ -272,7 +274,8 @@ mod tests {
272274
#[rstest]
273275
fn test_expr_top_level_ref_get_item_and_split_pack(dtype: DType) {
274276
let fields = dtype.as_struct_fields_opt().unwrap();
275-
let optimizer = ExprOptimizer::new(ExprSession::default());
277+
let session = ExprSession::default();
278+
let optimizer = ExprOptimizer::new(&session);
276279

277280
let expr = pack(
278281
[
@@ -301,7 +304,8 @@ mod tests {
301304
#[rstest]
302305
fn test_expr_top_level_ref_get_item_add(dtype: DType) {
303306
let fields = dtype.as_struct_fields_opt().unwrap();
304-
let optimizer = ExprOptimizer::new(ExprSession::default());
307+
let session = ExprSession::default();
308+
let optimizer = ExprOptimizer::new(&session);
305309

306310
let expr = and(get_item("y", get_item("a", root())), lit(1));
307311
let partitioned =
@@ -314,7 +318,8 @@ mod tests {
314318
#[rstest]
315319
fn test_expr_top_level_ref_get_item_add_cannot_split(dtype: DType) {
316320
let fields = dtype.as_struct_fields_opt().unwrap();
317-
let optimizer = ExprOptimizer::new(ExprSession::default());
321+
let session = ExprSession::default();
322+
let optimizer = ExprOptimizer::new(&session);
318323

319324
let expr = and(get_item("y", get_item("a", root())), get_item("b", root()));
320325
let partitioned =
@@ -328,7 +333,8 @@ mod tests {
328333
#[rstest]
329334
fn test_expr_partition_many_occurrences_of_field(dtype: DType) {
330335
let fields = dtype.as_struct_fields_opt().unwrap();
331-
let optimizer = ExprOptimizer::new(ExprSession::default());
336+
let session = ExprSession::default();
337+
let optimizer = ExprOptimizer::new(&session);
332338

333339
let expr = and(
334340
get_item("y", get_item("a", root())),
@@ -370,7 +376,8 @@ mod tests {
370376
#[rstest]
371377
fn test_expr_merge(dtype: DType) {
372378
let fields = dtype.as_struct_fields_opt().unwrap();
373-
let optimizer = ExprOptimizer::new(ExprSession::default());
379+
let session = ExprSession::default();
380+
let optimizer = ExprOptimizer::new(&session);
374381

375382
let expr = merge([col("a"), pack([("b", col("b"))], NonNullable)]);
376383

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use futures::FutureExt;
1414
use futures::future::BoxFuture;
1515
use vortex_array::compute::filter;
1616
use vortex_array::expr::session::ExprSessionExt;
17-
use vortex_array::expr::transform::{PartitionedExpr, partition, replace};
17+
use vortex_array::expr::transform::{ExprOptimizer, PartitionedExpr, partition, replace};
1818
use vortex_array::expr::{ExactExpr, Expression, is_root, root};
1919
use vortex_array::{ArrayRef, IntoArray, MaskFuture};
2020
use vortex_dtype::{DType, FieldMask, FieldName, Nullability, PType};
@@ -32,8 +32,8 @@ pub struct RowIdxLayoutReader {
3232
name: Arc<str>,
3333
row_offset: u64,
3434
child: Arc<dyn LayoutReader>,
35-
session: VortexSession,
3635
partition_cache: DashMap<ExactExpr, Partitioning>,
36+
session: VortexSession,
3737
}
3838

3939
impl RowIdxLayoutReader {
@@ -64,7 +64,7 @@ impl RowIdxLayoutReader {
6464
vec![]
6565
}
6666
},
67-
&self.session.expressions(),
67+
&ExprOptimizer::new(&self.session.expressions()),
6868
)
6969
.vortex_expect("We should not fail to partition expression over struct fields");
7070

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,14 @@ pub struct StructReader {
3333
name: Arc<str>,
3434
lazy_children: LazyReaderChildren,
3535

36-
session: VortexSession,
37-
3836
/// A `pack` expression that holds each individual field of the root DType. This expansion
3937
/// ensures we can correctly partition expressions over the fields of the struct.
4038
expanded_root_expr: Expression,
4139

4240
field_lookup: Option<HashMap<FieldName, usize>>,
4341
partitioned_expr_cache: DashMap<ExactExpr, Partitioned>,
4442

45-
optimizer: ExprOptimizer,
43+
session: VortexSession,
4644
}
4745

4846
impl StructReader {
@@ -92,12 +90,11 @@ impl StructReader {
9290
Ok(Self {
9391
layout,
9492
name,
95-
session,
9693
expanded_root_expr,
9794
lazy_children,
9895
field_lookup,
9996
partitioned_expr_cache: Default::default(),
100-
optimizer: ExprOptimizer::new(*session.expressions()),
97+
session,
10198
})
10299
}
103100

@@ -144,8 +141,9 @@ impl StructReader {
144141
// First, we expand the root scope into the fields of the struct to ensure
145142
// that partitioning works correctly.
146143
let expr = replace(expr.clone(), &root(), self.expanded_root_expr.clone());
147-
let expr = self
148-
.optimizer
144+
let exprs = self.session.expressions();
145+
let opt = ExprOptimizer::new(&exprs);
146+
let expr = opt
149147
.optimize_typed(expr, self.dtype())
150148
.vortex_expect("We should not fail to simplify expression over struct fields");
151149

@@ -158,7 +156,7 @@ impl StructReader {
158156
.as_struct_fields_opt()
159157
.vortex_expect("We know it's a struct DType"),
160158
),
161-
&self.session.expressions(),
159+
&opt,
162160
)
163161
.vortex_expect("We should not fail to partition expression over struct fields");
164162

vortex-scan/src/scan_builder.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,11 @@ impl<A: 'static + Send> ScanBuilder<A> {
216216
&self.session,
217217
));
218218

219-
let optimizer = ExprOptimizer::new(*self.session.expressions());
219+
let exprs = self.session.expressions();
220+
let optimizer = ExprOptimizer::new(&exprs);
220221

221222
// Normalize and simplify the expressions.
222-
let projection = optimizer.optimize_typed(self.projection, layout_reader.as_ref())?;
223+
let projection = optimizer.optimize_typed(self.projection, layout_reader.dtype())?;
223224

224225
let filter = self
225226
.filter

0 commit comments

Comments
 (0)