diff --git a/gramps/gen/filters/rules/person/_isdescendantfamilyof.py b/gramps/gen/filters/rules/person/_isdescendantfamilyof.py index 605f7e044..49777d9c5 100644 --- a/gramps/gen/filters/rules/person/_isdescendantfamilyof.py +++ b/gramps/gen/filters/rules/person/_isdescendantfamilyof.py @@ -82,7 +82,8 @@ class IsDescendantFamilyOf(Rule): while expand: person = expand.pop(0) - if person is None: + if person is None or person.handle in self.matches: + # if we have been here before, skip continue self.matches.add(person.handle) for family_handle in person.get_family_handle_list(): diff --git a/gramps/gen/filters/rules/person/_isdescendantof.py b/gramps/gen/filters/rules/person/_isdescendantof.py index 9b9056aaa..7e7ec7783 100644 --- a/gramps/gen/filters/rules/person/_isdescendantof.py +++ b/gramps/gen/filters/rules/person/_isdescendantof.py @@ -67,7 +67,8 @@ class IsDescendantOf(Rule): return person.handle in self.map def init_list(self, person, first): - if not person: + if not person or person.handle in self.map: + # if we have been here before, skip return if not first: self.map.add(person.handle) diff --git a/gramps/gen/filters/rules/person/_islessthannthgenerationancestorof.py b/gramps/gen/filters/rules/person/_islessthannthgenerationancestorof.py index b95e330d1..847d7294e 100644 --- a/gramps/gen/filters/rules/person/_islessthannthgenerationancestorof.py +++ b/gramps/gen/filters/rules/person/_islessthannthgenerationancestorof.py @@ -61,6 +61,9 @@ class IsLessThanNthGenerationAncestorOf(Rule): queue = [(root_handle, 1)] # generation 1 is root while queue: handle, gen = queue.pop(0) # pop off front of queue + if handle in self.map: + # if we have been here before, skip + continue self.map.add(handle) gen += 1 if gen <= int(self.list[1]): diff --git a/gramps/gen/filters/rules/person/_islessthannthgenerationancestorofbookmarked.py b/gramps/gen/filters/rules/person/_islessthannthgenerationancestorofbookmarked.py index 187f6317d..5e0510cbf 100644 --- a/gramps/gen/filters/rules/person/_islessthannthgenerationancestorofbookmarked.py +++ b/gramps/gen/filters/rules/person/_islessthannthgenerationancestorofbookmarked.py @@ -71,7 +71,8 @@ class IsLessThanNthGenerationAncestorOfBookmarked(Rule): def init_ancestor_list(self, handle, gen): # if p.get_handle() in self.map: # loop_error(self.orig,p) - if not handle: + if not handle or handle in self.map: + # if been here already, skip return if gen: self.map.add(handle) diff --git a/gramps/gen/filters/rules/person/_islessthannthgenerationancestorofdefaultperson.py b/gramps/gen/filters/rules/person/_islessthannthgenerationancestorofdefaultperson.py index 9f2ae9870..cbce57a74 100644 --- a/gramps/gen/filters/rules/person/_islessthannthgenerationancestorofdefaultperson.py +++ b/gramps/gen/filters/rules/person/_islessthannthgenerationancestorofdefaultperson.py @@ -64,7 +64,8 @@ class IsLessThanNthGenerationAncestorOfDefaultPerson(Rule): def init_ancestor_list(self, handle, gen): # if p.get_handle() in self.map: # loop_error(self.orig,p) - if not handle: + if not handle or handle in self.map: + # if we have been here before, skip return if gen: self.map.add(handle) diff --git a/gramps/gen/filters/rules/person/_islessthannthgenerationdescendantof.py b/gramps/gen/filters/rules/person/_islessthannthgenerationdescendantof.py index 74a70e3e5..3d5fb16da 100644 --- a/gramps/gen/filters/rules/person/_islessthannthgenerationdescendantof.py +++ b/gramps/gen/filters/rules/person/_islessthannthgenerationdescendantof.py @@ -65,7 +65,8 @@ class IsLessThanNthGenerationDescendantOf(Rule): return person.handle in self.map def init_list(self,person,gen): - if not person: + if not person or person.handle in self.map: + # if we have been here before, skip return if gen: self.map.add(person.handle)