Skip to content

Commit 90d85e2

Browse files
committed
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 <[email protected]> Reviewed-by: Stephen Finucane <[email protected]> (backported from commit 046aa15 - 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 <[email protected]>
1 parent 4e3100f commit 90d85e2

File tree

3 files changed

+24
-19
lines changed

3 files changed

+24
-19
lines changed

patchwork/api/cover.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,9 @@ class CoverLetterList(ListAPIView):
104104

105105
def get_queryset(self):
106106
return CoverLetter.objects.all().prefetch_related('series',
107+
'project',
107108
'series__project')\
108-
.select_related('project', 'submitter')\
109+
.select_related('submitter')\
109110
.defer('content', 'headers')
110111

111112

patchwork/api/filters.py

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,8 @@ class TimestampMixin(FilterSet):
158158

159159
class SeriesFilterSet(TimestampMixin, FilterSet):
160160

161-
submitter = PersonFilter(queryset=Person.objects.all())
162-
project = ProjectFilter(queryset=Project.objects.all())
161+
submitter = PersonFilter(queryset=Person.objects.all(), distinct=False)
162+
project = ProjectFilter(queryset=Project.objects.all(), distinct=False)
163163

164164
class Meta:
165165
model = Series
@@ -168,12 +168,12 @@ class Meta:
168168

169169
class CoverLetterFilterSet(TimestampMixin, FilterSet):
170170

171-
project = ProjectFilter(queryset=Project.objects.all())
171+
project = ProjectFilter(queryset=Project.objects.all(), distinct=False)
172172
# NOTE(stephenfin): We disable the select-based HTML widgets for these
173173
# filters as the resulting query is _huge_
174174
series = BaseFilter(queryset=Project.objects.all(),
175-
widget=MultipleHiddenInput)
176-
submitter = PersonFilter(queryset=Person.objects.all())
175+
widget=MultipleHiddenInput, distinct=False)
176+
submitter = PersonFilter(queryset=Person.objects.all(), distinct=False)
177177

178178
class Meta:
179179
model = CoverLetter
@@ -187,10 +187,10 @@ class PatchFilterSet(TimestampMixin, FilterSet):
187187
# NOTE(stephenfin): We disable the select-based HTML widgets for these
188188
# filters as the resulting query is _huge_
189189
series = BaseFilter(queryset=Series.objects.all(),
190-
widget=MultipleHiddenInput)
191-
submitter = PersonFilter(queryset=Person.objects.all())
192-
delegate = UserFilter(queryset=User.objects.all())
193-
state = StateFilter(queryset=State.objects.all())
190+
widget=MultipleHiddenInput, distinct=False)
191+
submitter = PersonFilter(queryset=Person.objects.all(), distinct=False)
192+
delegate = UserFilter(queryset=User.objects.all(), distinct=False)
193+
state = StateFilter(queryset=State.objects.all(), distinct=False)
194194

195195
class Meta:
196196
model = Patch
@@ -200,7 +200,7 @@ class Meta:
200200

201201
class CheckFilterSet(TimestampMixin, FilterSet):
202202

203-
user = UserFilter(queryset=User.objects.all())
203+
user = UserFilter(queryset=User.objects.all(), distinct=False)
204204

205205
class Meta:
206206
model = Check
@@ -213,13 +213,17 @@ class EventFilterSet(TimestampMixin, FilterSet):
213213
# filters as the resulting query is _huge_
214214
# TODO(stephenfin): We should really use an AJAX widget of some form here
215215
project = ProjectFilter(queryset=Project.objects.all(),
216-
widget=MultipleHiddenInput)
216+
widget=MultipleHiddenInput,
217+
distinct=False)
217218
series = BaseFilter(queryset=Series.objects.all(),
218-
widget=MultipleHiddenInput)
219+
widget=MultipleHiddenInput,
220+
distinct=False)
219221
patch = BaseFilter(queryset=Patch.objects.all(),
220-
widget=MultipleHiddenInput)
222+
widget=MultipleHiddenInput,
223+
distinct=False)
221224
cover = BaseFilter(queryset=CoverLetter.objects.all(),
222-
widget=MultipleHiddenInput)
225+
widget=MultipleHiddenInput,
226+
distinct=False)
223227

224228
class Meta:
225229
model = Event
@@ -228,8 +232,8 @@ class Meta:
228232

229233
class BundleFilterSet(FilterSet):
230234

231-
project = ProjectFilter(queryset=Project.objects.all())
232-
owner = UserFilter(queryset=User.objects.all())
235+
project = ProjectFilter(queryset=Project.objects.all(), distinct=False)
236+
owner = UserFilter(queryset=User.objects.all(), distinct=False)
233237

234238
class Meta:
235239
model = Bundle

patchwork/api/series.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ class SeriesMixin(object):
7070

7171
def get_queryset(self):
7272
return Series.objects.all()\
73-
.prefetch_related('patches__project',)\
74-
.select_related('submitter', 'cover_letter__project', 'project')
73+
.prefetch_related('patches__project', 'cover_letter__project')\
74+
.select_related('submitter', 'project')
7575

7676

7777
class SeriesList(SeriesMixin, ListAPIView):

0 commit comments

Comments
 (0)