Skip to content

Commit 90418f3

Browse files
committed
Fix a bug introduced into pattern matching.
1 parent 2c5ca18 commit 90418f3

File tree

1 file changed

+21
-13
lines changed

1 file changed

+21
-13
lines changed

lib/graphfusion-logical/src/patterns/pattern_element.rs

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
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};
42
use arrow_rdf::encoded::{ENC_AS_NATIVE_BOOLEAN, ENC_SAME_TERM};
5-
use datafusion::common::Column;
3+
use datafusion::common::{Column, ScalarValue};
64
use datafusion::logical_expr::{lit, Expr};
75
use model::{Literal, NamedNode};
86
use spargebra::term::{BlankNode, GraphNamePattern, NamedNodePattern, TermPattern, Variable};
@@ -30,16 +28,20 @@ impl PatternNodeElement {
3028
/// Creates an [Expr] that filters `column` based on the contents of this element.
3129
#[allow(clippy::unwrap_in_result, reason = "TODO")]
3230
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()),
3743
_ => 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+
}
4345
}
4446

4547
/// Returns a reference to a possible variable.
@@ -94,3 +96,9 @@ impl From<GraphNamePattern> for PatternNodeElement {
9496
}
9597
}
9698
}
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

Comments
 (0)