From bdeb73868cbe40025d45d19e8cc598a932ee5003 Mon Sep 17 00:00:00 2001 From: Tpt Date: Fri, 9 Apr 2021 20:24:01 +0200 Subject: [PATCH] Server: Add union-default-graph parameter Bug #92 --- server/src/main.rs | 126 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 96 insertions(+), 30 deletions(-) diff --git a/server/src/main.rs b/server/src/main.rs index ef35ff51..a4346ad2 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -374,6 +374,7 @@ fn configure_and_evaluate_sparql_query( ) -> Result { let mut default_graph_uris = Vec::new(); let mut named_graph_uris = Vec::new(); + let mut use_default_graph_as_union = false; for (k, v) in form_urlencoded::parse(&encoded) { match k.as_ref() { "query" => { @@ -383,12 +384,20 @@ fn configure_and_evaluate_sparql_query( query = Some(v.into_owned()) } "default-graph-uri" => default_graph_uris.push(v.into_owned()), + "union-default-graph" => use_default_graph_as_union = true, "named-graph-uri" => named_graph_uris.push(v.into_owned()), _ => (), } } if let Some(query) = query { - evaluate_sparql_query(store, query, default_graph_uris, named_graph_uris, request) + evaluate_sparql_query( + store, + query, + use_default_graph_as_union, + default_graph_uris, + named_graph_uris, + request, + ) } else { bail_status!(400, "You should set the 'query' parameter") } @@ -397,28 +406,37 @@ fn configure_and_evaluate_sparql_query( fn evaluate_sparql_query( store: Store, query: String, + use_default_graph_as_union: bool, default_graph_uris: Vec, named_graph_uris: Vec, request: Request, ) -> Result { let mut query = Query::parse(&query, Some(base_url(&request)?.as_str())).map_err(bad_request)?; - let default_graph_uris = default_graph_uris - .into_iter() - .map(|e| Ok(NamedNode::new(e)?.into())) - .collect::>>() - .map_err(bad_request)?; - let named_graph_uris = named_graph_uris - .into_iter() - .map(|e| Ok(NamedNode::new(e)?.into())) - .collect::>>() - .map_err(bad_request)?; - - if !default_graph_uris.is_empty() || !named_graph_uris.is_empty() { - query.dataset_mut().set_default_graph(default_graph_uris); - query - .dataset_mut() - .set_available_named_graphs(named_graph_uris); + + if use_default_graph_as_union { + if !default_graph_uris.is_empty() || !named_graph_uris.is_empty() { + bail_status!( + 400, + "default-graph-uri or named-graph-uri and union-default-graph should not be set at the same time" + ); + } + query.dataset_mut().set_default_graph_as_union() + } else if !default_graph_uris.is_empty() || !named_graph_uris.is_empty() { + query.dataset_mut().set_default_graph( + default_graph_uris + .into_iter() + .map(|e| Ok(NamedNode::new(e)?.into())) + .collect::>() + .map_err(bad_request)?, + ); + query.dataset_mut().set_available_named_graphs( + named_graph_uris + .into_iter() + .map(|e| Ok(NamedNode::new(e)?.into())) + .collect::>() + .map_err(bad_request)?, + ); } let results = store.query(query)?; @@ -455,6 +473,7 @@ fn configure_and_evaluate_sparql_update( mut update: Option, request: Request, ) -> Result { + let mut use_default_graph_as_union = false; let mut default_graph_uris = Vec::new(); let mut named_graph_uris = Vec::new(); for (k, v) in form_urlencoded::parse(&encoded) { @@ -466,12 +485,20 @@ fn configure_and_evaluate_sparql_update( update = Some(v.into_owned()) } "using-graph-uri" => default_graph_uris.push(v.into_owned()), + "using-union-graph" => use_default_graph_as_union = true, "using-named-graph-uri" => named_graph_uris.push(v.into_owned()), _ => (), } } if let Some(update) = update { - evaluate_sparql_update(store, update, default_graph_uris, named_graph_uris, request) + evaluate_sparql_update( + store, + update, + use_default_graph_as_union, + default_graph_uris, + named_graph_uris, + request, + ) } else { bail_status!(400, "You should set the 'update' parameter") } @@ -480,27 +507,48 @@ fn configure_and_evaluate_sparql_update( fn evaluate_sparql_update( store: Store, update: String, + use_default_graph_as_union: bool, default_graph_uris: Vec, named_graph_uris: Vec, request: Request, ) -> Result { let mut update = Update::parse(&update, Some(base_url(&request)?.as_str())).map_err(bad_request)?; - let default_graph_uris = default_graph_uris - .into_iter() - .map(|e| Ok(NamedNode::new(e)?.into())) - .collect::>>() - .map_err(bad_request)?; - let named_graph_uris = named_graph_uris - .into_iter() - .map(|e| Ok(NamedNode::new(e)?.into())) - .collect::>>() - .map_err(bad_request)?; - if !default_graph_uris.is_empty() || !named_graph_uris.is_empty() { + + if use_default_graph_as_union { + if !default_graph_uris.is_empty() || !named_graph_uris.is_empty() { + bail_status!( + 400, + "using-graph-uri or using-named-graph-uri and using-union-graph should not be set at the same time" + ); + } for operation in &mut update.operations { if let GraphUpdateOperation::DeleteInsert { using, .. } = operation { if !using.is_default_dataset() { - bail_status!(400, + bail_status!( + 400, + "using-union-graph must not be used with a SPARQL UPDATE containing USING", + ); + } + using.set_default_graph_as_union(); + } + } + } else if !default_graph_uris.is_empty() || !named_graph_uris.is_empty() { + let default_graph_uris = default_graph_uris + .into_iter() + .map(|e| Ok(NamedNode::new(e)?.into())) + .collect::>>() + .map_err(bad_request)?; + let named_graph_uris = named_graph_uris + .into_iter() + .map(|e| Ok(NamedNode::new(e)?.into())) + .collect::>>() + .map_err(bad_request)?; + for operation in &mut update.operations { + if let GraphUpdateOperation::DeleteInsert { using, .. } = operation { + if !using.is_default_dataset() { + bail_status!( + 400, "using-graph-uri and using-named-graph-uri must not be used with a SPARQL UPDATE containing USING", ); } @@ -786,6 +834,24 @@ mod tests { ); } + #[test] + fn get_query_union_graph() { + ServerTest::new().test_status(Request::new( + Method::Get, + Url::parse("http://localhost/query?query=SELECT%20*%20WHERE%20{%20?s%20?p%20?o%20}&union-default-graph") + .unwrap(), + ), StatusCode::Ok); + } + + #[test] + fn get_query_union_graph_and_default_graph() { + ServerTest::new().test_status(Request::new( + Method::Get, + Url::parse("http://localhost/query?query=SELECT%20*%20WHERE%20{%20?s%20?p%20?o%20}&union-default-graph&default-graph-uri=http://example.com") + .unwrap(), + ), StatusCode::BadRequest); + } + #[test] fn get_without_query() { ServerTest::new().test_status(