@@ -5,39 +5,23 @@ use vortex_error::VortexResult;
55
66use crate :: expr:: exprs:: get_item:: GetItem ;
77use 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 ;
910use 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- /// ```
2316pub 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 ) ;
0 commit comments