--- a/server/rqlannotation.py Wed Jan 20 11:23:27 2010 +0100
+++ b/server/rqlannotation.py Wed Jan 20 11:29:58 2010 +0100
@@ -189,7 +189,6 @@
return rel
principal = rel
if principal is None:
- print iter(relations).next().root
raise BadRQLQuery('unable to find principal in %s' % ', '.join(
r.as_string() for r in relations))
return principal
@@ -310,7 +309,7 @@
# apply relation restriction
self.maydeambrels = maydeambrels = {}
for rel in rqlst.iget_nodes(Relation):
- if rel.is_types_restriction() or rel.r_type == 'eid':
+ if rel.r_type == 'eid' or rel.is_types_restriction():
continue
lhs, rhs = rel.get_variable_parts()
if isinstance(lhs, VariableRef) or isinstance(rhs, VariableRef):
@@ -366,6 +365,10 @@
# we know variable won't be invariant, try to use
# it to deambguify the current variable
otheretypes = self.varsols[deambiguifier]
+ if not deambiguifier.stinfo['typerels']:
+ # if deambiguifier has no type restriction using 'is',
+ # don't record it
+ deambiguifier = None
elif isinstance(other, Constant) and other.uidtype:
otheretypes = (other.uidtype,)
deambiguifier = None
@@ -381,9 +384,8 @@
for otheretype in otheretypes:
reltypes = frozenset(rtypefunc(otheretype))
if var.stinfo['possibletypes'] != reltypes:
- break
- else:
- self.restrict(var, var.stinfo['possibletypes'])
- self.deambification_map[var] = deambiguifier
- return True
+ return False
+ self.restrict(var, var.stinfo['possibletypes'])
+ self.deambification_map[var] = deambiguifier
+ return True
return False
--- a/server/sources/rql2sql.py Wed Jan 20 11:23:27 2010 +0100
+++ b/server/sources/rql2sql.py Wed Jan 20 11:29:58 2010 +0100
@@ -1212,13 +1212,13 @@
def _update_outer_tables(self, table, actualtables, oldalias, newalias):
actualtables.remove(oldalias)
actualtables.append(newalias)
+ self._state.outer_tables[table] = newalias
# some tables which have already been used as outer table and replaced
# by <oldalias> may not be reused here, though their associated value
# in the outer_tables dict has to be updated as well
for table, outerexpr in self._state.outer_tables.iteritems():
if outerexpr == oldalias:
self._state.outer_tables[table] = newalias
- self._state.outer_tables[table] = newalias
def _var_table(self, var):
var.accept(self)#.visit_variable(var)
--- a/server/test/unittest_rql2sql.py Wed Jan 20 11:23:27 2010 +0100
+++ b/server/test/unittest_rql2sql.py Wed Jan 20 11:29:58 2010 +0100
@@ -1581,9 +1581,12 @@
FROM (SELECT 1) AS _T
WHERE EXISTS(SELECT 1 FROM owned_by_relation AS rel_owned_by0, cw_Affaire AS _P WHERE rel_owned_by0.eid_from=_P.cw_eid AND rel_owned_by0.eid_to=1 UNION SELECT 1 FROM owned_by_relation AS rel_owned_by1, cw_Note AS _P WHERE rel_owned_by1.eid_from=_P.cw_eid AND rel_owned_by1.eid_to=1)''')
- def test_groupby_multiple_outerjoins(self):
- self._check('Any A,U,P,group_concat(TN) GROUPBY A,U,P WHERE A is Affaire, A concerne N, N todo_by U?, T? tags A, T name TN, A todo_by P?',
- "SHOULD NOT CRASH")
+ def test_groupby_multiple_outerjoins(self):
+ self._check('Any A,U,P,group_concat(TN) GROUPBY A,U,P WHERE A is Affaire, A concerne N, N todo_by U?, T? tags A, T name TN, A todo_by P?',
+ '''SELECT _A.cw_eid, rel_todo_by1.eid_to, rel_todo_by3.eid_to, GROUP_CONCAT(_T.cw_name)
+FROM concerne_relation AS rel_concerne0, cw_Affaire AS _A LEFT OUTER JOIN tags_relation AS rel_tags2 ON (rel_tags2.eid_to=_A.cw_eid) LEFT OUTER JOIN cw_Tag AS _T ON (rel_tags2.eid_from=_T.cw_eid) LEFT OUTER JOIN todo_by_relation AS rel_todo_by3 ON (rel_todo_by3.eid_from=_A.cw_eid), cw_Note AS _N LEFT OUTER JOIN todo_by_relation AS rel_todo_by1 ON (rel_todo_by1.eid_from=_N.cw_eid)
+WHERE rel_concerne0.eid_from=_A.cw_eid AND rel_concerne0.eid_to=_N.cw_eid
+GROUP BY _A.cw_eid,rel_todo_by1.eid_to,rel_todo_by3.eid_to''')
class removeUnsusedSolutionsTC(TestCase):