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