diff planemo/lib/python3.7/site-packages/rdflib/plugins/sparql/evalutils.py @ 1:56ad4e20f292 draft

"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author guerler
date Fri, 31 Jul 2020 00:32:28 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/planemo/lib/python3.7/site-packages/rdflib/plugins/sparql/evalutils.py	Fri Jul 31 00:32:28 2020 -0400
@@ -0,0 +1,125 @@
+import collections
+
+from rdflib.term import Variable, Literal, BNode, URIRef
+
+from rdflib.plugins.sparql.operators import EBV
+from rdflib.plugins.sparql.parserutils import Expr, CompValue, value
+from rdflib.plugins.sparql.sparql import SPARQLError, NotBoundError
+
+
+def _diff(a, b, expr):
+    res = set()
+
+    for x in a:
+        if all(not x.compatible(y) or not _ebv(expr, x.merge(y)) for y in b):
+            res.add(x)
+
+    return res
+
+
+def _minus(a, b):
+    for x in a:
+        if all((not x.compatible(y)) or x.disjointDomain(y) for y in b):
+            yield x
+
+
+
+def _join(a, b):
+    for x in a:
+        for y in b:
+            if x.compatible(y):
+                yield x.merge(y)
+
+
+def _ebv(expr, ctx):
+
+    """
+    Return true/false for the given expr
+    Either the expr is itself true/false
+    or evaluates to something, with the given ctx
+
+    an error is false
+    """
+
+    try:
+        return EBV(expr)
+    except SPARQLError:
+        pass
+    if isinstance(expr, Expr):
+        try:
+            return EBV(expr.eval(ctx))
+        except SPARQLError:
+            return False  # filter error == False
+    elif isinstance(expr, CompValue):
+        raise Exception(
+            "Weird - filter got a CompValue without evalfn! %r" % expr)
+    elif isinstance(expr, Variable):
+        try:
+            return EBV(ctx[expr])
+        except:
+            return False
+    return False
+
+
+def _eval(expr, ctx, raise_not_bound_error=True):
+    if isinstance(expr, (Literal, URIRef)):
+        return expr
+    if isinstance(expr, Expr):
+        return expr.eval(ctx)
+    elif isinstance(expr, Variable):
+        try:
+            return ctx[expr]
+        except KeyError:
+            if raise_not_bound_error:
+                raise NotBoundError("Variable %s is not bound" % expr)
+            else:
+                return None
+    elif isinstance(expr, CompValue):
+        raise Exception(
+            "Weird - _eval got a CompValue without evalfn! %r" % expr)
+    else:
+        raise Exception("Cannot eval thing: %s (%s)" % (expr, type(expr)))
+
+
+def _filter(a, expr):
+    for c in a:
+        if _ebv(expr, c):
+            yield c
+
+
+def _fillTemplate(template, solution):
+
+    """
+    For construct/deleteWhere and friends
+
+    Fill a triple template with instantiated variables
+    """
+
+    bnodeMap = collections.defaultdict(BNode)
+    for t in template:
+        s, p, o = t
+
+        _s = solution.get(s)
+        _p = solution.get(p)
+        _o = solution.get(o)
+
+        # instantiate new bnodes for each solution
+        _s, _p, _o = [bnodeMap[x] if isinstance(
+            x, BNode) else y for x, y in zip(t, (_s, _p, _o))]
+
+        if _s is not None and \
+                _p is not None and \
+                _o is not None:
+
+            yield (_s, _p, _o)
+
+def _val(v):
+    """ utilitity for ordering things"""
+    if isinstance(v, Variable):
+        return (0, v)
+    elif isinstance(v, BNode):
+        return (1, v)
+    elif isinstance(v, URIRef):
+        return (2, v)
+    elif isinstance(v, Literal):
+        return (3, v)