Skip to content

Commit 1d793de

Browse files
committed
Merge branch 'main' into typos
2 parents 29d1437 + a4993ff commit 1d793de

File tree

53 files changed

+2814
-1302
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+2814
-1302
lines changed

acceptance/tests/other.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ async fn test_read_last_checkpoint() {
2525
let url = url::Url::from_directory_path(path).unwrap();
2626
2727
let store = Arc::new(LocalFileSystem::new());
28-
let prefix = Path::from(url.path());
28+
let prefix = Path::from_url_path(url.path()).unwrap();
2929
let storage = ObjectStoreStorageHandler::new(store, prefix);
3030
let cp = read_last_checkpoint(&storage, &url).await.unwrap().unwrap();
3131
assert_eq!(cp.version, 2);

ffi/examples/read-table/arrow.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ static ExclusiveEngineData* apply_transform(
122122
context->read_schema, // input schema
123123
context->arrow_context->cur_transform,
124124
context->logical_schema); // output schema
125-
ExternResultHandleExclusiveEngineData transformed_res = evaluate(
125+
ExternResultHandleExclusiveEngineData transformed_res = evaluate_expression(
126126
context->engine,
127127
&data,
128128
evaluator);

ffi/examples/visit-expression/expression.h

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ uintptr_t make_field_list(void* data, uintptr_t reserve) {
336336
return id;
337337
}
338338

339-
ExpressionItemList construct_predicate(SharedExpression* predicate) {
339+
ExpressionItemList construct_expression(SharedExpression* expression) {
340340
ExpressionBuilder data = { 0 };
341341
EngineExpressionVisitor visitor = {
342342
.data = &data,
@@ -378,7 +378,54 @@ ExpressionItemList construct_predicate(SharedExpression* predicate) {
378378
.visit_column = visit_expr_column,
379379
.visit_struct_expr = visit_expr_struct_expr,
380380
};
381-
uintptr_t top_level_id = visit_expression(&predicate, &visitor);
381+
uintptr_t top_level_id = visit_expression(&expression, &visitor);
382+
ExpressionItemList top_level_expr = data.lists[top_level_id];
383+
free(data.lists);
384+
return top_level_expr;
385+
}
386+
387+
ExpressionItemList construct_predicate(SharedPredicate* predicate) {
388+
ExpressionBuilder data = { 0 };
389+
EngineExpressionVisitor visitor = {
390+
.data = &data,
391+
.make_field_list = make_field_list,
392+
.visit_literal_int = visit_expr_int_literal,
393+
.visit_literal_long = visit_expr_long_literal,
394+
.visit_literal_short = visit_expr_short_literal,
395+
.visit_literal_byte = visit_expr_byte_literal,
396+
.visit_literal_float = visit_expr_float_literal,
397+
.visit_literal_double = visit_expr_double_literal,
398+
.visit_literal_bool = visit_expr_boolean_literal,
399+
.visit_literal_timestamp = visit_expr_timestamp_literal,
400+
.visit_literal_timestamp_ntz = visit_expr_timestamp_ntz_literal,
401+
.visit_literal_date = visit_expr_date_literal,
402+
.visit_literal_binary = visit_expr_binary_literal,
403+
.visit_literal_null = visit_expr_null_literal,
404+
.visit_literal_decimal = visit_expr_decimal_literal,
405+
.visit_literal_string = visit_expr_string_literal,
406+
.visit_literal_struct = visit_expr_struct_literal,
407+
.visit_literal_array = visit_expr_array_literal,
408+
.visit_and = visit_expr_and,
409+
.visit_or = visit_expr_or,
410+
.visit_not = visit_expr_not,
411+
.visit_is_null = visit_expr_is_null,
412+
.visit_lt = visit_expr_lt,
413+
.visit_le = visit_expr_le,
414+
.visit_gt = visit_expr_gt,
415+
.visit_ge = visit_expr_ge,
416+
.visit_eq = visit_expr_eq,
417+
.visit_ne = visit_expr_ne,
418+
.visit_distinct = visit_expr_distinct,
419+
.visit_in = visit_expr_in,
420+
.visit_not_in = visit_expr_not_in,
421+
.visit_add = visit_expr_add,
422+
.visit_minus = visit_expr_minus,
423+
.visit_multiply = visit_expr_multiply,
424+
.visit_divide = visit_expr_divide,
425+
.visit_column = visit_expr_column,
426+
.visit_struct_expr = visit_expr_struct_expr,
427+
};
428+
uintptr_t top_level_id = visit_predicate(&predicate, &visitor);
382429
ExpressionItemList top_level_expr = data.lists[top_level_id];
383430
free(data.lists);
384431
return top_level_expr;

ffi/examples/visit-expression/visit_expression.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,16 @@
33
#include "expression_print.h"
44

55
int main() {
6-
SharedExpression* pred = get_testing_kernel_expression();
7-
ExpressionItemList expr = construct_predicate(pred);
8-
print_expression(expr);
9-
free_expression_list(expr);
6+
SharedExpression* expr = get_testing_kernel_expression();
7+
ExpressionItemList expr_list = construct_expression(expr);
8+
print_expression(expr_list);
9+
free_expression_list(expr_list);
10+
free_kernel_expression(expr);
11+
12+
SharedPredicate* pred = get_testing_kernel_predicate();
13+
ExpressionItemList pred_list = construct_predicate(pred);
14+
print_expression(pred_list);
15+
free_expression_list(pred_list);
1016
free_kernel_predicate(pred);
1117
return 0;
1218
}

ffi/src/engine_funcs.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ fn new_expression_evaluator_impl(
185185
/// Caller is responsible for passing a valid handle.
186186
#[no_mangle]
187187
pub unsafe extern "C" fn free_expression_evaluator(evaluator: Handle<SharedExpressionEvaluator>) {
188-
debug!("engine released evaluator");
188+
debug!("engine released expression evaluator");
189189
evaluator.drop_handle();
190190
}
191191

@@ -194,19 +194,19 @@ pub unsafe extern "C" fn free_expression_evaluator(evaluator: Handle<SharedExpre
194194
/// # Safety
195195
/// Caller is responsible for calling with a valid `Engine`, `ExclusiveEngineData`, and `Evaluator`
196196
#[no_mangle]
197-
pub unsafe extern "C" fn evaluate(
197+
pub unsafe extern "C" fn evaluate_expression(
198198
engine: Handle<SharedExternEngine>,
199199
batch: &mut Handle<ExclusiveEngineData>,
200200
evaluator: Handle<SharedExpressionEvaluator>,
201201
) -> ExternResult<Handle<ExclusiveEngineData>> {
202202
let engine = unsafe { engine.clone_as_arc() };
203203
let batch = unsafe { batch.as_mut() };
204204
let evaluator = unsafe { evaluator.clone_as_arc() };
205-
let res = evaluate_impl(batch, evaluator.as_ref());
205+
let res = evaluate_expression_impl(batch, evaluator.as_ref());
206206
res.into_extern_result(&engine.as_ref())
207207
}
208208

209-
fn evaluate_impl(
209+
fn evaluate_expression_impl(
210210
batch: &dyn EngineData,
211211
evaluator: &dyn ExpressionEvaluator,
212212
) -> DeltaResult<Handle<ExclusiveEngineData>> {
@@ -224,7 +224,7 @@ mod tests {
224224
use std::sync::Arc;
225225

226226
#[test]
227-
fn test_new_evaluator() {
227+
fn test_new_expression_evaluator() {
228228
let engine = get_default_engine();
229229
let in_schema = Arc::new(StructType::new(vec![StructField::new(
230230
"a",

ffi/src/expressions/engine.rs

Lines changed: 110 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -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)]
1520
pub 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

3843
fn 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

4253
pub(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

4973
fn 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

Comments
 (0)