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