diff --git a/resources/schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql b/resources/schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql new file mode 100644 index 000000000..2238063f4 --- /dev/null +++ b/resources/schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql @@ -0,0 +1,15 @@ +SELECT core.executeJavaUpgradeCode('reparentOrphanedTargetedMSData'); + +-- Adding missing foreign keys to core.Containers(EntityId) +ALTER TABLE targetedms.Runs ADD CONSTRAINT FK_Runs_Container FOREIGN KEY (Container) REFERENCES core.Containers(EntityId); +ALTER TABLE targetedms.QCAnnotation ADD CONSTRAINT FK_QCAnnotation_Container FOREIGN KEY (Container) REFERENCES core.Containers(EntityId); +ALTER TABLE targetedms.GuideSet ADD CONSTRAINT FK_GuideSet_Container FOREIGN KEY (Container) REFERENCES core.Containers(EntityId); +ALTER TABLE targetedms.AutoQCPing ADD CONSTRAINT FK_AutoQCPing_Container FOREIGN KEY (Container) REFERENCES core.Containers(EntityId); +ALTER TABLE targetedms.PrecursorChromInfo ADD CONSTRAINT FK_PrecursorChromInfo_Container FOREIGN KEY (Container) REFERENCES core.Containers(EntityId); +ALTER TABLE targetedms.SampleFileChromInfo ADD CONSTRAINT FK_SampleFileChromInfo_Container FOREIGN KEY (Container) REFERENCES core.Containers(EntityId); + +-- Adding missing indices on Container +CREATE INDEX IX_QCAnnotationType_Container ON targetedms.QCAnnotationType(Container); +CREATE INDEX IX_QCAnnotation_Container ON targetedms.QCAnnotation(Container); +CREATE INDEX IX_GuideSet_Container ON targetedms.GuideSet(Container); +CREATE INDEX IX_QCMetricConfiguration_Container ON targetedms.QCMetricConfiguration(Container); diff --git a/src/org/labkey/targetedms/TargetedMSManager.java b/src/org/labkey/targetedms/TargetedMSManager.java index 73b423668..ffc7ed5f7 100644 --- a/src/org/labkey/targetedms/TargetedMSManager.java +++ b/src/org/labkey/targetedms/TargetedMSManager.java @@ -2524,6 +2524,17 @@ public void moveRun(TargetedMSRun run, Container newContainer, String newRunLSID new SqlExecutor(getSchema()).execute(updatePrecChromInfoSql); + SQLFragment updateSampleFileChromInfoSql = new SQLFragment("UPDATE "); + updateSampleFileChromInfoSql.append(getTableInfoSampleFileChromInfo(), ""); + updateSampleFileChromInfoSql.append(" SET container = ?").add(newContainer); + updateSampleFileChromInfoSql.append(" WHERE sampleFileId IN ("); + updateSampleFileChromInfoSql.append(" SELECT sf.Id FROM ").append(getTableInfoSampleFile(), "sf"); + updateSampleFileChromInfoSql.append(" INNER JOIN ").append(getTableInfoReplicate(), "rep").append(" ON rep.Id = sf.ReplicateId"); + updateSampleFileChromInfoSql.append(" WHERE rep.runId = ?").add(run.getId()); + updateSampleFileChromInfoSql.append(" )"); + + new SqlExecutor(getSchema()).execute(updateSampleFileChromInfoSql); + run.setExperimentRunLSID(newRunLSID); run.setDataId(newDataRowId); run.setContainer(newContainer); diff --git a/src/org/labkey/targetedms/TargetedMSModule.java b/src/org/labkey/targetedms/TargetedMSModule.java index 921e46202..df82dd64e 100644 --- a/src/org/labkey/targetedms/TargetedMSModule.java +++ b/src/org/labkey/targetedms/TargetedMSModule.java @@ -231,7 +231,7 @@ public String getName() @Override public Double getSchemaVersion() { - return 26.003; + return 26.004; } @Override diff --git a/src/org/labkey/targetedms/TargetedMSUpgradeCode.java b/src/org/labkey/targetedms/TargetedMSUpgradeCode.java index 3035b5fec..3c95c2dbe 100644 --- a/src/org/labkey/targetedms/TargetedMSUpgradeCode.java +++ b/src/org/labkey/targetedms/TargetedMSUpgradeCode.java @@ -108,4 +108,42 @@ public void populatePTMPercentsGroupedPrepivotCache(final ModuleContext moduleCo LOG.info("Finished populating PTMPercentsGroupedPrepivotCache for existing ExperimentMAM folders"); } + + @SuppressWarnings("UnusedDeclaration") + public void reparentOrphanedTargetedMSData(final ModuleContext moduleContext) + { + if (moduleContext.isNewInstall()) + { + return; + } + + Container sharedContainer = ContainerManager.getSharedContainer(); + + SqlExecutor executor = new SqlExecutor(TargetedMSManager.getSchema()); + + String[] tablesToDeleteOrphans = {"QCAnnotation", "GuideSet", "AutoQCPing"}; + for (String tableName : tablesToDeleteOrphans) + { + SQLFragment deleteSql = new SQLFragment("DELETE FROM targetedms.").append(tableName) + .append(" WHERE Container NOT IN (SELECT EntityId FROM core.Containers)"); + int deletedCount = executor.execute(deleteSql); + if (deletedCount > 0) + { + LOG.info("Deleted " + deletedCount + " orphaned rows from targetedms." + tableName); + } + } + + String[] tablesToReparentOrphans = {"Runs", "PrecursorChromInfo", "SampleFileChromInfo"}; + for (String tableName : tablesToReparentOrphans) + { + SQLFragment updateSql = new SQLFragment("UPDATE targetedms.").append(tableName) + .append(" SET Container = ? WHERE Container NOT IN (SELECT EntityId FROM core.Containers)") + .add(sharedContainer.getEntityId()); + int updatedCount = executor.execute(updateSql); + if (updatedCount > 0) + { + LOG.info("Reparented " + updatedCount + " orphaned rows from targetedms." + tableName + " to /Shared"); + } + } + } }