[rql2sql] closes #1697862: ORDERBY SUM(C) cancel GROUPBY by wrongly adding C to grouped variables
--- a/server/sources/rql2sql.py Mon May 23 13:24:54 2011 +0200
+++ b/server/sources/rql2sql.py Tue May 24 08:49:58 2011 +0200
@@ -72,7 +72,9 @@
stack.append(self.source_execute)
FunctionDescr.update_cb_stack = default_update_cb_stack
-LENGTH = SQL_FUNCTIONS_REGISTRY.get_function('LENGTH')
+get_func_descr = SQL_FUNCTIONS_REGISTRY.get_function
+
+LENGTH = get_func_descr('LENGTH')
def length_source_execute(source, session, value):
return len(value.getvalue())
LENGTH.source_execute = length_source_execute
@@ -271,7 +273,9 @@
# when a query is grouped, ensure sort terms are grouped as well
for sortterm in sorts:
term = sortterm.term
- if not isinstance(term, Constant):
+ if not (isinstance(term, Constant) or \
+ (isinstance(term, Function) and
+ get_func_descr(term.name).aggregat)):
for vref in term.iget_nodes(VariableRef):
if not vref in groups:
groups.append(vref)
@@ -308,12 +312,12 @@
break
if not isinstance(node, Function):
raise QueryError()
- func = SQL_FUNCTIONS_REGISTRY.get_function(node.name)
- if func.source_execute is None:
+ funcd = get_func_descr(node.name)
+ if funcd.source_execute is None:
raise QueryError('%s can not be called on mapped attribute'
% node.name)
state.source_cb_funcs.add(node)
- func.update_cb_stack(stack)
+ funcd.update_cb_stack(stack)
# IGenerator implementation for RQL->SQL #######################################
--- a/server/test/unittest_rql2sql.py Mon May 23 13:24:54 2011 +0200
+++ b/server/test/unittest_rql2sql.py Tue May 24 08:49:58 2011 +0200
@@ -536,6 +536,14 @@
'''SELECT _X.cw_eid
FROM cw_CWEType AS _X
WHERE _X.cw_description!=parent AND _X.cw_description!=_X.cw_name'''),
+
+ ('DISTINCT Any X, SUM(C) GROUPBY X ORDERBY SUM(C) DESC WHERE H todo_by X, H duration C',
+ '''SELECT DISTINCT rel_todo_by0.eid_to, SUM(_H.cw_duration)
+FROM cw_Affaire AS _H, todo_by_relation AS rel_todo_by0
+WHERE rel_todo_by0.eid_from=_H.cw_eid
+GROUP BY rel_todo_by0.eid_to
+ORDER BY 2 DESC'''),
+
]
ADVANCED_WITH_GROUP_CONCAT = [