--- 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):