From 920dbe169b156d764db5c13eae5dba928c6ff388 Mon Sep 17 00:00:00 2001
From: Alexander Pace <alexander.pace@ligo.org>
Date: Tue, 19 Nov 2024 02:05:22 +0000
Subject: [PATCH] improve gwtc query performance

---
 config/settings/base.py         |  2 +-
 gracedb/api/v1/gwtc/viewsets.py | 25 +++++++++++++++++--------
 2 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/config/settings/base.py b/config/settings/base.py
index 80f054cc7..0ab584220 100644
--- a/config/settings/base.py
+++ b/config/settings/base.py
@@ -463,7 +463,7 @@ REST_FRAMEWORK = {
     'ALLOWED_VERSIONS': ['default', 'v1', 'v2'],
     'DEFAULT_PAGINATION_CLASS':
         'rest_framework.pagination.LimitOffsetPagination',
-    'PAGE_SIZE': 1e7,
+    'PAGE_SIZE': 100,
     'DEFAULT_THROTTLE_CLASSES': (
         'api.throttling.BurstAnonRateThrottle',
     ),
diff --git a/gracedb/api/v1/gwtc/viewsets.py b/gracedb/api/v1/gwtc/viewsets.py
index 5eb984eae..2f04bec84 100644
--- a/gracedb/api/v1/gwtc/viewsets.py
+++ b/gracedb/api/v1/gwtc/viewsets.py
@@ -8,7 +8,7 @@ from django.shortcuts import get_object_or_404
 
 from guardian.shortcuts import get_objects_for_user
 from rest_framework import mixins, parsers, permissions, serializers, status, \
-    viewsets
+    viewsets, pagination
 from rest_framework.decorators import action
 from rest_framework.response import Response
 from rest_framework.views import APIView
@@ -18,10 +18,18 @@ from gwtc.models import gwtc_catalog, gwtc_gevent, gwtc_superevent
 from .serializers import gwtc_serializer
 from .permissions import gwtc_model_permissions
 
+
+class custom_gwtc_paginator(pagination.LimitOffsetPagination):
+    default_limit = 10
+    limit_query_param = 'count'
+    offset_query_param = 'start'
+
+
 class gwtc_viewset(SafeCreateMixin, InheritDefaultPermissionsMixin,
                    viewsets.ModelViewSet):
     queryset = gwtc_catalog.objects.all()
     serializer_class = gwtc_serializer 
+    pagination_class = custom_gwtc_paginator
     permission_classes = (gwtc_model_permissions, )
 
     # This function gets called for 'list' methods, and returns a queryset. This
@@ -32,14 +40,15 @@ class gwtc_viewset(SafeCreateMixin, InheritDefaultPermissionsMixin,
         selected_number = self.kwargs.get('number')
         selected_version = self.kwargs.get('version')
 
-        # if no catalog number is specified, return all the catalogs
-        if not selected_number:
-            return self.queryset
-        else:
-            # if the user specified a number, but not a version, return all the versions
-            # of that catalog number
+        # if the catalog number is specified, then return the filtered queryset
+        if selected_number:
+            self.queryset = self.queryset.filter(number=selected_number)
 
-           return self.queryset.filter(number=selected_number)
+        return self.queryset.prefetch_related('gwtc_superevent_set',
+            'gwtc_superevent_set__superevent',
+            'gwtc_superevent_set__gwtc_gevent_set',
+            'gwtc_superevent_set__gwtc_gevent_set__gevent',
+            'gwtc_superevent_set__gwtc_gevent_set__gevent__pipeline')
 
     # This function gets called for 'list' methods, and returns a queryset. This
     # is called for `GET` requests to /api/gwtc/{number}/{version}
-- 
GitLab