@@ -6,14 +6,19 @@ use crate::{
66 AllocateErrorFn , EngineIterator , ExternResult , IntoExternResult , KernelStringSlice ,
77 ReferenceSet , TryFromStringSlice ,
88} ;
9- use delta_kernel:: {
10- expressions:: { BinaryOperator , ColumnName , Expression , UnaryOperator } ,
11- DeltaResult ,
9+ use delta_kernel:: expressions:: {
10+ BinaryExpressionOp , BinaryPredicateOp , ColumnName , Expression , Predicate , UnaryPredicateOp ,
1211} ;
12+ use delta_kernel:: DeltaResult ;
13+
14+ pub ( crate ) enum ExpressionOrPredicate {
15+ Expression ( Expression ) ,
16+ Predicate ( Predicate ) ,
17+ }
1318
1419#[ derive( Default ) ]
1520pub struct KernelExpressionVisitorState {
16- inflight_ids : ReferenceSet < Expression > ,
21+ inflight_ids : ReferenceSet < ExpressionOrPredicate > ,
1722}
1823
1924/// A predicate that can be used to skip data when scanning.
@@ -36,95 +41,163 @@ pub struct EnginePredicate {
3641}
3742
3843fn wrap_expression ( state : & mut KernelExpressionVisitorState , expr : impl Into < Expression > ) -> usize {
39- state. inflight_ids . insert ( expr. into ( ) )
44+ let expr = ExpressionOrPredicate :: Expression ( expr. into ( ) ) ;
45+ state. inflight_ids . insert ( expr)
46+ }
47+
48+ fn wrap_predicate ( state : & mut KernelExpressionVisitorState , pred : impl Into < Predicate > ) -> usize {
49+ let pred = ExpressionOrPredicate :: Predicate ( pred. into ( ) ) ;
50+ state. inflight_ids . insert ( pred)
4051}
4152
4253pub ( crate ) fn unwrap_kernel_expression (
4354 state : & mut KernelExpressionVisitorState ,
4455 exprid : usize ,
4556) -> Option < Expression > {
46- state. inflight_ids . take ( exprid)
57+ match state. inflight_ids . take ( exprid) ? {
58+ ExpressionOrPredicate :: Expression ( expr) => Some ( expr) ,
59+ ExpressionOrPredicate :: Predicate ( pred) => Some ( Expression :: predicate ( pred) ) ,
60+ }
61+ }
62+
63+ pub ( crate ) fn unwrap_kernel_predicate (
64+ state : & mut KernelExpressionVisitorState ,
65+ predid : usize ,
66+ ) -> Option < Predicate > {
67+ match state. inflight_ids . take ( predid) ? {
68+ ExpressionOrPredicate :: Expression ( expr) => Some ( Predicate :: from_expr ( expr) ) ,
69+ ExpressionOrPredicate :: Predicate ( pred) => Some ( pred) ,
70+ }
4771}
4872
4973fn visit_expression_binary (
5074 state : & mut KernelExpressionVisitorState ,
51- op : BinaryOperator ,
75+ op : BinaryExpressionOp ,
5276 a : usize ,
5377 b : usize ,
5478) -> usize {
55- let left = unwrap_kernel_expression ( state, a) ;
56- let right = unwrap_kernel_expression ( state, b) ;
57- match left . zip ( right ) {
58- Some ( ( left , right ) ) => wrap_expression ( state, Expression :: binary ( op, left , right ) ) ,
59- None => 0 , // invalid child => invalid node
79+ let a = unwrap_kernel_expression ( state, a) ;
80+ let b = unwrap_kernel_expression ( state, b) ;
81+ match ( a , b ) {
82+ ( Some ( a ) , Some ( b ) ) => wrap_expression ( state, Expression :: binary ( op, a , b ) ) ,
83+ _ => 0 , // invalid child => invalid node
6084 }
6185}
6286
63- fn visit_expression_unary (
87+ fn visit_predicate_binary (
6488 state : & mut KernelExpressionVisitorState ,
65- op : UnaryOperator ,
89+ op : BinaryPredicateOp ,
90+ a : usize ,
91+ b : usize ,
92+ ) -> usize {
93+ let a = unwrap_kernel_expression ( state, a) ;
94+ let b = unwrap_kernel_expression ( state, b) ;
95+ match ( a, b) {
96+ ( Some ( a) , Some ( b) ) => wrap_predicate ( state, Predicate :: binary ( op, a, b) ) ,
97+ _ => 0 , // invalid child => invalid node
98+ }
99+ }
100+
101+ fn visit_predicate_unary (
102+ state : & mut KernelExpressionVisitorState ,
103+ op : UnaryPredicateOp ,
66104 inner_expr : usize ,
67105) -> usize {
68- unwrap_kernel_expression ( state, inner_expr) . map_or ( 0 , |expr| {
69- wrap_expression ( state, Expression :: unary ( op, expr) )
70- } )
106+ unwrap_kernel_expression ( state, inner_expr)
107+ . map_or ( 0 , |expr| wrap_predicate ( state, Predicate :: unary ( op, expr) ) )
71108}
72109
73110// The EngineIterator is not thread safe, not reentrant, not owned by callee, not freed by callee.
74111#[ no_mangle]
75- pub extern "C" fn visit_expression_and (
112+ pub extern "C" fn visit_predicate_and (
76113 state : & mut KernelExpressionVisitorState ,
77114 children : & mut EngineIterator ,
78115) -> usize {
79- let result = Expression :: and_from (
80- children. flat_map ( |child| unwrap_kernel_expression ( state, child as usize ) ) ,
116+ let result = Predicate :: and_from (
117+ children. flat_map ( |child| unwrap_kernel_predicate ( state, child as usize ) ) ,
81118 ) ;
82- wrap_expression ( state, result)
119+ wrap_predicate ( state, result)
120+ }
121+
122+ #[ no_mangle]
123+ pub extern "C" fn visit_expression_plus (
124+ state : & mut KernelExpressionVisitorState ,
125+ a : usize ,
126+ b : usize ,
127+ ) -> usize {
128+ visit_expression_binary ( state, BinaryExpressionOp :: Plus , a, b)
83129}
84130
85131#[ no_mangle]
86- pub extern "C" fn visit_expression_lt (
132+ pub extern "C" fn visit_expression_minus (
87133 state : & mut KernelExpressionVisitorState ,
88134 a : usize ,
89135 b : usize ,
90136) -> usize {
91- visit_expression_binary ( state, BinaryOperator :: LessThan , a, b)
137+ visit_expression_binary ( state, BinaryExpressionOp :: Minus , a, b)
92138}
93139
94140#[ no_mangle]
95- pub extern "C" fn visit_expression_le (
141+ pub extern "C" fn visit_expression_multiply (
96142 state : & mut KernelExpressionVisitorState ,
97143 a : usize ,
98144 b : usize ,
99145) -> usize {
100- visit_expression_binary ( state, BinaryOperator :: LessThanOrEqual , a, b)
146+ visit_expression_binary ( state, BinaryExpressionOp :: Multiply , a, b)
101147}
102148
103149#[ no_mangle]
104- pub extern "C" fn visit_expression_gt (
150+ pub extern "C" fn visit_expression_divide (
105151 state : & mut KernelExpressionVisitorState ,
106152 a : usize ,
107153 b : usize ,
108154) -> usize {
109- visit_expression_binary ( state, BinaryOperator :: GreaterThan , a, b)
155+ visit_expression_binary ( state, BinaryExpressionOp :: Divide , a, b)
110156}
111157
112158#[ no_mangle]
113- pub extern "C" fn visit_expression_ge (
159+ pub extern "C" fn visit_predicate_lt (
114160 state : & mut KernelExpressionVisitorState ,
115161 a : usize ,
116162 b : usize ,
117163) -> usize {
118- visit_expression_binary ( state, BinaryOperator :: GreaterThanOrEqual , a, b)
164+ visit_predicate_binary ( state, BinaryPredicateOp :: LessThan , a, b)
119165}
120166
121167#[ no_mangle]
122- pub extern "C" fn visit_expression_eq (
168+ pub extern "C" fn visit_predicate_le (
123169 state : & mut KernelExpressionVisitorState ,
124170 a : usize ,
125171 b : usize ,
126172) -> usize {
127- visit_expression_binary ( state, BinaryOperator :: Equal , a, b)
173+ visit_predicate_binary ( state, BinaryPredicateOp :: LessThanOrEqual , a, b)
174+ }
175+
176+ #[ no_mangle]
177+ pub extern "C" fn visit_predicate_gt (
178+ state : & mut KernelExpressionVisitorState ,
179+ a : usize ,
180+ b : usize ,
181+ ) -> usize {
182+ visit_predicate_binary ( state, BinaryPredicateOp :: GreaterThan , a, b)
183+ }
184+
185+ #[ no_mangle]
186+ pub extern "C" fn visit_predicate_ge (
187+ state : & mut KernelExpressionVisitorState ,
188+ a : usize ,
189+ b : usize ,
190+ ) -> usize {
191+ visit_predicate_binary ( state, BinaryPredicateOp :: GreaterThanOrEqual , a, b)
192+ }
193+
194+ #[ no_mangle]
195+ pub extern "C" fn visit_predicate_eq (
196+ state : & mut KernelExpressionVisitorState ,
197+ a : usize ,
198+ b : usize ,
199+ ) -> usize {
200+ visit_predicate_binary ( state, BinaryPredicateOp :: Equal , a, b)
128201}
129202
130203/// # Safety
@@ -148,19 +221,20 @@ fn visit_expression_column_impl(
148221}
149222
150223#[ no_mangle]
151- pub extern "C" fn visit_expression_not (
224+ pub extern "C" fn visit_predicate_not (
152225 state : & mut KernelExpressionVisitorState ,
153- inner_expr : usize ,
226+ inner_pred : usize ,
154227) -> usize {
155- visit_expression_unary ( state, UnaryOperator :: Not , inner_expr)
228+ unwrap_kernel_predicate ( state, inner_pred)
229+ . map_or ( 0 , |pred| wrap_predicate ( state, Predicate :: not ( pred) ) )
156230}
157231
158232#[ no_mangle]
159- pub extern "C" fn visit_expression_is_null (
233+ pub extern "C" fn visit_predicate_is_null (
160234 state : & mut KernelExpressionVisitorState ,
161235 inner_expr : usize ,
162236) -> usize {
163- visit_expression_unary ( state, UnaryOperator :: IsNull , inner_expr)
237+ visit_predicate_unary ( state, UnaryPredicateOp :: IsNull , inner_expr)
164238}
165239
166240/// # Safety
0 commit comments