cubicweb/rqlrewrite.py
changeset 12174 02b8325720d6
parent 12089 54b518367617
child 12175 c0ceadfc8aee
--- a/cubicweb/rqlrewrite.py	Wed Apr 19 09:05:10 2017 +0200
+++ b/cubicweb/rqlrewrite.py	Fri Apr 21 09:57:04 2017 +0200
@@ -649,6 +649,10 @@
         # the snippet has introduced some ambiguities, we have to resolve them
         # "manually"
         variantes = self.build_variantes(newsolutions)
+        # if all ambiguities have been generated by variables within a "NOT
+        # EXISTS()#" or with type explicitly specified, we've nothing to change
+        if not variantes:
+            return newsolutions
         # insert "is" where necessary
         varexistsmap = {}
         self.removing_ambiguity = True
@@ -680,21 +684,32 @@
         variantes = set()
         for sol in newsolutions:
             variante = []
-            for key, newvar in self.rewritten.items():
-                variante.append((key, sol[newvar]))
-            variantes.add(tuple(variante))
-        # rebuild variantes as dict
-        variantes = [dict(v) for v in variantes]
-        # remove variable which have always the same type
-        for key in self.rewritten:
-            it = iter(variantes)
-            etype = next(it)[key]
-            for variante in it:
-                if variante[key] != etype:
-                    break
-            else:
-                for variante in variantes:
-                    del variante[key]
+            for key, var_name in self.rewritten.items():
+                var = self.select.defined_vars[var_name]
+                # skip variable which are only in a NOT EXISTS
+                if len(var.stinfo['relations']) == 1 and isinstance(var.scope.parent, n.Not):
+                    continue
+                # skip variable whose type is already explicitly specified
+                if var.stinfo['typerel']:
+                    continue
+                variante.append((key, sol[var_name]))
+            if variante:
+                variantes.add(tuple(variante))
+
+        if variantes:
+            # rebuild variantes as dict
+            variantes = [dict(v) for v in variantes]
+            # remove variable which have always the same type
+            for key in self.rewritten:
+                it = iter(variantes)
+                etype = next(it)[key]
+                for variante in it:
+                    if variante[key] != etype:
+                        break
+                else:
+                    for variante in variantes:
+                        del variante[key]
+
         return variantes
 
     def _cleanup_inserted(self, node):