Fixes SPARQL parser property path parsing performance

The current behavior was 4^n with n the number of parentheses in the expression
pull/190/head
Tpt 3 years ago
parent 986e90845a
commit 12c297425a
  1. 18
      lib/spargebra/src/parser.rs
  2. 10
      testsuite/oxigraph-tests/sparql/manifest.ttl
  3. 4
      testsuite/oxigraph-tests/sparql/nested_expression.rq
  4. 3
      testsuite/oxigraph-tests/sparql/nested_path.rq

@ -1694,11 +1694,19 @@ parser! {
rule PathSequence_item() -> PropertyPathExpression = p:PathEltOrInverse() _ { p } rule PathSequence_item() -> PropertyPathExpression = p:PathEltOrInverse() _ { p }
//[91] //[91]
rule PathElt() -> PropertyPathExpression = rule PathElt() -> PropertyPathExpression = p:PathPrimary() _ o:PathElt_op()? {
p:PathPrimary() "?" { PropertyPathExpression::ZeroOrOne(Box::new(p)) } / //TODO: allow space before "?" match o {
p:PathPrimary() _ "*" { PropertyPathExpression::ZeroOrMore(Box::new(p)) } / Some('?') => PropertyPathExpression::ZeroOrOne(Box::new(p)),
p:PathPrimary() _ "+" { PropertyPathExpression::OneOrMore(Box::new(p)) } / Some('*') => PropertyPathExpression::ZeroOrMore(Box::new(p)),
PathPrimary() Some('+') => PropertyPathExpression::OneOrMore(Box::new(p)),
Some(_) => unreachable!(),
None => p
}
}
rule PathElt_op() -> char =
"*" { '*' } /
"+" { '+' } /
"?" !(['0'..='9'] / PN_CHARS_U()) { '?' } // We mandate that this is not a variable
//[92] //[92]
rule PathEltOrInverse() -> PropertyPathExpression = rule PathEltOrInverse() -> PropertyPathExpression =

@ -23,6 +23,8 @@
:subquery_in_filter_not_exists :subquery_in_filter_not_exists
:cmp_langString :cmp_langString
:update_dirtyRead :update_dirtyRead
:nested_path
:nested_expression
) . ) .
:small_unicode_escape_with_multibytes_char rdf:type mf:NegativeSyntaxTest ; :small_unicode_escape_with_multibytes_char rdf:type mf:NegativeSyntaxTest ;
@ -98,3 +100,11 @@
mf:name "An update operation should not be able to read its own writes" ; mf:name "An update operation should not be able to read its own writes" ;
mf:action [ ut:request <update_dirtyRead.ru> ] ; mf:action [ ut:request <update_dirtyRead.ru> ] ;
mf:result [ ut:data <update_dirty_read_result.ttl> ] . mf:result [ ut:data <update_dirty_read_result.ttl> ] .
:nested_path rdf:type mf:PositiveSyntaxTest11 ;
mf:name "A very nested property path" ;
mf:action <nested_path.rq> .
:nested_expression rdf:type mf:PositiveSyntaxTest11 ;
mf:name "A very nested expression" ;
mf:action <nested_expression.rq> .

@ -0,0 +1,4 @@
SELECT * WHERE {
?s ?p ?o .
FILTER((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((true))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
}

@ -0,0 +1,3 @@
SELECT * WHERE {
?s ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((<http://example.com>)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ?o
}
Loading…
Cancel
Save