cubicweb/rqlrewrite.py
changeset 12174 02b8325720d6
parent 12089 54b518367617
child 12175 c0ceadfc8aee
equal deleted inserted replaced
12173:d13fc09301bd 12174:02b8325720d6
   647 
   647 
   648     def remove_ambiguities(self, snippets, newsolutions):
   648     def remove_ambiguities(self, snippets, newsolutions):
   649         # the snippet has introduced some ambiguities, we have to resolve them
   649         # the snippet has introduced some ambiguities, we have to resolve them
   650         # "manually"
   650         # "manually"
   651         variantes = self.build_variantes(newsolutions)
   651         variantes = self.build_variantes(newsolutions)
       
   652         # if all ambiguities have been generated by variables within a "NOT
       
   653         # EXISTS()#" or with type explicitly specified, we've nothing to change
       
   654         if not variantes:
       
   655             return newsolutions
   652         # insert "is" where necessary
   656         # insert "is" where necessary
   653         varexistsmap = {}
   657         varexistsmap = {}
   654         self.removing_ambiguity = True
   658         self.removing_ambiguity = True
   655         for (erqlexpr, varmap, oldvarname), etype in variantes[0].items():
   659         for (erqlexpr, varmap, oldvarname), etype in variantes[0].items():
   656             varname = self.rewritten[(erqlexpr, varmap, oldvarname)]
   660             varname = self.rewritten[(erqlexpr, varmap, oldvarname)]
   678 
   682 
   679     def build_variantes(self, newsolutions):
   683     def build_variantes(self, newsolutions):
   680         variantes = set()
   684         variantes = set()
   681         for sol in newsolutions:
   685         for sol in newsolutions:
   682             variante = []
   686             variante = []
   683             for key, newvar in self.rewritten.items():
   687             for key, var_name in self.rewritten.items():
   684                 variante.append((key, sol[newvar]))
   688                 var = self.select.defined_vars[var_name]
   685             variantes.add(tuple(variante))
   689                 # skip variable which are only in a NOT EXISTS
   686         # rebuild variantes as dict
   690                 if len(var.stinfo['relations']) == 1 and isinstance(var.scope.parent, n.Not):
   687         variantes = [dict(v) for v in variantes]
   691                     continue
   688         # remove variable which have always the same type
   692                 # skip variable whose type is already explicitly specified
   689         for key in self.rewritten:
   693                 if var.stinfo['typerel']:
   690             it = iter(variantes)
   694                     continue
   691             etype = next(it)[key]
   695                 variante.append((key, sol[var_name]))
   692             for variante in it:
   696             if variante:
   693                 if variante[key] != etype:
   697                 variantes.add(tuple(variante))
   694                     break
   698 
   695             else:
   699         if variantes:
   696                 for variante in variantes:
   700             # rebuild variantes as dict
   697                     del variante[key]
   701             variantes = [dict(v) for v in variantes]
       
   702             # remove variable which have always the same type
       
   703             for key in self.rewritten:
       
   704                 it = iter(variantes)
       
   705                 etype = next(it)[key]
       
   706                 for variante in it:
       
   707                     if variante[key] != etype:
       
   708                         break
       
   709                 else:
       
   710                     for variante in variantes:
       
   711                         del variante[key]
       
   712 
   698         return variantes
   713         return variantes
   699 
   714 
   700     def _cleanup_inserted(self, node):
   715     def _cleanup_inserted(self, node):
   701         # cleanup inserted variable references
   716         # cleanup inserted variable references
   702         removed = set()
   717         removed = set()