diff --git a/lib/src/sparql/eval.rs b/lib/src/sparql/eval.rs index fa48ab8a..eece285b 100644 --- a/lib/src/sparql/eval.rs +++ b/lib/src/sparql/eval.rs @@ -2596,23 +2596,18 @@ impl<'a, S: ReadableEncodedStore + 'a> GroupConcatAccumulator<'a, S> { impl<'a, S: ReadableEncodedStore + 'a> Accumulator for GroupConcatAccumulator<'a, S> { fn add(&mut self, element: Option) { if let Some(concat) = self.concat.as_mut() { - let element = if let Some(element) = element { - self.eval.to_string_and_language(element) - } else { - None - }; - if let Some((value, e_language)) = element { - if let Some(lang) = self.language { - if lang != e_language { - self.language = Some(None) + if let Some(element) = element { + if let Some((value, e_language)) = self.eval.to_string_and_language(element) { + if let Some(lang) = self.language { + if lang != e_language { + self.language = Some(None) + } + concat.push_str(self.separator); + } else { + self.language = Some(e_language) } - concat.push_str(self.separator); - } else { - self.language = Some(e_language) + concat.push_str(&value); } - concat.push_str(&value); - } else { - self.concat = None; } } } diff --git a/lib/tests/oxigraph-tests/sparql/group_concat_with_null.rq b/lib/tests/oxigraph-tests/sparql/group_concat_with_null.rq new file mode 100644 index 00000000..8d819aba --- /dev/null +++ b/lib/tests/oxigraph-tests/sparql/group_concat_with_null.rq @@ -0,0 +1,3 @@ +PREFIX : + +SELECT (GROUP_CONCAT(?opt) AS ?g) WHERE { ?baseS a :ex OPTIONAL { ?baseS :opt ?opt } } \ No newline at end of file diff --git a/lib/tests/oxigraph-tests/sparql/group_concat_with_null.srx b/lib/tests/oxigraph-tests/sparql/group_concat_with_null.srx new file mode 100644 index 00000000..7104ba46 --- /dev/null +++ b/lib/tests/oxigraph-tests/sparql/group_concat_with_null.srx @@ -0,0 +1,13 @@ + + + + + + + + + value + + + + \ No newline at end of file diff --git a/lib/tests/oxigraph-tests/sparql/group_concat_with_null.ttl b/lib/tests/oxigraph-tests/sparql/group_concat_with_null.ttl new file mode 100644 index 00000000..0ade2884 --- /dev/null +++ b/lib/tests/oxigraph-tests/sparql/group_concat_with_null.ttl @@ -0,0 +1,4 @@ +@prefix : . + +:a a :ex ; :s :opt "value" . +:b a :ex . diff --git a/lib/tests/oxigraph-tests/sparql/manifest.ttl b/lib/tests/oxigraph-tests/sparql/manifest.ttl new file mode 100644 index 00000000..76dd6914 --- /dev/null +++ b/lib/tests/oxigraph-tests/sparql/manifest.ttl @@ -0,0 +1,20 @@ +@prefix rdf: . +@prefix : . +@prefix rdfs: . +@prefix mf: . +@prefix qt: . + +<> rdf:type mf:Manifest ; + rdfs:label "Oxigraph SPARQL tests" ; + mf:entries + ( + :group_concat_with_null + ) . + +:group_concat_with_null rdf:type mf:QueryEvaluationTest ; + mf:name "GROUP_CONCAT with NULL" ; + rdfs:comment "GROUP_CONCAT should ignore null values" ; + mf:action + [ qt:query ; + qt:data ] ; + mf:result . diff --git a/lib/tests/sparql_test_cases.rs b/lib/tests/sparql_test_cases.rs index 4c857189..a7335ca1 100644 --- a/lib/tests/sparql_test_cases.rs +++ b/lib/tests/sparql_test_cases.rs @@ -10,6 +10,7 @@ use std::fmt; use std::fs::File; use std::io::Read; use std::io::{BufRead, BufReader}; +use std::iter::once; use std::path::PathBuf; use std::sync::Arc; @@ -27,6 +28,9 @@ fn sparql_w3c_syntax_testsuite() -> Result<()> { for test_result in manifest_10_urls .into_iter() .chain(manifest_11_urls.into_iter()) + .chain(once( + "https://github.com/oxigraph/oxigraph/tests/sparql/manifest.ttl", + )) .flat_map(TestManifest::new) { let test = test_result.unwrap(); @@ -272,6 +276,11 @@ fn to_relative_path(url: &str) -> Result { "http://www.w3.org/2009/sparql/docs/tests/", "rdf-tests/sparql11/", )) + } else if url.starts_with("https://github.com/oxigraph/oxigraph/tests/") { + Ok(url.replace( + "https://github.com/oxigraph/oxigraph/tests/", + "oxigraph-tests/", + )) } else { Err(Error::msg(format!("Not supported url for file: {}", url))) }