From a57520e2dee68dcf2a6737cccd8eefeb610cfbd4 Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Wed, 25 Mar 2026 10:12:08 -0700 Subject: [PATCH 1/4] Ensure FKs and indices in targetedms schema --- .../postgresql/targetedms-26.003-26.004.sql | 13 +++++++++++++ src/org/labkey/targetedms/TargetedMSListener.java | 1 + src/org/labkey/targetedms/TargetedMSModule.java | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 resources/schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql 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..e7e13eae5 --- /dev/null +++ b/resources/schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql @@ -0,0 +1,13 @@ +-- 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); \ No newline at end of file diff --git a/src/org/labkey/targetedms/TargetedMSListener.java b/src/org/labkey/targetedms/TargetedMSListener.java index dadd3c03b..7bdc6e1e3 100644 --- a/src/org/labkey/targetedms/TargetedMSListener.java +++ b/src/org/labkey/targetedms/TargetedMSListener.java @@ -71,5 +71,6 @@ public void containerDeleted(Container c, User user) new SqlExecutor(TargetedMSManager.getSchema()).execute("DELETE FROM " + TargetedMSManager.getTableInfoMSInstrument() + " WHERE Container = ?", c); new SqlExecutor(TargetedMSManager.getSchema()).execute("DELETE FROM " + TargetedMSManager.getTableInfoPaymentMethod() + " WHERE Container = ?", c); new SqlExecutor(TargetedMSManager.getSchema()).execute("DELETE FROM " + TargetedMSManager.getTableInfoRateType() + " WHERE Container = ?", c); + new SqlExecutor(TargetedMSManager.getSchema()).execute("DELETE FROM " + TargetedMSManager.getTableInfoSampleFileChromInfo() + " WHERE Container = ?", c); } } diff --git a/src/org/labkey/targetedms/TargetedMSModule.java b/src/org/labkey/targetedms/TargetedMSModule.java index 5a14f90d9..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.002; + return 26.004; } @Override From 4923ba4025f3bf539c03a2baaa83c042a51bb74c Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Mon, 30 Mar 2026 10:24:55 -0700 Subject: [PATCH 2/4] code review comments --- .../postgresql/targetedms-26.003-26.004.sql | 7 +--- .../labkey/targetedms/TargetedMSListener.java | 1 - .../labkey/targetedms/TargetedMSManager.java | 11 ++++++ .../targetedms/TargetedMSUpgradeCode.java | 38 +++++++++++++++++++ 4 files changed, 50 insertions(+), 7 deletions(-) diff --git a/resources/schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql b/resources/schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql index e7e13eae5..edd925916 100644 --- a/resources/schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql +++ b/resources/schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql @@ -1,10 +1,5 @@ -- 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); +SELECT core.executeJavaUpgradeCode('reparentOrphanedTargetedMSData'); -- Adding missing indices on Container CREATE INDEX IX_QCAnnotationType_Container ON targetedms.QCAnnotationType(Container); diff --git a/src/org/labkey/targetedms/TargetedMSListener.java b/src/org/labkey/targetedms/TargetedMSListener.java index 7bdc6e1e3..dadd3c03b 100644 --- a/src/org/labkey/targetedms/TargetedMSListener.java +++ b/src/org/labkey/targetedms/TargetedMSListener.java @@ -71,6 +71,5 @@ public void containerDeleted(Container c, User user) new SqlExecutor(TargetedMSManager.getSchema()).execute("DELETE FROM " + TargetedMSManager.getTableInfoMSInstrument() + " WHERE Container = ?", c); new SqlExecutor(TargetedMSManager.getSchema()).execute("DELETE FROM " + TargetedMSManager.getTableInfoPaymentMethod() + " WHERE Container = ?", c); new SqlExecutor(TargetedMSManager.getSchema()).execute("DELETE FROM " + TargetedMSManager.getTableInfoRateType() + " WHERE Container = ?", c); - new SqlExecutor(TargetedMSManager.getSchema()).execute("DELETE FROM " + TargetedMSManager.getTableInfoSampleFileChromInfo() + " WHERE Container = ?", c); } } 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/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"); + } + } + } } From 50005f3af1d9f29de5f7e824dabf3325dce27c5d Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Mon, 30 Mar 2026 10:26:59 -0700 Subject: [PATCH 3/4] put back missing foreign keys --- .../dbscripts/postgresql/targetedms-26.003-26.004.sql | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/resources/schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql b/resources/schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql index edd925916..5729aaa63 100644 --- a/resources/schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql +++ b/resources/schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql @@ -1,6 +1,13 @@ --- Adding missing foreign keys to core.Containers(EntityId) SELECT core.executeJavaUpgradeCode('reparentOrphanedTargetedMSData'); +-- Adding missing foreign keys to core.Containers(EntityId)1 +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); From 5bfb27110b3275e7325042acd75d98dce2bba1ac Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Mon, 30 Mar 2026 16:00:43 -0700 Subject: [PATCH 4/4] Typo fix --- .../schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql b/resources/schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql index 5729aaa63..2238063f4 100644 --- a/resources/schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql +++ b/resources/schemas/dbscripts/postgresql/targetedms-26.003-26.004.sql @@ -1,6 +1,6 @@ SELECT core.executeJavaUpgradeCode('reparentOrphanedTargetedMSData'); --- Adding missing foreign keys to core.Containers(EntityId)1 +-- 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); @@ -12,4 +12,4 @@ ALTER TABLE targetedms.SampleFileChromInfo ADD CONSTRAINT FK_SampleFileChromInfo 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); \ No newline at end of file +CREATE INDEX IX_QCMetricConfiguration_Container ON targetedms.QCMetricConfiguration(Container);