summaryrefslogtreecommitdiff
path: root/rdflib
diff options
context:
space:
mode:
Diffstat (limited to 'rdflib')
-rw-r--r--rdflib/plugins/sparql/algebra.py4
-rw-r--r--rdflib/plugins/sparql/evaluate.py36
-rw-r--r--rdflib/plugins/sparql/parserutils.py3
3 files changed, 35 insertions, 8 deletions
diff --git a/rdflib/plugins/sparql/algebra.py b/rdflib/plugins/sparql/algebra.py
index fcaac02d..099594a3 100644
--- a/rdflib/plugins/sparql/algebra.py
+++ b/rdflib/plugins/sparql/algebra.py
@@ -63,6 +63,8 @@ def Filter(expr, p):
def Extend(p, expr, var):
return CompValue('Extend', p=p, expr=expr, var=var)
+def Values(res):
+ return CompValue('values', res=res)
def Project(p, PV):
return CompValue('Project', p=p, PV=PV)
@@ -511,7 +513,7 @@ def translateValues(v):
for vals in v.value:
res.append(dict(zip(v.var, vals)))
- return CompValue('values', res=res)
+ return Values(res)
def translate(q):
diff --git a/rdflib/plugins/sparql/evaluate.py b/rdflib/plugins/sparql/evaluate.py
index 948077be..cec3451a 100644
--- a/rdflib/plugins/sparql/evaluate.py
+++ b/rdflib/plugins/sparql/evaluate.py
@@ -26,7 +26,7 @@ from rdflib.plugins.sparql.evalutils import (
_filter, _eval, _join, _diff, _minus, _fillTemplate, _ebv)
from rdflib.plugins.sparql.aggregates import evalAgg
-
+from rdflib.plugins.sparql.algebra import Join, ToMultiSet, Values
def evalBGP(ctx, bgp):
@@ -410,16 +410,38 @@ def evalQuery(graph, query, initBindings, base=None):
ctx.prologue = query.prologue
+ main = query.algebra
+
if initBindings:
- for k, v in initBindings.iteritems():
+ # add initBindings as a values clause
+
+ values = {} # no dict comprehension in 2.6 :(
+ for k,v in initBindings.iteritems():
if not isinstance(k, Variable):
k = Variable(k)
- ctx[k] = v
- # ctx.push() # nescessary?
+ values[k] = v
+
+ main = main.clone() # clone to not change prepared q
+ main['p'] = main.p.clone()
+ # Find the right place to insert MultiSet join
+ repl = main.p
+ if repl.name == 'Slice':
+ repl['p'] = repl.p.clone()
+ repl = repl.p
+ if repl.name == 'Distinct':
+ repl['p'] = repl.p.clone()
+ repl = repl.p
+ if repl.p.name == 'OrderBy':
+ repl['p'] = repl.p.clone()
+ repl = repl.p
+ if repl.p.name == 'Extend':
+ repl['p'] = repl.p.clone()
+ repl = repl.p
+
+ repl['p'] = Join(repl.p, ToMultiSet(Values([values])))
+
+ # TODO: Vars?
- main = query.algebra
-
- # import pdb; pdb.set_trace()
if main.datasetClause:
if ctx.dataset is None:
raise Exception(
diff --git a/rdflib/plugins/sparql/parserutils.py b/rdflib/plugins/sparql/parserutils.py
index 233e88e8..b5c25600 100644
--- a/rdflib/plugins/sparql/parserutils.py
+++ b/rdflib/plugins/sparql/parserutils.py
@@ -147,6 +147,9 @@ class CompValue(OrderedDict):
self.name = name
self.update(values)
+ def clone(self):
+ return CompValue(self.name, **self)
+
def __str__(self):
return self.name + "_" + OrderedDict.__str__(self)