From e86e40939b6f265cc9377a486a4d005e7b14c92b Mon Sep 17 00:00:00 2001 From: XingY Date: Tue, 18 Aug 2026 17:16:01 -0700 Subject: [PATCH 1/2] Select only insert events for job sample actions --- audit/src/org/labkey/audit/AuditController.java | 13 ++++++++++++- audit/src/org/labkey/audit/AuditLogImpl.java | 14 +++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/audit/src/org/labkey/audit/AuditController.java b/audit/src/org/labkey/audit/AuditController.java index 9b3f53205a6..a813b5663e9 100644 --- a/audit/src/org/labkey/audit/AuditController.java +++ b/audit/src/org/labkey/audit/AuditController.java @@ -386,7 +386,7 @@ public Object execute(AuditTransactionForm form, BindException errors) // GitHub Issue 1307: use product folder data CF ContainerFilter cf = getContainer().getProductFoldersDataContainerFilter(elevatedUser); if (form.isSampleType()) - results = AuditLogImpl.get().getTransactionSampleIds(form.getTransactionAuditId(), elevatedUser, getContainer(), cf); + results = AuditLogImpl.get().getTransactionSampleIds(form.getTransactionAuditId(), form.isInsertOnly(), elevatedUser, getContainer(), cf); else results = AuditLogImpl.get().getTransactionSourceIds(form.getTransactionAuditId(), elevatedUser, getContainer(), cf); @@ -404,6 +404,7 @@ public static class AuditTransactionForm private Long _transactionAuditId; private String _dataType; private boolean _isSampleType; + private Boolean _insertOnly; public Long getTransactionAuditId() { @@ -425,6 +426,16 @@ public void setDataType(String dataType) _dataType = dataType; } + public Boolean isInsertOnly() + { + return Boolean.TRUE.equals(_insertOnly); + } + + public void setInsertOnly(Boolean insertOnly) + { + _insertOnly = insertOnly; + } + public boolean isSampleType() { return _isSampleType; diff --git a/audit/src/org/labkey/audit/AuditLogImpl.java b/audit/src/org/labkey/audit/AuditLogImpl.java index 9c7e82bea13..d9a5410f102 100644 --- a/audit/src/org/labkey/audit/AuditLogImpl.java +++ b/audit/src/org/labkey/audit/AuditLogImpl.java @@ -251,7 +251,7 @@ public ActionURL getAuditUrl() public record TransactionRowIds(Set rowIds, Map dataTypeRowCounts) {} - public TransactionRowIds getTransactionSampleIds(long transactionAuditId, User user, Container container, @Nullable ContainerFilter containerFilter) + public TransactionRowIds getTransactionSampleIds(long transactionAuditId, boolean includeInsertEventOnly, User user, Container container, @Nullable ContainerFilter containerFilter) { List transactionEvents = TRANSACTION_EVENT_CACHE.get(transactionAuditId).second; List events; @@ -268,10 +268,14 @@ public TransactionRowIds getTransactionSampleIds(long transactionAuditId, User u .map(SampleTimelineAuditEvent.class::cast) .toList(); } - // Drop the secondary "added/removed sample to/from job" events; the same sample has a primary registration/update event in the transaction, so counting these would double-count it. - events = events.stream() - .filter(event -> SampleTimelineAuditEvent.SampleTimelineEventType.INSERT.getComment().equals(event.getComment()) || SampleTimelineAuditEvent.SampleTimelineEventType.MERGE.getComment().equals(event.getComment())) - .toList(); + + if (includeInsertEventOnly) + { + // Drop the secondary "added/removed sample to/from job/update parent status" events; the same sample has a primary registration/update event in the transaction, so counting these would double-count it. + events = events.stream() + .filter(event -> SampleTimelineAuditEvent.SampleTimelineEventType.INSERT.getComment().equals(event.getComment()) || SampleTimelineAuditEvent.SampleTimelineEventType.MERGE.getComment().equals(event.getComment())) + .toList(); + } Map dataTypeRowCounts = new HashMap<>(); // Return distinct set of sampleIds, since there might be multiple events in transaction for the same sample From da35fa8e9947e3bbff6864f7ef1e44a2a39b16a7 Mon Sep 17 00:00:00 2001 From: XingY Date: Tue, 18 Aug 2026 17:36:46 -0700 Subject: [PATCH 2/2] clean --- audit/src/org/labkey/audit/AuditController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/audit/src/org/labkey/audit/AuditController.java b/audit/src/org/labkey/audit/AuditController.java index a813b5663e9..15bd4f8000b 100644 --- a/audit/src/org/labkey/audit/AuditController.java +++ b/audit/src/org/labkey/audit/AuditController.java @@ -428,7 +428,7 @@ public void setDataType(String dataType) public Boolean isInsertOnly() { - return Boolean.TRUE.equals(_insertOnly); + return Boolean.TRUE.equals(_insertOnly); } public void setInsertOnly(Boolean insertOnly)