diff --git a/lib/spargebra/src/parser.rs b/lib/spargebra/src/parser.rs index ca0c6ba4..98cfe9e0 100644 --- a/lib/spargebra/src/parser.rs +++ b/lib/spargebra/src/parser.rs @@ -128,7 +128,7 @@ impl From> for FocusedTriplePattern> { } } -#[derive(Clone)] +#[derive(Clone, Debug)] enum VariableOrPropertyPath { Variable(Variable), PropertyPath(PropertyPathExpression), @@ -289,6 +289,7 @@ fn build_bgp(patterns: Vec) -> GraphPattern { elements.into_iter().reduce(new_join).unwrap_or_default() } +#[derive(Debug)] enum TripleOrPathPattern { Triple(TriplePattern), Path { @@ -304,6 +305,7 @@ impl From for TripleOrPathPattern { } } +#[derive(Debug)] struct AnnotatedTermPath { term: TermPattern, annotations: Vec<(VariableOrPropertyPath, Vec)>, @@ -322,7 +324,7 @@ impl From for AnnotatedTermPath { } } -#[derive(Default)] +#[derive(Debug, Default)] struct FocusedTripleOrPathPattern { focus: F, patterns: Vec, @@ -1596,7 +1598,7 @@ parser! { } / s:TriplesNodePath() _ po:PropertyListPath() {? let mut patterns = s.patterns; - patterns.extend(po.patterns); + patterns.extend(po.patterns); for (p, os) in po.focus { for o in os { add_to_triple_or_path_patterns(s.focus.clone(), p.clone(), o, &mut patterns)?; @@ -1780,7 +1782,7 @@ parser! { //[101] rule BlankNodePropertyListPath() -> FocusedTripleOrPathPattern = "[" _ po:PropertyListPathNotEmpty() _ "]" {? - let mut patterns: Vec = Vec::new(); + let mut patterns = po.patterns; let mut bnode = TermPattern::from(BlankNode::default()); for (p, os) in po.focus { for o in os { diff --git a/testsuite/oxigraph-tests/sparql/manifest.ttl b/testsuite/oxigraph-tests/sparql/manifest.ttl index 9da0d1ba..e215c315 100644 --- a/testsuite/oxigraph-tests/sparql/manifest.ttl +++ b/testsuite/oxigraph-tests/sparql/manifest.ttl @@ -26,6 +26,7 @@ :nested_path :nested_expression :order_terms + :nested_anonymous ) . :small_unicode_escape_with_multibytes_char rdf:type mf:NegativeSyntaxTest ; @@ -114,3 +115,10 @@ mf:name "literals have an order for ORDER BY" ; mf:action [ qt:query ] ; mf:result . + +:nested_anonymous rdf:type mf:QueryEvaluationTest ; + mf:name "Nested anonymous" ; + mf:action + [ qt:query ; + qt:data ] ; + mf:result . diff --git a/testsuite/oxigraph-tests/sparql/nested_anonymous.rq b/testsuite/oxigraph-tests/sparql/nested_anonymous.rq new file mode 100644 index 00000000..c2f8b66f --- /dev/null +++ b/testsuite/oxigraph-tests/sparql/nested_anonymous.rq @@ -0,0 +1,5 @@ +PREFIX : + +SELECT ?a WHERE { + [ :p1 ?a ; :p2 [ :p3 :foo ] ] +} \ No newline at end of file diff --git a/testsuite/oxigraph-tests/sparql/nested_anonymous.srx b/testsuite/oxigraph-tests/sparql/nested_anonymous.srx new file mode 100644 index 00000000..91908168 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql/nested_anonymous.srx @@ -0,0 +1,13 @@ + + + + + + + + + t1 + + + + \ No newline at end of file diff --git a/testsuite/oxigraph-tests/sparql/nested_anonymous.ttl b/testsuite/oxigraph-tests/sparql/nested_anonymous.ttl new file mode 100644 index 00000000..c79d3369 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql/nested_anonymous.ttl @@ -0,0 +1,4 @@ +PREFIX : + +[ :p1 "t1" ; :p2 [ :p3 :foo ] ] . +[ :p1 "t2" ; :p2 [ :p3 :bar ] ] .