From cd8032136a4503f904f36397a27fe2f2a8d95872 Mon Sep 17 00:00:00 2001 From: Tpt Date: Tue, 1 Sep 2020 22:35:58 +0200 Subject: [PATCH] Fixes a bug in SPARQL DESCRIBE implementation Adds tests to ensure it won't happen again --- lib/src/sparql/eval.rs | 18 +++++++++++------- testsuite/oxigraph-tests/sparql/describe.rq | 1 + .../oxigraph-tests/sparql/describe_input.ttl | 9 +++++++++ .../oxigraph-tests/sparql/describe_output.ttl | 6 ++++++ .../oxigraph-tests/sparql/describe_where.rq | 1 + testsuite/oxigraph-tests/sparql/manifest.ttl | 16 ++++++++++++++++ 6 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 testsuite/oxigraph-tests/sparql/describe.rq create mode 100644 testsuite/oxigraph-tests/sparql/describe_input.ttl create mode 100644 testsuite/oxigraph-tests/sparql/describe_output.ttl create mode 100644 testsuite/oxigraph-tests/sparql/describe_where.rq diff --git a/lib/src/sparql/eval.rs b/lib/src/sparql/eval.rs index 330d5d71..4fea9b78 100644 --- a/lib/src/sparql/eval.rs +++ b/lib/src/sparql/eval.rs @@ -2731,16 +2731,20 @@ impl + 'static> Iterator for De Ok(tuple) => tuple, Err(error) => return Some(Err(error)), }; - for subject in tuple.iter() { - if let Some(subject) = subject { - self.quads = Box::new(self.eval.dataset.encoded_quads_for_pattern( + let eval = self.eval.clone(); + self.quads = Box::new(tuple.into_iter().flatten().flat_map(move |subject| { + eval.dataset + .encoded_quads_for_pattern( Some(subject), None, None, - None, - )); - } - } + Some(EncodedTerm::DefaultGraph), + ) + .chain( + eval.dataset + .encoded_quads_for_pattern(Some(subject), None, None, None), + ) + })); } } } diff --git a/testsuite/oxigraph-tests/sparql/describe.rq b/testsuite/oxigraph-tests/sparql/describe.rq new file mode 100644 index 00000000..9062944a --- /dev/null +++ b/testsuite/oxigraph-tests/sparql/describe.rq @@ -0,0 +1 @@ +DESCRIBE \ No newline at end of file diff --git a/testsuite/oxigraph-tests/sparql/describe_input.ttl b/testsuite/oxigraph-tests/sparql/describe_input.ttl new file mode 100644 index 00000000..f8dce4f7 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql/describe_input.ttl @@ -0,0 +1,9 @@ +PREFIX schema: + + a schema:Person ; + schema:name "test"@en ; + schema:parent ; + schema:child [ a schema:Person ] . + + a schema:Person ; + schema:child . \ No newline at end of file diff --git a/testsuite/oxigraph-tests/sparql/describe_output.ttl b/testsuite/oxigraph-tests/sparql/describe_output.ttl new file mode 100644 index 00000000..2c9ca3c5 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql/describe_output.ttl @@ -0,0 +1,6 @@ +PREFIX schema: + + a schema:Person ; + schema:name "test"@en ; + schema:parent ; + schema:child [] . diff --git a/testsuite/oxigraph-tests/sparql/describe_where.rq b/testsuite/oxigraph-tests/sparql/describe_where.rq new file mode 100644 index 00000000..1bc420fb --- /dev/null +++ b/testsuite/oxigraph-tests/sparql/describe_where.rq @@ -0,0 +1 @@ +DESCRIBE ?s WHERE { ?s "test"@en } \ No newline at end of file diff --git a/testsuite/oxigraph-tests/sparql/manifest.ttl b/testsuite/oxigraph-tests/sparql/manifest.ttl index 76dd6914..3f7a94c1 100644 --- a/testsuite/oxigraph-tests/sparql/manifest.ttl +++ b/testsuite/oxigraph-tests/sparql/manifest.ttl @@ -8,9 +8,25 @@ rdfs:label "Oxigraph SPARQL tests" ; mf:entries ( + :describe + :describe_where :group_concat_with_null ) . +:describe rdf:type mf:QueryEvaluationTest ; + mf:name "Simple DESCRIBE request" ; + mf:action + [ qt:query ; + qt:data ] ; + mf:result . + +:describe rdf:type mf:QueryEvaluationTest ; + mf:name "Simple DESCRIBE request" ; + mf:action + [ qt:query ; + qt:data ] ; + mf:result . + :group_concat_with_null rdf:type mf:QueryEvaluationTest ; mf:name "GROUP_CONCAT with NULL" ; rdfs:comment "GROUP_CONCAT should ignore null values" ;