1
1
use crate :: sparql:: rewriting:: GraphPatternRewriter ;
2
2
use crate :: DFResult ;
3
- use datafusion:: arrow:: datatypes:: DataType ;
4
3
use datafusion:: common:: { internal_err, plan_datafusion_err, plan_err, Column , Spans } ;
5
4
use datafusion:: functions_aggregate:: count:: count;
6
5
use datafusion:: logical_expr:: utils:: COUNT_STAR_EXPANSION ;
7
6
use datafusion:: logical_expr:: {
8
- lit, or, Expr , ExprSchemable , LogicalPlanBuilder , Operator , Subquery ,
7
+ lit, or, Expr , LogicalPlanBuilder , Operator , Subquery ,
9
8
} ;
10
9
use datafusion:: prelude:: { and, exists} ;
11
- use rdf_fusion_encoding:: EncodingName ;
12
10
use rdf_fusion_logical:: { RdfFusionExprBuilder , RdfFusionExprBuilderRoot } ;
13
11
use rdf_fusion_model:: vocab:: xsd;
14
12
use rdf_fusion_model:: Iri ;
@@ -45,12 +43,8 @@ impl<'rewriter> ExpressionRewriter<'rewriter> {
45
43
46
44
/// Rewrites an [Expression] to an [Expr] that computes a native Boolean.
47
45
pub fn rewrite_to_boolean ( & self , expression : & Expression ) -> DFResult < Expr > {
48
- let expr = self . rewrite_internal ( expression) ?;
49
- if expr. evaluates_to_boolean ( ) ? {
50
- return expr. build ( ) ;
51
- }
52
-
53
- expr. build_effective_boolean_value ( ) ?. build_boolean ( )
46
+ self . rewrite_internal ( expression) ?
47
+ . build_effective_boolean_value ( )
54
48
}
55
49
56
50
fn rewrite_internal (
@@ -66,7 +60,10 @@ impl<'rewriter> ExpressionRewriter<'rewriter> {
66
60
. rewrite_internal ( lhs) ?
67
61
. rdf_term_equal ( self . rewrite ( rhs) ?) ,
68
62
Expression :: SameTerm ( lhs, rhs) => {
69
- self . rewrite_internal ( lhs) ?. build_same_term ( self . rewrite ( rhs) ?)
63
+ let boolean = self
64
+ . rewrite_internal ( lhs) ?
65
+ . build_same_term ( self . rewrite ( rhs) ?) ?;
66
+ self . expr_builder_root . native_boolean_as_term ( boolean)
70
67
}
71
68
Expression :: Greater ( lhs, rhs) => {
72
69
self . rewrite_internal ( lhs) ?. greater_than ( self . rewrite ( rhs) ?)
@@ -297,13 +294,12 @@ impl<'rewriter> ExpressionRewriter<'rewriter> {
297
294
. map ( |e| {
298
295
lhs. clone ( )
299
296
. rdf_term_equal ( self . rewrite ( e) ?) ?
300
- . build_effective_boolean_value ( ) ?
301
- . build_boolean ( )
297
+ . build_effective_boolean_value ( )
302
298
} )
303
299
. collect :: < DFResult < Vec < _ > > > ( ) ?;
304
300
305
301
let result = expressions. into_iter ( ) . reduce ( or) . unwrap_or ( lit ( false ) ) ;
306
- self . expr_builder ( result ) . native_boolean_as_term ( )
302
+ self . expr_builder_root . native_boolean_as_term ( result )
307
303
}
308
304
309
305
/// Rewrites an EXISTS expression to a correlated subquery.
@@ -335,9 +331,10 @@ impl<'rewriter> ExpressionRewriter<'rewriter> {
335
331
outer_ref_columns : vec ! [ ] ,
336
332
spans : Spans ( vec ! [ ] ) ,
337
333
} ;
334
+
338
335
return self
339
- . expr_builder ( Expr :: ScalarSubquery ( subquery ) . gt ( lit ( 0 ) ) )
340
- . native_boolean_as_term ( ) ;
336
+ . expr_builder_root
337
+ . native_boolean_as_term ( Expr :: ScalarSubquery ( subquery ) . gt ( lit ( 0 ) ) ) ;
341
338
}
342
339
343
340
// TODO: Investigate why we need this renaming and cannot refer to the unqualified column
@@ -365,9 +362,10 @@ impl<'rewriter> ExpressionRewriter<'rewriter> {
365
362
. try_create_builder ( Expr :: OuterReferenceColumn (
366
363
data_type. clone ( ) ,
367
364
Column :: new_unqualified ( k) ,
368
- ) )
369
- . is_compatible ( Expr :: from ( Column :: new_unqualified ( format ! ( "__inner__{k}" ) ) ) ) ?
370
- . build_boolean ( )
365
+ ) ) ?
366
+ . build_is_compatible ( Expr :: from ( Column :: new_unqualified ( format ! (
367
+ "__inner__{k}"
368
+ ) ) ) )
371
369
} )
372
370
. collect :: < DFResult < Vec < _ > > > ( ) ?;
373
371
let compatible_filter = compatible_filters
@@ -376,7 +374,8 @@ impl<'rewriter> ExpressionRewriter<'rewriter> {
376
374
. unwrap_or ( lit ( true ) ) ;
377
375
378
376
let subquery = Arc :: new ( exists_pattern. filter ( compatible_filter) ?. build ( ) ?) ;
379
- self . expr_builder ( exists ( subquery) ) . native_boolean_as_term ( )
377
+ self . expr_builder_root
378
+ . native_boolean_as_term ( exists ( subquery) )
380
379
}
381
380
382
381
/// Rewrites an IF expression to a case expression.
@@ -398,29 +397,30 @@ impl<'rewriter> ExpressionRewriter<'rewriter> {
398
397
lhs : & Expression ,
399
398
rhs : & Expression ,
400
399
) -> DFResult < RdfFusionExprBuilder < ' rewriter > > {
401
- let lhs = self . rewrite_internal ( lhs) ?. build_effective_boolean_value ( ) ?;
400
+ let lhs = self
401
+ . rewrite_internal ( lhs) ?
402
+ . build_effective_boolean_value ( ) ?;
402
403
let rhs = self
403
404
. rewrite_internal ( rhs) ?
404
- . build_effective_boolean_value ( ) ?
405
- . build_boolean ( ) ?;
405
+ . build_effective_boolean_value ( ) ?;
406
406
407
407
let result = match operator {
408
- Operator :: And => lhs . and ( rhs) ?,
409
- Operator :: Or => lhs . or ( rhs) ?,
408
+ Operator :: And => self . expr_builder_root . sparql_and ( lhs , rhs) ?,
409
+ Operator :: Or => self . expr_builder_root . sparql_or ( lhs , rhs) ?,
410
410
_ => return plan_err ! ( "Unsupported logical expression: {}" , & operator) ,
411
411
} ;
412
- result . native_boolean_as_term ( )
412
+ self . expr_builder_root . native_boolean_as_term ( result )
413
413
}
414
414
415
415
/// TODO
416
- fn expr_builder ( & self , expr : Expr ) -> RdfFusionExprBuilder < ' rewriter > {
416
+ fn expr_builder ( & self , expr : Expr ) -> DFResult < RdfFusionExprBuilder < ' rewriter > > {
417
417
self . expr_builder_root . try_create_builder ( expr)
418
418
}
419
419
420
420
/// TODO
421
421
fn unary_args ( & self , args : Vec < Expr > ) -> DFResult < RdfFusionExprBuilder < ' rewriter > > {
422
422
match TryInto :: < [ Expr ; 1 ] > :: try_into ( args) {
423
- Ok ( [ expr] ) => Ok ( self . expr_builder ( expr) ) ,
423
+ Ok ( [ expr] ) => Ok ( self . expr_builder ( expr) ? ) ,
424
424
Err ( _) => plan_err ! ( "Unsupported argument list for unary function." ) ,
425
425
}
426
426
}
@@ -429,7 +429,7 @@ impl<'rewriter> ExpressionRewriter<'rewriter> {
429
429
fn binary_args ( & self , args : Vec < Expr > ) -> DFResult < ( RdfFusionExprBuilder < ' rewriter > , Expr ) > {
430
430
match TryInto :: < [ Expr ; 2 ] > :: try_into ( args) {
431
431
Ok ( [ lhs, rhs] ) => {
432
- let lhs = self . expr_builder ( lhs) ;
432
+ let lhs = self . expr_builder ( lhs) ? ;
433
433
Ok ( ( lhs, rhs) )
434
434
}
435
435
Err ( _) => plan_err ! ( "Unsupported argument list for unary function." ) ,
@@ -443,7 +443,7 @@ impl<'rewriter> ExpressionRewriter<'rewriter> {
443
443
) -> DFResult < ( RdfFusionExprBuilder < ' rewriter > , Expr , Expr ) > {
444
444
match TryInto :: < [ Expr ; 3 ] > :: try_into ( args) {
445
445
Ok ( [ arg0, arg1, arg2] ) => {
446
- let arg0 = self . expr_builder ( arg0) ;
446
+ let arg0 = self . expr_builder ( arg0) ? ;
447
447
Ok ( ( arg0, arg1, arg2) )
448
448
}
449
449
Err ( _) => plan_err ! ( "Unsupported argument list for unary function." ) ,
@@ -457,7 +457,7 @@ impl<'rewriter> ExpressionRewriter<'rewriter> {
457
457
) -> DFResult < ( RdfFusionExprBuilder < ' rewriter > , Expr , Expr , Expr ) > {
458
458
match TryInto :: < [ Expr ; 4 ] > :: try_into ( args) {
459
459
Ok ( [ arg0, arg1, arg2, arg3] ) => {
460
- let arg0 = self . expr_builder ( arg0) ;
460
+ let arg0 = self . expr_builder ( arg0) ? ;
461
461
Ok ( ( arg0, arg1, arg2, arg3) )
462
462
}
463
463
Err ( _) => plan_err ! ( "Unsupported argument list for unary function." ) ,
0 commit comments