|
1 |
| -use arrow_rdf::encoded::scalars::{ |
2 |
| - encode_scalar_literal, encode_scalar_named_node, encode_scalar_null, |
3 |
| -}; |
| 1 | +use arrow_rdf::encoded::scalars::{encode_scalar_literal, encode_scalar_named_node}; |
4 | 2 | use arrow_rdf::encoded::{ENC_AS_NATIVE_BOOLEAN, ENC_SAME_TERM};
|
5 |
| -use datafusion::common::Column; |
| 3 | +use datafusion::common::{Column, ScalarValue}; |
6 | 4 | use datafusion::logical_expr::{lit, Expr};
|
7 | 5 | use model::{Literal, NamedNode};
|
8 | 6 | use spargebra::term::{BlankNode, GraphNamePattern, NamedNodePattern, TermPattern, Variable};
|
@@ -30,16 +28,20 @@ impl PatternNodeElement {
|
30 | 28 | /// Creates an [Expr] that filters `column` based on the contents of this element.
|
31 | 29 | #[allow(clippy::unwrap_in_result, reason = "TODO")]
|
32 | 30 | pub fn filter_expression(&self, column: &Column) -> Option<Expr> {
|
33 |
| - let scalar = match self { |
34 |
| - PatternNodeElement::NamedNode(nn) => encode_scalar_named_node(nn.as_ref()), |
35 |
| - PatternNodeElement::DefaultGraph => encode_scalar_null(), |
36 |
| - PatternNodeElement::Literal(lit) => encode_scalar_literal(lit.as_ref()).unwrap(), |
| 31 | + match self { |
| 32 | + PatternNodeElement::NamedNode(nn) => { |
| 33 | + filter_by_scalar(column, encode_scalar_named_node(nn.as_ref())) |
| 34 | + } |
| 35 | + PatternNodeElement::Literal(lit) => { |
| 36 | + filter_by_scalar(column, encode_scalar_literal(lit.as_ref()).unwrap()) |
| 37 | + } |
| 38 | + PatternNodeElement::BlankNode(_) => { |
| 39 | + // A blank node indicates that this should be a non-default graph. |
| 40 | + return Some(Expr::from(column.clone()).is_not_null()); |
| 41 | + } |
| 42 | + PatternNodeElement::DefaultGraph => return Some(Expr::from(column.clone()).is_null()), |
37 | 43 | _ => return None,
|
38 |
| - }; |
39 |
| - |
40 |
| - Some(ENC_AS_NATIVE_BOOLEAN.call(vec![ |
41 |
| - ENC_SAME_TERM.call(vec![Expr::from(column.clone()), lit(scalar)]), |
42 |
| - ])) |
| 44 | + } |
43 | 45 | }
|
44 | 46 |
|
45 | 47 | /// Returns a reference to a possible variable.
|
@@ -94,3 +96,9 @@ impl From<GraphNamePattern> for PatternNodeElement {
|
94 | 96 | }
|
95 | 97 | }
|
96 | 98 | }
|
| 99 | + |
| 100 | +fn filter_by_scalar(column: &Column, scalar: ScalarValue) -> Option<Expr> { |
| 101 | + Some(ENC_AS_NATIVE_BOOLEAN.call(vec![ |
| 102 | + ENC_SAME_TERM.call(vec![Expr::from(column.clone()), lit(scalar)]), |
| 103 | + ])) |
| 104 | +} |
0 commit comments