use ll_sparql_parser::{
ast::{AstNode, QueryUnit},
parse_query,
};
use urlencoding::encode;
use crate::server::{configuration::BackendConfiguration, lsp::SparqlEngine};
const HEALTH_CHECK_QUERY: &str = "SELECT * WHERE { VALUES ?x {1} } LIMIT 1";
pub(crate) fn health_check_url(backend: &BackendConfiguration) -> String {
if let Some(url) = &backend.health_check_url {
return url.clone();
}
match backend.engine {
Some(SparqlEngine::QLever) => format!("{}/ping", backend.url.trim_end_matches('/')),
_ => format!("{}?query={}", backend.url, encode(HEALTH_CHECK_QUERY)),
}
}
pub(crate) fn add_limit_offset_to_query(
query: &str,
limit: Option<usize>,
offset: usize,
) -> Option<String> {
if limit.is_none() && offset == 0 {
return None;
}
let syntax_tree = QueryUnit::cast(parse_query(query).0)?;
let select_query = syntax_tree.select_query()?;
let limit_clause = limit.map_or(String::new(), |limit| format!("LIMIT {limit}\n"));
Some(format!(
"{}SELECT * WHERE {{\n{}\n}}\n{}OFFSET {}{}",
&query[0..select_query.syntax().text_range().start().into()],
select_query.text(),
limit_clause,
offset,
&query[select_query.syntax().text_range().end().into()..]
))
}