diff --git a/src/sparql/algebra.rs b/src/sparql/algebra.rs index 9b328fc1..eb6561ce 100644 --- a/src/sparql/algebra.rs +++ b/src/sparql/algebra.rs @@ -785,6 +785,15 @@ impl From for MultiSetPattern { } } +impl From for MultiSetPattern { + fn from(pattern: ListPattern) -> Self { + match pattern { + ListPattern::ToList(pattern) => pattern, + pattern => MultiSetPattern::ToMultiSet(Box::new(pattern)), + } + } +} + struct SparqlMultiSetPattern<'a>(&'a MultiSetPattern); impl<'a> fmt::Display for SparqlMultiSetPattern<'a> { @@ -874,6 +883,21 @@ pub enum ListPattern { Slice(Box, usize, usize), } +impl Default for ListPattern { + fn default() -> Self { + ListPattern::Data(Vec::default()) + } +} + +impl From for ListPattern { + fn from(pattern: MultiSetPattern) -> Self { + match pattern { + MultiSetPattern::ToMultiSet(pattern) => *pattern, + pattern => ListPattern::ToList(pattern), + } + } +} + impl fmt::Display for ListPattern { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { @@ -1000,20 +1024,20 @@ pub enum Query { SelectQuery { selection: Selection, dataset: Dataset, - filter: MultiSetPattern, + filter: ListPattern, }, ConstructQuery { construct: Vec, dataset: Dataset, - filter: MultiSetPattern, + filter: ListPattern, }, DescribeQuery { dataset: Dataset, - filter: MultiSetPattern, + filter: ListPattern, }, AskQuery { dataset: Dataset, - filter: MultiSetPattern, + filter: ListPattern, }, } @@ -1029,7 +1053,7 @@ impl fmt::Display for Query { "SELECT {} {} WHERE {{ {} }}", selection, dataset, - SparqlMultiSetPattern(&filter) + SparqlListPattern(&filter) ), Query::ConstructQuery { construct, @@ -1044,19 +1068,19 @@ impl fmt::Display for Query { .collect::>() .join(" . "), dataset, - SparqlMultiSetPattern(&filter) + SparqlListPattern(&filter) ), Query::DescribeQuery { dataset, filter } => write!( f, "DESCRIBE {} WHERE {{ {} }}", dataset, - SparqlMultiSetPattern(&filter) + SparqlListPattern(&filter) ), Query::AskQuery { dataset, filter } => write!( f, "ASK {} WHERE {{ {} }}", dataset, - SparqlMultiSetPattern(&filter) + SparqlListPattern(&filter) ), } } diff --git a/src/sparql/sparql_grammar.rustpeg b/src/sparql/sparql_grammar.rustpeg index 75aa466e..a29d49c3 100644 --- a/src/sparql/sparql_grammar.rustpeg +++ b/src/sparql/sparql_grammar.rustpeg @@ -81,7 +81,7 @@ ConstructQuery -> Query = Query::ConstructQuery { construct: c.clone(), dataset: d, - filter: MultiSetPattern::BGP(c.into_iter().map(|p| PropertyPathPattern::from(p)).collect()) + filter: MultiSetPattern::BGP(c.into_iter().map(|p| PropertyPathPattern::from(p)).collect()).into() } } @@ -91,7 +91,7 @@ ConstructQuery_optional_triple_template -> Vec = TriplesTemplate DescribeQuery -> Query = "DESCRIBE"i _ ('*' / (VarOrIri _)+) _ d:DatasetClauses f:WhereClause? _ SolutionModifier { Query::DescribeQuery { dataset: d, - filter: f.unwrap_or_else(MultiSetPattern::default) + filter: f.unwrap_or_else(ListPattern::default) } } @@ -123,7 +123,9 @@ NamedGraphClause -> Dataset = "NAMED"i _ s:SourceSelector { SourceSelector -> NamedNode = iri //[17] -WhereClause -> MultiSetPattern = "WHERE"i? _ p:GroupGraphPattern { p } +WhereClause -> ListPattern = "WHERE"i? _ p:GroupGraphPattern { + p.into() +} //[18] SolutionModifier -> () = GroupClause? _ HavingClause? _ OrderClause? _ LimitOffsetClauses? @@ -255,7 +257,7 @@ InlineData -> PartialGraphPattern = "VALUES"i _ p:DataBlock { PartialGraphPatter //[62] DataBlock -> MultiSetPattern = l:(InlineDataOneVar / InlineDataFull) { - MultiSetPattern::ToMultiSet(Box::new(ListPattern::Data(l))) + ListPattern::Data(l).into() } //[63]