From 47e2930114811d27a1c4e1a337e310f74f282048 Mon Sep 17 00:00:00 2001 From: Jerven bolleman Date: Wed, 4 Mar 2020 20:57:51 +0100 Subject: [PATCH] Working on #955 Parsing passes, now into the algebra --- rdflib/plugins/sparql/algebra.py | 17 ++++++++--- rdflib/plugins/sparql/parser.py | 5 ++-- test/test_sparql_star.py | 50 ++++++++++++++++++++------------ 3 files changed, 48 insertions(+), 24 deletions(-) diff --git a/rdflib/plugins/sparql/algebra.py b/rdflib/plugins/sparql/algebra.py index 5fa445c70..18c9bdc6e 100644 --- a/rdflib/plugins/sparql/algebra.py +++ b/rdflib/plugins/sparql/algebra.py @@ -67,6 +67,8 @@ def Filter(expr, p): def Extend(p, expr, var): return CompValue('Extend', p=p, expr=expr, var=var) +def EmpTP(p, o): + return CompValue('EmpTP', var=o) def Values(res): return CompValue('values', res=res) @@ -133,6 +135,7 @@ def triples(l): l = reduce(lambda x, y: x + y, l) if (len(l) % 3) != 0: raise Exception('these aint triples') + return reorderTriples((l[x], l[x + 1], l[x + 2]) for x in range(0, len(l), 3)) @@ -307,7 +310,8 @@ def translateGroupGraphPattern(graphPattern): G = Join(p1=G, p2=p) elif p.name == 'Bind': G = Extend(G, p.expr, p.var) - + elif p.name == "EmpTP": + G = Project(p, p.o) else: raise Exception('Unknown part in GroupGraphPattern: %s - %s' % (type(p), p.name)) @@ -342,9 +346,11 @@ def _traverse(e, visitPre=lambda n: None, visitPost=lambda n: None): return tuple([_traverse(x, visitPre, visitPost) for x in e]) elif isinstance(e, CompValue): - for k, val in e.items(): - e[k] = _traverse(val, visitPre, visitPost) - + if e.name != 'EmpTP': + for k, val in e.items(): + e[k] = _traverse(val, visitPre, visitPost) + else: + raise Exception("Sparql star not tied into the algebra jet") _e = visitPost(e) if _e is not None: return _e @@ -682,6 +688,9 @@ def translatePrologue(p, base, initNs=None, prologue=None): return prologue +def translateEmbTP(u): + return u + def translateQuads(quads): if quads.triples: alltriples = triples(quads.triples) diff --git a/rdflib/plugins/sparql/parser.py b/rdflib/plugins/sparql/parser.py index 6a9d47fe6..20553fe32 100644 --- a/rdflib/plugins/sparql/parser.py +++ b/rdflib/plugins/sparql/parser.py @@ -24,7 +24,7 @@ import rdflib -DEBUG = False +DEBUG = True # ---------------- ACTIONS @@ -431,8 +431,9 @@ def _hexExpand(match): # [104] GraphNode ::= VarOrTerm | TriplesNode GraphNode = VarOrTerm | TriplesNode +#Should be recursive but it is not yet so VarOrBlankNodeOrIriOrLitOrEmbTP = Var | BlankNode | iri | RDFLiteral | NumericLiteral | BooleanLiteral -EmbTP = Suppress('<<') + VarOrBlankNodeOrIriOrLitOrEmbTP + Verb + VarOrBlankNodeOrIriOrLitOrEmbTP + Suppress('>>') +EmbTP = Suppress('<<') + Comp('EmpTP',ParamList('s', VarOrBlankNodeOrIriOrLitOrEmbTP) + ParamList('p', Verb) + ParamList('o', VarOrBlankNodeOrIriOrLitOrEmbTP)) + Suppress('>>') VarOrTermOrEmbTP = Var | GraphTerm | EmbTP diff --git a/test/test_sparql_star.py b/test/test_sparql_star.py index 07eb99787..ddaf86c6a 100644 --- a/test/test_sparql_star.py +++ b/test/test_sparql_star.py @@ -1,26 +1,40 @@ from rdflib import Graph +from rdflib.plugins.sparql.parser import VarOrBlankNodeOrIriOrLitOrEmbTP +import pyparsing +import unittest +class SparqlStarTests(unittest.TestCase): -def test_basic_sparql_star_subject(): - g = Graph() - res = g.query('''SELECT * WHERE { -<< ?s ?p ?o >> ?p2 ?o2 . -}''') + @staticmethod + def test_basic_sparql_star_subject(): + g = Graph() + res = g.query('''SELECT * WHERE { + << ?s ?p ?o >> ?p2 ?o2 . + }''') + + @staticmethod + def test_basic_sparql_star_object(): + g = Graph() + res = g.query('''SELECT * WHERE { + ?s ?p << ?s2 ?p2 ?o2 >> . + }''') + @staticmethod + def test_basic_sparql(): + g = Graph() + res = g.query('''SELECT * WHERE { + ?s ?p ?o . + }''') -def test_basic_sparql_star_object(): - g = Graph() - res = g.query('''SELECT * WHERE { -?s ?p << ?s2 ?p2 ?o2 >> . -}''') + @staticmethod + def test_bind_sparql_star(): + g = Graph() + res = g.query('''SELECT * WHERE { BIND(<< ?s2 ?p2 ?o2 >> AS ?b) }''') -def test_basic_sparql(): - g = Graph() - res = g.query('''SELECT * WHERE { - ?s ?p ?o . - }''') + @staticmethod + def test_parser(): + assert VarOrBlankNodeOrIriOrLitOrEmbTP.matches("<>") -def test_bind_sparql_star(): - g = Graph() - res = g.query('''SELECT * WHERE { BIND(<< ?s2 ?p2 ?o2 >> AS ?b) }''') \ No newline at end of file +if __name__ == '__main__': + unittest.main() \ No newline at end of file