diff options
Diffstat (limited to 'rdflib')
| -rw-r--r-- | rdflib/plugins/sparql/algebra.py | 4 | ||||
| -rw-r--r-- | rdflib/plugins/sparql/evaluate.py | 36 | ||||
| -rw-r--r-- | rdflib/plugins/sparql/parserutils.py | 3 |
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) |
