From 4954aeb195c17f0dc306faa49387c93a4e9ddab1 Mon Sep 17 00:00:00 2001 From: Florian Fritze Date: Wed, 22 Jul 2026 12:38:30 +0200 Subject: [PATCH] get the curation statuses faster: no expensive get calls --- .../harvard/iq/dataverse/DatasetVersion.java | 45 ++++++++++++++++--- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index c45ddcd62cb..bf2eb3e005d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -197,6 +197,15 @@ public enum VersionState { @OrderBy("createTime DESC NULLS LAST") private List curationStatuses = new ArrayList<>(); + @Transient + private Map keyCache = curationStatuses.stream() + .collect(Collectors.toMap( + cs -> cs, + CurationStatus::getCreateTime, + (a, b) -> a, + IdentityHashMap::new + )); + @Transient private DatasetVersionDifference dvd; @@ -2140,31 +2149,55 @@ public List getCurationStatuses() { * The code here assured both the DESC order and NULLS LAST. */ if (curationStatuses != null) { - curationStatuses.sort(Comparator.comparing( - CurationStatus::getCreateTime, - Comparator.nullsLast(Comparator.reverseOrder()) - )); + curationStatuses.sort( + Comparator.comparing( + keyCache::get, + Comparator.nullsLast(Comparator.reverseOrder()) + ) + ); } return curationStatuses; } protected void setCurationStatuses(List curationStatuses) { this.curationStatuses = curationStatuses; + keyCache = curationStatuses.stream() + .collect(Collectors.toMap( + cs -> cs, + CurationStatus::getCreateTime, + (a, b) -> a, + IdentityHashMap::new + )); } public CurationStatus getCurrentCurationStatus() { - return !getCurationStatuses().isEmpty() ? getCurationStatuses().get(0) : null; + return !getCurationStatuses().isEmpty() ? getCurationStatuses().getFirst() : null; } public void addCurationStatus(CurationStatus status) { status.setDatasetVersion(this); - curationStatuses.add(0, status); // Add the new status at the beginning of the list + curationStatuses.addFirst(status); // Add the new status at the beginning of the list + // After that cache the keys + keyCache = curationStatuses.stream() + .collect(Collectors.toMap( + cs -> cs, + CurationStatus::getCreateTime, + (a, b) -> a, + IdentityHashMap::new + )); } public void removeCurationStatus(CurationStatus curationStatus) { curationStatuses.remove(curationStatus); curationStatus.setDatasetVersion(null); + keyCache = curationStatuses.stream() + .collect(Collectors.toMap( + cs -> cs, + CurationStatus::getCreateTime, + (a, b) -> a, + IdentityHashMap::new + )); } public CurationStatus getCurationStatusAsOfDate(Date date) {