diff -r c397819f2482 -r 1e73a466aa69 server/msplanner.py --- a/server/msplanner.py Thu Jun 17 12:13:38 2010 +0200 +++ b/server/msplanner.py Thu Jun 17 14:43:16 2010 +0200 @@ -96,7 +96,7 @@ from rql.stmts import Union, Select from rql.nodes import (VariableRef, Comparison, Relation, Constant, Variable, - Not, Exists) + Not, Exists, SortTerm, Function) from cubicweb import server from cubicweb.utils import make_uid @@ -1330,6 +1330,12 @@ orderby.append) if orderby: newroot.set_orderby(orderby) + elif rqlst.orderby: + for sortterm in rqlst.orderby: + if any(f for f in sortterm.iget_nodes(Function) if f.name == 'FTIRANK'): + newnode, oldnode = sortterm.accept(self, newroot, terms) + if newnode is not None: + newroot.add_sort_term(newnode) self.process_selection(newroot, terms, rqlst) elif not newroot.where: # no restrictions have been copied, just select terms and add @@ -1530,12 +1536,38 @@ copy.operator = '=' return copy, node + def visit_function(self, node, newroot, terms): + if node.name == 'FTIRANK': + # FTIRANK is somewhat special... Rank function should be included in + # the same query has the has_text relation, potentially added to + # selection for latter usage + if not self.hasaggrstep and self.final and node not in self.skip: + return self.visit_default(node, newroot, terms) + elif any(s for s in self.sources if s.uri != 'system'): + return None, node + # p = node.parent + # while p is not None and not isinstance(p, SortTerm): + # p = p.parent + # if isinstance(p, SortTerm): + if not self.hasaggrstep and self.final and node in self.skip: + return Constant(self.skip[node], 'Int'), node + # XXX only if not yet selected + newroot.append_selected(node.copy(newroot)) + self.skip[node] = len(newroot.selection) + return None, node + return self.visit_default(node, newroot, terms) + def visit_default(self, node, newroot, terms): subparts, node = self._visit_children(node, newroot, terms) return copy_node(newroot, node, subparts), node - visit_mathexpression = visit_constant = visit_function = visit_default - visit_sort = visit_sortterm = visit_default + visit_mathexpression = visit_constant = visit_default + + def visit_sortterm(self, node, newroot, terms): + subparts, node = self._visit_children(node, newroot, terms) + if not subparts: + return None, node + return copy_node(newroot, node, subparts), node def _visit_children(self, node, newroot, terms): subparts = []