From 90d85e24f1207daee22f46ab7eca4e367616dbd4 Mon Sep 17 00:00:00 2001 From: Daniel Axtens Date: Wed, 18 Mar 2020 00:59:15 +1100 Subject: [PATCH] REST: extend performance improvements to other parts of the API We can trivially extend what we've just done to other parts of the API. I haven't done much by way of benchmark but we're seeing multiple 'x's pretty much across the board when filtering. Signed-off-by: Daniel Axtens Reviewed-by: Stephen Finucane (backported from commit 046aa155c3bf827691bab9e1df8916c969a30d54 - dropped tests, it depends on a test we don't carry - rejigged to suit old M:N series model and old API) Signed-off-by: Daniel Axtens --- patchwork/api/cover.py | 3 ++- patchwork/api/filters.py | 36 ++++++++++++++++++++---------------- patchwork/api/series.py | 4 ++-- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/patchwork/api/cover.py b/patchwork/api/cover.py index 8a9e61e2..edc00298 100644 --- a/patchwork/api/cover.py +++ b/patchwork/api/cover.py @@ -104,8 +104,9 @@ class CoverLetterList(ListAPIView): def get_queryset(self): return CoverLetter.objects.all().prefetch_related('series', + 'project', 'series__project')\ - .select_related('project', 'submitter')\ + .select_related('submitter')\ .defer('content', 'headers') diff --git a/patchwork/api/filters.py b/patchwork/api/filters.py index d374b585..886f06ee 100644 --- a/patchwork/api/filters.py +++ b/patchwork/api/filters.py @@ -158,8 +158,8 @@ class TimestampMixin(FilterSet): class SeriesFilterSet(TimestampMixin, FilterSet): - submitter = PersonFilter(queryset=Person.objects.all()) - project = ProjectFilter(queryset=Project.objects.all()) + submitter = PersonFilter(queryset=Person.objects.all(), distinct=False) + project = ProjectFilter(queryset=Project.objects.all(), distinct=False) class Meta: model = Series @@ -168,12 +168,12 @@ class SeriesFilterSet(TimestampMixin, FilterSet): class CoverLetterFilterSet(TimestampMixin, FilterSet): - project = ProjectFilter(queryset=Project.objects.all()) + project = ProjectFilter(queryset=Project.objects.all(), distinct=False) # NOTE(stephenfin): We disable the select-based HTML widgets for these # filters as the resulting query is _huge_ series = BaseFilter(queryset=Project.objects.all(), - widget=MultipleHiddenInput) - submitter = PersonFilter(queryset=Person.objects.all()) + widget=MultipleHiddenInput, distinct=False) + submitter = PersonFilter(queryset=Person.objects.all(), distinct=False) class Meta: model = CoverLetter @@ -187,10 +187,10 @@ class PatchFilterSet(TimestampMixin, FilterSet): # NOTE(stephenfin): We disable the select-based HTML widgets for these # filters as the resulting query is _huge_ series = BaseFilter(queryset=Series.objects.all(), - widget=MultipleHiddenInput) - submitter = PersonFilter(queryset=Person.objects.all()) - delegate = UserFilter(queryset=User.objects.all()) - state = StateFilter(queryset=State.objects.all()) + widget=MultipleHiddenInput, distinct=False) + submitter = PersonFilter(queryset=Person.objects.all(), distinct=False) + delegate = UserFilter(queryset=User.objects.all(), distinct=False) + state = StateFilter(queryset=State.objects.all(), distinct=False) class Meta: model = Patch @@ -200,7 +200,7 @@ class PatchFilterSet(TimestampMixin, FilterSet): class CheckFilterSet(TimestampMixin, FilterSet): - user = UserFilter(queryset=User.objects.all()) + user = UserFilter(queryset=User.objects.all(), distinct=False) class Meta: model = Check @@ -213,13 +213,17 @@ class EventFilterSet(TimestampMixin, FilterSet): # filters as the resulting query is _huge_ # TODO(stephenfin): We should really use an AJAX widget of some form here project = ProjectFilter(queryset=Project.objects.all(), - widget=MultipleHiddenInput) + widget=MultipleHiddenInput, + distinct=False) series = BaseFilter(queryset=Series.objects.all(), - widget=MultipleHiddenInput) + widget=MultipleHiddenInput, + distinct=False) patch = BaseFilter(queryset=Patch.objects.all(), - widget=MultipleHiddenInput) + widget=MultipleHiddenInput, + distinct=False) cover = BaseFilter(queryset=CoverLetter.objects.all(), - widget=MultipleHiddenInput) + widget=MultipleHiddenInput, + distinct=False) class Meta: model = Event @@ -228,8 +232,8 @@ class EventFilterSet(TimestampMixin, FilterSet): class BundleFilterSet(FilterSet): - project = ProjectFilter(queryset=Project.objects.all()) - owner = UserFilter(queryset=User.objects.all()) + project = ProjectFilter(queryset=Project.objects.all(), distinct=False) + owner = UserFilter(queryset=User.objects.all(), distinct=False) class Meta: model = Bundle diff --git a/patchwork/api/series.py b/patchwork/api/series.py index 627b8743..6b95310e 100644 --- a/patchwork/api/series.py +++ b/patchwork/api/series.py @@ -70,8 +70,8 @@ class SeriesMixin(object): def get_queryset(self): return Series.objects.all()\ - .prefetch_related('patches__project',)\ - .select_related('submitter', 'cover_letter__project', 'project') + .prefetch_related('patches__project', 'cover_letter__project')\ + .select_related('submitter', 'project') class SeriesList(SeriesMixin, ListAPIView): -- 2.47.3