backport stable
authorSylvain Thénault <sylvain.thenault@logilab.fr>
Thu, 20 Oct 2011 14:20:46 +0200
changeset 7970 83075d897943
parent 7968 92303e2ed77a (current diff)
parent 7969 d43569aaf5d6 (diff)
child 7971 3e51c2a577dd
backport stable
server/session.py
server/test/unittest_session.py
--- a/server/session.py	Tue Oct 18 17:08:05 2011 +0200
+++ b/server/session.py	Thu Oct 20 14:20:46 2011 +0200
@@ -62,6 +62,18 @@
         description.append(term.get_type(solution, args))
     return description
 
+def selection_idx_type(i, rqlst, args):
+    """try to return type of term at index `i` of the rqlst's selection"""
+    for select in rqlst.children:
+        term = select.selection[i]
+        for solution in select.solutions:
+            try:
+                ttype = term.get_type(solution, args)
+                if ttype is not None:
+                    return ttype
+            except CoercionError:
+                return None
+
 @objectify_selector
 def is_user_session(cls, req, **kwargs):
     """repository side only selector returning 1 if the session is a regular
@@ -1157,20 +1169,13 @@
         unstables = rqlst.get_variable_indices()
         basedescr = []
         todetermine = []
-        sampleselect = rqlst.children[0]
-        samplesols = sampleselect.solutions[0]
-        for i, term in enumerate(sampleselect.selection):
-            try:
-                ttype = term.get_type(samplesols, args)
-            except CoercionError:
+        for i in xrange(len(rqlst.children[0].selection)):
+            ttype = selection_idx_type(i, rqlst, args)
+            if ttype is None or ttype == 'Any':
                 ttype = None
                 isfinal = True
             else:
-                if ttype is None or ttype == 'Any':
-                    ttype = None
-                    isfinal = True
-                else:
-                    isfinal = ttype in BASE_TYPES
+                isfinal = ttype in BASE_TYPES
             if ttype is None or i in unstables:
                 basedescr.append(None)
                 todetermine.append( (i, isfinal) )
--- a/server/test/unittest_session.py	Tue Oct 18 17:08:05 2011 +0200
+++ b/server/test/unittest_session.py	Thu Oct 20 14:20:46 2011 +0200
@@ -88,7 +88,7 @@
         self.assertEqual(session.disabled_hook_categories, set())
         self.assertEqual(session.enabled_hook_categories, set())
 
-    def test_build_descr(self):
+    def test_build_descr1(self):
         rset = self.execute('(Any U,L WHERE U login L) UNION (Any G,N WHERE G name N, G is CWGroup)')
         orig_length = len(rset)
         rset.rows[0][0] = 9999999
@@ -97,6 +97,18 @@
         self.assertEqual(len(rset.rows), orig_length - 1)
         self.assertFalse(rset.rows[0][0] == 9999999)
 
+    def test_build_descr2(self):
+        rset = self.execute('Any X,Y WITH X,Y BEING ((Any G,NULL WHERE G is CWGroup) UNION (Any U,G WHERE U in_group G))')
+        for x, y in rset.description:
+            if y is not None:
+                self.assertEqual(y, 'CWGroup')
+
+    def test_build_descr3(self):
+        rset = self.execute('(Any G,NULL WHERE G is CWGroup) UNION (Any U,G WHERE U in_group G)')
+        for x, y in rset.description:
+            if y is not None:
+                self.assertEqual(y, 'CWGroup')
+
 
 if __name__ == '__main__':
     unittest_main()