diff --git a/gramps/gen/filters/rules/person/_isrelatedwith.py b/gramps/gen/filters/rules/person/_isrelatedwith.py index 2debae3c3..1ace5c2ac 100644 --- a/gramps/gen/filters/rules/person/_isrelatedwith.py +++ b/gramps/gen/filters/rules/person/_isrelatedwith.py @@ -63,34 +63,42 @@ class IsRelatedWith(Rule): return person.handle in self.relatives - def add_relative(self, person): - """Recursive function that scans relatives and add them to self.relatives""" - if not(person) or person.handle in self.relatives: + def add_relative(self, start): + """Non-recursive function that scans relatives and add them to self.relatives""" + if not(start): return - # Add the relative to the list - self.relatives.append(person.handle) + expand = [start] + relatives = {} + + while expand: + person = expand.pop() + # Add the relative to the list + if person is None or (person.handle in relatives): + continue + relatives[person.handle] = True - for family_handle in person.get_parent_family_handle_list(): - family = self.db.get_family_from_handle(family_handle) - if family: - # Check Parents - for parent_handle in (family.get_father_handle(), family.get_mother_handle()): - if parent_handle: - self.add_relative(self.db.get_person_from_handle(parent_handle)) - # Check Sibilings - for child_ref in family.get_child_ref_list(): - self.add_relative(self.db.get_person_from_handle(child_ref.ref)) - - for family_handle in person.get_family_handle_list(): - family = self.db.get_family_from_handle(family_handle) - if family: - # Check Spouse - for parent_handle in (family.get_father_handle(), family.get_mother_handle()): - if parent_handle: - self.add_relative(self.db.get_person_from_handle(parent_handle)) - # Check Children - for child_ref in family.get_child_ref_list(): - self.add_relative(self.db.get_person_from_handle(child_ref.ref)) - - return + for family_handle in person.get_parent_family_handle_list(): + family = self.db.get_family_from_handle(family_handle) + if family: + # Check Parents + for parent_handle in (family.get_father_handle(), family.get_mother_handle()): + if parent_handle: + expand.append(self.db.get_person_from_handle(parent_handle)) + # Check Sibilings + for child_ref in family.get_child_ref_list(): + expand.append(self.db.get_person_from_handle(child_ref.ref)) + + for family_handle in person.get_family_handle_list(): + family = self.db.get_family_from_handle(family_handle) + if family: + # Check Spouse + for parent_handle in (family.get_father_handle(), family.get_mother_handle()): + if parent_handle: + expand.append(self.db.get_person_from_handle(parent_handle)) + # Check Children + for child_ref in family.get_child_ref_list(): + expand.append(self.db.get_person_from_handle(child_ref.ref)) + + self.relatives = list(relatives.keys()) + return