From e7570d05a3578a440fdbe1a22ad94e33d72b867c Mon Sep 17 00:00:00 2001 From: bbimber Date: Fri, 3 Jul 2026 08:43:14 -0700 Subject: [PATCH 1/2] Check whether study exists in study overview --- Studies/resources/views/studiesOverview.html | 58 +++++++++++--------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/Studies/resources/views/studiesOverview.html b/Studies/resources/views/studiesOverview.html index 5fd144f1e..b2cb492ee 100644 --- a/Studies/resources/views/studiesOverview.html +++ b/Studies/resources/views/studiesOverview.html @@ -26,37 +26,43 @@ // } // }) - LABKEY.Query.selectRows({ - schemaName: 'study', - queryName: 'datasets', - columns: 'Name,Label,CategoryId/Label', - scope: this, - failure: LDK.Utils.getErrorCallback(), - success: function (results) { - let div = $('
') + // timepointType is an indirect test for whether a study exists: + if (LABKEY.moduleContext.study.timepointType) { + LABKEY.Query.selectRows({ + schemaName: 'study', + queryName: 'datasets', + columns: 'Name,Label,CategoryId/Label', + scope: this, + failure: LDK.Utils.getErrorCallback(), + success: function (results) { + let div = $('
') - const dataByCategory = {} - results.rows.sort((a, b) => a.Label.localeCompare(b.Label)).forEach(row => { - const dsUrl = LABKEY.ActionURL.buildURL('query', 'executeQuery', null, { - schemaName: 'study', - queryName: row.Name - }); + const dataByCategory = {} + results.rows.sort((a, b) => a.Label.localeCompare(b.Label)).forEach(row => { + const dsUrl = LABKEY.ActionURL.buildURL('query', 'executeQuery', null, { + schemaName: 'study', + queryName: row.Name + }); - dataByCategory[row['CategoryId/Label']] = dataByCategory[row['CategoryId/Label']] || [] - dataByCategory[row['CategoryId/Label']].push($(`
  • ${row.Label}
  • `)) - }) + dataByCategory[row['CategoryId/Label']] = dataByCategory[row['CategoryId/Label']] || [] + dataByCategory[row['CategoryId/Label']].push($(`
  • ${row.Label}
  • `)) + }) - Object.keys(dataByCategory).sort().forEach(category => { - div.append('

    ' + category + '

    ').append('
      ') - const ul = div.children('ul')[0] - dataByCategory[category].forEach(item => { - ul.append(item[0]) + Object.keys(dataByCategory).sort().forEach(category => { + div.append('

      ' + category + '

      ').append('
        ') + const ul = div.children('ul')[0] + dataByCategory[category].forEach(item => { + ul.append(item[0]) + }) }) - }) - $('#' + webpart.wrapperDivId).append(div) - } - }) + $('#' + webpart.wrapperDivId).append(div) + } + }) + } else { + let div = $('
        There are no studies in the current folder
        ') + $('#' + webpart.wrapperDivId).append(div) + } }) }); }(jQuery, LABKEY)); From 4f9d04d455556502cca3ef433f1afa2148be7095 Mon Sep 17 00:00:00 2001 From: bbimber Date: Sat, 4 Jul 2026 18:09:53 -0700 Subject: [PATCH 2/2] Improve logic for SequenceAnalysisMaintenanceTask and cancellation --- .../SequenceAnalysisMaintenanceTask.java | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisMaintenanceTask.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisMaintenanceTask.java index 82e76b851..bd691d3d4 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisMaintenanceTask.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisMaintenanceTask.java @@ -44,6 +44,7 @@ import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -81,25 +82,32 @@ public String getName() return "DeleteSequenceAnalysisArtifacts"; } + private int _jobId = -1; + // NOTE: if there is a more direct way to locate the JobID this hack should be replaced private void checkJobCancelled(Logger log) { - // Make the assumption there is only one active maintenance job at a time: - SimpleFilter filter = new SimpleFilter(FieldKey.fromString("description"), SYSTEM_MAINTENANCE_DESCRIPTION). - addCondition(FieldKey.fromString("container"), ContainerManager.getRoot().getId()). - addCondition(FieldKey.fromString("modified"), new Date(), CompareType.DATE_EQUAL); - int rowId = new TableSelector(DbSchema.get("pipeline", DbSchemaType.Module).getTable(JOB_TABLE), PageFlowUtil.set("RowId", "Status"), filter, null).getMapCollection().stream().filter(map -> { - String val = String.valueOf(map.get("status")); - return val != null && (val.toLowerCase().startsWith(PipelineJob.TaskStatus.cancelling.name()) || val.toLowerCase().startsWith(PipelineJob.TaskStatus.running.name())); - }).map(rs -> Integer.parseInt(String.valueOf(rs.get("rowid")))).max(Integer::compareTo).orElse(-1); - - if (rowId == -1) + if (_jobId == -1) { - log.warn("Unable to find rowId for job", new Exception("Unable to find rowId for job")); - return; + // Make the assumption there is only one active maintenance job at a time: + SimpleFilter filter = new SimpleFilter(FieldKey.fromString("description"), SYSTEM_MAINTENANCE_DESCRIPTION). + addCondition(FieldKey.fromString("container"), ContainerManager.getRoot().getId()). + addCondition(FieldKey.fromString("modified"), LocalDate.now().minusDays(2), CompareType.DATE_GTE); + int rowId = new TableSelector(DbSchema.get("pipeline", DbSchemaType.Module).getTable(JOB_TABLE), PageFlowUtil.set("RowId", "Status"), filter, null).getMapCollection().stream().filter(map -> { + String val = String.valueOf(map.get("status")); + return val != null && (val.toLowerCase().startsWith(PipelineJob.TaskStatus.cancelling.name()) || val.toLowerCase().startsWith(PipelineJob.TaskStatus.running.name())); + }).map(rs -> Integer.parseInt(String.valueOf(rs.get("rowid")))).max(Integer::compareTo).orElse(-1); + + if (rowId == -1) + { + log.warn("Unable to find rowId for job", new Exception("Unable to find rowId for job")); + return; + } + + _jobId = rowId; } - PipelineStatusFile sf = PipelineService.get().getStatusFile(rowId); + PipelineStatusFile sf = PipelineService.get().getStatusFile(_jobId); if (PipelineJob.TaskStatus.cancelling.name().equalsIgnoreCase(sf.getStatus())) { throw new CancelledException();