diff -r 00b1b6b906cf -r 97c55baefa0c server/querier.py --- 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