--- a/server/querier.py Thu Jul 15 12:03:13 2010 +0200
+++ b/server/querier.py Mon Jul 19 15:37:02 2010 +0200
@@ -29,7 +29,8 @@
from logilab.common.compat import any
from rql import RQLSyntaxError
from rql.stmts import Union, Select
-from rql.nodes import Relation, VariableRef, Constant, SubQuery, Exists, Not
+from rql.nodes import (Relation, VariableRef, Constant, SubQuery, Function,
+ Exists, Not)
from cubicweb import Unauthorized, QueryError, UnknownEid, typed_eid
from cubicweb import server
@@ -50,7 +51,8 @@
key = term.as_string()
value = '%s.C%s' % (table, i)
if varmap.get(key, value) != value:
- raise Exception('variable name conflict on %s' % key)
+ raise Exception('variable name conflict on %s: got %s / %s'
+ % (key, value, varmap))
varmap[key] = value
# permission utilities ########################################################
@@ -294,7 +296,26 @@
for term in origselection:
newselect.append_selected(term.copy(newselect))
if select.orderby:
- newselect.set_orderby([s.copy(newselect) for s in select.orderby])
+ sortterms = []
+ for sortterm in select.orderby:
+ sortterms.append(sortterm.copy(newselect))
+ for fnode in sortterm.get_nodes(Function):
+ if fnode.name == 'FTIRANK':
+ # we've to fetch the has_text relation as well
+ var = fnode.children[0].variable
+ rel = iter(var.stinfo['ftirels']).next()
+ assert not rel.ored(), 'unsupported'
+ newselect.add_restriction(rel.copy(newselect))
+ # remove relation from the orig select and
+ # cleanup variable stinfo
+ rel.parent.remove(rel)
+ var.stinfo['ftirels'].remove(rel)
+ var.stinfo['relations'].remove(rel)
+ # XXX not properly re-annotated after security insertion?
+ newvar = newselect.get_variable(var.name)
+ newvar.stinfo.setdefault('ftirels', set()).add(rel)
+ newvar.stinfo.setdefault('relations', set()).add(rel)
+ newselect.set_orderby(sortterms)
_expand_selection(select.orderby, selected, aliases, select, newselect)
select.orderby = () # XXX dereference?
if select.groupby:
@@ -339,6 +360,7 @@
select.set_possible_types(localchecks[()])
add_types_restriction(self.schema, select)
add_noinvariant(noinvariant, restricted, select, nbtrees)
+ self.rqlhelper.annotate(union)
def _check_permissions(self, rqlst):
"""return a dict defining "local checks", e.g. RQLExpression defined in
@@ -571,6 +593,8 @@
# rql parsing / analysing helper
self.solutions = repo.vreg.solutions
rqlhelper = repo.vreg.rqlhelper
+ # set backend on the rql helper, will be used for function checking
+ rqlhelper.backend = repo.config.sources()['system']['db-driver']
self._parse = rqlhelper.parse
self._annotate = rqlhelper.annotate
# rql planner