diff --git a/src/main/java/org/dependencytrack/model/Project.java b/src/main/java/org/dependencytrack/model/Project.java index c2b6dafbb9..2513e50d17 100644 --- a/src/main/java/org/dependencytrack/model/Project.java +++ b/src/main/java/org/dependencytrack/model/Project.java @@ -103,11 +103,19 @@ }), @FetchGroup(name = "METRICS_UPDATE", members = { @Persistent(name = "id"), + @Persistent(name = "parent"), + @Persistent(name = "collectionLogic"), + @Persistent(name = "collectionTag"), @Persistent(name = "lastInheritedRiskScore"), @Persistent(name = "uuid") }), @FetchGroup(name = "PARENT", members = { @Persistent(name = "parent") + }), + @FetchGroup(name = "PORTFOLIO_METRICS_UPDATE", members = { + @Persistent(name = "id"), + @Persistent(name = "lastInheritedRiskScore"), + @Persistent(name = "uuid") }) }) @JsonInclude(JsonInclude.Include.NON_NULL) @@ -122,7 +130,8 @@ public enum FetchGroup { ALL, METADATA, METRICS_UPDATE, - PARENT + PARENT, + PORTFOLIO_METRICS_UPDATE } @PrimaryKey diff --git a/src/main/java/org/dependencytrack/tasks/metrics/PortfolioMetricsUpdateTask.java b/src/main/java/org/dependencytrack/tasks/metrics/PortfolioMetricsUpdateTask.java index da40183579..edb2ac5491 100644 --- a/src/main/java/org/dependencytrack/tasks/metrics/PortfolioMetricsUpdateTask.java +++ b/src/main/java/org/dependencytrack/tasks/metrics/PortfolioMetricsUpdateTask.java @@ -189,7 +189,7 @@ private List fetchNextActiveProjectsBatch(final PersistenceManager pm, // NB: Set fetch group on PM level to avoid fields of the default fetch group from being loaded. try (var ignoredPersistenceCustomization = new ScopedCustomization(pm) - .withFetchGroup(Project.FetchGroup.METRICS_UPDATE.name())) { + .withFetchGroup(Project.FetchGroup.PORTFOLIO_METRICS_UPDATE.name())) { return List.copyOf(query.executeList()); } finally { query.closeAll(); diff --git a/src/main/java/org/dependencytrack/tasks/metrics/ProjectMetricsUpdateTask.java b/src/main/java/org/dependencytrack/tasks/metrics/ProjectMetricsUpdateTask.java index 93c32182c3..a8dae87168 100644 --- a/src/main/java/org/dependencytrack/tasks/metrics/ProjectMetricsUpdateTask.java +++ b/src/main/java/org/dependencytrack/tasks/metrics/ProjectMetricsUpdateTask.java @@ -62,13 +62,13 @@ public void inform(final Event e) { } } - private void updateMetrics(final UUID uuid) throws Exception { + private void updateMetrics(final UUID uuid) { final var counters = new Counters(); try (final QueryManager qm = new QueryManager()) { final PersistenceManager pm = qm.getPersistenceManager(); - final Project project = qm.getObjectByUuid(Project.class, uuid, List.of(Project.FetchGroup.METRICS_UPDATE.name())); + final Project project = fetchProject(pm, uuid); if (project == null) { throw new NoSuchElementException("Project " + uuid + " does not exist"); } @@ -263,6 +263,20 @@ private void updateLatestVersionChildrenCollectionMetrics(final Project project, } } + private Project fetchProject(final PersistenceManager pm, final UUID uuid) { + final Query query = pm.newQuery(Project.class); + query.setFilter("uuid == :uuid"); + query.setParameters(uuid); + + // NB: Set fetch group on PM level to avoid fields of the default fetch group from being loaded. + try (var ignoredPersistenceCustomization = new ScopedCustomization(pm) + .withFetchGroup(Project.FetchGroup.METRICS_UPDATE.name())) { + return query.executeUnique(); + } finally { + query.closeAll(); + } + } + private List fetchNextComponentsPage(final PersistenceManager pm, final Project project, final Long lastId) { final Query query = pm.newQuery(Component.class); if (lastId == null) {