|
|
@ -325,7 +325,7 @@ fn load_sparql_query_result(url: &str) -> Result<StaticQueryResults> { |
|
|
|
false, |
|
|
|
false, |
|
|
|
) |
|
|
|
) |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
Ok(StaticQueryResults::from_graph(load_graph(url)?)) |
|
|
|
StaticQueryResults::from_graph(load_graph(url)?) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -547,10 +547,10 @@ impl fmt::Display for StaticQueryResults { |
|
|
|
|
|
|
|
|
|
|
|
impl StaticQueryResults { |
|
|
|
impl StaticQueryResults { |
|
|
|
fn from_query_results(results: QueryResults, with_order: bool) -> Result<StaticQueryResults> { |
|
|
|
fn from_query_results(results: QueryResults, with_order: bool) -> Result<StaticQueryResults> { |
|
|
|
Ok(Self::from_graph(to_graph(results, with_order)?)) |
|
|
|
Self::from_graph(to_graph(results, with_order)?) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
fn from_graph(graph: Graph) -> StaticQueryResults { |
|
|
|
fn from_graph(graph: Graph) -> Result<StaticQueryResults> { |
|
|
|
// Hack to normalize literals
|
|
|
|
// Hack to normalize literals
|
|
|
|
let store = Store::new().unwrap(); |
|
|
|
let store = Store::new().unwrap(); |
|
|
|
for t in graph.iter() { |
|
|
|
for t in graph.iter() { |
|
|
@ -563,28 +563,30 @@ impl StaticQueryResults { |
|
|
|
if let Some(result_set) = graph.subject_for_predicate_object(rdf::TYPE, rs::RESULT_SET) { |
|
|
|
if let Some(result_set) = graph.subject_for_predicate_object(rdf::TYPE, rs::RESULT_SET) { |
|
|
|
if let Some(bool) = graph.object_for_subject_predicate(result_set, rs::BOOLEAN) { |
|
|
|
if let Some(bool) = graph.object_for_subject_predicate(result_set, rs::BOOLEAN) { |
|
|
|
// Boolean query
|
|
|
|
// Boolean query
|
|
|
|
StaticQueryResults::Boolean(bool == Literal::from(true).as_ref().into()) |
|
|
|
Ok(StaticQueryResults::Boolean( |
|
|
|
|
|
|
|
bool == Literal::from(true).as_ref().into(), |
|
|
|
|
|
|
|
)) |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
// Regular query
|
|
|
|
// Regular query
|
|
|
|
let mut variables: Vec<Variable> = graph |
|
|
|
let mut variables: Vec<Variable> = graph |
|
|
|
.objects_for_subject_predicate(result_set, rs::RESULT_VARIABLE) |
|
|
|
.objects_for_subject_predicate(result_set, rs::RESULT_VARIABLE) |
|
|
|
.filter_map(|object| { |
|
|
|
.map(|object| { |
|
|
|
if let TermRef::Literal(l) = object { |
|
|
|
if let TermRef::Literal(l) = object { |
|
|
|
Some(Variable::new_unchecked(l.value())) |
|
|
|
Ok(Variable::new_unchecked(l.value())) |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
None |
|
|
|
Err(anyhow!("Invalid rs:resultVariable: {}", object)) |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
}) |
|
|
|
.collect(); |
|
|
|
.collect::<Result<Vec<_>>>()?; |
|
|
|
variables.sort(); |
|
|
|
variables.sort(); |
|
|
|
|
|
|
|
|
|
|
|
let mut solutions: Vec<_> = graph |
|
|
|
let mut solutions = graph |
|
|
|
.objects_for_subject_predicate(result_set, rs::SOLUTION) |
|
|
|
.objects_for_subject_predicate(result_set, rs::SOLUTION) |
|
|
|
.filter_map(|object| { |
|
|
|
.map(|object| { |
|
|
|
if let TermRef::BlankNode(solution) = object { |
|
|
|
if let TermRef::BlankNode(solution) = object { |
|
|
|
let mut bindings = graph |
|
|
|
let mut bindings = graph |
|
|
|
.objects_for_subject_predicate(solution, rs::BINDING) |
|
|
|
.objects_for_subject_predicate(solution, rs::BINDING) |
|
|
|
.filter_map(|object| { |
|
|
|
.map(|object| { |
|
|
|
if let TermRef::BlankNode(binding) = object { |
|
|
|
if let TermRef::BlankNode(binding) = object { |
|
|
|
if let (Some(TermRef::Literal(variable)), Some(value)) = ( |
|
|
|
if let (Some(TermRef::Literal(variable)), Some(value)) = ( |
|
|
|
graph.object_for_subject_predicate( |
|
|
|
graph.object_for_subject_predicate( |
|
|
@ -593,50 +595,51 @@ impl StaticQueryResults { |
|
|
|
), |
|
|
|
), |
|
|
|
graph.object_for_subject_predicate(binding, rs::VALUE), |
|
|
|
graph.object_for_subject_predicate(binding, rs::VALUE), |
|
|
|
) { |
|
|
|
) { |
|
|
|
Some(( |
|
|
|
Ok(( |
|
|
|
Variable::new_unchecked(variable.value()), |
|
|
|
Variable::new_unchecked(variable.value()), |
|
|
|
value.into_owned(), |
|
|
|
value.into_owned(), |
|
|
|
)) |
|
|
|
)) |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
None |
|
|
|
Err(anyhow!("Invalid rs:binding: {}", binding)) |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
None |
|
|
|
Err(anyhow!("Invalid rs:binding: {}", object)) |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
}) |
|
|
|
.collect::<Vec<_>>(); |
|
|
|
.collect::<Result<Vec<_>>>()?; |
|
|
|
bindings.sort_by(|(a, _), (b, _)| a.cmp(b)); |
|
|
|
bindings.sort_by(|(a, _), (b, _)| a.cmp(b)); |
|
|
|
let index = graph |
|
|
|
let index = graph |
|
|
|
.object_for_subject_predicate(solution, rs::INDEX) |
|
|
|
.object_for_subject_predicate(solution, rs::INDEX) |
|
|
|
.and_then(|object| { |
|
|
|
.map(|object| { |
|
|
|
if let TermRef::Literal(l) = object { |
|
|
|
if let TermRef::Literal(l) = object { |
|
|
|
u64::from_str(l.value()).ok() |
|
|
|
Ok(u64::from_str(l.value())?) |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
None |
|
|
|
Err(anyhow!("Invalid rs:index: {}", object)) |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}) |
|
|
|
Some((bindings, index)) |
|
|
|
.transpose()?; |
|
|
|
|
|
|
|
Ok((bindings, index)) |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
None |
|
|
|
Err(anyhow!("Invalid rs:solution: {}", object)) |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
}) |
|
|
|
.collect(); |
|
|
|
.collect::<Result<Vec<_>>>()?; |
|
|
|
solutions.sort_by(|(_, index_a), (_, index_b)| index_a.cmp(index_b)); |
|
|
|
solutions.sort_by(|(_, index_a), (_, index_b)| index_a.cmp(index_b)); |
|
|
|
|
|
|
|
|
|
|
|
let ordered = solutions.iter().all(|(_, index)| index.is_some()); |
|
|
|
let ordered = solutions.iter().all(|(_, index)| index.is_some()); |
|
|
|
|
|
|
|
|
|
|
|
StaticQueryResults::Solutions { |
|
|
|
Ok(StaticQueryResults::Solutions { |
|
|
|
variables, |
|
|
|
variables, |
|
|
|
solutions: solutions |
|
|
|
solutions: solutions |
|
|
|
.into_iter() |
|
|
|
.into_iter() |
|
|
|
.map(|(solution, _)| solution) |
|
|
|
.map(|(solution, _)| solution) |
|
|
|
.collect(), |
|
|
|
.collect(), |
|
|
|
ordered, |
|
|
|
ordered, |
|
|
|
} |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
graph.canonicalize(); |
|
|
|
graph.canonicalize(); |
|
|
|
StaticQueryResults::Graph(graph) |
|
|
|
Ok(StaticQueryResults::Graph(graph)) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|