diff --git a/api/src/org/labkey/api/exp/api/ExperimentService.java b/api/src/org/labkey/api/exp/api/ExperimentService.java index d317517c57b..2ce76f42943 100644 --- a/api/src/org/labkey/api/exp/api/ExperimentService.java +++ b/api/src/org/labkey/api/exp/api/ExperimentService.java @@ -82,7 +82,6 @@ import org.labkey.api.util.Pair; import org.labkey.api.util.StringUtilsLabKey; import org.labkey.api.view.HttpView; -import org.labkey.api.view.NotFoundException; import org.labkey.api.view.ViewBackgroundInfo; import org.labkey.api.view.ViewContext; import org.labkey.vfs.FileLike; @@ -1183,6 +1182,11 @@ List getExpProtocolsWithParameterValue( Map> getDomainMetrics(); + void clearAncestors(ExpRunItem runItem); + void clearDataAncestors(Collection dataRowIds); + void clearMaterialAncestors(Collection materialRowIds); + void repopulateAncestors(); + class XarExportOptions { String _lsidRelativizer = LSID_OPTION_FOLDER_RELATIVE; diff --git a/experiment/src/org/labkey/experiment/api/ClosureQueryHelper.java b/experiment/src/org/labkey/experiment/api/ClosureQueryHelper.java index f2daaf48d46..909ff74ed46 100644 --- a/experiment/src/org/labkey/experiment/api/ClosureQueryHelper.java +++ b/experiment/src/org/labkey/experiment/api/ClosureQueryHelper.java @@ -17,6 +17,7 @@ import org.labkey.api.data.MutableColumnInfo; import org.labkey.api.data.SQLFragment; import org.labkey.api.data.SqlExecutor; +import org.labkey.api.data.Table; import org.labkey.api.data.TableInfo; import org.labkey.api.data.TempTableTracker; import org.labkey.api.data.VirtualTable; @@ -349,26 +350,26 @@ private static void incrementalRecomputeFromTempTable(SQLFragment familyTempTabl } } - public static void clearAncestorsForMaterial(long rowId) + public static void clearAncestorsForMaterials(Collection materialRowIds) { var tx = getScope().getCurrentTransaction(); if (null != tx) { - tx.addCommitTask(() -> clearAncestorsForMaterial(rowId), DbScope.CommitTaskOption.POSTCOMMIT); + tx.addCommitTask(() -> clearAncestorsForMaterials(materialRowIds), DbScope.CommitTaskOption.POSTCOMMIT); return; } - recomputeMaterialAncestors(rowId); + recomputeMaterialAncestors(materialRowIds); } - public static void clearAncestorsForDataObject(long rowId) + public static void clearAncestorsForDataObjects(Collection dataRowIds) { var tx = getScope().getCurrentTransaction(); if (null != tx) { - tx.addCommitTask(() -> clearAncestorsForDataObject(rowId), DbScope.CommitTaskOption.POSTCOMMIT); + tx.addCommitTask(() -> clearAncestorsForDataObjects(dataRowIds), DbScope.CommitTaskOption.POSTCOMMIT); return; } - recomputeDataObjectAncestors(rowId); + recomputeDataObjectAncestors(dataRowIds); } public static void populateMaterialAncestors(Logger logger) @@ -425,14 +426,12 @@ public static void truncateAndRecreate() public static void truncateAndRecreate(Logger logger) { - try (DbScope.Transaction transaction = ExperimentService.get().getSchema().getScope().ensureTransaction()) + try (DbScope.Transaction transaction = ExperimentService.get().ensureTransaction()) { - TableInfo tInfo = ExperimentServiceImpl.get().getTinfoMaterialAncestors(); - new SqlExecutor(tInfo.getSchema()).execute("TRUNCATE TABLE " + tInfo); + Table.truncate(ExperimentServiceImpl.get().getTinfoMaterialAncestors()); ClosureQueryHelper.populateMaterialAncestors(logger); - tInfo = ExperimentServiceImpl.get().getTinfoDataAncestors(); - new SqlExecutor(tInfo.getSchema()).execute("TRUNCATE TABLE " + tInfo); + Table.truncate(ExperimentServiceImpl.get().getTinfoDataAncestors()); ClosureQueryHelper.populateDataAncestors(logger); transaction.commit(); @@ -485,11 +484,11 @@ public static void recomputeFromSeeds(SQLFragment selectSeedsSql, boolean isSamp } } - private static void recomputeMaterialAncestors(long rowId) + private static void recomputeMaterialAncestors(Collection rowIds) { SQLFragment selectSeedsSql = new SQLFragment() .append("SELECT m.RowId, m.ObjectId, 'm' AS ObjectType FROM exp.material m\n") - .append("WHERE m.RowId = ").appendValue(rowId); + .append("WHERE m.RowId ").appendInClause(rowIds, getScope().getSqlDialect()); recomputeFromSeeds(selectSeedsSql, true); } @@ -525,18 +524,16 @@ private static void recomputeMaterialAncestorsForRuns(Collection runIds) .append("SELECT m.RowId, m.ObjectId, 'm' AS ObjectType FROM exp.material m\n") .append("INNER JOIN exp.MaterialInput mi ON m.rowId = mi.materialId\n") .append("INNER JOIN exp.ProtocolApplication pa ON mi.TargetApplicationId = pa.RowId\n") - .append("WHERE pa.RunId "); - getScope().getSqlDialect().appendInClauseSql(selectSeedsSql, runIds); - selectSeedsSql + .append("WHERE pa.RunId ").appendInClause(runIds, getScope().getSqlDialect()) .append(" AND pa.CpasType = ").appendValue(ExperimentRunOutput); recomputeFromSeeds(selectSeedsSql, true); } - private static void recomputeDataObjectAncestors(long rowId) + private static void recomputeDataObjectAncestors(Collection rowIds) { SQLFragment selectSeedsSql = new SQLFragment() .append("SELECT d.RowId, d.ObjectId, 'd' AS ObjectType FROM exp.data d\n") - .append("WHERE d.RowId = ").appendValue(rowId); + .append("WHERE d.RowId ").appendInClause(rowIds, getScope().getSqlDialect()); recomputeFromSeeds(selectSeedsSql, false); } @@ -572,9 +569,7 @@ private static void recomputeDataAncestorsForRuns(Collection runIds) .append("SELECT d.RowId, d.ObjectId, 'd' AS ObjectType FROM exp.data d\n") .append("INNER JOIN exp.DataInput di ON d.rowId = di.dataId\n") .append("INNER JOIN exp.ProtocolApplication pa ON di.TargetApplicationId = pa.RowId\n") - .append("WHERE pa.RunId "); - getScope().getSqlDialect().appendInClauseSql(selectSeedsSql, runIds); - selectSeedsSql + .append("WHERE pa.RunId ").appendInClause(runIds, getScope().getSqlDialect()) .append(" AND pa.CpasType = ").appendValue(ExperimentRunOutput); recomputeFromSeeds(selectSeedsSql, false); } diff --git a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java index e3bc1bbb24b..b9b8859e1e4 100644 --- a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java +++ b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java @@ -236,7 +236,6 @@ import org.labkey.api.view.HttpView; import org.labkey.api.view.JspTemplate; import org.labkey.api.view.JspView; -import org.labkey.api.view.NotFoundException; import org.labkey.api.view.UnauthorizedException; import org.labkey.api.view.ViewBackgroundInfo; import org.labkey.api.view.ViewContext; @@ -244,7 +243,6 @@ import org.labkey.experiment.FileLinkFileListener; import org.labkey.experiment.MissingFilesCheckInfo; import org.labkey.experiment.XarExportType; -import org.labkey.experiment.XarExporter; import org.labkey.experiment.XarReader; import org.labkey.experiment.api.property.DomainPropertyManager; import org.labkey.experiment.controllers.exp.ExperimentController; @@ -253,13 +251,11 @@ import org.labkey.experiment.pipeline.ExperimentPipelineJob; import org.labkey.experiment.pipeline.MoveRunsPipelineJob; import org.labkey.experiment.xar.AutoFileLSIDReplacer; -import org.labkey.experiment.xar.XarExportSelection; import org.labkey.vfs.FileLike; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.PessimisticLockingFailureException; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.io.UncheckedIOException; import java.net.MalformedURLException; @@ -3615,9 +3611,24 @@ public void clearAncestors(ExpRunItem runItem) { boolean isSample = runItem instanceof ExpMaterial; if (isSample) - ClosureQueryHelper.clearAncestorsForMaterial(runItem.getRowId()); + clearMaterialAncestors(List.of(runItem.getRowId())); else - ClosureQueryHelper.clearAncestorsForDataObject(runItem.getRowId()); + clearDataAncestors(List.of(runItem.getRowId())); + } + + public void repopulateAncestors() + { + ClosureQueryHelper.truncateAndRecreate(); + } + + public void clearDataAncestors(Collection dataRowIds) + { + ClosureQueryHelper.clearAncestorsForDataObjects(dataRowIds); + } + + public void clearMaterialAncestors(Collection materialRowIds) + { + ClosureQueryHelper.clearAncestorsForMaterials(materialRowIds); } public List getProtocolApplicationsForRun(long runId)