Skip to content

Commit dfc71b0

Browse files
committed
Optimize queries
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 3c1ea8e commit dfc71b0

File tree

4 files changed

+39
-32
lines changed

4 files changed

+39
-32
lines changed

vulnerabilities/api_v3.py

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -207,11 +207,13 @@ def get_affected_by_vulnerabilities(self, package):
207207
"""Return a dictionary with advisory as keys and their details, including fixed_by_packages."""
208208
advisories_qs = AdvisoryV2.objects.latest_affecting_advisories_for_purl(package.package_url)
209209

210-
advisories = list(advisories_qs[:101])
211-
if len(advisories) > 100:
210+
advisories_ids = advisories_qs.only("id")
211+
212+
advisories_ids = list(advisories_ids[:101])
213+
if len(advisories_ids) > 100:
212214
return None
213215

214-
advisory_by_avid = {adv.avid: adv for adv in advisories}
216+
advisory_by_avid = {adv.avid: adv for adv in advisories_qs}
215217
avids = advisory_by_avid.keys()
216218

217219
impacts = (
@@ -222,7 +224,7 @@ def get_affected_by_vulnerabilities(self, package):
222224

223225
impact_by_avid = {impact.advisory.avid: impact for impact in impacts}
224226

225-
grouped = group_advisories_by_content(advisories)
227+
grouped = group_advisories_by_content(advisories_qs)
226228

227229
result = []
228230
for entry in grouped.values():
@@ -244,30 +246,17 @@ def get_affected_by_vulnerabilities(self, package):
244246
def get_fixing_vulnerabilities(self, package):
245247
advisories_qs = AdvisoryV2.objects.latest_fixed_by_advisories_for_purl(package.package_url)
246248

247-
advisories = list(advisories_qs[:101])
248-
if len(advisories) > 100:
249-
return None
250-
251-
advisory_by_avid = {adv.avid: adv for adv in advisories}
252-
avids = advisory_by_avid.keys()
253-
254-
impacts = (
255-
package.fixed_in_impacts.filter(advisory__avid__in=avids)
256-
.select_related("advisory")
257-
.prefetch_related("fixed_by_packages")
258-
)
249+
advisories_ids = advisories_qs.only("id")
259250

260-
impact_by_avid = {impact.advisory.avid: impact for impact in impacts}
251+
advisories_ids = list(advisories_ids[:101])
252+
if len(advisories_ids) > 100:
253+
return None
261254

262-
grouped = group_advisories_by_content(advisories)
255+
grouped = group_advisories_by_content(advisories_qs)
263256

264257
result = []
265258
for entry in grouped.values():
266259
primary = entry["primary"]
267-
impact = impact_by_avid.get(primary.avid)
268-
if not impact:
269-
continue
270-
271260
result.append(
272261
{
273262
"advisory_id": primary.avid,
@@ -301,14 +290,24 @@ def create(self, request, *args, **kwargs):
301290
approximate = serializer.validated_data["approximate"]
302291

303292
if not purls:
304-
vulnerable_purls = (
305-
PackageV2.objects.vulnerable()
306-
.only("package_url")
307-
.distinct()
293+
pkg_ids = (
294+
PackageV2.objects.vulnerable().values_list("id", flat=True)
295+
# .distinct()
296+
)
297+
298+
# vulnerable_purls = (
299+
# PackageV2.objects.vulnerable()
300+
# .only("package_url")
301+
# .values_list("package_url", flat=True)
302+
# .distinct()
303+
# .order_by("package_url")
304+
# )
305+
query = (
306+
PackageV2.objects.filter(id__in=pkg_ids)
308307
.values_list("package_url", flat=True)
309308
.order_by("package_url")
310309
)
311-
page = self.paginate_queryset(vulnerable_purls)
310+
page = self.paginate_queryset(query)
312311
return self.get_paginated_response(page)
313312

314313
plain_purls = None

vulnerabilities/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3387,7 +3387,7 @@ def vulnerable(self):
33873387
"""
33883388
Return only packages that are vulnerable.
33893389
"""
3390-
return self.filter(affected_in_impacts__isnull=False)
3390+
return self.filter(id__in=ImpactedPackageAffecting.objects.values("package_id").distinct())
33913391

33923392
def with_is_vulnerable(self):
33933393
"""

vulnerabilities/tests/test_api_v3.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def test_packages_post_without_details(self):
5353
def test_packages_post_with_details(self):
5454
url = reverse("package-v3-list")
5555

56-
with self.assertNumQueries(21):
56+
with self.assertNumQueries(23):
5757
response = self.client.post(
5858
url,
5959
data={
@@ -174,7 +174,7 @@ def setUp(self):
174174
def test_packages_post_purl_with_many_advisories(self):
175175
url = reverse("package-v3-list")
176176

177-
with self.assertNumQueries(11):
177+
with self.assertNumQueries(12):
178178
response = self.client.post(
179179
url,
180180
data={

vulnerabilities/views.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,11 @@ def get_context_data(self, **kwargs):
179179

180180
def get_queryset(self):
181181
purl = self.kwargs.get("purl")
182-
return models.AdvisoryV2.objects.latest_affecting_advisories_for_purl(purl).only("advisory_id", "summary", "url", "date_published").prefetch_related("aliases")
182+
return (
183+
models.AdvisoryV2.objects.latest_affecting_advisories_for_purl(purl)
184+
.only("advisory_id", "summary", "url", "date_published")
185+
.prefetch_related("aliases")
186+
)
183187

184188

185189
class FixingAdvisoriesListView(ListView):
@@ -189,7 +193,11 @@ class FixingAdvisoriesListView(ListView):
189193

190194
def get_queryset(self):
191195
purl = self.kwargs.get("purl")
192-
return models.AdvisoryV2.objects.latest_fixed_by_advisories_for_purl(purl).only("advisory_id", "summary", "url", "date_published").prefetch_related("aliases")
196+
return (
197+
models.AdvisoryV2.objects.latest_fixed_by_advisories_for_purl(purl)
198+
.only("advisory_id", "summary", "url", "date_published")
199+
.prefetch_related("aliases")
200+
)
193201

194202

195203
class PackageV2Details(DetailView):

0 commit comments

Comments
 (0)