Skip to content

Commit 0376909

Browse files
committed
add further sql optimizations
1 parent 9750cfb commit 0376909

File tree

23 files changed

+65
-75
lines changed

23 files changed

+65
-75
lines changed

errata/managers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,4 @@
1919

2020
class ErratumManager(models.Manager):
2121
def get_queryset(self):
22-
return super().get_queryset().select_related()
22+
return super().get_queryset()

errata/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929

3030
@login_required
3131
def erratum_list(request):
32-
errata = Erratum.objects.select_related()
32+
errata = Erratum.objects.all()
3333

3434
if 'e_type' in request.GET:
3535
errata = errata.filter(e_type=request.GET['e_type']).distinct()

hosts/managers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,4 @@
2020

2121
class HostManager(models.Manager):
2222
def get_queryset(self):
23-
return super().get_queryset().select_related()
23+
return super().get_queryset().select_related('osvariant', 'arch', 'domain')

hosts/models.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,9 @@ def clean_reports(self):
135135
""" Remove all but the last 3 reports for a host
136136
"""
137137
from reports.models import Report
138-
reports = Report.objects.filter(host=self).order_by('-created')[3:]
139-
rlen = reports.count()
140-
for report in Report.objects.filter(host=self).order_by('-created')[3:]:
138+
reports = list(Report.objects.filter(host=self).order_by('-created')[3:])
139+
rlen = len(reports)
140+
for report in reports:
141141
report.delete()
142142
if rlen > 0:
143143
info_message(text=f'{self.hostname}: removed {rlen} old reports')
@@ -157,14 +157,14 @@ def get_host_repo_packages(self):
157157
Q(mirror__repo__in=self.repos.all(),
158158
mirror__enabled=True,
159159
mirror__repo__enabled=True)
160-
return Package.objects.select_related().filter(hostrepos_q).distinct()
160+
return Package.objects.select_related('name', 'arch').filter(hostrepos_q).distinct()
161161

162162
def process_update(self, package, highest_package):
163163
if self.host_repos_only:
164164
host_repos = Q(repo__host=self)
165165
else:
166166
host_repos = Q(repo__osrelease__osvariant__host=self, repo__arch=self.arch) | Q(repo__host=self)
167-
mirrors = highest_package.mirror_set.filter(host_repos)
167+
mirrors = highest_package.mirror_set.filter(host_repos).select_related('repo')
168168
security = False
169169
# if any of the containing repos are security, mark the update as a security update
170170
for mirror in mirrors:
@@ -223,7 +223,7 @@ def find_host_repo_updates(self, host_packages, repo_packages):
223223
repo__mirror__refresh=True,
224224
repo__mirror__repo__enabled=True,
225225
host=self)
226-
hostrepos = HostRepo.objects.select_related().filter(hostrepos_q)
226+
hostrepos = HostRepo.objects.select_related('host', 'repo').filter(hostrepos_q)
227227

228228
for package in host_packages:
229229
highest_package = package

hosts/views.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def _get_filtered_hosts(filter_params):
4242
from urllib.parse import parse_qs
4343
params = parse_qs(filter_params)
4444

45-
hosts = Host.objects.select_related()
45+
hosts = Host.objects.select_related('osvariant', 'arch', 'domain')
4646

4747
if 'domain_id' in params:
4848
hosts = hosts.filter(domain=params['domain_id'][0])
@@ -77,7 +77,7 @@ def _get_filtered_hosts(filter_params):
7777
@login_required
7878
def host_list(request):
7979
# Use cached count fields instead of expensive annotations
80-
hosts = Host.objects.select_related()
80+
hosts = Host.objects.select_related('osvariant', 'arch', 'domain')
8181

8282
if 'domain_id' in request.GET:
8383
hosts = hosts.filter(domain=request.GET['domain_id'])
@@ -156,7 +156,7 @@ def host_detail(request, hostname):
156156
hostrepos = HostRepo.objects.filter(host=host)
157157

158158
# Build packages list with update info
159-
updates_by_package = {u.oldpackage_id: u for u in host.updates.select_related()}
159+
updates_by_package = {u.oldpackage_id: u for u in host.updates.select_related('oldpackage', 'newpackage')}
160160
packages_with_updates = []
161161
for package in host.packages.select_related('name', 'arch').order_by('name__name'):
162162
package.update = updates_by_package.get(package.id)
@@ -294,7 +294,7 @@ class HostViewSet(viewsets.ModelViewSet):
294294
"""
295295
API endpoint that allows hosts to be viewed or edited.
296296
"""
297-
queryset = Host.objects.all()
297+
queryset = Host.objects.select_related('osvariant', 'arch', 'domain').all()
298298
serializer_class = HostSerializer
299299
filterset_class = HostFilter
300300

@@ -303,5 +303,5 @@ class HostRepoViewSet(viewsets.ModelViewSet):
303303
"""
304304
API endpoint that allows host repos to be viewed or edited.
305305
"""
306-
queryset = HostRepo.objects.all()
306+
queryset = HostRepo.objects.select_related('host', 'repo').all()
307307
serializer_class = HostRepoSerializer

modules/managers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,4 @@
1919

2020
class ModuleManager(models.Manager):
2121
def get_queryset(self):
22-
return super().get_queryset().select_related()
22+
return super().get_queryset().select_related('arch', 'repo')

modules/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
@login_required
2929
def module_list(request):
3030

31-
modules = Module.objects.select_related()
31+
modules = Module.objects.select_related('arch', 'repo')
3232

3333
if 'search' in request.GET:
3434
terms = request.GET['search'].lower()
@@ -62,6 +62,6 @@ class ModuleViewSet(viewsets.ModelViewSet):
6262
"""
6363
API endpoint that allows modules to be viewed or edited.
6464
"""
65-
queryset = Module.objects.all()
65+
queryset = Module.objects.select_related('arch', 'repo').all()
6666
serializer_class = ModuleSerializer
6767
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

operatingsystems/forms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class Meta:
4747
class AddReposToOSReleaseForm(ModelForm):
4848

4949
repos = ModelMultipleChoiceField(
50-
queryset=Repository.objects.select_related(),
50+
queryset=Repository.objects.select_related('arch'),
5151
required=False,
5252
label=None,
5353
widget=FilteredSelectMultiple('Repos', False, attrs={'size': '30'}))

operatingsystems/templates/operatingsystems/osvariant_detail.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<tr><th>Name</th><td> {{ osvariant.name }} </td></tr>
2525
<tr><th>Architecture</th><td> {{ osvariant.arch }} </td></tr>
2626
<tr><th>Codename</th><td> {{ osvariant.codename }} </td></tr>
27-
<tr><th>Hosts</th><td><a href="{% url 'hosts:host_list' %}?osvariant_id={{ osvariant.id }}">{{ osvariant.host_set.count }}</a></td></tr>
27+
<tr><th>Hosts</th><td><a href="{% url 'hosts:host_list' %}?osvariant_id={{ osvariant.id }}">{{ osvariant.hosts_count }}</a></td></tr>
2828
<tr><th>OS Release</th><td>{% if osvariant.osrelease != None %}<a href="{{ osvariant.osrelease.get_absolute_url }}"> {{ osvariant.osrelease }} </a>{% else %}No OS Release{% endif %}</td></tr>
2929
</table>
3030
{% if user.is_authenticated and perms.is_admin %}

operatingsystems/views.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def _get_filtered_osvariants(filter_params):
4040
from urllib.parse import parse_qs
4141
params = parse_qs(filter_params)
4242

43-
osvariants = OSVariant.objects.select_related()
43+
osvariants = OSVariant.objects.select_related('osrelease', 'arch')
4444

4545
if 'osrelease_id' in params:
4646
osvariants = osvariants.filter(osrelease=params['osrelease_id'][0])
@@ -60,7 +60,7 @@ def _get_filtered_osreleases(filter_params):
6060
from urllib.parse import parse_qs
6161
params = parse_qs(filter_params)
6262

63-
osreleases = OSRelease.objects.select_related()
63+
osreleases = OSRelease.objects.all()
6464

6565
if 'erratum_id' in params:
6666
osreleases = osreleases.filter(erratum=params['erratum_id'][0])
@@ -78,7 +78,7 @@ def _get_filtered_osreleases(filter_params):
7878
@login_required
7979
def osvariant_list(request):
8080
# Use cached hosts_count instead of expensive annotation
81-
osvariants = OSVariant.objects.select_related().annotate(
81+
osvariants = OSVariant.objects.select_related('osrelease', 'arch').annotate(
8282
repos_count=Count('osrelease__repos'),
8383
)
8484

@@ -182,7 +182,7 @@ def delete_nohost_osvariants(request):
182182

183183
@login_required
184184
def osrelease_list(request):
185-
osreleases = OSRelease.objects.select_related()
185+
osreleases = OSRelease.objects.all()
186186

187187
if 'erratum_id' in request.GET:
188188
osreleases = osreleases.filter(erratum=request.GET['erratum_id'])
@@ -347,7 +347,7 @@ class OSVariantViewSet(viewsets.ModelViewSet):
347347
"""
348348
API endpoint that allows operating system variants to be viewed or edited.
349349
"""
350-
queryset = OSVariant.objects.all()
350+
queryset = OSVariant.objects.select_related('osrelease', 'arch').all()
351351
serializer_class = OSVariantSerializer
352352
filterset_fields = ['name']
353353

0 commit comments

Comments
 (0)