From 263c874793b19a3a55dc1d8b192b8b2c87d3605c Mon Sep 17 00:00:00 2001 From: Alexander Saprykin Date: Mon, 19 Nov 2018 15:36:52 +0100 Subject: [PATCH] Optimize search API view Eliminate extra SQL queries executed by search API view. --- galaxy/api/views/search.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/galaxy/api/views/search.py b/galaxy/api/views/search.py index fe93c3153..7e319b454 100644 --- a/galaxy/api/views/search.py +++ b/galaxy/api/views/search.py @@ -77,10 +77,26 @@ class ContentSearchView(base.ListAPIView): filter_backends = [filters.OrderByFilter] def get_queryset(self): - return (models.Content.objects.distinct() - .filter( - repository__provider_namespace__namespace__isnull=False, - repository__provider_namespace__namespace__active=True)) + return ( + models.Content.objects.distinct() + .select_related( + 'content_type', + 'namespace', + 'repository', + 'repository__provider_namespace', + 'repository__provider_namespace__namespace', + ) + .prefetch_related( + 'videos', + 'tags', + 'dependencies', + 'platforms', + 'repository__versions', + ) + .filter( + repository__provider_namespace__namespace__isnull=False, + repository__provider_namespace__namespace__active=True) + ) # TODO(cutwater): Use serializer to parse request arguments def list(self, request, *args, **kwargs): @@ -129,8 +145,10 @@ def list(self, request, *args, **kwargs): tags = request.GET.get('tags_autocomplete', '').split() queryset = self.add_tags_filter(queryset, tags) + platforms = request.GET.get('platforms_autocomplete', '').split() queryset = self.add_platforms_filter(queryset, platforms) + namespaces = request.GET.get('username_autocomplete', '').split() queryset = self.add_namespaces_filter(queryset, namespaces)