From ee9f89a87d9dd44ddcbec3e19842ef5322588525 Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Sat, 5 Nov 2022 21:43:49 +0100 Subject: [PATCH] Tagable: Implement tag_hierachy & all_tags separately Other implementation of all_tags makes it much, much faster --- server/entertainment_decider/models.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/server/entertainment_decider/models.py b/server/entertainment_decider/models.py index 3dd48bd..56d1377 100644 --- a/server/entertainment_decider/models.py +++ b/server/entertainment_decider/models.py @@ -217,7 +217,7 @@ class Tagable: return self.assigned_tags | self.inherited_tags @property - def __tag_hierachy(self) -> Tuple[TagRootElement, Set[Tag]]: + def tag_hierachy(self) -> TagRootElement: root = TagRootElement( base=self, children=[TagTreeElement(tag) for tag in self.direct_tags], @@ -232,15 +232,18 @@ class Tagable: cur.children.append(elem) stack.append(elem) used.add(tag) - return root, used - - @property - def tag_hierachy(self) -> TagRootElement: - return self.__tag_hierachy[0] + return root @property def all_tags(self) -> Set[Tag]: - return self.__tag_hierachy[1] + queue: List[Tag] = list(self.direct_tags) + used: Set[Tag] = set(queue) + while queue: + tag = queue.pop(0) + new_tags = tag.super_tags - used + queue.extend(new_tags) + used |= new_tags + return used T_tagged = TypeVar("T_tagged", bound=Tagable)