From 9af5375dbf52afb0e53911a7b5a0772dd7d55406 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sat, 18 Nov 2023 20:04:08 +0100 Subject: [PATCH] Fix heavy request for getting user maps This was creating a huge INNER JOIN, and is replaced by a UNION cf https://explain.dalibo.com/plan/91af244fg9d1ec21 Also remove the conditional queryset, as now "my maps" is serverd by the dashboard page, so we can only serve public maps on this URL. --- umap/views.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/umap/views.py b/umap/views.py index 824baf4e..593efe92 100644 --- a/umap/views.py +++ b/umap/views.py @@ -205,13 +205,10 @@ class UserMaps(PaginatorMixin, DetailView): return settings.UMAP_MAPS_PER_PAGE_OWNER return settings.UMAP_MAPS_PER_PAGE - def get_map_queryset(self): - return Map.objects if self.is_owner() else Map.public - def get_maps(self): - qs = self.get_map_queryset() - qs = qs.filter(Q(owner=self.object) | Q(editors=self.object)) - return qs.distinct().order_by("-modified_at") + qs = Map.public + qs = qs.filter(owner=self.object).union(qs.filter(editors=self.object)) + return qs.order_by("-modified_at") def get_context_data(self, **kwargs): kwargs.update({"maps": self.paginate(self.get_maps(), self.per_page)}) @@ -225,9 +222,8 @@ class UserStars(UserMaps): template_name = "auth/user_stars.html" def get_maps(self): - qs = self.get_map_queryset() stars = Star.objects.filter(by=self.object).values("map") - qs = qs.filter(pk__in=stars) + qs = Map.public.filter(pk__in=stars) return qs.order_by("-modified_at")