grammar;
use crate::sparql_data::SelectClause;
use crate::sparql_data::SparqlQuery;
use crate::sparql_data::TriplePattern;
use crate::sparql_data::Variable;
pub Query: SparqlQuery = {
"SELECT" <select_cl:SelectClause> "WHERE" "{" <triples_bl:TriplesBlock> "}" =>
SparqlQuery { select_clause: select_cl, triples_block: triples_bl },
};
SelectClause: SelectClause = {
"DISTINCT" <vars:Variables> =>
SelectClause { distinct: true, variables: vars },
};
Variables: Vec<Variable> = {
<v:Variable+> => v,
};
Variable: Variable = {
"<" <sparql_iri:SPARQL_IRI> ">" => Variable::IRI(sparql_iri),
"?" <sparql_var:SPARQL_VAR> => Variable::Var(sparql_var),
};
TriplesBlock: Vec<TriplePattern> = {
<pat:TriplePattern+> => pat,
};
TriplePattern: TriplePattern = {
<s:Variable> <p:SPARQL_IRI> <o:Variable> ("."?) =>
TriplePattern { subject: s, predicate: p, object: o },
};
// This will parse SPARQL variables like "?s", "?metric", "?appname"
SPARQL_VAR: String = <v:r"[a-zA-Z_][a-zA-Z0-9_]*"> => v.to_string();
// This will parse SPARQL IRI references enclosed in angle brackets
SPARQL_IRI: String = <i:r"<http://[^\s<>]+>"> => i[1..i.len()-1].to_string();