Skip to content

Commit 93c4eaf

Browse files
authored
Merge pull request #1507 from DependencyTrack/fix-slow-affectedprojectcount-query
2 parents 1429324 + 8c4c1a3 commit 93c4eaf

File tree

3 files changed

+21
-11
lines changed

3 files changed

+21
-11
lines changed

apiserver/src/main/java/org/dependencytrack/persistence/jdbi/FindingDao.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ record GroupedFindingRow(
104104

105105
@SqlQuery(/* language=InjectedFreeMarker */ """
106106
<#-- @ftlvariable name="apiOffsetLimitClause" type="String" -->
107+
<#-- @ftlvariable name="includeSuppressed" type="boolean" -->
107108
SELECT "PROJECT"."UUID" AS "projectUuid"
108109
, "PROJECT"."NAME" AS "projectName"
109110
, "PROJECT"."VERSION" AS "projectVersion"
@@ -185,13 +186,15 @@ record GroupedFindingRow(
185186
INNER JOIN "PROJECT"
186187
ON "COMPONENT"."PROJECT_ID" = "PROJECT"."ID"
187188
WHERE "COMPONENT"."PROJECT_ID" = :projectId
188-
AND (:includeSuppressed OR "A"."SUPPRESSED" IS NULL OR NOT "A"."SUPPRESSED")
189+
<#if !includeSuppressed>
190+
AND "A"."SUPPRESSED" IS DISTINCT FROM TRUE
191+
</#if>
189192
AND (:hasAnalysis IS NULL OR ("A"."ID" IS NOT NULL) = :hasAnalysis)
190193
ORDER BY "FINDINGATTRIBUTION"."ID"
191194
${apiOffsetLimitClause!}
192195
""")
193196
@RegisterConstructorMapper(FindingRow.class)
194-
List<FindingRow> getFindingsByProject(@Bind long projectId, @Bind boolean includeSuppressed, @Bind Boolean hasAnalysis);
197+
List<FindingRow> getFindingsByProject(@Bind long projectId, @Define boolean includeSuppressed, @Bind Boolean hasAnalysis);
195198

196199
default List<Finding> getFindings(final long projectId, final boolean includeSuppressed) {
197200
List<FindingRow> findingRows = getFindingsByProject(projectId, includeSuppressed, null);
@@ -292,7 +295,7 @@ default List<Finding> getFindings(final long projectId, final boolean includeSup
292295
AND "PROJECT"."INACTIVE_SINCE" IS NULL
293296
</#if>
294297
<#if !suppressedFilter>
295-
AND ("A"."SUPPRESSED" IS NULL OR NOT "A"."SUPPRESSED")
298+
AND "A"."SUPPRESSED" IS DISTINCT FROM TRUE
296299
</#if>
297300
<#if queryFilter??>
298301
${queryFilter}

apiserver/src/main/java/org/dependencytrack/persistence/jdbi/NotificationSubjectDao.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public interface NotificationSubjectDao extends SqlObject {
151151
"ANALYSIS" AS "A" ON "A"."COMPONENT_ID" = "C"."ID" AND "A"."VULNERABILITY_ID" = "V"."ID"
152152
WHERE
153153
"C"."UUID" = :componentUuid AND "V"."UUID" = ANY(:vulnUuids)
154-
AND ("A"."SUPPRESSED" IS NULL OR NOT "A"."SUPPRESSED")
154+
AND "A"."SUPPRESSED" IS DISTINCT FROM TRUE
155155
""")
156156
@RegisterRowMapper(NotificationSubjectNewVulnerabilityRowMapper.class)
157157
List<NewVulnerabilitySubject> getForNewVulnerabilities(final UUID componentUuid, final Collection<UUID> vulnUuids,
@@ -239,7 +239,7 @@ List<NewVulnerabilitySubject> getForNewVulnerabilities(final UUID componentUuid,
239239
"ANALYSIS" AS "A" ON "A"."COMPONENT_ID" = "C"."ID" AND "A"."VULNERABILITY_ID" = "V"."ID"
240240
WHERE
241241
"C"."UUID" = :componentUuid
242-
AND ("A"."SUPPRESSED" IS NULL OR NOT "A"."SUPPRESSED")
242+
AND "A"."SUPPRESSED" IS DISTINCT FROM TRUE
243243
""")
244244
@UseRowReducer(NotificationSubjectNewVulnerableDependencyRowReducer.class)
245245
Optional<NewVulnerableDependencySubject> getForNewVulnerableDependency(final UUID componentUuid);
@@ -491,7 +491,7 @@ default Optional<ProjectVulnAnalysisCompleteSubject> getForProjectVulnAnalysisCo
491491
INNER JOIN "VULNERABILITY" AS "V" ON "V"."ID" = "CV"."VULNERABILITY_ID"
492492
LEFT JOIN "ANALYSIS" AS "A" ON "A"."COMPONENT_ID" = "C"."ID" AND "A"."VULNERABILITY_ID" = "V"."ID"
493493
WHERE "C"."PROJECT_ID" = (SELECT "ID" FROM "CTE_PROJECT")
494-
AND ("A"."SUPPRESSED" IS NULL OR NOT "A"."SUPPRESSED")
494+
AND "A"."SUPPRESSED" IS DISTINCT FROM TRUE
495495
""")
496496
.bind("projectUuid", UUID.fromString(optionalProject.get().getUuid()))
497497
.registerRowMapper(Component.class, new NotificationComponentRowMapper())

apiserver/src/main/java/org/dependencytrack/persistence/jdbi/VulnerabilityDao.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ record AffectedProjectListRow(
222222

223223
@SqlQuery(/* language=InjectedFreeMarker */ """
224224
<#-- @ftlvariable name="apiFilterParameter" type="String" -->
225+
<#-- @ftlvariable name="includeSuppressed" type="boolean" -->
225226
SELECT "V"."ID" AS "ID"
226227
, "V"."VULNID"
227228
, "V"."SOURCE"
@@ -273,14 +274,17 @@ record AffectedProjectListRow(
273274
AND "COMPONENT"."PROJECT_ID" = "ANALYSIS"."PROJECT_ID"
274275
LEFT JOIN "EPSS"
275276
ON "V"."VULNID" = "EPSS"."CVE"
276-
WHERE (:includeSuppressed OR "ANALYSIS"."SUPPRESSED" IS NULL OR NOT "ANALYSIS"."SUPPRESSED")
277+
WHERE TRUE
278+
<#if !includeSuppressed>
279+
AND "ANALYSIS"."SUPPRESSED" IS DISTINCT FROM TRUE
280+
</#if>
277281
<#if apiFilterParameter??>
278282
AND (LOWER("V"."VULNID") LIKE ('%' || LOWER(${apiFilterParameter}) || '%'))
279283
</#if>
280284
ORDER BY "V"."ID"
281285
""")
282286
@RegisterRowMapper(VulnerabilityRowMapper.class)
283-
List<Vulnerability> getVulnerabilitiesByComponent(@Bind Long componentId, @Bind boolean includeSuppressed);
287+
List<Vulnerability> getVulnerabilitiesByComponent(@Bind Long componentId, @Define boolean includeSuppressed);
284288

285289
@SqlQuery(/* language=InjectedFreeMarker */ """
286290
<#-- @ftlvariable name="includeSuppressed" type="boolean" -->
@@ -302,7 +306,7 @@ record AffectedProjectListRow(
302306
</#if>
303307
WHERE "VULNERABILITY"."ID" = ANY(:vulnerabilityIds)
304308
<#if !includeSuppressed>
305-
AND ("ANALYSIS"."SUPPRESSED" IS NULL OR NOT "ANALYSIS"."SUPPRESSED")
309+
AND "ANALYSIS"."SUPPRESSED" IS DISTINCT FROM TRUE
306310
</#if>
307311
AND ${apiProjectAclCondition}
308312
GROUP BY "VULNERABILITY"."ID"
@@ -321,6 +325,7 @@ record AffectedProjectCountRow(
321325

322326
@SqlQuery(/* language=InjectedFreeMarker */ """
323327
<#-- @ftlvariable name="apiFilterParameter" type="String" -->
328+
<#-- @ftlvariable name="includeSuppressed" type="boolean" -->
324329
SELECT DISTINCT ON ("V"."ID")
325330
"V"."ID"
326331
, "V"."VULNID"
@@ -375,15 +380,17 @@ SELECT DISTINCT ON ("V"."ID")
375380
AND "COMPONENT"."ID" = "ANALYSIS"."COMPONENT_ID"
376381
AND "COMPONENT"."PROJECT_ID" = "ANALYSIS"."PROJECT_ID"
377382
WHERE "COMPONENT"."PROJECT_ID" = :projectId
378-
AND (:includeSuppressed OR "ANALYSIS"."SUPPRESSED" IS NULL OR NOT "ANALYSIS"."SUPPRESSED")
383+
<#if !includeSuppressed>
384+
AND "ANALYSIS"."SUPPRESSED" IS DISTINCT FROM TRUE
385+
</#if>
379386
<#if apiFilterParameter??>
380387
AND (LOWER("V"."VULNID") LIKE ('%' || LOWER(${apiFilterParameter}) || '%'))
381388
</#if>
382389
GROUP BY "V"."ID", "EPSS"."SCORE", "EPSS"."PERCENTILE"
383390
ORDER BY "V"."ID"
384391
""")
385392
@RegisterRowMapper(VulnerabilityRowMapper.class)
386-
List<Vulnerability> getVulnerabilitiesByProject(@Bind long projectId, boolean includeSuppressed);
393+
List<Vulnerability> getVulnerabilitiesByProject(@Bind long projectId, @Define boolean includeSuppressed);
387394

388395
@SqlQuery("""
389396
SELECT distinct "C"."ID",

0 commit comments

Comments
 (0)