]> git.ipfire.org Git - thirdparty/patchwork.git/commitdiff
REST: extend performance improvements to other parts of the API
authorDaniel Axtens <dja@axtens.net>
Tue, 17 Mar 2020 13:59:15 +0000 (00:59 +1100)
committerDaniel Axtens <dja@axtens.net>
Fri, 20 Mar 2020 08:33:28 +0000 (19:33 +1100)
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 <dja@axtens.net>
Reviewed-by: Stephen Finucane <stephen@that.guru>
(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 <dja@axtens.net>
patchwork/api/cover.py
patchwork/api/filters.py
patchwork/api/series.py

index 8a9e61e29b23362dee0deef4127978478697b58d..edc00298251f7120af195e2227cc7c56d475406c 100644 (file)
@@ -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')
 
 
index d374b5852fd1c2ef124feb4e266302bd92cdb126..886f06ee7ebbb8ab11c0dd94655f8f3e6f3c7d87 100644 (file)
@@ -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
index 627b87434d3ededafac06aa860bbe3105c046a2f..6b95310e3b2e371bd95f734e0e77ab1bc9915759 100644 (file)
@@ -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):