Skip to content

Commit 3bbc534

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

File tree

9 files changed

+308
-519
lines changed

9 files changed

+308
-519
lines changed

vortex-array/src/expr/exprs/get_item/transform.rs

Lines changed: 10 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -5,39 +5,23 @@ use vortex_error::VortexResult;
55

66
use crate::expr::exprs::get_item::GetItem;
77
use crate::expr::exprs::pack::Pack;
8-
use crate::expr::transform::rules::{ChildReduceRule, RewriteContext};
8+
use crate::expr::transform::ReduceRule;
9+
use crate::expr::transform::rules::RewriteContext;
910
use crate::expr::{Expression, ExpressionView};
1011

1112
/// Rewrite rule: `pack(l_1: e_1, ..., l_i: e_i, ..., l_n: e_n).get_item(l_i) = e_i`
1213
///
1314
/// Simplifies accessing a field from a pack expression by directly returning the field's
1415
/// expression instead of materializing the pack.
15-
///
16-
/// # Example
17-
/// ```
18-
/// # use vortex_array::expr::exprs::{get_item::get_item, literal::lit, pack::pack};
19-
/// # use vortex_dtype::Nullability::NonNullable;
20-
/// let e = get_item("b", pack([("a", lit(1)), ("b", lit(2))], NonNullable));
21-
/// // After applying PackGetItemRule, this becomes: lit(2)
22-
/// ```
2316
pub struct PackGetItemRule;
2417

25-
impl ChildReduceRule<GetItem, &dyn RewriteContext> for PackGetItemRule {
26-
fn reduce_child(
18+
impl ReduceRule<GetItem, &dyn RewriteContext> for PackGetItemRule {
19+
fn reduce(
2720
&self,
2821
get_item: &ExpressionView<GetItem>,
29-
child: &Expression,
30-
child_idx: usize,
3122
_ctx: &dyn RewriteContext,
3223
) -> VortexResult<Option<Expression>> {
33-
// Only consider the first child (child_idx == 0) of GetItem expressions
34-
if child_idx != 0 {
35-
return Ok(None);
36-
}
37-
38-
// Check if child is Pack
39-
if let Some(pack) = child.as_opt::<Pack>() {
40-
// Extract the field from the pack
24+
if let Some(pack) = get_item.child(0).as_opt::<Pack>() {
4125
let field_expr = pack.field(get_item.data())?;
4226
return Ok(Some(field_expr));
4327
}
@@ -52,31 +36,28 @@ mod tests {
5236
use vortex_dtype::{DType, PType};
5337

5438
use super::PackGetItemRule;
55-
use crate::expr::ExprId;
5639
use crate::expr::exprs::binary::checked_add;
5740
use crate::expr::exprs::get_item::{GetItem, get_item};
5841
use crate::expr::exprs::literal::lit;
5942
use crate::expr::exprs::pack::pack;
6043
use crate::expr::session::ExprSession;
61-
use crate::expr::transform::rules::{ChildReduceRule, SimpleRewriteContext};
62-
use crate::expr::transform::simplify_typed;
44+
use crate::expr::transform::rules::SimpleRewriteContext;
45+
use crate::expr::transform::{ReduceRule, simplify_typed};
6346

6447
#[test]
6548
fn test_pack_get_item_rule() {
6649
let rule = PackGetItemRule;
6750

6851
// Create: pack(a: lit(1), b: lit(2)).get_item("b")
6952
let pack_expr = pack([("a", lit(1)), ("b", lit(2))], NonNullable);
70-
let get_item_expr = get_item("b", pack_expr.clone());
53+
let get_item_expr = get_item("b", pack_expr);
7154

7255
// Create a dummy context
7356
let dtype = DType::Primitive(PType::I32, NonNullable);
7457
let ctx = SimpleRewriteContext { dtype: &dtype };
7558

7659
let get_item_view = get_item_expr.as_::<GetItem>();
77-
let result = rule
78-
.reduce_child(&get_item_view, &pack_expr, 0, &ctx)
79-
.unwrap();
60+
let result = rule.reduce(&get_item_view, &ctx).unwrap();
8061

8162
assert!(result.is_some());
8263
assert_eq!(&result.unwrap(), &lit(2));
@@ -94,39 +75,11 @@ mod tests {
9475
let ctx = SimpleRewriteContext { dtype: &dtype };
9576

9677
let get_item_view = get_item_expr.as_::<GetItem>();
97-
let result = rule
98-
.reduce_child(&get_item_view, &lit_expr, 0, &ctx)
99-
.unwrap();
78+
let result = rule.reduce(&get_item_view, &ctx).unwrap();
10079

10180
assert!(result.is_none());
10281
}
10382

104-
#[test]
105-
fn test_pack_get_item_rule_from_session() {
106-
let session = ExprSession::default();
107-
108-
let get_item_id = ExprId::new_ref("vortex.get_item");
109-
let rules = session.rewrite_rules().child_rules_for(&get_item_id);
110-
111-
// Should have at least one rule registered (PackGetItemRule)
112-
assert!(rules.is_some());
113-
assert_eq!(rules.unwrap().len(), 1);
114-
115-
let pack_expr = pack([("a", lit(1)), ("b", lit(2))], NonNullable);
116-
let get_item_expr = get_item("b", pack_expr.clone());
117-
118-
let dtype = DType::Primitive(PType::I32, NonNullable);
119-
let ctx = SimpleRewriteContext { dtype: &dtype };
120-
121-
let rule = &rules.unwrap()[0];
122-
let result = rule
123-
.reduce_child_dyn(&get_item_expr, &pack_expr, 0, &ctx)
124-
.unwrap();
125-
126-
assert!(result.is_some());
127-
assert_eq!(&result.unwrap(), &lit(2));
128-
}
129-
13083
#[test]
13184
fn test_multi_level_pack_get_item_simplify() {
13285
let inner_pack = pack([("a", lit(1)), ("b", lit(2))], NonNullable);

vortex-array/src/expr/exprs/merge/transform.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// SPDX-FileCopyrightText: Copyright the Vortex contributors
33

44
use itertools::Itertools as _;
5-
use vortex_error::{VortexExpect, VortexResult, vortex_bail, vortex_err};
5+
use vortex_error::{VortexExpect, VortexResult, vortex_bail};
66
use vortex_utils::aliases::hash_set::HashSet;
77

88
use crate::expr::exprs::get_item::get_item;
@@ -31,10 +31,10 @@ impl ReduceRule<Merge, &dyn TypedRewriteContext> for RemoveMergeRule {
3131
for child in merge.children().iter() {
3232
let child_dtype = child.return_dtype(ctx.dtype())?;
3333
if !child_dtype.is_struct() {
34-
return Err(vortex_err!(
34+
vortex_bail!(
3535
"Merge child must return a non-nullable struct dtype, got {}",
3636
child_dtype
37-
));
37+
)
3838
}
3939

4040
let child_dtype = child_dtype

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

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@ use crate::expr::exprs::pack::Pack;
2323
use crate::expr::exprs::root::Root;
2424
use crate::expr::exprs::select::Select;
2525
use crate::expr::exprs::select::transform::RemoveSelectRule;
26-
use crate::expr::transform::rules::{
27-
ChildReduceRule, ParentReduceRule, ReduceRule, RewriteContext,
28-
};
26+
use crate::expr::transform::rules::{ParentReduceRule, ReduceRule, RewriteContext};
2927
use crate::expr::{ExprVTable, VTable};
3028

3129
/// Registry of expression vtables.
@@ -69,7 +67,7 @@ impl ExprSession {
6967
self.rewrite_rules.register_typed_reduce_rule(vtable, rule);
7068
}
7169

72-
/// Register a generic reduce rule that only uses RewriteContext (non-typed).
70+
/// Register a reduce rule that doesn't use TypedRewriteContext.
7371
/// Use this for rules that don't need access to dtype information.
7472
pub fn register_reduce_rule<V, R>(&mut self, vtable: &'static V, rule: R)
7573
where
@@ -80,28 +78,6 @@ impl ExprSession {
8078
self.rewrite_rules.register_reduce_rule(vtable, rule);
8179
}
8280

83-
/// Register a child reduce rule that uses TypedRewriteContext.
84-
/// Use this for rules that need access to dtype information.
85-
pub fn register_typed_child_rule<V, R>(&mut self, vtable: &'static V, rule: R)
86-
where
87-
V: VTable,
88-
R: 'static,
89-
for<'a> R: ChildReduceRule<V, &'a dyn crate::expr::transform::TypedRewriteContext>,
90-
{
91-
self.rewrite_rules.register_typed_child_rule(vtable, rule);
92-
}
93-
94-
/// Register a child reduce rule that only uses RewriteContext (non-typed).
95-
/// Use this for rules that don't need access to dtype information.
96-
pub fn register_child_rule<V, R>(&mut self, vtable: &'static V, rule: R)
97-
where
98-
V: VTable,
99-
R: 'static,
100-
for<'a> R: ChildReduceRule<V, &'a dyn RewriteContext>,
101-
{
102-
self.rewrite_rules.register_child_rule(vtable, rule);
103-
}
104-
10581
/// Register a parent reduce rule in the session.
10682
pub fn register_parent_rule<V: VTable>(
10783
&mut self,
@@ -137,7 +113,7 @@ impl Default for ExprSession {
137113
let mut rewrite_rules = RewriteRuleRegistry::new();
138114
rewrite_rules.register_typed_reduce_rule(&Select, RemoveSelectRule);
139115
rewrite_rules.register_typed_reduce_rule(&Merge, RemoveMergeRule);
140-
rewrite_rules.register_child_rule(&GetItem, PackGetItemRule);
116+
rewrite_rules.register_reduce_rule(&GetItem, PackGetItemRule);
141117

142118
Self {
143119
registry: expressions,

0 commit comments

Comments
 (0)