diff --git a/luminex/resources/schemas/dbscripts/postgresql/luminex-0.00-17.10.sql b/luminex/resources/schemas/dbscripts/postgresql/luminex-0.00-17.10.sql new file mode 100644 index 0000000000..a4498719c0 --- /dev/null +++ b/luminex/resources/schemas/dbscripts/postgresql/luminex-0.00-17.10.sql @@ -0,0 +1,612 @@ +/* + * Copyright (c) 2010-2017 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* luminex-0.00-10.10.sql */ + +CREATE SCHEMA luminex; + +CREATE TABLE luminex.Analyte +( + RowId SERIAL NOT NULL, + LSID LSIDType NOT NULL, + Name VARCHAR(50) NOT NULL, + DataId INT NOT NULL, + FitProb REAL, + ResVar REAL, + RegressionType VARCHAR(100), + StdCurve VARCHAR(255), + MinStandardRecovery INT NOT NULL, + MaxStandardRecovery INT NOT NULL, + + CONSTRAINT PK_Luminex_Analyte PRIMARY KEY (RowId), + CONSTRAINT FK_LuminexAnalyte_DataId FOREIGN KEY (DataId) REFERENCES exp.Data(RowId) +); +CREATE INDEX IX_LuminexAnalyte_DataId ON luminex.Analyte (DataId); + +CREATE TABLE luminex.DataRow +( + RowId SERIAL NOT NULL, + DataId INT NOT NULL, + AnalyteId INT NOT NULL, + Type VARCHAR(10), + Well VARCHAR(50), + Outlier INT, + Description VARCHAR(50), + FIString VARCHAR(20), + FI REAL, + FIOORIndicator VARCHAR(10), + FIBackgroundString VARCHAR(20), + FIBackground REAL, + FIBackgroundOORIndicator VARCHAR(10), + StdDevString VARCHAR(20), + StdDev REAL, + StdDevOORIndicator VARCHAR(10), + ObsConcString VARCHAR(20), + ObsConc REAL, + ObsConcOORIndicator VARCHAR(10), + ExpConc REAL, + ObsOverExp REAL, + ConcInRangeString VARCHAR(20), + ConcInRange REAL, + ConcInRangeOORIndicator VARCHAR(10), + + Dilution REAL, + DataRowGroup VARCHAR(25), + Ratio VARCHAR(25), + SamplingErrors VARCHAR(25), + PTID VARCHAR(32), + VisitID FLOAT, + Date TIMESTAMP, + ExtraSpecimenInfo VARCHAR(50), + SpecimenID VARCHAR(50), + Container UniqueIdentifier NOT NULL, + ProtocolID INT NOT NULL, + BeadCount INT, + + CONSTRAINT PK_Luminex_DataRow PRIMARY KEY (RowId), + CONSTRAINT FK_LuminexDataRow_DataId FOREIGN KEY (DataId) REFERENCES exp.Data(RowId), + CONSTRAINT FK_LuminexDataRow_AnalyteId FOREIGN KEY (AnalyteId) REFERENCES luminex.analyte(RowId), + CONSTRAINT FK_DataRow_Container FOREIGN KEY (Container) REFERENCES core.Containers (EntityID), + CONSTRAINT FK_DataRow_ProtocolID FOREIGN KEY (ProtocolID) REFERENCES exp.Protocol (RowID) +); +CREATE INDEX IX_LuminexDataRow_DataId ON luminex.DataRow (DataId); +CREATE INDEX IX_LuminexDataRow_AnalyteId ON luminex.DataRow (AnalyteId); +CREATE INDEX IDX_DataRow_Container_ProtocolID ON luminex.datarow(Container, ProtocolID); + +/* luminex-10.30-11.10.sql */ + +ALTER TABLE luminex.DataRow + ALTER COLUMN fistring TYPE VARCHAR(64), + ALTER COLUMN fibackgroundstring TYPE VARCHAR(64), + ALTER COLUMN stddevstring TYPE VARCHAR(64), + ALTER COLUMN obsconcstring TYPE VARCHAR(64), + ALTER COLUMN concinrangestring TYPE VARCHAR(64); + +/* luminex-11.10-11.20.sql */ + +ALTER TABLE luminex.datarow ADD COLUMN LSID LSIDtype; + +UPDATE luminex.datarow SET LSID = 'urn:lsid:' || COALESCE ((SELECT p.value +FROM prop.properties p, prop.propertysets ps, core.containers c +WHERE + p.name = 'defaultLsidAuthority' AND + ps.set = p.set AND + ps.category = 'SiteConfig' AND + ps.objectid = c.entityid AND + c.name IS NULL AND c.parent IS NULL), 'localhost') || ':LuminexDataRow:' || RowId; + +ALTER TABLE luminex.datarow ALTER COLUMN LSID SET NOT NULL; + +CREATE INDEX IX_LuminexDataRow_LSID ON luminex.Analyte (LSID); + +CREATE TABLE luminex.Titration +( + RowId SERIAL NOT NULL, + RunId INT NOT NULL, + Name VARCHAR(255) NOT NULL, + Standard BOOLEAN NOT NULL, + QCControl BOOLEAN NOT NULL, + + CONSTRAINT PK_Luminex_Titration PRIMARY KEY (RowId), + CONSTRAINT FK_Luminex_Titration_RunId FOREIGN KEY (RunId) REFERENCES exp.ExperimentRun(RowId), + CONSTRAINT UQ_Titration UNIQUE (Name, RunId) +); + +CREATE TABLE luminex.AnalyteTitration +( + AnalyteId INT NOT NULL, + TitrationId INT NOT NULL, + + CONSTRAINT PK_Luminex_AnalyteTitration PRIMARY KEY (AnalyteId, TitrationId) +); + +CREATE INDEX IX_LuminexTitration_RunId ON luminex.Titration (RunId); + +-- Assume a single titration for all existing data +INSERT INTO luminex.Titration + (RunId, Name, Standard, QCControl) + SELECT RowId, 'Standard', true, false FROM exp.experimentrun WHERE protocollsid LIKE '%:LuminexAssayProtocol.%'; + +-- Assign all existing analytes to the single titration created above +INSERT INTO luminex.AnalyteTitration + (AnalyteId, TitrationId) + SELECT a.RowId, t.RowId + FROM luminex.analyte a, exp.data d, luminex.titration t, exp.protocolapplication pa + WHERE a.dataid = d.rowid AND t.runid = pa.runid AND d.sourceapplicationid = pa.rowid; + +ALTER TABLE luminex.datarow ADD COLUMN TitrationId INT; + +ALTER TABLE luminex.datarow ADD CONSTRAINT FK_Luminex_DataRow_TitrationId FOREIGN KEY (TitrationId) REFERENCES luminex.Titration(RowId); + +CREATE INDEX IX_LuminexDataRow_TitrationId ON luminex.DataRow (TitrationId); + +-- Assume that any existing data that has an expected concentration is part of the single standard titration +-- for that run +UPDATE luminex.datarow SET titrationid = + (SELECT t.rowid FROM luminex.titration t, exp.data d, exp.protocolapplication pa + WHERE pa.runid = t.runid AND d.sourceapplicationid = pa.rowid AND dataid = d.rowid) + WHERE expconc IS NOT NULL; + +-- Use the description as the titration name, grabbing an arbitrary one if they're not all the same +UPDATE luminex.titration SET name = (SELECT COALESCE(MIN(description), 'Standard') FROM luminex.datarow WHERE luminex.titration.rowid = titrationid); + +-- Add the Unknown type for a titration +ALTER TABLE luminex.Titration ADD COLUMN "unknown" BOOLEAN; + +UPDATE luminex.Titration SET "unknown" = FALSE; + +ALTER TABLE luminex.Titration ALTER COLUMN "unknown" SET NOT NULL; + +-- Make sure we have a row in exp.Object for all Luminex data files so that we can migrate the Excel run properties to it +INSERT INTO exp.Object (ObjectURI, Container) + SELECT d.LSID, d.Container + FROM exp.Data d, exp.ExperimentRun r, exp.ProtocolApplication pa + WHERE d.SourceApplicationId = pa.RowId and r.RowId = pa.RunId AND r.ProtocolLSID LIKE '%:LuminexAssayProtocol.Folder-%' AND d.LSID NOT IN (SELECT ObjectURI FROM exp.Object); + +-- Clean up run field values that were orphaned when we failed to delete them as part of deleting a Luminex run +DELETE FROM exp.ObjectProperty WHERE ObjectId IN (SELECT o.ObjectId FROM exp.Object o LEFT OUTER JOIN exp.ExperimentRun r ON o.ObjectURI = r.LSID WHERE o.ObjectURI like '%:LuminexAssayRun.Folder-%' AND r.LSID IS NULL); + +-- Migrate Excel-based values from run to data +UPDATE exp.ObjectProperty SET ObjectId = + (SELECT MIN(dataO.ObjectId) FROM exp.Object dataO, exp.Object runO, exp.Data d, exp.ExperimentRun r, exp.ProtocolApplication pa + WHERE dataO.ObjectURI = d.LSID AND runO.ObjectURI = r.LSID AND runO.ObjectId = exp.ObjectProperty.ObjectId AND d.SourceApplicationId = pa.RowId AND pa.RunId = r.RowId AND r.ProtocolLSID LIKE '%:LuminexAssayProtocol.Folder-%') +WHERE PropertyId IN (SELECT pd.PropertyId FROM exp.PropertyDescriptor p, exp.DomainDescriptor d, exp.PropertyDomain pd WHERE p.PropertyId = pd.PropertyId AND d.domainuri LIKE '%:AssayDomain-ExcelRun.Folder-%' AND pd.DomainId = d.DomainId); + +-- Add the Unknown type for a titration +ALTER TABLE luminex.DataRow ADD COLUMN WellRole VARCHAR(50); + +UPDATE luminex.DataRow SET WellRole = 'Standard' WHERE Type ILIKE 'S%' OR Type ILIKE 'ES%'; +UPDATE luminex.DataRow SET WellRole = 'Control' WHERE Type ILIKE 'C%'; +UPDATE luminex.DataRow SET WellRole = 'Background' WHERE Type ILIKE 'B%'; +UPDATE luminex.DataRow SET WellRole = 'Unknown' WHERE Type ILIKE 'U%'; + +CREATE TABLE luminex.WellExclusion +( + RowId SERIAL NOT NULL, + Description VARCHAR(50), + Dilution REAL, + DataId INT NOT NULL, + Comment VARCHAR(2000), + CreatedBy USERID, + Created TIMESTAMP, + ModifiedBy USERID, + Modified TIMESTAMP, + + CONSTRAINT PK_Luminex_WellExclusion PRIMARY KEY (RowId), + CONSTRAINT FK_LuminexWellExclusion_DataId FOREIGN KEY (DataId) REFERENCES exp.Data(RowId) +); + +CREATE UNIQUE INDEX UQ_WellExclusion ON luminex.WellExclusion(Description, Dilution, DataId); + +CREATE TABLE luminex.WellExclusionAnalyte +( + AnalyteId INT, + WellExclusionId INT NOT NULL, + + CONSTRAINT FK_LuminexWellExclusionAnalyte_AnalyteId FOREIGN KEY (AnalyteId) REFERENCES luminex.Analyte(RowId), + CONSTRAINT FK_LuminexWellExclusionAnalyte_WellExclusionId FOREIGN KEY (WellExclusionId) REFERENCES luminex.WellExclusion(RowId) +); + +CREATE UNIQUE INDEX UQ_WellExclusionAnalyte ON luminex.WellExclusionAnalyte(AnalyteId, WellExclusionId); + +CREATE TABLE luminex.RunExclusion +( + RunId INT NOT NULL, + Comment VARCHAR(2000), + CreatedBy USERID, + Created TIMESTAMP, + ModifiedBy USERID, + Modified TIMESTAMP, + + CONSTRAINT PK_Luminex_RunExclusion PRIMARY KEY (RunId), + CONSTRAINT FK_LuminexRunExclusion_RunId FOREIGN KEY (RunId) REFERENCES exp.ExperimentRun(RowId) +); + +CREATE TABLE luminex.RunExclusionAnalyte +( + AnalyteId INT, + RunId INT NOT NULL, + + CONSTRAINT FK_LuminexRunExclusionAnalyte_AnalyteId FOREIGN KEY (AnalyteId) REFERENCES luminex.Analyte(RowId), + CONSTRAINT FK_LuminexRunExclusionAnalyte_RunId FOREIGN KEY (RunId) REFERENCES luminex.RunExclusion(RunId) +); + +CREATE UNIQUE INDEX UQ_RunExclusionAnalyte ON luminex.RunExclusionAnalyte(AnalyteId, RunId); + +-- Don't allow AnalyteId to be NULL in the exclusion tables + +ALTER TABLE luminex.WellExclusionAnalyte ALTER COLUMN AnalyteId SET NOT NULL; + +DROP INDEX luminex.UQ_WellExclusionAnalyte; + +ALTER TABLE luminex.WellExclusionAnalyte ADD CONSTRAINT PK_LuminexWellExclusionAnalyte PRIMARY KEY (AnalyteId, WellExclusionId); + +CREATE INDEX IDX_LuminexWellExclusionAnalyte_WellExclusionID ON luminex.WellExclusionAnalyte(WellExclusionId); + +ALTER TABLE luminex.RunExclusionAnalyte ALTER COLUMN AnalyteId SET NOT NULL; + +DROP INDEX luminex.UQ_RunExclusionAnalyte; + +ALTER TABLE luminex.RunExclusionAnalyte ADD CONSTRAINT PK_LuminexRunExclusionAnalyte PRIMARY KEY (AnalyteId, RunId); + +CREATE INDEX IDX_LuminexRunExclusionAnalyte_RunID ON luminex.RunExclusionAnalyte(RunId); + +/* luminex-11.20-11.30.sql */ + +CREATE TABLE luminex.CurveFit +( + RowId serial NOT NULL, + TitrationId INT NOT NULL, + AnalyteId INT NOT NULL, + CurveType VARCHAR(20) NOT NULL, + MaxFI REAL NOT NULL, + EC50 REAL NOT NULL, + AUC REAL NOT NULL, + + CONSTRAINT PK_luminex_CurveFit PRIMARY KEY (rowid), + CONSTRAINT FK_CurveFit_AnalyteIdTitrationId FOREIGN KEY (AnalyteId, TitrationId) REFERENCES luminex.AnalyteTitration (AnalyteId, TitrationId), + CONSTRAINT UQ_CurveFit UNIQUE (AnalyteId, TitrationId, CurveType) +); + +ALTER TABLE luminex.CurveFit ALTER COLUMN CurveType TYPE VARCHAR(30); + +ALTER TABLE luminex.CurveFit ALTER COLUMN MaxFI DROP NOT NULL; +ALTER TABLE luminex.CurveFit ALTER COLUMN AUC DROP NOT NULL; +ALTER TABLE luminex.CurveFit ALTER COLUMN EC50 DROP NOT NULL; + +-- Add the 4 and 5 PL curve fit values +ALTER TABLE luminex.CurveFit ADD COLUMN MinAsymptote REAL; +ALTER TABLE luminex.CurveFit ADD COLUMN MaxAsymptote REAL; +ALTER TABLE luminex.CurveFit ADD COLUMN Asymmetry REAL; +ALTER TABLE luminex.CurveFit ADD COLUMN Inflection REAL; +ALTER TABLE luminex.CurveFit ADD COLUMN Slope REAL; + +-- Move MaxFI from CurveFit to Titration as it doesn't depend on the fit parameters +-- Don't bother to migrate values, no real data MaxFI has been stored in the CurveFit table yet +ALTER TABLE luminex.CurveFit DROP COLUMN MaxFI; +ALTER TABLE luminex.AnalyteTitration ADD COLUMN MaxFI REAL; + +CREATE TABLE luminex.GuideSet +( + RowId SERIAL NOT NULL, + ProtocolId INT NOT NULL, + AnalyteName VARCHAR(50) NOT NULL, + CurrentGuideSet BOOLEAN NOT NULL, + Conjugate VARCHAR(50), + Isotype VARCHAR(50), + MaxFIAverage REAL, + MaxFIStdDev REAL, + + CONSTRAINT PK_luminex_GuideSet PRIMARY KEY (RowId), + CONSTRAINT FK_luminex_GuideSet_ProtocolId FOREIGN KEY (ProtocolId) REFERENCES exp.Protocol(RowId) +); + +CREATE INDEX IDX_GuideSet_ProtocolId ON luminex.GuideSet(ProtocolId); + +CREATE TABLE luminex.GuideSetCurveFit +( + GuideSetId INT NOT NULL, + CurveType VARCHAR(30) NOT NULL, + AUCAverage REAL, + AUCStdDev REAL, + EC50Average REAL, + EC50StdDev REAL, + + CONSTRAINT PK_luminex_GuideSetCurveFit PRIMARY KEY (GuideSetId, CurveType) +); + +ALTER TABLE luminex.Analyte ADD COLUMN GuideSetId INT; + +ALTER TABLE luminex.Analyte ADD CONSTRAINT FK_Analyte_GuideSetId FOREIGN KEY (GuideSetId) REFERENCES luminex.GuideSet(RowId); + +CREATE INDEX IDX_Analyte_GuideSetId ON luminex.Analyte(GuideSetId); + +ALTER TABLE luminex.Analyte ADD COLUMN IncludeInGuideSetCalculation BOOLEAN; + +UPDATE luminex.analyte SET IncludeInGuideSetCalculation = FALSE; + +ALTER TABLE luminex.analyte ALTER COLUMN IncludeInGuideSetCalculation SET NOT NULL; + +DROP TABLE luminex.GuideSetCurveFit; + +ALTER TABLE luminex.GuideSet ADD COLUMN TitrationName VARCHAR(255); +ALTER TABLE luminex.GuideSet ADD COLUMN Comment TEXT; +ALTER TABLE luminex.GuideSet ADD COLUMN CreatedBy USERID; +ALTER TABLE luminex.GuideSet ADD COLUMN Created TIMESTAMP; +ALTER TABLE luminex.GuideSet ADD COLUMN ModifiedBy USERID; +ALTER TABLE luminex.GuideSet ADD COLUMN Modified TIMESTAMP; + +ALTER TABLE luminex.AnalyteTitration ADD COLUMN GuideSetId INT; +ALTER TABLE luminex.AnalyteTitration ADD CONSTRAINT FK_AnalytTitration_GuideSetId FOREIGN KEY (GuideSetId) REFERENCES luminex.GuideSet(RowId); +CREATE INDEX IDX_AnalyteTitration_GuideSetId ON luminex.AnalyteTitration(GuideSetId); + +ALTER TABLE luminex.AnalyteTitration ADD COLUMN IncludeInGuideSetCalculation BOOLEAN; +UPDATE luminex.AnalyteTitration SET IncludeInGuideSetCalculation = FALSE; +ALTER TABLE luminex.AnalyteTitration ALTER COLUMN IncludeInGuideSetCalculation SET NOT NULL; + +ALTER TABLE luminex.Analyte DROP COLUMN GuideSetId; +ALTER TABLE luminex.Analyte DROP COLUMN IncludeInGuideSetCalculation; + +ALTER TABLE luminex.GuideSet DROP COLUMN MaxFIAverage; +ALTER TABLE luminex.GuideSet DROP COLUMN MaxFIStdDev; + +ALTER TABLE luminex.DataRow ADD COLUMN Summary Boolean; +ALTER TABLE luminex.DataRow ADD COLUMN CV REAL; + +UPDATE luminex.DataRow SET Summary = TRUE WHERE POSITION(',' IN Well) > 0; +UPDATE luminex.DataRow SET Summary = FALSE WHERE Summary IS NULL; + +ALTER TABLE luminex.DataRow ALTER COLUMN Summary SET NOT NULL; + +-- Calculate the StdDev for any summary rows that have already been uploaded +UPDATE luminex.DataRow dr1 SET StdDev = + (SELECT STDDEV(FI) FROM luminex.DataRow dr2 WHERE + dr2.description = dr1.description AND + ((dr2.dilution IS NULL AND dr1.dilution IS NULL) OR dr1.dilution = dr2.dilution) AND + dr1.dataid = dr2.dataid AND + dr1.analyteid = dr2.analyteid AND + ((dr2.expConc IS NULL AND dr1.expConc IS NULL) OR dr1.expConc = dr2.expConc)) + WHERE StdDev IS NULL; + +-- Calculate the %CV for any summary rows that have already been uploaded +UPDATE luminex.DataRow dr1 SET CV = + StdDev / (SELECT AVG(FI) FROM luminex.DataRow dr2 WHERE + dr2.description = dr1.description AND + ((dr2.dilution IS NULL AND dr1.dilution IS NULL) OR dr1.dilution = dr2.dilution) AND + dr1.dataid = dr2.dataid AND + dr1.analyteid = dr2.analyteid AND + ((dr2.expConc IS NULL AND dr1.expConc IS NULL) OR dr1.expConc = dr2.expConc)) + WHERE StdDev IS NOT NULL AND + (SELECT AVG(FI) FROM luminex.DataRow dr2 WHERE + dr2.description = dr1.description AND + ((dr2.dilution IS NULL AND dr1.dilution IS NULL) OR dr1.dilution = dr2.dilution) AND + dr1.dataid = dr2.dataid AND + dr1.analyteid = dr2.analyteid AND + ((dr2.expConc IS NULL AND dr1.expConc IS NULL) OR dr1.expConc = dr2.expConc)) != 0; + +ALTER TABLE luminex.WellExclusion ADD COLUMN "type" VARCHAR(10); + +-- Populate the WellExclusion Type column based on the value in the DataRow table for the given DataId/Description/Dilution +UPDATE luminex.wellexclusion we SET "type" = + (SELECT types."type" FROM (SELECT dr.dataid, dr.dilution, dr.description, min(dr."type") AS "type" + FROM luminex.datarow AS dr + GROUP BY dr.dataid, dr.dilution, dr.description) AS types + WHERE we.dataid = types.dataid + AND ((we.dilution IS NULL AND types.dilution IS NULL) OR we.dilution = types.dilution) + AND ((we.description IS NULL AND types.description IS NULL) OR we.description = types.description)) + WHERE "type" IS NULL; + +DROP INDEX luminex.UQ_WellExclusion; + +CREATE UNIQUE INDEX UQ_WellExclusion ON luminex.WellExclusion(Description, Type, DataId); + +ALTER TABLE luminex.wellexclusion DROP COLUMN dilution; + +DROP INDEX luminex.ix_luminexdatarow_lsid; + +CREATE UNIQUE INDEX UQ_Analyte_LSID ON luminex.Analyte(LSID); + +/* luminex-11.30-12.10.sql */ + +/* NOTE: this change was added on the 11.3 branch after installers for 11.3 were posted; + this script is for servers that haven't upgraded to 11.31 yet. */ +CREATE INDEX IX_LuminexDataRow_LSID ON luminex.DataRow (LSID); + +ALTER TABLE luminex.Analyte ADD COLUMN PositivityThreshold INT; + +ALTER TABLE luminex.CurveFit ADD COLUMN FailureFlag BOOLEAN; + +/* luminex-13.20-13.30.sql */ + +CREATE TABLE luminex.SinglePointControl +( + RowId SERIAL NOT NULL, + RunId INT NOT NULL, + Name VARCHAR(255) NOT NULL, + + CONSTRAINT PK_Luminex_SinglePointControl PRIMARY KEY (RowId), + CONSTRAINT FK_Luminex_SinglePointControl_RunId FOREIGN KEY (RunId) REFERENCES exp.ExperimentRun(RowId), + CONSTRAINT UQ_SinglePointControl UNIQUE (Name, RunId) +); + +ALTER TABLE luminex.GuideSet RENAME COLUMN TitrationName TO ControlName; + +ALTER TABLE luminex.GuideSet ADD COLUMN Titration BOOLEAN; + +UPDATE luminex.GuideSet SET Titration = TRUE; + +ALTER TABLE luminex.GuideSet ALTER COLUMN Titration SET NOT NULL; + +CREATE TABLE luminex.AnalyteSinglePointControl +( + SinglePointControlId INT NOT NULL, + AnalyteId INT NOT NULL, + GuideSetId INT, + IncludeInGuideSetCalculation BOOLEAN NOT NULL, + + CONSTRAINT PK_AnalyteSinglePointControl PRIMARY KEY (AnalyteId, SinglePointControlId), + CONSTRAINT FK_AnalyteSinglePointControl_AnalyteId FOREIGN KEY (AnalyteId) REFERENCES luminex.Analyte (RowId), + CONSTRAINT FK_AnalyteSinglePointControl_SinglePointControlId FOREIGN KEY (SinglePointControlId) REFERENCES luminex.SinglePointControl (RowId), + CONSTRAINT FK_AnalyteSinglePointControl_GuideSetId FOREIGN KEY (GuideSetId) REFERENCES luminex.GuideSet (RowId) +); + +CREATE INDEX IDX_AnalyteSinglePointControl_GuideSetId ON luminex.AnalyteSinglePointControl(GuideSetId); +CREATE INDEX IDX_AnalyteSinglePointControl_SinglePointControlId ON luminex.AnalyteSinglePointControl(SinglePointControlId); + +ALTER TABLE luminex.GuideSet DROP COLUMN Titration; + +/* luminex-14.10-14.20.sql */ + +ALTER TABLE luminex.GuideSet ADD COLUMN ValueBased BOOLEAN; +UPDATE luminex.GuideSet SET ValueBased = FALSE; +ALTER TABLE luminex.GuideSet ALTER COLUMN ValueBased SET NOT NULL; + +ALTER TABLE luminex.GuideSet ADD COLUMN EC504PLAverage REAL; +ALTER TABLE luminex.GuideSet ADD COLUMN EC504PLStdDev REAL; +ALTER TABLE luminex.GuideSet ADD COLUMN EC505PLAverage REAL; +ALTER TABLE luminex.GuideSet ADD COLUMN EC505PLStdDev REAL; +ALTER TABLE luminex.GuideSet ADD COLUMN AUCAverage REAL; +ALTER TABLE luminex.GuideSet ADD COLUMN AUCStdDev REAL; +ALTER TABLE luminex.GuideSet ADD COLUMN MaxFIAverage REAL; +ALTER TABLE luminex.GuideSet ADD COLUMN MaxFIStdDev REAL; + +ALTER TABLE luminex.GuideSet ALTER COLUMN EC504PLAverage TYPE DOUBLE PRECISION; +ALTER TABLE luminex.GuideSet ALTER COLUMN EC504PLStdDev TYPE DOUBLE PRECISION; +ALTER TABLE luminex.GuideSet ALTER COLUMN EC505PLAverage TYPE DOUBLE PRECISION; +ALTER TABLE luminex.GuideSet ALTER COLUMN EC505PLStdDev TYPE DOUBLE PRECISION; +ALTER TABLE luminex.GuideSet ALTER COLUMN AUCAverage TYPE DOUBLE PRECISION; +ALTER TABLE luminex.GuideSet ALTER COLUMN AUCStdDev TYPE DOUBLE PRECISION; +ALTER TABLE luminex.GuideSet ALTER COLUMN MaxFIAverage TYPE DOUBLE PRECISION; +ALTER TABLE luminex.GuideSet ALTER COLUMN MaxFIStdDev TYPE DOUBLE PRECISION; + +-- Clear out empty strings that were imported instead of treating them as null values. See issue 19837. +-- OntologyManager doesn't bother storing NULL values, so just delete the rows from exp.ObjectProperty + +DELETE FROM exp.objectproperty +WHERE + PropertyId IN ( + SELECT + PropertyId + FROM + exp.propertydescriptor + WHERE + PropertyURI LIKE '%:AssayDomain-ExcelRun.%' AND + RangeURI = 'http://www.w3.org/2001/XMLSchema#string' + ) AND + StringValue = '' AND + MVIndicator IS NULL; + +/* luminex-14.20-14.30.sql */ + +ALTER TABLE luminex.Titration ADD COLUMN OtherControl BOOLEAN; + UPDATE luminex.Titration SET OtherControl=FALSE; + ALTER TABLE luminex.Titration ALTER COLUMN OtherControl SET NOT NULL; + +ALTER TABLE luminex.Analyte ADD COLUMN NegativeBead VARCHAR(50); + +-- assume that any run/dataid that has a "Blank" analyte was using that as the Negative Control bead +UPDATE luminex.analyte SET NegativeBead = ( + SELECT x.Name FROM luminex.analyte AS a + JOIN (SELECT DISTINCT DataId, Name FROM luminex.analyte WHERE Name LIKE 'Blank %') AS x ON a.DataId = x.DataId + WHERE a.DataId IN (SELECT DataId FROM luminex.analyte WHERE Name LIKE 'Blank %') AND a.Name NOT LIKE 'Blank %' + AND luminex.analyte.RowId = a.RowId) +WHERE NegativeBead IS NULL; + +ALTER TABLE luminex.datarow ADD COLUMN SinglePointControlId INT; +ALTER TABLE luminex.datarow ADD CONSTRAINT FK_Luminex_DataRow_SinglePointControlId FOREIGN KEY (SinglePointControlId) REFERENCES luminex.SinglePointControl(RowId); +CREATE INDEX IX_LuminexDataRow_SinglePointControlId ON luminex.DataRow (SinglePointControlId); + +UPDATE luminex.datarow SET SinglePointControlId = + (SELECT s.rowid FROM luminex.singlepointcontrol s, exp.data d, exp.protocolapplication pa + WHERE pa.runid = s.runid AND d.sourceapplicationid = pa.rowid AND dataid = d.rowid AND description = s.name) +WHERE SinglePointControlId IS NULL; + +/* luminex-14.30-14.31.sql */ + +ALTER TABLE luminex.GuideSet ADD EC504PLEnabled BOOLEAN; +ALTER TABLE luminex.GuideSet ADD EC505PLEnabled BOOLEAN; +ALTER TABLE luminex.GuideSet ADD AUCEnabled BOOLEAN; +ALTER TABLE luminex.GuideSet ADD MaxFIEnabled BOOLEAN; +UPDATE luminex.GuideSet SET EC504PLEnabled=TRUE, EC505PLEnabled=TRUE, AUCEnabled=TRUE, MaxFIEnabled=TRUE; +ALTER TABLE luminex.GuideSet ALTER COLUMN EC504PLEnabled SET NOT NULL; +ALTER TABLE luminex.GuideSet ALTER COLUMN EC505PLEnabled SET NOT NULL; +ALTER TABLE luminex.GuideSet ALTER COLUMN AUCEnabled SET NOT NULL; +ALTER TABLE luminex.GuideSet ALTER COLUMN MaxFIEnabled SET NOT NULL; + +/* luminex-14.31-14.32.sql */ + +ALTER TABLE luminex.GuideSet ALTER COLUMN EC504PLEnabled SET DEFAULT TRUE; +ALTER TABLE luminex.GuideSet ALTER COLUMN EC505PLEnabled SET DEFAULT TRUE; +ALTER TABLE luminex.GuideSet ALTER COLUMN AUCEnabled SET DEFAULT TRUE; +ALTER TABLE luminex.GuideSet ALTER COLUMN MaxFIEnabled SET DEFAULT TRUE; + +/* luminex-14.32-14.33.sql */ + +CREATE INDEX IX_LuminexSinglePointControl_RunId ON luminex.SinglePointControl (RunId); +CREATE INDEX IDX_AnalyteSinglePointControl_AnalyteId ON luminex.AnalyteSinglePointControl(AnalyteId); + +/* luminex-14.33-14.34.sql */ + +ALTER TABLE luminex.GuideSet ADD IsTitration BOOLEAN; +UPDATE luminex.GuideSet SET IsTitration = + ( + /* Set the control type to single point control if the GuideSet is used in the AnalyteSinglePointControl table. + Default to setting the control type to titration if not found. */ + CASE WHEN RowId IN (SELECT DISTINCT GuideSetId FROM luminex.AnalyteSinglePointControl WHERE GuideSetId IS NOT NULL) THEN FALSE ELSE TRUE END + ) +; +ALTER TABLE luminex.GuideSet ALTER COLUMN IsTitration SET NOT NULL; + +/* luminex-16.20-16.30.sql */ + +ALTER TABLE luminex.Analyte ADD BeadNumber VARCHAR(50); + +-- parse out the bead number from the analyte name +UPDATE luminex.Analyte + SET BeadNumber = + CASE WHEN STRPOS(REVERSE(RTRIM(Name)), ')') = 1 THEN + TRIM(both FROM (SUBSTRING(Name FROM (LENGTH(Name) - STRPOS(REVERSE(Name), '(') + 2) FOR (STRPOS(REVERSE(Name), '(') - STRPOS(REVERSE(Name), ')') - 1)))) + ELSE Name END, + Name = + CASE WHEN STRPOS(REVERSE(RTRIM(Name)), ')') = 1 THEN + SUBSTRING(Name, 1, LENGTH(Name) - STRPOS(REVERSE(Name), '(')) + ELSE Name END; + +-- parse out the bead number from the guide set analyte name +UPDATE luminex.GuideSet SET AnalyteName = +CASE WHEN STRPOS(REVERSE(RTRIM(AnalyteName)), ')') = 1 THEN + SUBSTRING(AnalyteName, 1, LENGTH(AnalyteName) - STRPOS(REVERSE(AnalyteName), '(')) +ELSE AnalyteName END; + +UPDATE luminex.GuideSet set CurrentGuideSet = false; +UPDATE luminex.GuideSet SET CurrentGuideSet = true WHERE rowId IN (SELECT MAX(rowId) FROM luminex.GuideSet GROUP BY analyteName, protocolId, conjugate, isotype, controlname); + +-- need to parse the bead number off of the negative bead name and trim the analyte name +UPDATE luminex.Analyte SET Name = TRIM(both FROM Name), + NegativeBead = + CASE WHEN STRPOS(REVERSE(RTRIM(NegativeBead)), ')') = 1 THEN + TRIM(both FROM SUBSTRING(NegativeBead, 1, LENGTH(NegativeBead) - STRPOS(REVERSE(NegativeBead), '('))) + ELSE NegativeBead END; + +-- trim the analyte name from the guide set table +UPDATE luminex.GuideSet SET AnalyteName = TRIM(both FROM AnalyteName); + +/* luminex-16.30-17.10.sql */ + +ALTER TABLE luminex.WellExclusion ADD COLUMN Dilution REAL; + +DROP INDEX luminex.UQ_WellExclusion; +CREATE UNIQUE INDEX UQ_WellExclusion ON luminex.WellExclusion(Description, Dilution, Type, DataId); \ No newline at end of file diff --git a/luminex/resources/schemas/dbscripts/postgresql/luminex-0.00-16.30.sql b/luminex/resources/schemas/dbscripts/postgresql/obsolete/luminex-0.00-16.30.sql similarity index 100% rename from luminex/resources/schemas/dbscripts/postgresql/luminex-0.00-16.30.sql rename to luminex/resources/schemas/dbscripts/postgresql/obsolete/luminex-0.00-16.30.sql diff --git a/luminex/resources/schemas/dbscripts/postgresql/luminex-16.30-17.10.sql b/luminex/resources/schemas/dbscripts/postgresql/obsolete/luminex-16.30-17.10.sql similarity index 100% rename from luminex/resources/schemas/dbscripts/postgresql/luminex-16.30-17.10.sql rename to luminex/resources/schemas/dbscripts/postgresql/obsolete/luminex-16.30-17.10.sql diff --git a/luminex/resources/schemas/dbscripts/sqlserver/luminex-0.00-17.10.sql b/luminex/resources/schemas/dbscripts/sqlserver/luminex-0.00-17.10.sql new file mode 100644 index 0000000000..5dd9c32aa9 --- /dev/null +++ b/luminex/resources/schemas/dbscripts/sqlserver/luminex-0.00-17.10.sql @@ -0,0 +1,660 @@ +/* + * Copyright (c) 2010-2017 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* luminex-0.00-10.10.sql */ + +CREATE SCHEMA luminex; +GO + +CREATE TABLE luminex.Analyte +( + RowId INT IDENTITY(1,1) NOT NULL, + LSID LSIDtype NOT NULL , + Name VARCHAR(50) NOT NULL, + DataId INT NOT NULL, + FitProb REAL, + ResVar REAL, + RegressionType VARCHAR(100), + StdCurve VARCHAR(255), + MinStandardRecovery INT NOT NULL, + MaxStandardRecovery INT NOT NULL, + + CONSTRAINT PK_Luminex_Analyte PRIMARY KEY (RowId), + CONSTRAINT FK_LuminexAnalyte_DataId FOREIGN KEY (DataId) REFERENCES exp.Data(RowId) +); + +CREATE INDEX IX_LuminexAnalyte_DataId ON luminex.Analyte (DataId); + +CREATE TABLE luminex.DataRow +( + RowId INT IDENTITY(1,1) NOT NULL, + DataId INT NOT NULL, + AnalyteId INT NOT NULL, + Type VARCHAR(10), + Well VARCHAR(50), + Outlier INT, + Description VARCHAR(50), + FIString VARCHAR(20), + FI REAL, + FIOORIndicator VARCHAR(10), + FIBackgroundString VARCHAR(20), + FIBackground REAL, + FIBackgroundOORIndicator VARCHAR(10), + StdDevString VARCHAR(20), + StdDev REAL, + StdDevOORIndicator VARCHAR(10), + ObsConcString VARCHAR(20), + ObsConc REAL, + ObsConcOORIndicator VARCHAR(10), + ExpConc REAL, + ObsOverExp REAL, + ConcInRangeString VARCHAR(20), + ConcInRange REAL, + ConcInRangeOORIndicator VARCHAR(10), + + Dilution REAL, + DataRowGroup VARCHAR(25), + Ratio VARCHAR(25), + SamplingErrors VARCHAR(25), + PTID NVARCHAR(32), + VisitID FLOAT, + Date DATETIME, + ExtraSpecimenInfo NVARCHAR(50), + SpecimenID NVARCHAR(50), + Container EntityID NOT NULL, + ProtocolID INT NOT NULL, + BeadCount INT, + + CONSTRAINT PK_Luminex_DataRow PRIMARY KEY (RowId), + CONSTRAINT FK_LuminexDataRow_DataId FOREIGN KEY (DataId) REFERENCES exp.Data(RowId), + CONSTRAINT FK_LuminexDataRow_AnalyteId FOREIGN KEY (AnalyteId) REFERENCES luminex.analyte(RowId), + CONSTRAINT FK_DataRow_Container FOREIGN KEY (Container) REFERENCES core.Containers (EntityID), + CONSTRAINT FK_DataRow_ProtocolID FOREIGN KEY (ProtocolID) REFERENCES exp.Protocol (RowID) +); +CREATE INDEX IX_LuminexDataRow_DataId ON luminex.DataRow (DataId); +CREATE INDEX IX_LuminexDataRow_AnalyteId ON luminex.DataRow (AnalyteId); +CREATE INDEX IDX_DataRow_Container_ProtocolID ON luminex.datarow(Container, ProtocolID); + +/* luminex-10.30-11.10.sql */ + +ALTER TABLE luminex.DataRow + ALTER COLUMN fistring NVARCHAR(64); + +ALTER TABLE luminex.DataRow + ALTER COLUMN fibackgroundstring NVARCHAR(64); + +ALTER TABLE luminex.DataRow + ALTER COLUMN stddevstring NVARCHAR(64); + +ALTER TABLE luminex.DataRow + ALTER COLUMN obsconcstring NVARCHAR(64); + +ALTER TABLE luminex.DataRow + ALTER COLUMN concinrangestring NVARCHAR(64); + +/* luminex-11.10-11.20.sql */ + +ALTER TABLE luminex.datarow ADD LSID LSIDtype; +GO + +UPDATE luminex.datarow SET LSID = 'urn:lsid:' + COALESCE ((SELECT p.value +FROM prop.properties p, prop.propertysets ps, core.containers c +WHERE + p.name = 'defaultLsidAuthority' AND + ps."set" = p."set" AND + ps.category = 'SiteConfig' AND + ps.objectid = c.entityid AND + c.name IS NULL AND c.parent IS NULL), 'localhost') + ':LuminexDataRow:' + CAST(RowId AS NVARCHAR); + +ALTER TABLE luminex.datarow ALTER COLUMN LSID LSIDType NOT NULL; + +CREATE INDEX IX_LuminexDataRow_LSID ON luminex.Analyte (LSID); + +CREATE TABLE luminex.Titration +( + RowId INT IDENTITY(1,1) NOT NULL, + RunId INT NOT NULL, + Name NVARCHAR(255) NOT NULL, + Standard BIT NOT NULL, + QCControl BIT NOT NULL, + + CONSTRAINT PK_Luminex_Titration PRIMARY KEY (RowId), + CONSTRAINT FK_Luminex_Titration_RunId FOREIGN KEY (RunId) REFERENCES exp.ExperimentRun(RowId), + CONSTRAINT UQ_Titration UNIQUE (Name, RunId) +); + +CREATE TABLE luminex.AnalyteTitration +( + AnalyteId INT NOT NULL, + TitrationId INT NOT NULL, + + CONSTRAINT PK_Luminex_AnalyteTitration PRIMARY KEY (AnalyteId, TitrationId) +); + +CREATE INDEX IX_LuminexTitration_RunId ON luminex.Titration (RunId); + +-- Assume a single titration for all existing data +INSERT INTO luminex.Titration + (RunId, Name, Standard, QCControl) + SELECT RowId, 'Standard', 1, 0 FROM exp.experimentrun WHERE protocollsid LIKE '%:LuminexAssayProtocol.%'; + +-- Assign all existing analytes to the single titration created above +INSERT INTO luminex.AnalyteTitration + (AnalyteId, TitrationId) + SELECT a.RowId, t.RowId + FROM luminex.analyte a, exp.data d, luminex.titration t, exp.protocolapplication pa + WHERE a.dataid = d.rowid AND t.runid = pa.runid AND d.sourceapplicationid = pa.rowid; + +ALTER TABLE luminex.datarow ADD TitrationId INT; + +GO + +ALTER TABLE luminex.datarow ADD CONSTRAINT FK_Luminex_DataRow_TitrationId FOREIGN KEY (TitrationId) REFERENCES luminex.Titration(RowId); +CREATE INDEX IX_LuminexDataRow_TitrationId ON luminex.DataRow (TitrationId); + +-- Assume that any existing data that has an expected concentration is part of the single standard titration +-- for that run +UPDATE luminex.datarow SET titrationid = + (SELECT t.rowid FROM luminex.titration t, exp.data d, exp.protocolapplication pa + WHERE pa.runid = t.runid AND d.sourceapplicationid = pa.rowid AND dataid = d.rowid) + WHERE expconc IS NOT NULL; + +-- Use the description as the titration name, grabbing an arbitrary one if they're not all the same +UPDATE luminex.titration SET name = (SELECT COALESCE(MIN(description), 'Standard') FROM luminex.datarow WHERE luminex.titration.rowid = titrationid); + +ALTER TABLE luminex.Titration ADD "unknown" BIT; + +GO + +UPDATE luminex.Titration SET "unknown" = 0; + +ALTER TABLE luminex.Titration ALTER COLUMN "unknown" BIT NOT NULL; + +-- Make sure we have a row in exp.Object for all Luminex data files so that we can migrate the Excel run properties to it +INSERT INTO exp.Object (ObjectURI, Container) + SELECT d.LSID, d.Container + FROM exp.Data d, exp.ExperimentRun r, exp.ProtocolApplication pa + WHERE d.SourceApplicationId = pa.RowId and r.RowId = pa.RunId AND r.ProtocolLSID LIKE '%:LuminexAssayProtocol.Folder-%' AND d.LSID NOT IN (SELECT ObjectURI FROM exp.Object); + +-- Clean up run field values that were orphaned when we failed to delete them as part of deleting a Luminex run +DELETE FROM exp.ObjectProperty + WHERE ObjectId IN (SELECT o.ObjectId FROM exp.Object o LEFT OUTER JOIN exp.ExperimentRun r ON o.ObjectURI = r.LSID WHERE o.ObjectURI like '%:LuminexAssayRun.Folder-%' AND r.LSID IS NULL); + +-- Migrate Excel-based values from run to data +UPDATE exp.ObjectProperty SET ObjectId = + (SELECT MIN(dataO.ObjectId) FROM exp.Object dataO, exp.Object runO, exp.Data d, exp.ExperimentRun r, exp.ProtocolApplication pa + WHERE dataO.ObjectURI = d.LSID AND runO.ObjectURI = r.LSID AND runO.ObjectId = exp.ObjectProperty.ObjectId AND d.SourceApplicationId = pa.RowId AND pa.RunId = r.RowId AND r.ProtocolLSID LIKE '%:LuminexAssayProtocol.Folder-%') +WHERE PropertyId IN (SELECT pd.PropertyId FROM exp.PropertyDescriptor p, exp.DomainDescriptor d, exp.PropertyDomain pd WHERE p.PropertyId = pd.PropertyId AND d.domainuri LIKE '%:AssayDomain-ExcelRun.Folder-%' AND pd.DomainId = d.DomainId); + +-- Add the Unknown type for a titration +ALTER TABLE luminex.DataRow ADD WellRole NVARCHAR(50); + +GO + +UPDATE luminex.DataRow SET WellRole = 'Standard' WHERE UPPER(Type) LIKE 'S%' OR UPPER(Type) LIKE 'ES%'; +UPDATE luminex.DataRow SET WellRole = 'Control' WHERE UPPER(Type) LIKE 'C%'; +UPDATE luminex.DataRow SET WellRole = 'Background' WHERE UPPER(Type) LIKE 'B%'; +UPDATE luminex.DataRow SET WellRole = 'Unknown' WHERE UPPER(Type) LIKE 'U%'; + +CREATE TABLE luminex.WellExclusion +( + RowId INT IDENTITY(1,1) NOT NULL, + Description NVARCHAR(50), + Dilution REAL, + DataId INT NOT NULL, + Comment NVARCHAR(2000), + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, + + CONSTRAINT PK_Luminex_WellExclusion PRIMARY KEY (RowId), + CONSTRAINT FK_LuminexWellExclusion_DataId FOREIGN KEY (DataId) REFERENCES exp.Data(RowId) +); + +CREATE UNIQUE INDEX UQ_WellExclusion ON luminex.WellExclusion(Description, Dilution, DataId); + +CREATE TABLE luminex.WellExclusionAnalyte +( + AnalyteId INT, + WellExclusionId INT NOT NULL, + + CONSTRAINT FK_LuminexWellExclusionAnalyte_AnalyteId FOREIGN KEY (AnalyteId) REFERENCES luminex.Analyte(RowId), + CONSTRAINT FK_LuminexWellExclusionAnalyte_WellExclusionId FOREIGN KEY (WellExclusionId) REFERENCES luminex.WellExclusion(RowId) +); + +CREATE UNIQUE INDEX UQ_WellExclusionAnalyte ON luminex.WellExclusionAnalyte(AnalyteId, WellExclusionId); + +CREATE TABLE luminex.RunExclusion +( + RunId INT NOT NULL, + Comment NVARCHAR(2000), + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, + + CONSTRAINT PK_Luminex_RunExclusion PRIMARY KEY (RunId), + CONSTRAINT FK_LuminexRunExclusion_RunId FOREIGN KEY (RunId) REFERENCES exp.ExperimentRun(RowId) +); + +CREATE TABLE luminex.RunExclusionAnalyte +( + AnalyteId INT, + RunId INT NOT NULL, + + CONSTRAINT FK_LuminexRunExclusionAnalyte_AnalyteId FOREIGN KEY (AnalyteId) REFERENCES luminex.Analyte(RowId), + CONSTRAINT FK_LuminexRunExclusionAnalyte_RunId FOREIGN KEY (RunId) REFERENCES luminex.RunExclusion(RunId) +); + +CREATE UNIQUE INDEX UQ_RunExclusionAnalyte ON luminex.RunExclusionAnalyte(AnalyteId, RunId); + +-- Don't allow AnalyteId to be NULL in the exclusion tables + +DROP INDEX UQ_WellExclusionAnalyte ON luminex.WellExclusionAnalyte; +ALTER TABLE luminex.WellExclusionAnalyte ALTER COLUMN AnalyteId INT NOT NULL; +ALTER TABLE luminex.WellExclusionAnalyte ADD CONSTRAINT PK_LuminexWellExclusionAnalyte PRIMARY KEY (AnalyteId, WellExclusionId); +CREATE INDEX IDX_LuminexWellExclusionAnalyte_WellExclusionID ON luminex.WellExclusionAnalyte(WellExclusionId); + +DROP INDEX UQ_RunExclusionAnalyte ON luminex.RunExclusionAnalyte; +ALTER TABLE luminex.RunExclusionAnalyte ALTER COLUMN AnalyteId INT NOT NULL; +ALTER TABLE luminex.RunExclusionAnalyte ADD CONSTRAINT PK_LuminexRunExclusionAnalyte PRIMARY KEY (AnalyteId, RunId); +CREATE INDEX IDX_LuminexRunExclusionAnalyte_RunID ON luminex.RunExclusionAnalyte(RunId); + +/* luminex-11.20-11.30.sql */ + +CREATE TABLE luminex.CurveFit +( + RowId INT IDENTITY(1,1) NOT NULL, + TitrationId INT NOT NULL, + AnalyteId INT NOT NULL, + CurveType VARCHAR(20) NOT NULL, + MaxFI REAL NOT NULL, + EC50 REAL NOT NULL, + AUC REAL NOT NULL, + + CONSTRAINT PK_luminex_CurveFit PRIMARY KEY (rowid), + CONSTRAINT FK_CurveFit_AnalyteIdTitrationId FOREIGN KEY (AnalyteId, TitrationId) REFERENCES luminex.AnalyteTitration (AnalyteId, TitrationId), + CONSTRAINT UQ_CurveFit UNIQUE (AnalyteId, TitrationId, CurveType) +); + +ALTER TABLE luminex.CurveFit ALTER COLUMN CurveType VARCHAR(30); + +ALTER TABLE luminex.CurveFit ALTER COLUMN MaxFI REAL NULL; +ALTER TABLE luminex.CurveFit ALTER COLUMN AUC REAL NULL; +ALTER TABLE luminex.CurveFit ALTER COLUMN EC50 REAL NULL; + +-- Add the 4 and 5 PL curve fit values +ALTER TABLE luminex.CurveFit ADD MinAsymptote REAL; +ALTER TABLE luminex.CurveFit ADD MaxAsymptote REAL; +ALTER TABLE luminex.CurveFit ADD Asymmetry REAL; +ALTER TABLE luminex.CurveFit ADD Inflection REAL; +ALTER TABLE luminex.CurveFit ADD Slope REAL; + +-- Move MaxFI from CurveFit to Titration as it doesn't depend on the fit parameters +-- Don't bother to migrate values, no real data MaxFI has been stored in the CurveFit table yet +ALTER TABLE luminex.CurveFit DROP COLUMN MaxFI; +ALTER TABLE luminex.AnalyteTitration ADD MaxFI REAL; + +CREATE TABLE luminex.GuideSet +( + RowId INT IDENTITY(1,1) NOT NULL, + ProtocolId INT NOT NULL, + AnalyteName VARCHAR(50) NOT NULL, + CurrentGuideSet BIT NOT NULL, + Conjugate VARCHAR(50), + Isotype VARCHAR(50), + MaxFIAverage REAL, + MaxFIStdDev REAL, + + CONSTRAINT PK_luminex_GuideSet PRIMARY KEY (RowId), + CONSTRAINT FK_luminex_GuideSet_ProtocolId FOREIGN KEY (ProtocolId) REFERENCES exp.Protocol(RowId) +); + +CREATE INDEX IDX_GuideSet_ProtocolId ON luminex.GuideSet(ProtocolId); + +CREATE TABLE luminex.GuideSetCurveFit +( + GuideSetId INT NOT NULL, + CurveType VARCHAR(30) NOT NULL, + AUCAverage REAL, + AUCStdDev REAL, + EC50Average REAL, + EC50StdDev REAL, + + CONSTRAINT PK_luminex_GuideSetCurveFit PRIMARY KEY (GuideSetId, CurveType) +); + +ALTER TABLE luminex.Analyte ADD GuideSetId INT; +ALTER TABLE luminex.Analyte ADD CONSTRAINT FK_Analyte_GuideSetId FOREIGN KEY (GuideSetId) REFERENCES luminex.GuideSet(RowId); + +CREATE INDEX IDX_Analyte_GuideSetId ON luminex.Analyte(GuideSetId); + +ALTER TABLE luminex.Analyte ADD IncludeInGuideSetCalculation BIT; + +GO + +UPDATE luminex.analyte SET IncludeInGuideSetCalculation = 0; +ALTER TABLE luminex.analyte ALTER COLUMN IncludeInGuideSetCalculation BIT NOT NULL; + +DROP TABLE luminex.GuideSetCurveFit; + +ALTER TABLE luminex.GuideSet ADD TitrationName VARCHAR(255); +ALTER TABLE luminex.GuideSet ADD Comment TEXT; +ALTER TABLE luminex.GuideSet ADD CreatedBy USERID; +ALTER TABLE luminex.GuideSet ADD Created DATETIME; +ALTER TABLE luminex.GuideSet ADD ModifiedBy USERID; +ALTER TABLE luminex.GuideSet ADD Modified DATETIME; + +ALTER TABLE luminex.AnalyteTitration ADD GuideSetId INT; +ALTER TABLE luminex.AnalyteTitration ADD CONSTRAINT FK_AnalytTitration_GuideSetId FOREIGN KEY (GuideSetId) REFERENCES luminex.GuideSet(RowId); + +ALTER TABLE luminex.AnalyteTitration ADD IncludeInGuideSetCalculation BIT; + +GO + +UPDATE luminex.AnalyteTitration SET IncludeInGuideSetCalculation = 0; +ALTER TABLE luminex.AnalyteTitration ALTER COLUMN IncludeInGuideSetCalculation BIT NOT NULL; + +CREATE INDEX IDX_AnalyteTitration_GuideSetId ON luminex.AnalyteTitration(GuideSetId); + +DROP INDEX IDX_Analyte_GuideSetId ON luminex.Analyte; +ALTER TABLE luminex.Analyte DROP CONSTRAINT FK_Analyte_GuideSetId; +ALTER TABLE luminex.Analyte DROP COLUMN GuideSetId; +ALTER TABLE luminex.Analyte DROP COLUMN IncludeInGuideSetCalculation; + +ALTER TABLE luminex.GuideSet DROP COLUMN MaxFIAverage; +ALTER TABLE luminex.GuideSet DROP COLUMN MaxFIStdDev; + +ALTER TABLE luminex.DataRow ADD Summary BIT; +ALTER TABLE luminex.DataRow ADD CV REAL; + +GO + +UPDATE luminex.DataRow SET Summary = 1 WHERE patindex('%,%', Well) > 0; +UPDATE luminex.DataRow SET Summary = 0 WHERE Summary IS NULL; + +ALTER TABLE luminex.DataRow ALTER COLUMN Summary BIT NOT NULL; + +-- Calculate the StdDev for any summary rows that have already been uploaded +UPDATE luminex.DataRow SET StdDev = + (SELECT STDEV(FI) FROM luminex.DataRow dr2 WHERE + dr2.description = luminex.DataRow.description AND + ((dr2.dilution IS NULL AND luminex.DataRow.dilution IS NULL) OR luminex.DataRow.dilution = dr2.dilution) AND + luminex.DataRow.dataid = dr2.dataid AND + luminex.DataRow.analyteid = dr2.analyteid AND + ((dr2.expConc IS NULL AND luminex.DataRow.expConc IS NULL) OR luminex.DataRow.expConc = dr2.expConc)) + WHERE StdDev IS NULL; + +-- Calculate the %CV for any summary rows that have already been uploaded +UPDATE luminex.DataRow SET CV = + StdDev / (SELECT AVG(FI) FROM luminex.DataRow dr2 WHERE + dr2.description = luminex.DataRow.description AND + ((dr2.dilution IS NULL AND luminex.DataRow.dilution IS NULL) OR luminex.DataRow.dilution = dr2.dilution) AND + luminex.DataRow.dataid = dr2.dataid AND + luminex.DataRow.analyteid = dr2.analyteid AND + ((dr2.expConc IS NULL AND luminex.DataRow.expConc IS NULL) OR luminex.DataRow.expConc = dr2.expConc)) + WHERE StdDev IS NOT NULL AND + (SELECT AVG(FI) FROM luminex.DataRow dr2 WHERE + dr2.description = luminex.DataRow.description AND + ((dr2.dilution IS NULL AND luminex.DataRow.dilution IS NULL) OR luminex.DataRow.dilution = dr2.dilution) AND + luminex.DataRow.dataid = dr2.dataid AND + luminex.DataRow.analyteid = dr2.analyteid AND + ((dr2.expConc IS NULL AND luminex.DataRow.expConc IS NULL) OR luminex.DataRow.expConc = dr2.expConc)) != 0; + +ALTER TABLE luminex.WellExclusion ADD Type VARCHAR(10); +GO + +-- Populate the WellExclusion Type column based on the value in the DataRow table for the given DataId/Description/Dilution +UPDATE luminex.WellExclusion SET Type = + (SELECT types.Type FROM (SELECT dr.DataId, dr.Dilution, dr.Description, min(dr.Type) AS Type + FROM luminex.DataRow dr + GROUP BY dr.DataId, dr.Dilution, dr.Description) AS types + WHERE luminex.WellExclusion.DataId = types.DataId + AND ((luminex.WellExclusion.Dilution IS NULL AND types.Dilution IS NULL) OR luminex.WellExclusion.Dilution = types.Dilution) + AND ((luminex.WellExclusion.Description IS NULL AND types.Description IS NULL) OR luminex.WellExclusion.Description = types.Description)) + WHERE Type IS NULL; + +DROP INDEX UQ_WellExclusion ON luminex.WellExclusion; +CREATE UNIQUE INDEX UQ_WellExclusion ON luminex.WellExclusion(Description, Type, DataId); +ALTER TABLE luminex.WellExclusion DROP COLUMN Dilution; + +DROP INDEX luminex.analyte.ix_luminexdatarow_lsid; +CREATE UNIQUE INDEX UQ_Analyte_LSID ON luminex.Analyte(LSID); + +/* luminex-11.30-12.10.sql */ + +/* NOTE: this change was added on the 11.3 branch after installers for 11.3 were posted; + this script is for servers that haven't upgraded to 11.31 yet. */ +CREATE INDEX IX_LuminexDataRow_LSID ON luminex.DataRow (LSID); + +ALTER TABLE luminex.Analyte ADD PositivityThreshold INT; + +ALTER TABLE luminex.CurveFit ADD FailureFlag BIT; + +/* luminex-13.20-13.30.sql */ + +CREATE TABLE luminex.SinglePointControl +( + RowId INT IDENTITY(1,1) NOT NULL, + RunId INT NOT NULL, + Name NVARCHAR(255) NOT NULL, + + CONSTRAINT PK_Luminex_SinglePointControl PRIMARY KEY (RowId), + CONSTRAINT FK_Luminex_SinglePointControl_RunId FOREIGN KEY (RunId) REFERENCES exp.ExperimentRun(RowId), + CONSTRAINT UQ_SinglePointControl UNIQUE (Name, RunId) +); + +EXEC sp_rename 'luminex.GuideSet.TitrationName', 'ControlName', 'COLUMN'; + +ALTER TABLE luminex.GuideSet ADD Titration BIT +-- Need a GO here so that we can use the column in the next line +GO + +UPDATE luminex.GuideSet SET Titration = 1; + +ALTER TABLE luminex.GuideSet ALTER COLUMN Titration BIT NOT NULL; + +CREATE TABLE luminex.AnalyteSinglePointControl +( + RowId INT IDENTITY(1,1) NOT NULL, + SinglePointControlId INT NOT NULL, + AnalyteId INT NOT NULL, + GuideSetId INT, + IncludeInGuideSetCalculation BIT NOT NULL, + + CONSTRAINT PK_AnalyteSinglePointControl PRIMARY KEY (AnalyteId, SinglePointControlId), + CONSTRAINT FK_AnalyteSinglePointControl_AnalyteId FOREIGN KEY (AnalyteId) REFERENCES luminex.Analyte (RowId), + CONSTRAINT FK_AnalyteSinglePointControl_SinglePointControlId FOREIGN KEY (SinglePointControlId) REFERENCES luminex.SinglePointControl (RowId), + CONSTRAINT FK_AnalyteSinglePointControl_GuideSetId FOREIGN KEY (GuideSetId) REFERENCES luminex.GuideSet (RowId) +); + +CREATE INDEX IDX_AnalyteSinglePointControl_GuideSetId ON luminex.AnalyteSinglePointControl(GuideSetId); +CREATE INDEX IDX_AnalyteSinglePointControl_SinglePointControlId ON luminex.AnalyteSinglePointControl(SinglePointControlId); + +ALTER TABLE luminex.GuideSet DROP COLUMN Titration; + +DROP TABLE luminex.AnalyteSinglePointControl; + +CREATE TABLE luminex.AnalyteSinglePointControl +( + SinglePointControlId INT NOT NULL, + AnalyteId INT NOT NULL, + GuideSetId INT, + IncludeInGuideSetCalculation BIT NOT NULL, + + CONSTRAINT PK_AnalyteSinglePointControl PRIMARY KEY (AnalyteId, SinglePointControlId), + CONSTRAINT FK_AnalyteSinglePointControl_AnalyteId FOREIGN KEY (AnalyteId) REFERENCES luminex.Analyte (RowId), + CONSTRAINT FK_AnalyteSinglePointControl_SinglePointControlId FOREIGN KEY (SinglePointControlId) REFERENCES luminex.SinglePointControl (RowId), + CONSTRAINT FK_AnalyteSinglePointControl_GuideSetId FOREIGN KEY (GuideSetId) REFERENCES luminex.GuideSet (RowId) +); + +CREATE INDEX IDX_AnalyteSinglePointControl_GuideSetId ON luminex.AnalyteSinglePointControl(GuideSetId); +CREATE INDEX IDX_AnalyteSinglePointControl_SinglePointControlId ON luminex.AnalyteSinglePointControl(SinglePointControlId); + +/* luminex-14.10-14.20.sql */ + +ALTER TABLE luminex.GuideSet ADD ValueBased BIT; +GO +UPDATE luminex.GuideSet SET ValueBased = 0; +ALTER TABLE luminex.GuideSet ALTER COLUMN ValueBased BIT NOT NULL; + +ALTER TABLE luminex.GuideSet ADD EC504PLAverage REAL; +ALTER TABLE luminex.GuideSet ADD EC504PLStdDev REAL; +ALTER TABLE luminex.GuideSet ADD EC505PLAverage REAL; +ALTER TABLE luminex.GuideSet ADD EC505PLStdDev REAL; +ALTER TABLE luminex.GuideSet ADD AUCAverage REAL; +ALTER TABLE luminex.GuideSet ADD AUCStdDev REAL; +ALTER TABLE luminex.GuideSet ADD MaxFIAverage REAL; +ALTER TABLE luminex.GuideSet ADD MaxFIStdDev REAL; + +ALTER TABLE luminex.GuideSet ALTER COLUMN EC504PLAverage DOUBLE PRECISION; +ALTER TABLE luminex.GuideSet ALTER COLUMN EC504PLStdDev DOUBLE PRECISION; +ALTER TABLE luminex.GuideSet ALTER COLUMN EC505PLAverage DOUBLE PRECISION; +ALTER TABLE luminex.GuideSet ALTER COLUMN EC505PLStdDev DOUBLE PRECISION; +ALTER TABLE luminex.GuideSet ALTER COLUMN AUCAverage DOUBLE PRECISION; +ALTER TABLE luminex.GuideSet ALTER COLUMN AUCStdDev DOUBLE PRECISION; +ALTER TABLE luminex.GuideSet ALTER COLUMN MaxFIAverage DOUBLE PRECISION; +ALTER TABLE luminex.GuideSet ALTER COLUMN MaxFIStdDev DOUBLE PRECISION; + +-- Clear out empty strings that were imported instead of treating them as null values. See issue 19837. +-- OntologyManager doesn't bother storing NULL values, so just delete the rows from exp.ObjectProperty + +DELETE FROM exp.objectproperty +WHERE + PropertyId IN ( + SELECT + PropertyId + FROM + exp.propertydescriptor + WHERE + PropertyURI LIKE '%:AssayDomain-ExcelRun.%' AND + RangeURI = 'http://www.w3.org/2001/XMLSchema#string' + ) AND + StringValue = '' AND + MVIndicator IS NULL; + +/* luminex-14.20-14.30.sql */ + +ALTER TABLE luminex.Titration ADD OtherControl BIT; +GO +UPDATE luminex.Titration SET OtherControl=0; +ALTER TABLE luminex.Titration ALTER COLUMN OtherControl BIT NOT NULL; + +ALTER TABLE luminex.Analyte ADD NegativeBead VARCHAR(50); +GO + +-- assume that any run/dataid that has a "Blank" analyte was using that as the Negative Control bead +UPDATE luminex.analyte SET NegativeBead = ( + SELECT x.Name FROM luminex.analyte AS a + JOIN (SELECT DISTINCT DataId, Name FROM luminex.analyte WHERE Name LIKE 'Blank %') AS x ON a.DataId = x.DataId + WHERE a.DataId IN (SELECT DataId FROM luminex.analyte WHERE Name LIKE 'Blank %') AND a.Name NOT LIKE 'Blank %' + AND luminex.analyte.RowId = a.RowId) +WHERE NegativeBead IS NULL; + +ALTER TABLE luminex.datarow ADD SinglePointControlId INT; +GO +ALTER TABLE luminex.datarow ADD CONSTRAINT FK_Luminex_DataRow_SinglePointControlId FOREIGN KEY (SinglePointControlId) REFERENCES luminex.SinglePointControl(RowId); +CREATE INDEX IX_LuminexDataRow_SinglePointControlId ON luminex.DataRow (SinglePointControlId); + +UPDATE luminex.datarow SET SinglePointControlId = + (SELECT s.rowid FROM luminex.singlepointcontrol s, exp.data d, exp.protocolapplication pa + WHERE pa.runid = s.runid AND d.sourceapplicationid = pa.rowid AND dataid = d.rowid AND description = s.name) +WHERE SinglePointControlId IS NULL; + +/* luminex-14.30-14.31.sql */ + +ALTER TABLE luminex.GuideSet ADD EC504PLEnabled BIT; +ALTER TABLE luminex.GuideSet ADD EC505PLEnabled BIT; +ALTER TABLE luminex.GuideSet ADD AUCEnabled BIT; +ALTER TABLE luminex.GuideSet ADD MaxFIEnabled BIT; +GO +UPDATE luminex.GuideSet SET EC504PLEnabled=1, EC505PLEnabled=1, AUCEnabled=1, MaxFIEnabled=1; +ALTER TABLE luminex.GuideSet ALTER COLUMN EC504PLEnabled BIT NOT NULL; +ALTER TABLE luminex.GuideSet ALTER COLUMN EC505PLEnabled BIT NOT NULL; +ALTER TABLE luminex.GuideSet ALTER COLUMN AUCEnabled BIT NOT NULL; +ALTER TABLE luminex.GuideSet ALTER COLUMN MaxFIEnabled BIT NOT NULL; + +/* luminex-14.31-14.32.sql */ + +ALTER TABLE luminex.GuideSet ADD CONSTRAINT DF_EC504PLEnabled DEFAULT 1 FOR EC504PLEnabled; +ALTER TABLE luminex.GuideSet ADD CONSTRAINT DF_EC505PLEnabled DEFAULT 1 FOR EC505PLEnabled; +ALTER TABLE luminex.GuideSet ADD CONSTRAINT DF_AUCEnabled DEFAULT 1 FOR AUCEnabled; +ALTER TABLE luminex.GuideSet ADD CONSTRAINT DF_MaxFIEnabled DEFAULT 1 FOR MaxFIEnabled; + +/* luminex-14.32-14.33.sql */ + +CREATE INDEX IX_LuminexSinglePointControl_RunId ON luminex.SinglePointControl(RunId); +CREATE INDEX IDX_AnalyteSinglePointControl_AnalyteId ON luminex.AnalyteSinglePointControl(AnalyteId); + +/* luminex-14.33-14.34.sql */ + +ALTER TABLE luminex.GuideSet ADD IsTitration BIT; +GO +UPDATE luminex.GuideSet SET IsTitration = + ( + /* Set the control type to single point control if the GuideSet is used in the AnalyteSinglePointControl table. + Default to setting the control type to titration if not found. */ + CASE WHEN RowId IN (SELECT DISTINCT GuideSetId FROM luminex.AnalyteSinglePointControl WHERE GuideSetId IS NOT NULL) THEN 0 ELSE 1 END + ) +; +ALTER TABLE luminex.GuideSet ALTER COLUMN IsTitration BIT NOT NULL; + +/* luminex-16.20-16.30.sql */ + +ALTER TABLE luminex.Analyte ADD BeadNumber NVARCHAR(50); +GO + +-- parse out the bead number from the analyte name +UPDATE luminex.Analyte + SET BeadNumber = + CASE WHEN CHARINDEX(')', REVERSE(RTRIM(Name))) = 1 THEN + RTRIM(LTRIM(SUBSTRING(Name, LEN(Name) - CHARINDEX('(', REVERSE(RTRIM(Name))) + 2, CHARINDEX('(', REVERSE(RTRIM(Name))) - CHARINDEX(')', REVERSE(RTRIM(Name))) - 1))) + ELSE Name END, + Name = + CASE WHEN CHARINDEX(')', REVERSE(RTRIM(Name))) = 1 THEN + SUBSTRING(Name, 1, LEN(Name) - CHARINDEX('(', REVERSE(RTRIM(Name)))) + ELSE Name END; + +-- parse out the bead number from the guide set analyte name +UPDATE luminex.GuideSet SET AnalyteName = + CASE WHEN CHARINDEX(')', REVERSE(RTRIM(AnalyteName))) = 1 THEN + SUBSTRING(AnalyteName, 1, LEN(AnalyteName) - CHARINDEX('(', REVERSE(RTRIM(AnalyteName)))) + ELSE AnalyteName END; + +UPDATE luminex.GuideSet set CurrentGuideSet = 0; +UPDATE luminex.GuideSet SET CurrentGuideSet = 1 WHERE rowId IN (SELECT MAX(rowId) FROM luminex.GuideSet GROUP BY analyteName, protocolId, conjugate, isotype, controlname); + +-- need to parse the bead number off of the negative bead name and trim the analyte name +UPDATE luminex.Analyte SET Name = RTRIM(LTRIM(Name)), + NegativeBead = + CASE WHEN CHARINDEX(')', REVERSE(RTRIM(NegativeBead))) = 1 THEN + RTRIM(LTRIM(SUBSTRING(NegativeBead, 1, LEN(NegativeBead) - CHARINDEX('(', REVERSE(RTRIM(NegativeBead)))))) + ELSE NegativeBead END; + +-- trim the analyte name from the guide set table +UPDATE luminex.GuideSet SET AnalyteName = RTRIM(LTRIM(AnalyteName)); + +/* luminex-16.30-17.10.sql */ + +/* luminex-16.30-16.31.sql */ + +ALTER TABLE luminex.WellExclusion ADD Dilution REAL; + +/* luminex-16.31-16.32.sql */ + +DROP INDEX UQ_WellExclusion ON luminex.WellExclusion; +CREATE UNIQUE INDEX UQ_WellExclusion ON luminex.WellExclusion(Description, Dilution, Type, DataId); \ No newline at end of file diff --git a/luminex/resources/schemas/dbscripts/sqlserver/luminex-0.00-16.30.sql b/luminex/resources/schemas/dbscripts/sqlserver/obsolete/luminex-0.00-16.30.sql similarity index 100% rename from luminex/resources/schemas/dbscripts/sqlserver/luminex-0.00-16.30.sql rename to luminex/resources/schemas/dbscripts/sqlserver/obsolete/luminex-0.00-16.30.sql diff --git a/luminex/resources/schemas/dbscripts/sqlserver/luminex-16.30-17.10.sql b/luminex/resources/schemas/dbscripts/sqlserver/obsolete/luminex-16.30-17.10.sql similarity index 100% rename from luminex/resources/schemas/dbscripts/sqlserver/luminex-16.30-17.10.sql rename to luminex/resources/schemas/dbscripts/sqlserver/obsolete/luminex-16.30-17.10.sql diff --git a/ms2/resources/schemas/dbscripts/postgresql/ms2-0.00-17.10.sql b/ms2/resources/schemas/dbscripts/postgresql/ms2-0.00-17.10.sql new file mode 100644 index 0000000000..5c992712ff --- /dev/null +++ b/ms2/resources/schemas/dbscripts/postgresql/ms2-0.00-17.10.sql @@ -0,0 +1,1087 @@ +/* + * Copyright (c) 2015-2018 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* ms2-0.00-13.30.sql */ + +-- All tables used for MS2 data + +CREATE SCHEMA prot; +CREATE SCHEMA ms2; + +/****** AnnotInsertions */ + +CREATE TABLE prot.AnnotInsertions +( + InsertId SERIAL NOT NULL, + FileName VARCHAR(200) NULL, + FileType VARCHAR(50) NULL, + Comment VARCHAR(200) NULL, + InsertDate TIMESTAMP NOT NULL, + ChangeDate TIMESTAMP NULL, + Mouthsful INT NULL DEFAULT 0, + RecordsProcessed INT NULL DEFAULT 0, + CompletionDate TIMESTAMP NULL, + SequencesAdded INT NULL DEFAULT 0, + AnnotationsAdded INT NULL DEFAULT 0, + IdentifiersAdded INT NULL DEFAULT 0, + OrganismsAdded INT NULL DEFAULT 0, + MRMSize INT NULL DEFAULT 0, + MRMSequencesAdded INT NULL, + MRMAnnotationsAdded INT NULL, + MRMIdentifiersAdded INT NULL, + MRMOrganismsAdded INT NULL, + DefaultOrganism VARCHAR(100) NULL DEFAULT 'Unknown unknown', + OrgShouldBeGuessed INT NULL DEFAULT 1, + + CONSTRAINT PK_ProtAnnotInsertions PRIMARY KEY (InsertId) +); + +ALTER TABLE prot.AnnotInsertions ALTER COLUMN FileName TYPE VARCHAR(400); +/****** InfoSources */ +CREATE TABLE prot.InfoSources +( + SourceId SERIAL NOT NULL, + Name VARCHAR(50) NOT NULL, + CurrentVersion VARCHAR(50) NULL, + CurrentVersionDate TIMESTAMP NULL, + Url VARCHAR(1000) NULL , + ProcessToObtain BYTEA NULL, + LastUpdate TIMESTAMP NULL, + InsertDate TIMESTAMP NOT NULL, + ModDate TIMESTAMP NULL , + Deleted INT NOT NULL DEFAULT 0, + + CONSTRAINT PK_ProtSeqSources PRIMARY KEY (SourceId) +); + +/*** Initializations */ + +INSERT INTO prot.InfoSources (Name, Url, InsertDate) VALUES ('Genbank', 'http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=protein&cmd=search&term={}', '2005-03-04 12:08:10'); +INSERT INTO prot.InfoSources (Name, Url, InsertDate) VALUES ('NiceProt', 'http://au.expasy.org/cgi-bin/niceprot.pl?{}', '2005-03-04 12:08:10'); +INSERT INTO prot.InfoSources (Name, Url, InsertDate) VALUES ('GeneCards', 'http://www.genecards.org/cgi-bin/carddisp?{}&alias=yes', '2005-03-04 12:08:10'); +INSERT INTO prot.InfoSources (Name, Url, InsertDate) VALUES ('NCBI Taxonomy', 'http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id={}', '2005-03-04 12:08:10'); +INSERT INTO prot.InfoSources (Name, Url, InsertDate) VALUES ('GO', 'http://amigo.geneontology.org/cgi-bin/amigo/go.cgi?action=query&view=query&query={}', '2005-03-04 12:08:52'); + +UPDATE prot.InfoSources SET Url = 'http://www.genecards.org/cgi-bin/carddisp.pl?gene={}' WHERE Name = 'GeneCards'; +UPDATE prot.InfoSources SET URL = 'http://www.uniprot.org/uniprot/{}' WHERE Name = 'NiceProt'; +UPDATE prot.InfoSources SET URL = 'http://www.ncbi.nlm.nih.gov/protein/{}' WHERE Name = 'Genbank'; + +/****** AnnotationTypes */ +CREATE TABLE prot.AnnotationTypes +( + AnnotTypeId SERIAL NOT NULL, + Name VARCHAR(50) NOT NULL, + SourceId INT NULL, + Description VARCHAR(200) NULL, + EntryDate TIMESTAMP NOT NULL, + ModDate TIMESTAMP NULL, + Deleted INTEGER NOT NULL DEFAULT 0, + + CONSTRAINT PK_ProtAnnotationTypes PRIMARY KEY (AnnotTypeId), + CONSTRAINT FK_ProtAnnotationTypes_ProtSeqSources FOREIGN KEY (SourceId) REFERENCES prot.InfoSources (SourceId) +); +CREATE UNIQUE INDEX UQ_ProtAnnotationTypes ON prot.AnnotationTypes(Name); + +INSERT INTO prot.AnnotationTypes (Name,SourceId,EntryDate) VALUES ('GO_F',5,'2005-03-04 11:37:15'); +INSERT INTO prot.AnnotationTypes (Name,SourceId,EntryDate) VALUES ('GO_P',5,'2005-03-04 11:37:15'); +INSERT INTO prot.AnnotationTypes (Name,EntryDate) VALUES ('keyword','2005-03-04 11:37:15'); +INSERT INTO prot.AnnotationTypes (Name,EntryDate) VALUES ('feature','2005-03-04 11:37:15'); +INSERT INTO prot.AnnotationTypes (Name,SourceId,EntryDate) VALUES ('GO_C',5,'2005-03-04 11:38:13'); +INSERT INTO prot.AnnotationTypes (Name,EntryDate) VALUES ('FullOrganismName',now()); +INSERT INTO prot.AnnotationTypes (Name,EntryDate) VALUES ('LookupString',now()); + +CREATE INDEX IX_AnnotationTypes_SourceId ON prot.annotationtypes(SourceId); + +/****** IdentTypes */ +CREATE TABLE prot.IdentTypes +( + IdentTypeId SERIAL NOT NULL, + Name VARCHAR(50) NOT NULL, + CannonicalSourceId INT NULL, + EntryDate TIMESTAMP NOT NULL, + Description VARCHAR(200) NULL, + Deleted INT NOT NULL DEFAULT 0, + + CONSTRAINT PK_ProtIdentTypes PRIMARY KEY (IdentTypeId), + CONSTRAINT FK_ProtIdentTypes_ProtInfoSources FOREIGN KEY (CannonicalSourceId) REFERENCES prot.InfoSources (SourceId) +); + +CREATE UNIQUE INDEX UQ_ProtIdentTypes ON prot.IdentTypes(Name); +CREATE INDEX IX_IdentTypes_cannonicalsourceid ON prot.IdentTypes(cannonicalsourceid); + +INSERT INTO prot.IdentTypes (Name,CannonicalSourceId,EntryDate) VALUES ('Genbank',1,'2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,CannonicalSourceId,EntryDate) VALUES ('SwissProt',2,'2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,CannonicalSourceId,EntryDate) VALUES ('GeneName',3,'2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,CannonicalSourceId,EntryDate) VALUES ('NCBI Taxonomy',4,'2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('EMBL','2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('IntAct','2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Ensembl','2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('FlyBase','2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,CannonicalSourceId,EntryDate) VALUES ('GO',5,'2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('InterPro','2005-03-04 11:37:15'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Pfam','2005-03-04 11:37:15'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PIR','2005-03-04 11:37:15'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Uniprot_keyword','2005-03-04 11:37:15'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('SMART','2005-03-04 11:37:16'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('HSSP','2005-03-04 11:37:17'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('ProDom','2005-03-04 11:37:17'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PROSITE','2005-03-04 11:37:17'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PRINTS','2005-03-04 11:37:19'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('TIGRFAMs','2005-03-04 11:37:22'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('EC','2005-03-04 11:37:22'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('MaizeDB','2005-03-04 11:37:33'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('TRANSFAC','2005-03-04 11:37:34'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('WormBase','2005-03-04 11:37:38'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('WormPep','2005-03-04 11:37:39'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('COMPLUYEAST-2DPAGE','2005-03-04 11:37:39'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('DictyBase','2005-03-04 11:37:40'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Gramene','2005-03-04 11:37:45'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('OGP','2005-03-04 11:38:02'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Genew','2005-03-04 11:38:02'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('H-InvDB','2005-03-04 11:38:02'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('MIM','2005-03-04 11:38:02'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('MGD','2005-03-04 11:38:04'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('RGD','2005-03-04 11:38:06'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PDB','2005-03-04 11:38:10'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('SWISS-2DPAGE','2005-03-04 11:38:33'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Aarhus/Ghent-2DPAGE','2005-03-04 11:38:33'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PMMA-2DPAGE','2005-03-04 11:38:45'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('TIGR','2005-03-04 11:38:49'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('TubercuList','2005-03-04 11:38:50'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Leproma','2005-03-04 11:39:05'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('GeneFarm','2005-03-04 11:39:35'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('GermOnline','2005-03-04 11:43:54'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('SGD','2005-03-04 11:43:54'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('GeneDB_SPombe','2005-03-04 11:44:15'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PIRSF','2005-03-04 11:45:42'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('HAMAP','2005-03-04 11:46:49'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Reactome','2005-03-04 11:46:52'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('ECO2DBASE','2005-03-04 11:46:55'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('EchoBASE','2005-03-04 11:46:55'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('EcoGene','2005-03-04 11:46:55'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('SubtiList','2005-03-04 11:46:58'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('ListiList','2005-03-04 11:47:14'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('GlycoSuiteDB','2005-03-04 11:47:44'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('StyGene','2005-03-04 11:51:59'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PHCI-2DPAGE','2005-03-04 11:52:19'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Siena-2DPAGE','2005-03-04 11:55:22'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('HSC-2DPAGE','2005-03-04 11:55:41'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('MEROPS','2005-03-04 11:59:32'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('AGD','2005-03-04 12:14:40'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PhotoList','2005-03-04 12:15:22'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('ZFIN','2005-03-04 12:15:39'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('MypuList','2005-03-04 12:24:15'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('SagaList','2005-03-04 12:25:40'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('ANU-2DPAGE','2005-03-04 12:29:22'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Rat-heart-2DPAGE','2005-03-04 12:30:51'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PhosSite','2005-03-04 12:49:00'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('REBASE','2005-03-04 13:25:29'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Maize-2DPAGE','2005-03-04 15:10:53'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('HIV','2005-03-04 22:13:40'); + +/****** Organisms */ +CREATE TABLE prot.Organisms +( + OrgId SERIAL NOT NULL, + CommonName VARCHAR(100) NULL, + Genus VARCHAR(100) NOT NULL, + Species VARCHAR(100) NOT NULL, + Comments VARCHAR(200) NULL, + IdentId INT NULL, + Deleted INT NOT NULL DEFAULT 0, + + CONSTRAINT PK_ProtOrganisms PRIMARY KEY (OrgId) +); +CREATE UNIQUE INDEX UQ_ProtOrganisms_Genus_Species ON prot.Organisms(Genus, Species); + +INSERT INTO prot.Organisms (CommonName,Genus,Species,Comments) VALUES ('Unknown organism','Unknown','unknown','Organism is unknown'); + +CREATE INDEX IX_Organisms_IdentId ON prot.Organisms(IdentId); + +/****** Sequences */ +CREATE TABLE prot.Sequences +( + SeqId SERIAL NOT NULL, + ProtSequence TEXT NULL, + Hash VARCHAR(100) NULL , + Description VARCHAR(200) NULL, + SourceId INT NULL, + SourceVersion VARCHAR(50) NULL, + InsertDate TIMESTAMP NOT NULL, + ChangeDate TIMESTAMP NULL, + SourceChangeDate TIMESTAMP NULL, + SourceInsertDate TIMESTAMP NULL, + OrgId INT NULL, + Mass FLOAT NULL, + BestName VARCHAR(50) NULL, + BestGeneName VARCHAR(50) NULL, + Length INT NULL, + Deleted INT NOT NULL DEFAULT 0, + + CONSTRAINT PK_ProtSequences PRIMARY KEY (SeqId), + CONSTRAINT FK_ProtSequences_ProtSeqSources FOREIGN KEY (SourceId) REFERENCES prot.InfoSources (SourceId), + CONSTRAINT FK_ProtSequences_ProtOrganisms FOREIGN KEY (OrgId) REFERENCES prot.Organisms (OrgId) +); + +CREATE INDEX IX_ProtSequences_OrgId ON prot.Sequences(OrgId); +CREATE INDEX IX_ProtSequences_BestGeneName ON prot.Sequences(BestGeneName); +CREATE UNIQUE INDEX UQ_ProtSequences_Hash_OrgId ON prot.Sequences(Hash, OrgId); + +--Bug 2193 +CREATE INDEX IX_SequencesSource ON prot.Sequences(SourceId); + +/****** Identifiers */ +CREATE TABLE prot.Identifiers +( + IdentId SERIAL NOT NULL, + IdentTypeId INT NOT NULL, + Identifier VARCHAR(50) NOT NULL, + SeqId INT NULL, + SourceId INT NULL, + EntryDate TIMESTAMP NOT NULL, + SourceVersion VARCHAR(50) NULL, + Deleted INT NOT NULL DEFAULT 0, + + CONSTRAINT PK_ProtIdentifiers PRIMARY KEY (IdentId), + CONSTRAINT FK_ProtIdentifiers_ProtIdentTypes FOREIGN KEY (IdentTypeId) REFERENCES prot.IdentTypes (IdentTypeId), + CONSTRAINT FK_ProtIdentifiers_ProtSeqSources FOREIGN KEY (SourceId) REFERENCES prot.InfoSources (SourceId), + CONSTRAINT FK_ProtIdentifiers_ProtSequences FOREIGN KEY (SeqId) REFERENCES prot.Sequences (SeqId) +); +CREATE INDEX IX_ProtIdentifiers_Identifier ON prot.Identifiers(Identifier); +CREATE UNIQUE INDEX UQ_ProtIdentifiers_IdentTypeId_Identifier_SeqId ON prot.Identifiers(IdentTypeId, Identifier, SeqId); + +CREATE INDEX IX_Identifiers_SourceId ON prot.Identifiers(sourceid); +CREATE INDEX IX_Identifiers_SeqId ON prot.Identifiers(SeqId); + +ALTER TABLE prot.Organisms ADD CONSTRAINT FK_ProtOrganisms_ProtIdentifiers FOREIGN KEY (IdentId) REFERENCES prot.Identifiers (IdentId); + +/****** Annotations */ +CREATE TABLE prot.Annotations +( + AnnotId SERIAL NOT NULL, + AnnotTypeId INT NOT NULL, + AnnotVal VARCHAR(200) NULL, + AnnotIdent INT NULL, + SeqId INT NULL, + AnnotSourceId INT NULL, + AnnotSourceVersion VARCHAR(50) NULL, + InsertDate TIMESTAMP NOT NULL, + ModDate TIMESTAMP NULL, + StartPos INT NULL, + EndPos INT NULL, + Deleted INT NOT NULL DEFAULT 0, + + CONSTRAINT PK_ProtAnnotations PRIMARY KEY (AnnotId), + CONSTRAINT FK_ProtAnnotations_ProtAnnotationTypes FOREIGN KEY (AnnotTypeId) REFERENCES prot.AnnotationTypes (AnnotTypeId), + CONSTRAINT FK_ProtAnnotations_ProtIdentifiers FOREIGN KEY (AnnotIdent) REFERENCES prot.Identifiers (IdentId), + CONSTRAINT FK_ProtAnnotations_ProtSeqSources FOREIGN KEY (AnnotSourceId) REFERENCES prot.InfoSources (SourceId), + CONSTRAINT FK_ProtAnnotations_ProtSequences FOREIGN KEY (SeqId) REFERENCES prot.Sequences (SeqId) +); +CREATE INDEX IX_ProtAnnotations_SeqId_AnnotTypeId ON prot.Annotations(SeqId, AnnotTypeId); +CREATE UNIQUE INDEX UQ_ProtAnnotations_AnnotTypeId_AnnotVal_SeqId_StartPos_EndPos ON prot.Annotations(AnnotTypeId, AnnotVal, SeqId, StartPos, EndPos); + +CREATE INDEX IX_Annotations_AnnotVal ON prot.Annotations(annotval); + +CREATE INDEX IX_Annotations_AnnotIdent ON prot.Annotations(annotident); + +CREATE INDEX IX_Annotations_annotsourceid ON prot.Annotations(annotsourceid); + +CREATE INDEX IX_Annotations_IdentId ON prot.Annotations(AnnotIdent); + +/****** FastaLoads */ +CREATE TABLE prot.FastaLoads +( + FastaId SERIAL NOT NULL, + FileName VARCHAR(200) NOT NULL, + FileChecksum VARCHAR(50) NULL, + Comment VARCHAR(200) NULL, + InsertDate TIMESTAMP NOT NULL, + DbName VARCHAR(100) NULL, + DbVersion VARCHAR(100) NULL, + DbSource INT NULL, + DbDate TIMESTAMP NULL, + Reference VARCHAR(200) NULL, + NSequences INT NULL, + Sequences TEXT NULL, + + CONSTRAINT FK_ProtFastas_ProtSeqSources FOREIGN KEY (DbSource) REFERENCES prot.InfoSources (SourceId), + CONSTRAINT PK_ProtFastas PRIMARY KEY (FastaId) +); + +CREATE INDEX IX_FastaLoads_DBSource ON prot.fastaloads(dbsource); + +/****** SprotOrgMap */ +CREATE TABLE prot.SprotOrgMap +( + SprotSuffix VARCHAR(5) NOT NULL, + SuperKingdomCode CHAR(1) NULL, + TaxonId INT NULL, + FullName VARCHAR(200) NOT NULL, + Genus VARCHAR(100) NOT NULL, + Species VARCHAR(100) NOT NULL, + CommonName VARCHAR(200) NULL, + Synonym VARCHAR(200) NULL, + + CONSTRAINT PK_ProtSprotOrgMap PRIMARY KEY (SprotSuffix) +); + +CREATE TABLE prot.FastaFiles +( + FastaId SERIAL, + FileName VARCHAR(400), + Loaded TIMESTAMP, + FileChecksum VARCHAR(50) NULL, -- hash of the file + ScoringAnalysis BOOLEAN NOT NULL DEFAULT FALSE, + + CONSTRAINT PK_ProteinDataBases PRIMARY KEY (FastaId) +); + +/**** Runs */ +CREATE TABLE ms2.Runs +( + _ts TIMESTAMP DEFAULT now(), + Run SERIAL, + CreatedBy USERID, + Created TIMESTAMP, + ModifiedBy USERID, + Modified TIMESTAMP, + Owner USERID NULL, + + Container ENTITYID NOT NULL, + EntityId ENTITYID NOT NULL, + Description VARCHAR(300), + Path VARCHAR(500), + FileName VARCHAR(300), + Status VARCHAR(200), + StatusId INT NOT NULL DEFAULT 0, + Type VARCHAR(30), + SearchEngine VARCHAR(20), + MassSpecType VARCHAR(200), + FastaId INT NOT NULL DEFAULT 0, + SearchEnzyme VARCHAR(50), + Deleted BOOLEAN NOT NULL DEFAULT '0', + ExperimentRunLSID LSIDType NULL, + HasPeptideProphet BOOLEAN NOT NULL DEFAULT '0', + PeptideCount INT NOT NULL DEFAULT 0, -- Store peptide and spectrum counts with each run to make computing stats much faster + SpectrumCount INT NOT NULL DEFAULT 0, + NegativeHitCount INT NOT NULL DEFAULT 0, + + CONSTRAINT PK_MS2Runs PRIMARY KEY (Run) +); + +-- Create indexes on ms2 Runs table to support common operations in MS2Manager + +CREATE INDEX MS2Runs_Stats ON ms2.Runs(PeptideCount, SpectrumCount, Deleted, StatusId); +CREATE INDEX MS2Runs_ExperimentRunLSID ON ms2.Runs(ExperimentRunLSID); +CREATE INDEX MS2Runs_Container ON ms2.Runs(Container); + +UPDATE ms2.Runs SET Type = 'LegacyComet' WHERE Type = 'Comet'; + +CREATE TABLE ms2.Fractions +( + Fraction SERIAL, + Run INT NOT NULL, + Description VARCHAR(300), + FileName VARCHAR(300), + HydroB0 REAL, + HydroB1 REAL, + HydroR2 REAL, + HydroSigma REAL, + PepXmlDataLSID LSIDType NULL, + MzXmlURL VARCHAR(400) NULL, + + CONSTRAINT PK_MS2Fractions PRIMARY KEY (Fraction) +); + +CREATE INDEX IX_Fractions_Run_Fraction ON ms2.Fractions(Run,Fraction); + +CREATE INDEX IX_Fractions_MzXMLURL ON ms2.fractions(mzxmlurl); + +ALTER TABLE ms2.Fractions ADD COLUMN ScanCount INT; +ALTER TABLE ms2.Fractions ADD COLUMN MS1ScanCount INT; +ALTER TABLE ms2.Fractions ADD COLUMN MS2ScanCount INT; +ALTER TABLE ms2.Fractions ADD COLUMN MS3ScanCount INT; +ALTER TABLE ms2.Fractions ADD COLUMN MS4ScanCount INT; + +CREATE TABLE ms2.Modifications +( + Run INT NOT NULL, + AminoAcid VARCHAR (1) NOT NULL, + MassDiff REAL NOT NULL, + Variable BOOLEAN NOT NULL, + Symbol VARCHAR (1) NOT NULL, + + CONSTRAINT PK_MS2Modifications PRIMARY KEY (Run, AminoAcid, Symbol) +); + +-- Store MS2 Spectrum data in separate table to improve performance of upload and MS2Peptides queries +CREATE TABLE ms2.SpectraData +( + Fraction INT NOT NULL, + Scan INT NOT NULL, + Spectrum BYTEA NOT NULL, + + CONSTRAINT PK_MS2SpectraData PRIMARY KEY (Fraction, Scan) +); + +CREATE TABLE ms2.History +( + Date TIMESTAMP, + Runs BIGINT, + Peptides BIGINT +); + +CREATE INDEX IX_MS2History ON ms2.History (Date); + +-- All tables used for GO data +-- Data will change frequently, with updates from the GO consortium +-- See +-- http://www.geneontology.org/GO.downloads.shtml +-- + +-- GO Terms + +CREATE TABLE prot.GoTerm +( + id INTEGER NOT NULL, + name VARCHAR(255) NOT NULL DEFAULT '', + termtype VARCHAR(55) NOT NULL DEFAULT '', + acc VARCHAR(255) NOT NULL DEFAULT '', + isobsolete INTEGER NOT NULL DEFAULT 0, + isroot INTEGER NOT NULL DEFAULT 0, + + CONSTRAINT pk_goterm PRIMARY KEY(id) +); + +CREATE INDEX IX_GoTerm_Name ON prot.GoTerm(name); +CREATE INDEX IX_GoTerm_TermType ON prot.GoTerm(termtype); +CREATE UNIQUE INDEX UQ_GoTerm_Acc ON prot.GoTerm(acc); + +-- GO Term2Term + +CREATE TABLE prot.GoTerm2Term +( + id INTEGER NOT NULL, + relationshipTypeId INTEGER NOT NULL DEFAULT 0, + term1Id INTEGER NOT NULL DEFAULT 0, + term2Id INTEGER NOT NULL DEFAULT 0, + complete INTEGER NOT NULL DEFAULT 0, + + CONSTRAINT pk_goterm2term PRIMARY KEY(id) +); + +CREATE INDEX IX_GoTerm2Term_term1Id ON prot.GoTerm2Term(term1Id); +CREATE INDEX IX_GoTerm2Term_term2Id ON prot.GoTerm2Term(term2Id); +CREATE INDEX IX_GoTerm2Term_term1_2_Id ON prot.GoTerm2Term(term1Id,term2Id); +CREATE INDEX IX_GoTerm2Term_relationshipTypeId ON prot.GoTerm2Term(relationshipTypeId); +CREATE UNIQUE INDEX UQ_GoTerm2Term_1_2_R ON prot.GoTerm2Term(term1Id,term2Id,relationshipTypeId); + +-- Graph path + +CREATE TABLE prot.GoGraphPath +( + id INTEGER NOT NULL, + term1Id INTEGER NOT NULL DEFAULT 0, + term2Id INTEGER NOT NULL DEFAULT 0, + distance INTEGER NOT NULL DEFAULT 0, + + CONSTRAINT pk_gographpath PRIMARY KEY(id) +); + +CREATE INDEX IX_GoGraphPath_term1Id ON prot.GoGraphPath(term1Id); +CREATE INDEX IX_GoGraphPath_term2Id ON prot.GoGraphPath(term2Id); +CREATE INDEX IX_GoGraphPath_term1_2_Id ON prot.GoGraphPath(term1Id,term2Id); +CREATE INDEX IX_GoGraphPath_t1_distance ON prot.GoGraphPath(term1Id,distance); + +-- GO term definitions + +CREATE TABLE prot.GoTermDefinition +( + termId INTEGER NOT NULL DEFAULT 0, + termDefinition text NOT NULL, + dbXrefId INTEGER NULL DEFAULT NULL, + termComment text NULL DEFAULT NULL, + reference VARCHAR(255) NULL DEFAULT NULL +); + +CREATE INDEX IX_GoTermDefinition_dbXrefId ON prot.GoTermDefinition(dbXrefId); +CREATE UNIQUE INDEX UQ_GoTermDefinition_termId ON prot.GoTermDefinition(termId); + +-- GO term synonyms + +CREATE TABLE prot.GoTermSynonym +( + termId INTEGER NOT NULL DEFAULT 0, + termSynonym VARCHAR(500) NULL DEFAULT NULL, + accSynonym VARCHAR(255) NULL DEFAULT NULL, + synonymTypeId INTEGER NOT NULL DEFAULT 0 +); + +CREATE INDEX IX_GoTermSynonym_SynonymTypeId ON prot.GoTermSynonym(synonymTypeId); +CREATE INDEX IX_GoTermSynonym_TermId ON prot.GoTermSynonym(termId); +CREATE INDEX IX_GoTermSynonym_termSynonym ON prot.GoTermSynonym(termSynonym); +CREATE UNIQUE INDEX UQ_GoTermSynonym_termId_termSynonym ON prot.GoTermSynonym(termId,termSynonym); + +-- add most common ncbi Taxonomy id's + +CREATE TEMPORARY TABLE idents +( + Identifier VARCHAR(50) NOT NULL, + CommonName VARCHAR(20) NULL, + Genus VARCHAR(100) NOT NULL, + Species VARCHAR(100) NOT NULL, + OrgId INT NULL, + IdentId INT NULL, + IdentTypeId INT NULL +); + +INSERT INTO idents (CommonName, Genus, Species, Identifier) + VALUES ('chicken', 'Gallus', 'gallus', '9031'); +INSERT INTO idents (CommonName, Genus, Species, Identifier) + VALUES ('chimp', 'Pan', 'troglodytes', '9598'); +INSERT INTO idents (CommonName, Genus, Species, Identifier) + VALUES ('cow', 'Bos', 'taurus', '9913'); +INSERT INTO idents (CommonName, Genus, Species, Identifier) + VALUES ('dog', 'Canis', 'familiaris', '9615'); +INSERT INTO idents (CommonName, Genus, Species, Identifier) + VALUES ('ecoli', 'Escherichia', 'coli', '562'); +INSERT INTO idents (CommonName, Genus, Species, Identifier) + VALUES ('fruit fly', 'Drosophila', 'melanogaster', '7227'); +INSERT INTO idents (CommonName, Genus, Species, Identifier) + VALUES ('horse', 'Equus', 'caballus', '9796'); +INSERT INTO idents (CommonName, Genus, Species, Identifier) + VALUES ('human', 'Homo', 'sapiens', '9606'); +INSERT INTO idents (CommonName, Genus, Species, Identifier) + VALUES ('mouse', 'Mus', 'musculus', '10090'); +INSERT INTO idents (CommonName, Genus, Species, Identifier) + VALUES ('nematode', 'Caenorhabditis', 'elegans', '6239'); +INSERT INTO idents (CommonName, Genus, Species, Identifier) + VALUES ('pig', 'Sus', 'scrofa', '9823'); +INSERT INTO idents (CommonName, Genus, Species, Identifier) + VALUES ('rat', 'Rattus', 'norvegicus', '10116'); +INSERT INTO idents (CommonName, Genus, Species, Identifier) + VALUES ('yeast', 'Saccharomyces', 'cerevisiae', '4932'); +INSERT INTO idents (CommonName, Genus, Species, Identifier) + VALUES ('zebrafish', 'Danio', 'rerio', '7955'); + +UPDATE idents + SET IdentTypeId = (SELECT identtypeid FROM prot.IdentTypes WHERE name='NCBI Taxonomy'); + +INSERT INTO prot.Organisms (CommonName, Genus, Species) + SELECT CommonName, Genus, Species FROM idents + WHERE NOT EXISTS + (SELECT * FROM prot.Organisms PO INNER JOIN idents i ON (PO.Genus = i.Genus AND PO.Species = i.Species)); + +INSERT INTO prot.Identifiers (Identifier, IdentTypeId, entrydate) + SELECT Identifier, IdentTypeId , now() FROM idents + WHERE NOT EXISTS + (SELECT * FROM prot.Identifiers PI INNER JOIN idents i ON (PI.Identifier = i.Identifier AND PI.IdentTypeId = i.IdentTypeId)); + +UPDATE idents + SET OrgId = PO.OrgId + FROM prot.Organisms PO + WHERE idents.Genus = PO.Genus AND idents.Species = PO.Species; + +UPDATE idents + SET IdentId = PI.IdentId + FROM prot.Identifiers PI + WHERE idents.Identifier = PI.Identifier AND idents.IdentTypeId = PI.IdentTypeId; + +UPDATE prot.Organisms + SET IdentId = i.IdentID + FROM idents i + WHERE i.OrgId = Organisms.OrgId; + +DROP TABLE idents; + +CREATE TABLE ms2.PeptidesData +( + RowId BIGSERIAL NOT NULL, + Fraction INT NOT NULL, + Scan INT NOT NULL, + Charge SMALLINT NOT NULL, + Score1 REAL NOT NULL DEFAULT 0, + Score2 REAL NOT NULL DEFAULT 0, + Score3 REAL NOT NULL DEFAULT 0, + Score4 REAL NULL, + Score5 REAL NULL, + IonPercent REAL NOT NULL, + Mass FLOAT8 NOT NULL, + DeltaMass REAL NOT NULL, + PeptideProphet REAL NOT NULL, + Peptide VARCHAR (200) NOT NULL, + PrevAA CHAR(1) NOT NULL DEFAULT '', + TrimmedPeptide VARCHAR(200) NOT NULL DEFAULT '', + NextAA CHAR(1) NOT NULL DEFAULT '', + ProteinHits SMALLINT NOT NULL, + SequencePosition INT NOT NULL DEFAULT 0, + Protein VARCHAR(100) NOT NULL, + SeqId INT NULL, + RetentionTime REAL NULL, + PeptideProphetErrorRate REAL NULL, + EndScan INT NULL, + + CONSTRAINT PK_MS2PeptidesData PRIMARY KEY (RowId) +); + +CREATE INDEX IX_MS2PeptidesData_Protein ON ms2.PeptidesData (Protein); +CREATE INDEX IX_PeptidesData_SeqId ON ms2.PeptidesData(SeqId); +CREATE UNIQUE INDEX UQ_MS2PeptidesData_FractionScanCharge ON ms2.PeptidesData (Fraction, Scan, EndScan, Charge); + +CREATE INDEX IX_MS2PeptidesData_TrimmedPeptide ON ms2.PeptidesData(TrimmedPeptide); +CREATE INDEX IX_MS2PeptidesData_Peptide ON ms2.PeptidesData(Peptide); + +ALTER TABLE ms2.peptidesdata ALTER score1 DROP NOT NULL; +ALTER TABLE ms2.peptidesdata ALTER score1 DROP DEFAULT; + +ALTER TABLE ms2.peptidesdata ALTER score2 DROP NOT NULL; +ALTER TABLE ms2.peptidesdata ALTER score2 DROP DEFAULT; + +ALTER TABLE ms2.peptidesdata ALTER score3 DROP NOT NULL; +ALTER TABLE ms2.peptidesdata ALTER score3 DROP DEFAULT; + +ALTER TABLE ms2.PeptidesData ADD COLUMN score6 REAL; + +CREATE TABLE ms2.ProteinProphetFiles +( + RowId SERIAL NOT NULL, + FilePath VARCHAR(255) NOT NULL, + Run INT NOT NULL, + UploadCompleted BOOLEAN NOT NULL DEFAULT '0', + MinProbSeries BYTEA NULL, + SensitivitySeries BYTEA NULL, + ErrorSeries BYTEA NULL, + PredictedNumberCorrectSeries BYTEA NULL, + PredictedNumberIncorrectSeries BYTEA NULL, + + CONSTRAINT PK_MS2ProteinProphetFiles PRIMARY KEY (RowId), + CONSTRAINT FK_MS2ProteinProphetFiles_MS2Runs FOREIGN KEY (Run) REFERENCES ms2.Runs(Run), + CONSTRAINT UQ_MS2ProteinProphetFiles UNIQUE (Run) +); + +ALTER TABLE ms2.proteinprophetfiles ALTER COLUMN FilePath TYPE VARCHAR(512); + +CREATE TABLE ms2.ProteinGroups +( + RowId SERIAL NOT NULL, + GroupProbability REAL NOT NULL, + ProteinProphetFileId INT NOT NULL, + GroupNumber INT NOT NULL, + IndistinguishableCollectionId INT NOT NULL, + UniquePeptidesCount INT NOT NULL, + TotalNumberPeptides INT NOT NULL, + PctSpectrumIds REAL NULL, + PercentCoverage REAL NULL, + ProteinProbability REAL NOT NULL DEFAULT 0, + ErrorRate REAL NULL, + + CONSTRAINT PK_MS2ProteinGroups PRIMARY KEY (RowId), + CONSTRAINT UQ_MS2ProteinGroups UNIQUE (ProteinProphetFileId, GroupNumber, IndistinguishableCollectionId), + CONSTRAINT FK_MS2ProteinGroup_MS2ProteinProphetFileId FOREIGN KEY (ProteinProphetFileId) REFERENCES ms2.ProteinProphetFiles(RowId) +); + +CREATE TABLE ms2.ProteinGroupMemberships +( + ProteinGroupId INT NOT NULL, + SeqId INT NOT NULL, + Probability REAL NOT NULL, + + CONSTRAINT PK_MS2ProteinGroupMemberships PRIMARY KEY (ProteinGroupId, SeqId), + CONSTRAINT FK_MS2ProteinGroupMemberships_ProtSequences FOREIGN KEY (SeqId) REFERENCES prot.Sequences (SeqId), + CONSTRAINT FK_MS2ProteinGroupMembership_MS2ProteinGroups FOREIGN KEY (ProteinGroupId) REFERENCES ms2.ProteinGroups (RowId) +); + +CREATE INDEX IX_ProteinGroupMemberships_SeqId ON ms2.ProteinGroupMemberships(SeqId, ProteinGroupId, Probability); + +CREATE TABLE ms2.PeptideMemberships +( + PeptideId int8 NOT NULL, + ProteinGroupId int4 NOT NULL, + NSPAdjustedProbability float4 NOT NULL, + Weight float4 NOT NULL, + NondegenerateEvidence bool NOT NULL, + EnzymaticTermini int4 NOT NULL, + SiblingPeptides float4 NOT NULL, + SiblingPeptidesBin int4 NOT NULL, + Instances int4 NOT NULL, + ContributingEvidence bool NOT NULL, + CalcNeutralPepMass float4 NOT NULL, + + CONSTRAINT pk_ms2peptidememberships PRIMARY KEY (proteingroupid, peptideid), + CONSTRAINT fk_ms2peptidemembership_ms2peptidesdata FOREIGN KEY (peptideid) REFERENCES ms2.PeptidesData (rowid), + CONSTRAINT fk_ms2peptidemembership_ms2proteingroup FOREIGN KEY (proteingroupid) REFERENCES ms2.ProteinGroups (rowid) +); + +-- Index to speed up deletes from PeptidesData +CREATE INDEX IX_MS2PeptideMemberships_PeptideId ON ms2.PeptideMemberships(PeptideId); + +CREATE INDEX IX_Peptidemembership_ProteingroupId ON ms2.PeptideMemberships(ProteinGroupId); + +CREATE TABLE ms2.Quantitation +( + PeptideId BIGINT NOT NULL, + LightFirstscan INT NOT NULL, + LightLastscan INT NOT NULL, + LightMass REAL NOT NULL, + HeavyFirstscan INT NOT NULL, + HeavyLastscan INT NOT NULL, + HeavyMass REAL NOT NULL, + Ratio VARCHAR(20) NULL, -- q3 does not generate string representations of ratios + Heavy2lightRatio VARCHAR(20) NULL, -- q3 does not generate string representations of ratios. + LightArea REAL NOT NULL, + HeavyArea REAL NOT NULL, + DecimalRatio REAL NOT NULL, + QuantId INT NOT NULL, -- QuantId must be non-null; eventually (PeptideId, QuantId) should become a compound PK + + CONSTRAINT PK_Quantitation PRIMARY KEY (PeptideId), + CONSTRAINT FK_Quantitation_MS2PeptidesData FOREIGN KEY (PeptideId) REFERENCES ms2.PeptidesData(RowId) +); + +ALTER TABLE ms2.Quantitation ADD COLUMN Invalidated BOOLEAN; + +CREATE TABLE ms2.ProteinQuantitation +( + ProteinGroupId INT NOT NULL, + RatioMean REAL NOT NULL, + RatioStandardDev REAL NOT NULL, + RatioNumberPeptides INT NOT NULL, + Heavy2LightRatioMean REAL NOT NULL, + Heavy2LightRatioStandardDev REAL NOT NULL, + CONSTRAINT PK_ProteinQuantitation PRIMARY KEY (ProteinGroupId), + CONSTRAINT FK_ProteinQuantitation_ProteinGroup FOREIGN KEY (ProteinGroupId) REFERENCES ms2.ProteinGroups (RowId) +); + +CREATE INDEX IX_ProteinQuantitation_ProteinGroupId ON ms2.ProteinQuantitation(ProteinGroupId); + +CREATE TABLE ms2.PeptideProphetSummaries +( + Run INT NOT NULL, + FValSeries BYTEA NULL, + ObsSeries1 BYTEA NULL, + ObsSeries2 BYTEA NULL, + ObsSeries3 BYTEA NULL, + ModelPosSeries1 BYTEA NULL, + ModelPosSeries2 BYTEA NULL, + ModelPosSeries3 BYTEA NULL, + ModelNegSeries1 BYTEA NULL, + ModelNegSeries2 BYTEA NULL, + ModelNegSeries3 BYTEA NULL, + MinProbSeries BYTEA NULL, + SensitivitySeries BYTEA NULL, + ErrorSeries BYTEA NULL, + + CONSTRAINT PK_PeptideProphetSummmaries PRIMARY KEY (Run) +); + +-- Add a quantitation summary table +CREATE TABLE ms2.QuantSummaries +( + QuantId SERIAL NOT NULL, + Run INTEGER NOT NULL, + AnalysisType VARCHAR(20) NOT NULL, + AnalysisTime TIMESTAMP NULL, + Version VARCHAR(80) NULL, + LabeledResidues VARCHAR(20) NULL, + MassDiff VARCHAR(80) NULL, + MassTol REAL NOT NULL, + SameScanRange CHAR(1) NULL, + XpressLight INT NULL, + + CONSTRAINT PK_QuantSummaries PRIMARY KEY (QuantId), + CONSTRAINT FK_QuantSummaries_MS2Runs FOREIGN KEY (Run) REFERENCES ms2.Runs (Run), + -- Current restrictions allow only one quantitation analysis per run + CONSTRAINT UQ_QuantSummaries UNIQUE (Run) +); + +CREATE TABLE ms2.PeptideProphetData +( + PeptideId BIGINT NOT NULL, + ProphetFVal REAL NOT NULL, + ProphetDeltaMass REAL NULL, + ProphetNumTrypticTerm INT NULL, + ProphetNumMissedCleav INT NULL, + + CONSTRAINT PK_PeptideProphetData PRIMARY KEY (PeptideId), + CONSTRAINT FK_PeptideProphetData_MS2PeptidesData FOREIGN KEY (PeptideId) REFERENCES ms2.PeptidesData(RowId) +); + +CREATE TABLE prot.FastaSequences +( + FastaId INT NOT NULL, + LookupString VARCHAR (200) NOT NULL, + SeqId INT NULL, + + CONSTRAINT PK_FastaSequences PRIMARY KEY(LookupString, FastaId), + CONSTRAINT FK_FastaSequences_Sequences FOREIGN KEY (SeqId) REFERENCES prot.Sequences (SeqId) +); + +CREATE INDEX IX_FastaSequences_FastaId_SeqId ON prot.FastaSequences(FastaId, SeqId); +CREATE INDEX IX_FastaSequences_SeqId ON prot.FastaSequences(SeqId); + +CREATE TABLE prot.CustomAnnotationSet +( + CustomAnnotationSetId SERIAL NOT NULL, + Container ENTITYID NOT NULL, + Name VARCHAR(200) NOT NULL, + CreatedBy USERID, + Created TIMESTAMP without time zone, + ModifiedBy USERID, + Modified TIMESTAMP without time zone, + CustomAnnotationType VARCHAR(20) NOT NULL, + Lsid lsidtype, + + CONSTRAINT pk_customannotationset PRIMARY KEY (CustomAnnotationSetId), + CONSTRAINT fk_CustomAnnotationSet_Container FOREIGN KEY (container) REFERENCES core.containers(EntityId), + CONSTRAINT uq_CustomAnnotationSet UNIQUE (Container, Name) +); + +CREATE INDEX IX_CustomAnnotationSet_Container ON prot.CustomAnnotationSet(Container); + +CREATE TABLE prot.CustomAnnotation +( + CustomAnnotationId SERIAL NOT NULL, + CustomAnnotationSetId INT NOT NULL, + ObjectURI LsidType NOT NULL, + LookupString VARCHAR(200) NOT NULL, + + CONSTRAINT pk_customannotation PRIMARY KEY (CustomAnnotationId), + CONSTRAINT fk_CustomAnnotation_CustomAnnotationSetId FOREIGN KEY (CustomAnnotationSetId) REFERENCES prot.CustomAnnotationSet(CustomAnnotationSetId), + CONSTRAINT UQ_CustomAnnotation_LookupString_SetId UNIQUE (LookupString, CustomAnnotationSetId), + CONSTRAINT UQ_CustomAnnotation_ObjectURI UNIQUE (ObjectURI) +); + +CREATE INDEX IX_CustomAnnotation_CustomAnnotationSetId ON prot.CustomAnnotation(CustomAnnotationSetId); + +UPDATE exp.DataInput SET Role = 'Spectra' WHERE Role = 'mzXML'; + +CREATE TABLE ms2.iTraqPeptideQuantitation +( + PeptideId BIGINT NOT NULL, + TargetMass1 REAL, + AbsoluteMass1 REAL, + Normalized1 REAL, + TargetMass2 REAL, + AbsoluteMass2 REAL, + Normalized2 REAL, + TargetMass3 REAL, + AbsoluteMass3 REAL, + Normalized3 REAL, + TargetMass4 REAL, + AbsoluteMass4 REAL, + Normalized4 REAL, + TargetMass5 REAL, + AbsoluteMass5 REAL, + Normalized5 REAL, + TargetMass6 REAL, + AbsoluteMass6 REAL, + Normalized6 REAL, + TargetMass7 REAL, + AbsoluteMass7 REAL, + Normalized7 REAL, + TargetMass8 REAL, + AbsoluteMass8 REAL, + Normalized8 REAL, + + CONSTRAINT PK_iTraqPeptideQuantitation PRIMARY KEY (PeptideId), + CONSTRAINT FK_iTraqPeptideQuantitation_MS2PeptidesData FOREIGN KEY (PeptideId) REFERENCES ms2.PeptidesData(RowId) +); + +ALTER TABLE ms2.iTraqPeptideQuantitation RENAME COLUMN AbsoluteMass1 TO AbsoluteIntensity1; +ALTER TABLE ms2.iTraqPeptideQuantitation RENAME COLUMN AbsoluteMass2 TO AbsoluteIntensity2; +ALTER TABLE ms2.iTraqPeptideQuantitation RENAME COLUMN AbsoluteMass3 TO AbsoluteIntensity3; +ALTER TABLE ms2.iTraqPeptideQuantitation RENAME COLUMN AbsoluteMass4 TO AbsoluteIntensity4; +ALTER TABLE ms2.iTraqPeptideQuantitation RENAME COLUMN AbsoluteMass5 TO AbsoluteIntensity5; +ALTER TABLE ms2.iTraqPeptideQuantitation RENAME COLUMN AbsoluteMass6 TO AbsoluteIntensity6; +ALTER TABLE ms2.iTraqPeptideQuantitation RENAME COLUMN AbsoluteMass7 TO AbsoluteIntensity7; +ALTER TABLE ms2.iTraqPeptideQuantitation RENAME COLUMN AbsoluteMass8 TO AbsoluteIntensity8; + +CREATE TABLE ms2.iTraqProteinQuantitation +( + ProteinGroupId BIGINT NOT NULL, + Ratio1 REAL, + Error1 REAL, + Ratio2 REAL, + Error2 REAL, + Ratio3 REAL, + Error3 REAL, + Ratio4 REAL, + Error4 REAL, + Ratio5 REAL, + Error5 REAL, + Ratio6 REAL, + Error6 REAL, + Ratio7 REAL, + Error7 REAL, + Ratio8 REAL, + Error8 REAL, + + CONSTRAINT PK_iTraqProteinQuantitation PRIMARY KEY (ProteinGroupId), + CONSTRAINT FK_iTraqProteinQuantitation_ProteinGroups FOREIGN KEY (ProteinGroupId) REFERENCES ms2.ProteinGroups(RowId) +); + + +-- Create functions to drop & create all GO indexes. This helps with load performance. +CREATE FUNCTION prot.create_go_indexes() RETURNS void AS $$ + BEGIN + ALTER TABLE prot.goterm ADD CONSTRAINT pk_goterm PRIMARY KEY (id); + CREATE INDEX IX_GoTerm_Name ON prot.GoTerm(name); + CREATE INDEX IX_GoTerm_TermType ON prot.GoTerm(termtype); + CREATE UNIQUE INDEX UQ_GoTerm_Acc ON prot.GoTerm(acc); + + ALTER TABLE prot.goterm2term ADD CONSTRAINT pk_goterm2term PRIMARY KEY (id); + CREATE INDEX IX_GoTerm2Term_term1Id ON prot.GoTerm2Term(term1Id); + CREATE INDEX IX_GoTerm2Term_term2Id ON prot.GoTerm2Term(term2Id); + CREATE INDEX IX_GoTerm2Term_term1_2_Id ON prot.GoTerm2Term(term1Id,term2Id); + CREATE INDEX IX_GoTerm2Term_relationshipTypeId ON prot.GoTerm2Term(relationshipTypeId); + CREATE UNIQUE INDEX UQ_GoTerm2Term_1_2_R ON prot.GoTerm2Term(term1Id,term2Id,relationshipTypeId); + + ALTER TABLE prot.gographpath ADD CONSTRAINT pk_gographpath PRIMARY KEY (id); + CREATE INDEX IX_GoGraphPath_term1Id ON prot.GoGraphPath(term1Id); + CREATE INDEX IX_GoGraphPath_term2Id ON prot.GoGraphPath(term2Id); + CREATE INDEX IX_GoGraphPath_term1_2_Id ON prot.GoGraphPath(term1Id,term2Id); + CREATE INDEX IX_GoGraphPath_t1_distance ON prot.GoGraphPath(term1Id,distance); + + CREATE INDEX IX_GoTermDefinition_dbXrefId ON prot.GoTermDefinition(dbXrefId); + CREATE UNIQUE INDEX UQ_GoTermDefinition_termId ON prot.GoTermDefinition(termId); + + CREATE INDEX IX_GoTermSynonym_SynonymTypeId ON prot.GoTermSynonym(synonymTypeId); + CREATE INDEX IX_GoTermSynonym_TermId ON prot.GoTermSynonym(termId); + CREATE INDEX IX_GoTermSynonym_termSynonym ON prot.GoTermSynonym(termSynonym); + CREATE UNIQUE INDEX UQ_GoTermSynonym_termId_termSynonym ON prot.GoTermSynonym(termId,termSynonym); + END; + $$ LANGUAGE plpgsql; + +-- Use fn_dropifexists to increase reliability +CREATE OR REPLACE FUNCTION prot.drop_go_indexes() RETURNS void AS $$ + BEGIN + PERFORM core.fn_dropifexists('goterm', 'prot', 'Constraint', 'pk_goterm'); + PERFORM core.fn_dropifexists('goterm', 'prot', 'Index', 'IX_GoTerm_Name'); + PERFORM core.fn_dropifexists('goterm', 'prot', 'Index', 'IX_GoTerm_TermType'); + PERFORM core.fn_dropifexists('goterm', 'prot', 'Index', 'UQ_GoTerm_Acc'); + + PERFORM core.fn_dropifexists('goterm2term', 'prot', 'Constraint', 'pk_goterm2term'); + PERFORM core.fn_dropifexists('goterm2term', 'prot', 'Index', 'IX_GoTerm2Term_term1Id'); + PERFORM core.fn_dropifexists('goterm2term', 'prot', 'Index', 'IX_GoTerm2Term_term2Id'); + PERFORM core.fn_dropifexists('goterm2term', 'prot', 'Index', 'IX_GoTerm2Term_term1_2_Id'); + PERFORM core.fn_dropifexists('goterm2term', 'prot', 'Index', 'IX_GoTerm2Term_relationshipTypeId'); + PERFORM core.fn_dropifexists('goterm2term', 'prot', 'Index', 'UQ_GoTerm2Term_1_2_R'); + + PERFORM core.fn_dropifexists('gographpath', 'prot', 'Constraint', 'pk_gographpath'); + PERFORM core.fn_dropifexists('gographpath', 'prot', 'Index', 'IX_GoGraphPath_term1Id'); + PERFORM core.fn_dropifexists('gographpath', 'prot', 'Index', 'IX_GoGraphPath_term2Id'); + PERFORM core.fn_dropifexists('gographpath', 'prot', 'Index', 'IX_GoGraphPath_term1_2_Id'); + PERFORM core.fn_dropifexists('gographpath', 'prot', 'Index', 'IX_GoGraphPath_t1_distance'); + + PERFORM core.fn_dropifexists('gotermdefinition', 'prot', 'Index', 'IX_GoTermDefinition_dbXrefId'); + PERFORM core.fn_dropifexists('gotermdefinition', 'prot', 'Index', 'UQ_GoTermDefinition_termId'); + + PERFORM core.fn_dropifexists('gotermsynonym', 'prot', 'Index', 'IX_GoTermSynonym_SynonymTypeId'); + PERFORM core.fn_dropifexists('gotermsynonym', 'prot', 'Index', 'IX_GoTermSynonym_TermId'); + PERFORM core.fn_dropifexists('gotermsynonym', 'prot', 'Index', 'IX_GoTermSynonym_termSynonym'); + PERFORM core.fn_dropifexists('gotermsynonym', 'prot', 'Index', 'UQ_GoTermSynonym_termId_termSynonym'); + END; + $$ LANGUAGE plpgsql; + +/* ms2-14.10-14.20.sql */ + +UPDATE prot.infosources SET url = 'http://amigo.geneontology.org/amigo/term/{}' WHERE Name = 'GO'; + +/* ms2-15.10-15.20.sql */ + +CREATE TABLE ms2.ExpressionData ( + RowId SERIAL, + Value REAL, + SeqId INT NOT NULL, + SampleId INT NOT NULL, + DataId INT NOT NULL, + + CONSTRAINT PK_ExpressionData PRIMARY KEY (RowId), + CONSTRAINT FK_ExpressionData_SeqId FOREIGN KEY (SeqId) REFERENCES prot.sequences (SeqId), + CONSTRAINT FK_ExpressionData_SampleId FOREIGN KEY (SampleId) REFERENCES exp.material (RowId), + CONSTRAINT FK_ExpressionData_DataId FOREIGN KEY (DataId) REFERENCES exp.data (RowId) +); + +CREATE INDEX IX_ExpressionData_SeqId ON ms2.ExpressionData(SeqId); +CREATE INDEX IX_ExpressionData_SampleId ON ms2.ExpressionData(SampleId); +CREATE INDEX IX_ExpressionData_DataId ON ms2.ExpressionData(DataId); + +ALTER TABLE ms2.ExpressionData ADD CONSTRAINT UQ_ExpressionData_DataId_SeqId_SampleId UNIQUE (DataId, SeqId, SampleId); + +DROP INDEX ms2.IX_ExpressionData_DataId; + +/* ms2-15.30-16.10.sql */ + +ALTER TABLE ms2.Runs ADD COLUMN MascotFile VARCHAR(300) NULL; +ALTER TABLE ms2.Runs ADD COLUMN DistillerRawFile VARCHAR(500) NULL; + + +ALTER TABLE ms2.PeptidesData ADD COLUMN QueryNumber int NULL; +ALTER TABLE ms2.PeptidesData ADD COLUMN HitRank int NOT NULL DEFAULT 1; +ALTER TABLE ms2.PeptidesData ADD COLUMN Decoy boolean NOT NULL DEFAULT FALSE; + +-- Issue 25276: MS2 script rollup for 16.1 should not create UQ_MS2PeptidesData_FractionScanCharge index twice +-- SELECT core.fn_dropifexists('PeptidesData','ms2', 'INDEX','UQ_MS2PeptidesData_FractionScanCharge'); +-- CREATE UNIQUE INDEX UQ_MS2PeptidesData_FractionScanCharge ON ms2.PeptidesData(Fraction, Scan, EndScan, Charge, HitRank, Decoy); + +ALTER TABLE ms2.PeptidesData ALTER COLUMN PeptideProphet DROP NOT NULL; + +ALTER TABLE ms2.peptidesdata + ADD CONSTRAINT FK_ms2PeptidesData_ProtSequences FOREIGN KEY (seqid) REFERENCES prot.sequences (seqid); + +-- This index should replace the one created in ms2-15.30-15.31.sql. There is no need to create the older one first. +SELECT core.fn_dropifexists('PeptidesData','ms2', 'INDEX','UQ_MS2PeptidesData_FractionScanCharge'); +CREATE UNIQUE INDEX UQ_MS2PeptidesData_FractionScanCharge ON ms2.PeptidesData(Fraction, Scan, EndScan, Charge, HitRank, Decoy, QueryNumber); + +-- Create a new set of properties for Mascot settings +INSERT INTO prop.propertysets (category, objectid, userid) SELECT 'MascotConfig' AS Category, EntityId, -1 AS UserId FROM core.containers WHERE parent IS NULL; + +-- Migrate existing Mascot settings +UPDATE prop.properties SET "set" = (SELECT MAX("set") FROM prop.propertysets) + WHERE name LIKE 'Mascot%' AND "set" = (SELECT "set" FROM prop.propertysets WHERE category = 'SiteConfig' AND userid = -1 AND objectid = (SELECT entityid FROM core.containers WHERE parent IS NULL)); + +CREATE TABLE ms2.FastaRunMapping ( + Run INT NOT NULL, + FastaId INT NOT NULL, + + CONSTRAINT PK_FastaRunMapping PRIMARY KEY (Run, FastaId), + CONSTRAINT FK_FastaRunMapping_Run FOREIGN KEY (Run) REFERENCES ms2.Runs (Run), + CONSTRAINT FK_FastaRunMapping_FastaId FOREIGN KEY (FastaId) REFERENCES prot.FastaFiles (FastaId) +); + +INSERT INTO ms2.FastaRunMapping( Run, FastaId ) SELECT Run, FastaId FROM ms2.Runs WHERE FastaId IN (SELECT FastaId FROM prot.FastaFiles); + +CREATE INDEX IX_FastaRunMapping_FastaId ON ms2.FastaRunMapping(FastaId); + +ALTER TABLE ms2.Runs DROP COLUMN FastaId; + +/* ms2-16.20-16.30.sql */ + +-- Issue 27667 - Importing failed due to data type length limitation +ALTER TABLE ms2.Runs ALTER COLUMN mascotfile TYPE TEXT; + +/* ms2-16.30-17.10.sql */ + +ALTER TABLE ms2.itraqproteinquantitation ADD COLUMN Ratio9 REAL; +ALTER TABLE ms2.itraqproteinquantitation ADD COLUMN Error9 REAL; +ALTER TABLE ms2.itraqproteinquantitation ADD COLUMN Ratio10 REAL; +ALTER TABLE ms2.itraqproteinquantitation ADD COLUMN Error10 REAL; + +ALTER TABLE ms2.itraqpeptidequantitation ADD COLUMN TargetMass9 REAL; +ALTER TABLE ms2.itraqpeptidequantitation ADD COLUMN AbsoluteIntensity9 REAL; +ALTER TABLE ms2.itraqpeptidequantitation ADD COLUMN Normalized9 REAL; +ALTER TABLE ms2.itraqpeptidequantitation ADD COLUMN TargetMass10 REAL; +ALTER TABLE ms2.itraqpeptidequantitation ADD COLUMN AbsoluteIntensity10 REAL; +ALTER TABLE ms2.itraqpeptidequantitation ADD COLUMN Normalized10 REAL; \ No newline at end of file diff --git a/ms2/resources/schemas/dbscripts/postgresql/ms2-0.00-16.30.sql b/ms2/resources/schemas/dbscripts/postgresql/obsolete/ms2-0.00-16.30.sql similarity index 100% rename from ms2/resources/schemas/dbscripts/postgresql/ms2-0.00-16.30.sql rename to ms2/resources/schemas/dbscripts/postgresql/obsolete/ms2-0.00-16.30.sql diff --git a/ms2/resources/schemas/dbscripts/postgresql/ms2-16.30-17.10.sql b/ms2/resources/schemas/dbscripts/postgresql/obsolete/ms2-16.30-17.10.sql similarity index 100% rename from ms2/resources/schemas/dbscripts/postgresql/ms2-16.30-17.10.sql rename to ms2/resources/schemas/dbscripts/postgresql/obsolete/ms2-16.30-17.10.sql diff --git a/ms2/resources/schemas/dbscripts/sqlserver/ms2-0.00-17.10.sql b/ms2/resources/schemas/dbscripts/sqlserver/ms2-0.00-17.10.sql new file mode 100644 index 0000000000..dba5771f15 --- /dev/null +++ b/ms2/resources/schemas/dbscripts/sqlserver/ms2-0.00-17.10.sql @@ -0,0 +1,1169 @@ +/* + * Copyright (c) 2015-2018 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* ms2-0.00-9.20.sql */ + +-- Tables used for Proteins and MS2 data + +CREATE SCHEMA prot; +GO + +CREATE SCHEMA ms2; +GO + +/****** AnnotInsertions */ +CREATE TABLE prot.AnnotInsertions +( + InsertId INT IDENTITY (1, 1) NOT NULL, + FileName VARCHAR(200) NULL, + FileType VARCHAR(50) NULL, + Comment VARCHAR(200) NULL, + InsertDate DATETIME NULL DEFAULT (getdate()), + ChangeDate DATETIME NULL DEFAULT (getdate()), + Mouthsful INT NULL DEFAULT 0, + RecordsProcessed INT NULL DEFAULT 0, + CompletionDate DATETIME NULL, + SequencesAdded INT NULL DEFAULT 0, + AnnotationsAdded INT NULL DEFAULT 0, + IdentifiersAdded INT NULL DEFAULT 0, + OrganismsAdded INT NULL DEFAULT 0, + MRMSize INT NULL DEFAULT 0, + MRMSequencesAdded INT NULL, + MRMAnnotationsAdded INT NULL, + MRMIdentifiersAdded INT NULL, + MRMOrganismsAdded INT NULL, + DefaultOrganism VARCHAR(100) NULL DEFAULT 'Unknown unknown', + OrgShouldBeGuessed INT NULL DEFAULT 1, + + CONSTRAINT PK_ProtAnnotInsertions PRIMARY KEY CLUSTERED (InsertId) +); + +/****** InfoSources */ +CREATE TABLE prot.InfoSources +( + SourceId INT IDENTITY (1, 1) NOT NULL, + Name VARCHAR(50) NOT NULL, + CurrentVersion VARCHAR(50) NULL, + CurrentVersionDate DATETIME NULL, + Url VARCHAR(1000) NULL, + ProcessToObtain BINARY(1000) NULL, + LastUpdate DATETIME NULL, + InsertDate DATETIME NULL DEFAULT (getdate()), + ModDate DATETIME NULL, + Deleted BIT NOT NULL DEFAULT 0, + + CONSTRAINT PK_SeqSources PRIMARY KEY CLUSTERED (SourceId) +); + +INSERT INTO prot.InfoSources (Name, Url, InsertDate) VALUES ('Genbank', 'http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=protein&cmd=search&term={}', '2005-03-04 12:08:10'); +INSERT INTO prot.InfoSources (Name, Url, InsertDate) VALUES ('NiceProt', 'http://au.expasy.org/cgi-bin/niceprot.pl?{}', '2005-03-04 12:08:10'); +INSERT INTO prot.InfoSources (Name, Url, InsertDate) VALUES ('GeneCards', 'http://www.genecards.org/cgi-bin/carddisp?{}&alias=yes', '2005-03-04 12:08:10'); +INSERT INTO prot.InfoSources (Name, Url, InsertDate) VALUES ('NCBI Taxonomy', 'http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id={}', '2005-03-04 12:08:10'); +INSERT INTO prot.InfoSources (Name, Url, InsertDate) VALUES ('GO', 'http://amigo.geneontology.org/cgi-bin/amigo/go.cgi?action=query&view=query&query={}', '2005-03-04 12:08:52'); + +/****** AnnotationTypes */ +CREATE TABLE prot.AnnotationTypes +( + AnnotTypeId INT IDENTITY (1, 1) NOT NULL, + Name VARCHAR(50) NOT NULL, + SourceId INT NULL, + Description VARCHAR(200) NULL, + EntryDate DATETIME NOT NULL DEFAULT (getdate()), + ModDate DATETIME NULL, + Deleted BIT NOT NULL DEFAULT 0, + + CONSTRAINT PK_ProtAnnotationTypes PRIMARY KEY CLUSTERED (AnnotTypeId), + CONSTRAINT FK_ProtAnnotationTypes_ProtSeqSources FOREIGN KEY (SourceId) REFERENCES prot.InfoSources (SourceId) +); +CREATE UNIQUE INDEX IX_ProtAnnotationTypes ON prot.AnnotationTypes(Name); + +INSERT INTO prot.AnnotationTypes (Name,SourceId,EntryDate) VALUES ('GO_F',5,'2005-03-04 11:37:15'); +INSERT INTO prot.AnnotationTypes (Name,SourceId,EntryDate) VALUES ('GO_P',5,'2005-03-04 11:37:15'); +INSERT INTO prot.AnnotationTypes (Name,EntryDate) VALUES ('keyword','2005-03-04 11:37:15'); +INSERT INTO prot.AnnotationTypes (Name,EntryDate) VALUES ('feature','2005-03-04 11:37:15'); +INSERT INTO prot.AnnotationTypes (Name,SourceId,EntryDate) VALUES ('GO_C',5,'2005-03-04 11:38:13'); +INSERT INTO prot.AnnotationTypes (Name) VALUES ('FullOrganismName'); +INSERT INTO prot.AnnotationTypes (Name) VALUES ('LookupString'); + +CREATE INDEX IX_AnnotationTypes_SourceId ON prot.annotationtypes(SourceId); + +/****** IdentTypes */ +CREATE TABLE prot.IdentTypes +( + IdentTypeId INT IDENTITY (1, 1) NOT NULL, + Name VARCHAR(50) NOT NULL, + CannonicalSourceId INT NULL, + EntryDate DATETIME NOT NULL DEFAULT (getdate()), + Description VARCHAR(200) NULL, + Deleted BIT NOT NULL DEFAULT 0, + + CONSTRAINT PK_ProtIdentTypes PRIMARY KEY CLUSTERED (IdentTypeId), + CONSTRAINT FK_ProtIdentTypes_ProtInfoSources FOREIGN KEY (CannonicalSourceId) REFERENCES prot.InfoSources (SourceId) +); +CREATE UNIQUE INDEX IX_ProtIdentTypes ON prot.IdentTypes(Name); + +INSERT INTO prot.IdentTypes (Name,CannonicalSourceId,EntryDate) VALUES ('Genbank',1,'2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,CannonicalSourceId,EntryDate) VALUES ('SwissProt',2,'2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,CannonicalSourceId,EntryDate) VALUES ('GeneName',3,'2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,CannonicalSourceId,EntryDate) VALUES ('NCBI Taxonomy',4,'2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('EMBL','2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('IntAct','2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Ensembl','2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('FlyBase','2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,CannonicalSourceId,EntryDate) VALUES ('GO',5,'2005-03-04 11:37:14'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('InterPro','2005-03-04 11:37:15'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Pfam','2005-03-04 11:37:15'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PIR','2005-03-04 11:37:15'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Uniprot_keyword','2005-03-04 11:37:15'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('SMART','2005-03-04 11:37:16'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('HSSP','2005-03-04 11:37:17'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('ProDom','2005-03-04 11:37:17'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PROSITE','2005-03-04 11:37:17'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PRINTS','2005-03-04 11:37:19'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('TIGRFAMs','2005-03-04 11:37:22'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('EC','2005-03-04 11:37:22'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('MaizeDB','2005-03-04 11:37:33'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('TRANSFAC','2005-03-04 11:37:34'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('WormBase','2005-03-04 11:37:38'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('WormPep','2005-03-04 11:37:39'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('COMPLUYEAST-2DPAGE','2005-03-04 11:37:39'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('DictyBase','2005-03-04 11:37:40'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Gramene','2005-03-04 11:37:45'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('OGP','2005-03-04 11:38:02'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Genew','2005-03-04 11:38:02'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('H-InvDB','2005-03-04 11:38:02'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('MIM','2005-03-04 11:38:02'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('MGD','2005-03-04 11:38:04'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('RGD','2005-03-04 11:38:06'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PDB','2005-03-04 11:38:10'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('SWISS-2DPAGE','2005-03-04 11:38:33'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Aarhus/Ghent-2DPAGE','2005-03-04 11:38:33'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PMMA-2DPAGE','2005-03-04 11:38:45'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('TIGR','2005-03-04 11:38:49'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('TubercuList','2005-03-04 11:38:50'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Leproma','2005-03-04 11:39:05'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('GeneFarm','2005-03-04 11:39:35'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('GermOnline','2005-03-04 11:43:54'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('SGD','2005-03-04 11:43:54'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('GeneDB_SPombe','2005-03-04 11:44:15'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PIRSF','2005-03-04 11:45:42'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('HAMAP','2005-03-04 11:46:49'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Reactome','2005-03-04 11:46:52'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('ECO2DBASE','2005-03-04 11:46:55'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('EchoBASE','2005-03-04 11:46:55'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('EcoGene','2005-03-04 11:46:55'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('SubtiList','2005-03-04 11:46:58'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('ListiList','2005-03-04 11:47:14'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('GlycoSuiteDB','2005-03-04 11:47:44'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('StyGene','2005-03-04 11:51:59'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PHCI-2DPAGE','2005-03-04 11:52:19'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Siena-2DPAGE','2005-03-04 11:55:22'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('HSC-2DPAGE','2005-03-04 11:55:41'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('MEROPS','2005-03-04 11:59:32'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('AGD','2005-03-04 12:14:40'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PhotoList','2005-03-04 12:15:22'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('ZFIN','2005-03-04 12:15:39'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('MypuList','2005-03-04 12:24:15'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('SagaList','2005-03-04 12:25:40'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('ANU-2DPAGE','2005-03-04 12:29:22'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Rat-heart-2DPAGE','2005-03-04 12:30:51'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('PhosSite','2005-03-04 12:49:00'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('REBASE','2005-03-04 13:25:29'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('Maize-2DPAGE','2005-03-04 15:10:53'); +INSERT INTO prot.IdentTypes (Name,EntryDate) VALUES ('HIV','2005-03-04 22:13:40'); + +CREATE INDEX IX_IdentTypes_cannonicalsourceid ON prot.IdentTypes(cannonicalsourceid); + +/****** Sequences */ +CREATE TABLE prot.Sequences +( + SeqId INT IDENTITY (1, 1) NOT NULL, + ProtSequence TEXT NULL, + Hash VARCHAR(100) NULL, + Description VARCHAR(200) NULL, + SourceId INT NULL, + SourceVersion VARCHAR(50) NULL, + InsertDate DATETIME NULL DEFAULT (getdate()), + ChangeDate DATETIME NULL, + SourceChangeDate DATETIME NULL, + SourceInsertDate DATETIME NULL, + OrgId INT NULL, + Mass FLOAT NULL, + BestName VARCHAR(50) NULL, + BestGeneName VARCHAR(50) NULL, + Length INT NULL, + Deleted BIT NOT NULL DEFAULT 0, + + CONSTRAINT PK_ProtSequences PRIMARY KEY CLUSTERED (SeqId), + CONSTRAINT FK_ProtSequences_ProtSeqSources FOREIGN KEY (SourceId) REFERENCES prot.InfoSources (SourceId) +); +CREATE INDEX IX_SequencesOrg ON prot.Sequences(OrgId); +CREATE INDEX IX_ProtSequences_BestGeneName ON prot.Sequences(BestGeneName); +CREATE UNIQUE INDEX IX_ProtSequencesSurrogateKey ON prot.Sequences(Hash, OrgId); + +/****** Identifiers */ +CREATE TABLE prot.Identifiers +( + IdentId INT IDENTITY (1, 1) NOT NULL, + IdentTypeId INT NOT NULL, + Identifier VARCHAR(50) NOT NULL, + SeqId INT NULL, + SourceId INT NULL, + EntryDate DATETIME NOT NULL DEFAULT (getdate()), + SourceVersion VARCHAR(50) NULL, + Deleted BIT NOT NULL DEFAULT 0, + + CONSTRAINT PK_ProtIdentifiers PRIMARY KEY CLUSTERED (IdentId), + CONSTRAINT FK_ProtIdentifiers_ProtIdentTypes FOREIGN KEY (IdentTypeId) REFERENCES prot.IdentTypes (IdentTypeId), + CONSTRAINT FK_ProtIdentifiers_ProtSeqSources FOREIGN KEY (SourceId) REFERENCES prot.InfoSources (SourceId), + CONSTRAINT FK_ProtIdentifiers_ProtSequences FOREIGN KEY (SeqId) REFERENCES prot.Sequences (SeqId) +); +CREATE INDEX IX_Identifier ON prot.Identifiers(Identifier); +CREATE UNIQUE INDEX IX_ProtIdentifiers ON prot.Identifiers(IdentTypeId, Identifier, SeqId); +CREATE INDEX IX_Identifiers_SourceId ON prot.Identifiers(sourceid); +CREATE INDEX IX_Identifiers_SeqId ON prot.Identifiers(SeqId); + +/****** Organisms */ +CREATE TABLE prot.Organisms +( + OrgId INT IDENTITY (1, 1) NOT NULL, + CommonName VARCHAR(100) NULL, + Genus VARCHAR(100) NOT NULL, + Species VARCHAR(100) NOT NULL, + Comments VARCHAR(200) NULL, + IdentId INT NULL, + Deleted BIT NOT NULL DEFAULT 0, + + CONSTRAINT PK_ProtOrganisms PRIMARY KEY CLUSTERED (OrgId), + CONSTRAINT FK_ProtOrganisms_ProtIdentifiers FOREIGN KEY (IdentId) REFERENCES prot.Identifiers (IdentId), + CONSTRAINT FK_ProtSequences_ProtOrganisms FOREIGN KEY (OrgId) REFERENCES prot.Organisms (OrgId) +); +CREATE UNIQUE INDEX IX_ProtOrganismsSurrogateKey ON prot.Organisms(Genus, Species); + +INSERT INTO prot.Organisms (CommonName, Genus, Species, Comments) VALUES ('Unknown organism', 'Unknown', 'unknown', 'Organism is unknown'); + +CREATE INDEX IX_Organisms_IdentId ON prot.Organisms(IdentId); + +/****** Annotations */ +CREATE TABLE prot.Annotations +( + AnnotId INT IDENTITY (1, 1) NOT NULL, + AnnotTypeId INT NOT NULL, + AnnotVal VARCHAR(200) NULL, + AnnotIdent INT NULL, + SeqId INT NULL, + AnnotSourceId INT NULL, + AnnotSourceVersion VARCHAR(50) NULL, + InsertDate DATETIME NOT NULL DEFAULT (getdate()), + ModDate DATETIME NULL, + StartPos INT NULL, + EndPos INT NULL, + Deleted BIT NOT NULL DEFAULT 0, + + CONSTRAINT PK_ProtAnnotations PRIMARY KEY CLUSTERED (AnnotId), + CONSTRAINT FK_ProtAnnotations_ProtAnnotationTypes FOREIGN KEY (AnnotTypeId) REFERENCES prot.AnnotationTypes (AnnotTypeId), + CONSTRAINT FK_ProtAnnotations_ProtIdentifiers FOREIGN KEY (AnnotIdent) REFERENCES prot.Identifiers (IdentId), + CONSTRAINT FK_ProtAnnotations_ProtSeqSources FOREIGN KEY (AnnotSourceId) REFERENCES prot.InfoSources (SourceId), + CONSTRAINT FK_ProtAnnotations_ProtSequences FOREIGN KEY (SeqId) REFERENCES prot.Sequences (SeqId) +) +CREATE INDEX IX_ProtAnnotations1 ON prot.Annotations(SeqId, AnnotTypeId) +CREATE UNIQUE INDEX IX_AnnotSurrogateKey ON prot.Annotations(AnnotTypeId, AnnotVal, SeqId, StartPos, EndPos); +CREATE INDEX IX_Annotations_AnnotVal ON prot.Annotations(annotval); +CREATE INDEX IX_Annotations_AnnotIdent ON prot.annotations(annotident); +CREATE INDEX IX_Annotations_annotsourceid ON prot.annotations(annotsourceid); +CREATE INDEX IX_Annotations_IdentId ON prot.annotations(AnnotIdent); + +/****** FastaLoads */ +CREATE TABLE prot.FastaLoads +( + FastaId INT IDENTITY (1, 1) NOT NULL, + FileName VARCHAR(200) NOT NULL, + FileChecksum VARCHAR(50) NULL, + Comment VARCHAR(200) NULL, + InsertDate DATETIME NULL DEFAULT (getdate()), + DbName VARCHAR(100) NULL, + DbVersion VARCHAR(100) NULL, + DbSource INT NULL, + DbDate DATETIME NULL, + Reference VARCHAR(200) NULL, + NSequences INT NULL, + Sequences IMAGE NULL, + + CONSTRAINT FK_ProtFastas_ProtSeqSources FOREIGN KEY (DbSource) REFERENCES prot.InfoSources (SourceId), + CONSTRAINT PK_ProtFastas PRIMARY KEY CLUSTERED (FastaId) +); + +CREATE INDEX IX_FastaLoads_DBSource ON prot.FastaLoads(dbsource); + +/****** SprotOrgMap */ +CREATE TABLE prot.SprotOrgMap +( + SprotSuffix VARCHAR(5) NOT NULL, + SuperKingdomCode CHAR(1) NULL, + TaxonId INT NULL, + FullName VARCHAR(200) NOT NULL, + Genus VARCHAR(100) NOT NULL, + Species VARCHAR(100) NOT NULL, + CommonName VARCHAR(200) NULL, + Synonym VARCHAR(200) NULL, + + CONSTRAINT PK_ProtSprotOrgMap PRIMARY KEY (SprotSuffix) +); + +CREATE TABLE prot.FastaFiles +( + FastaId INT IDENTITY (1, 1) NOT NULL, + FileName NVARCHAR (400), + Loaded DATETIME, + FileChecksum VARCHAR(50) NULL, -- Hash of the file + ScoringAnalysis BIT NOT NULL DEFAULT 0, + + CONSTRAINT PK_ProteinDataBases PRIMARY KEY (FastaId) +); + +CREATE TABLE ms2.Runs +( + -- standard fields + _ts TIMESTAMP, + Run INT IDENTITY(1, 1), + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, + Owner USERID NULL, + + Container ENTITYID NOT NULL, + EntityId ENTITYID DEFAULT NEWID(), + Description NVARCHAR(300), + Path NVARCHAR(500), + FileName NVARCHAR(300), + Status NVARCHAR(200), + StatusId INT NOT NULL DEFAULT 0, + Type NVARCHAR(30), + SearchEngine NVARCHAR(20), + MassSpecType NVARCHAR(200), + FastaId INT NOT NULL DEFAULT 0, + SearchEnzyme NVARCHAR(50), + Deleted BIT NOT NULL DEFAULT 0, + ExperimentRunLSID LSIDType NULL, + HasPeptideProphet BIT NOT NULL DEFAULT '0', + PeptideCount INT NOT NULL DEFAULT 0, + SpectrumCount INT NOT NULL DEFAULT 0, + NegativeHitCount INT NOT NULL DEFAULT 0, -- Store reverse peptide counts to enable scoring analysis UI. + + CONSTRAINT PK_MS2Runs PRIMARY KEY (Run) +); + +-- Create indexes on ms2 Runs table to support common operations in MS2Manager +CREATE INDEX MS2Runs_Stats ON ms2.Runs (PeptideCount, SpectrumCount, Deleted, StatusId); +CREATE INDEX MS2Runs_ExperimentRunLSID ON ms2.Runs(ExperimentRunLSID); +CREATE INDEX MS2Runs_Container ON ms2.Runs(Container); + +CREATE TABLE ms2.Fractions +( + Fraction INT IDENTITY(1,1), + Run INT NOT NULL, + Description NVARCHAR(300), + FileName NVARCHAR(300), + HydroB0 REAL, + HydroB1 REAL, + HydroR2 REAL, + HydroSigma REAL, + PepXmlDataLSID LSIDType NULL, + MzXmlURL VARCHAR(400) NULL, + + CONSTRAINT PK_MS2Fractions PRIMARY KEY (Fraction) +); + +CREATE INDEX IX_Fractions_Run_Fraction ON ms2.Fractions(Run, Fraction); +CREATE INDEX IX_Fractions_MzXMLURL ON ms2.fractions(mzxmlurl); + +CREATE TABLE ms2.Modifications +( + Run INT NOT NULL, + AminoAcid VARCHAR (1) NOT NULL, + MassDiff REAL NOT NULL, + Variable BIT NOT NULL, + Symbol VARCHAR (1) NOT NULL, + + CONSTRAINT PK_MS2Modifications PRIMARY KEY (Run, AminoAcid, Symbol) +); + +-- Store MS2 Spectrum data in separate table to improve performance of upload and MS2Peptides queries +CREATE TABLE ms2.SpectraData +( + Fraction INT NOT NULL, + Scan INT NOT NULL, + Spectrum IMAGE NOT NULL, + + CONSTRAINT PK_MS2SpectraData PRIMARY KEY (Fraction, Scan) +); + +-- Create table for MS2 run & peptide history +CREATE TABLE ms2.History +( + Date DATETIME, + Runs BIGINT, + Peptides BIGINT +); + +-- Not a PK... unique is unnecessary and causes constraint violations +CREATE INDEX IX_MS2History ON ms2.History (Date); + +-- All tables used for GO data +-- Data will change frequently, with updates from the GO consortium +-- See +-- http://www.geneontology.org/GO.downloads.shtml +-- + +-- GO Terms + +CREATE TABLE prot.GoTerm +( + id INTEGER NOT NULL, + name VARCHAR(255) NOT NULL DEFAULT '', + termtype VARCHAR(55) NOT NULL DEFAULT '', + acc VARCHAR(255) NOT NULL DEFAULT '', + isobsolete INTEGER NOT NULL DEFAULT 0, + isroot INTEGER NOT NULL DEFAULT 0, + + CONSTRAINT PK_GoTerm PRIMARY KEY(id) +); +CREATE INDEX IX_GoTerm_Name ON prot.GoTerm(name); +CREATE INDEX IX_GoTerm_TermType ON prot.GoTerm(termtype); +CREATE UNIQUE INDEX UQ_GoTerm_Acc ON prot.GoTerm(acc); + +-- GO Term2Term + +CREATE TABLE prot.GoTerm2Term +( + id INTEGER NOT NULL, + relationshipTypeId INTEGER NOT NULL DEFAULT 0, + term1Id INTEGER NOT NULL DEFAULT 0, + term2Id INTEGER NOT NULL DEFAULT 0, + complete INTEGER NOT NULL DEFAULT 0, + + CONSTRAINT PK_GoTerm2Term PRIMARY KEY(id) +); + +CREATE INDEX IX_GoTerm2Term_term1Id ON prot.GoTerm2Term(term1Id); +CREATE INDEX IX_GoTerm2Term_term2Id ON prot.GoTerm2Term(term2Id); +CREATE INDEX IX_GoTerm2Term_term1_2_Id ON prot.GoTerm2Term(term1Id, term2Id); +CREATE INDEX IX_GoTerm2Term_relationshipTypeId ON prot.GoTerm2Term(relationshipTypeId); +CREATE UNIQUE INDEX UQ_GoTerm2Term_1_2_R ON prot.GoTerm2Term(term1Id, term2Id, relationshipTypeId); + +-- Graph path + +CREATE TABLE prot.GoGraphPath +( + id INTEGER NOT NULL, + term1Id INTEGER NOT NULL DEFAULT 0, + term2Id INTEGER NOT NULL DEFAULT 0, + distance INTEGER NOT NULL DEFAULT 0, + + CONSTRAINT PK_GoGraphPath PRIMARY KEY(id) +); + +CREATE INDEX IX_GoGraphPath_term1Id ON prot.GoGraphPath(term1Id); +CREATE INDEX IX_GoGraphPath_term2Id ON prot.GoGraphPath(term2Id); +CREATE INDEX IX_GoGraphPath_term1_2_Id ON prot.GoGraphPath(term1Id, term2Id); +CREATE INDEX IX_GoGraphPath_t1_distance ON prot.GoGraphPath(term1Id, distance); + +-- Go term definitions + +CREATE TABLE prot.GoTermDefinition +( + termId INTEGER NOT NULL DEFAULT 0, + termDefinition text NOT NULL, + dbXrefId INTEGER NULL DEFAULT NULL, + termComment text NULL DEFAULT NULL, + reference VARCHAR(255) NULL DEFAULT NULL +); + +CREATE INDEX IX_GoTermDefinition_dbXrefId ON prot.GoTermDefinition(dbXrefId); +CREATE UNIQUE INDEX UQ_GoTermDefinition_termId ON prot.GoTermDefinition(termId); + +-- GO term synonyms + +CREATE TABLE prot.GoTermSynonym +( + TermId INTEGER NOT NULL DEFAULT 0, + TermSynonym VARCHAR(500) NULL DEFAULT NULL, + AccSynonym VARCHAR(255) NULL DEFAULT NULL, + SynonymTypeId INTEGER NOT NULL DEFAULT 0 +); +CREATE INDEX IX_GoTermSynonym_SynonymTypeId ON prot.GoTermSynonym(SynonymTypeId); +CREATE INDEX IX_GoTermSynonym_TermId ON prot.GoTermSynonym(TermId); +CREATE INDEX IX_GoTermSynonym_termSynonym ON prot.GoTermSynonym(TermSynonym); +CREATE UNIQUE INDEX UQ_GoTermSynonym_termId_termSynonym ON prot.GoTermSynonym(TermId, TermSynonym); + +-- add most common ncbi Taxonomy id's +CREATE TABLE prot.idents +( + RowId INT NOT NULL IDENTITY, + Identifier VARCHAR(50) NOT NULL, + CommonName VARCHAR(20) NULL, + Genus VARCHAR(100) NOT NULL, + Species VARCHAR(100) NOT NULL, + OrgId INT NULL, + IdentId INT NULL, + IdentTypeId INT NULL +); + +INSERT prot.idents (CommonName, Genus, Species, Identifier) + VALUES ('chicken', 'Gallus', 'gallus', '9031'); +INSERT prot.idents (CommonName, Genus, Species, Identifier) + VALUES ('chimp', 'Pan', 'troglodytes', '9598'); +INSERT prot.idents (CommonName, Genus, Species, Identifier) + VALUES ('cow', 'Bos', 'taurus', '9913'); +INSERT prot.idents (CommonName, Genus, Species, Identifier) + VALUES ('dog', 'Canis', 'familiaris', '9615'); +INSERT prot.idents (CommonName, Genus, Species, Identifier) + VALUES ('ecoli', 'Escherichia', 'coli', '562'); +INSERT prot.idents (CommonName, Genus, Species, Identifier) + VALUES ('fruit fly', 'Drosophila', 'melanogaster', '7227'); +INSERT prot.idents (CommonName, Genus, Species, Identifier) + VALUES ('horse', 'Equus', 'caballus', '9796'); +INSERT prot.idents (CommonName, Genus, Species, Identifier) + VALUES ('human', 'Homo', 'sapiens', '9606'); +INSERT prot.idents (CommonName, Genus, Species, Identifier) + VALUES ('mouse', 'Mus', 'musculus', '10090'); +INSERT prot.idents (CommonName, Genus, Species, Identifier) + VALUES ('nematode', 'Caenorhabditis', 'elegans', '6239'); +INSERT prot.idents (CommonName, Genus, Species, Identifier) + VALUES ('pig', 'Sus', 'scrofa', '9823'); +INSERT prot.idents (CommonName, Genus, Species, Identifier) + VALUES ('rat', 'Rattus', 'norvegicus', '10116'); +INSERT prot.idents (CommonName, Genus, Species, Identifier) + VALUES ('yeast', 'Saccharomyces', 'cerevisiae', '4932'); +INSERT prot.idents (CommonName, Genus, Species, Identifier) + VALUES ('zebrafish', 'Danio', 'rerio', '7955'); + +UPDATE prot.idents + SET IdentTypeId = (SELECT identtypeid FROM prot.IdentTypes WHERE name='NCBI Taxonomy'); + +INSERT prot.Organisms (CommonName, Genus, Species) +SELECT CommonName, Genus, Species FROM prot.idents + WHERE NOT EXISTS + (SELECT * FROM prot.Organisms PO INNER JOIN prot.idents i ON (PO.Genus = i.Genus AND PO.Species = i.Species)); + +INSERT prot.Identifiers (Identifier, IdentTypeId) + SELECT Identifier, IdentTypeId FROM prot.idents + WHERE NOT EXISTS + (SELECT * FROM prot.Identifiers PI INNER JOIN prot.idents i ON (PI.Identifier = i.Identifier AND PI.IdentTypeId = i.IdentTypeId)); + +UPDATE prot.idents + SET OrgId = PO.OrgId + FROM prot.Organisms PO + WHERE prot.idents.Genus = PO.Genus AND prot.idents.Species = PO.Species; + +UPDATE prot.idents + SET IdentId = PI.IdentId + FROM prot.Identifiers PI + WHERE prot.idents.Identifier = PI.Identifier AND prot.idents.IdentTypeId = PI.IdentTypeId; + +UPDATE prot.Organisms + SET IdentId = i.IdentID + FROM prot.idents i + WHERE i.OrgId = prot.Organisms.OrgId; + +DROP TABLE prot.idents +GO + +CREATE TABLE ms2.PeptidesData +( + RowId BIGINT IDENTITY (1, 1) NOT NULL, + Fraction INT NOT NULL, + Scan INT NOT NULL, + Charge TINYINT NOT NULL, + Score1 REAL NOT NULL DEFAULT 0, + Score2 REAL NOT NULL DEFAULT 0, + Score3 REAL NOT NULL DEFAULT 0, + Score4 REAL NULL, + Score5 REAL NULL, + IonPercent REAL NOT NULL, + Mass FLOAT NOT NULL, -- Store mass as high-precision real + DeltaMass REAL NOT NULL, + PeptideProphet REAL NOT NULL, + Peptide VARCHAR (200) NOT NULL, + PrevAA CHAR(1) NOT NULL DEFAULT '', + TrimmedPeptide VARCHAR(200) NOT NULL DEFAULT '', + NextAA CHAR(1) NOT NULL DEFAULT '', + ProteinHits SMALLINT NOT NULL, + SequencePosition INT NOT NULL DEFAULT 0, + Protein VARCHAR (100) NOT NULL, + SeqId INT NULL, + RetentionTime REAL NULL, + PeptideProphetErrorRate REAL NULL, + EndScan INT NULL, + + CONSTRAINT PK_MS2PeptidesData PRIMARY KEY NONCLUSTERED (RowId) +); + +CREATE UNIQUE CLUSTERED INDEX UQ_MS2PeptidesData_FractionScanCharge ON ms2.PeptidesData(Fraction, Scan, EndScan, Charge); + +CREATE INDEX IX_MS2PeptidesData_Protein ON ms2.PeptidesData(Protein); + +-- this is not a declared fk +CREATE INDEX IX_PeptidesData_SeqId ON ms2.PeptidesData(SeqId); + +CREATE INDEX IX_MS2PeptidesData_TrimmedPeptide ON ms2.PeptidesData(TrimmedPeptide); +CREATE INDEX IX_MS2PeptidesData_Peptide ON ms2.PeptidesData(Peptide); + +CREATE TABLE ms2.PeptideProphetSummaries +( + Run INT NOT NULL, + FValSeries IMAGE NULL, + ObsSeries1 IMAGE NULL, + ObsSeries2 IMAGE NULL, + ObsSeries3 IMAGE NULL, + ModelPosSeries1 IMAGE NULL, + ModelPosSeries2 IMAGE NULL, + ModelPosSeries3 IMAGE NULL, + ModelNegSeries1 IMAGE NULL, + ModelNegSeries2 IMAGE NULL, + ModelNegSeries3 IMAGE NULL, + MinProbSeries IMAGE NULL, + SensitivitySeries IMAGE NULL, + ErrorSeries IMAGE NULL, + + CONSTRAINT PK_PeptideProphetSummmaries PRIMARY KEY (Run) +); + +CREATE TABLE ms2.ProteinProphetFiles +( + RowId INT IDENTITY (1, 1) NOT NULL, + FilePath VARCHAR(255) NOT NULL, + Run INT NOT NULL, + UploadCompleted BIT DEFAULT 0 NOT NULL, + MinProbSeries IMAGE NULL, + SensitivitySeries IMAGE NULL, + ErrorSeries IMAGE NULL, + PredictedNumberCorrectSeries IMAGE NULL, + PredictedNumberIncorrectSeries IMAGE NULL, + + CONSTRAINT PK_MS2ProteinProphetFiles PRIMARY KEY (RowId), + CONSTRAINT FK_MS2ProteinProphetFiles_MS2Runs FOREIGN KEY (Run) REFERENCES ms2.Runs(Run), + CONSTRAINT UQ_MS2ProteinProphetFiles UNIQUE (Run) +); + +CREATE TABLE ms2.ProteinGroups +( + RowId INT IDENTITY (1, 1) NOT NULL, + GroupProbability REAL NOT NULL, + ProteinProphetFileId INT NOT NULL, + GroupNumber INT NOT NULL, + IndistinguishableCollectionId INT NOT NULL, + UniquePeptidesCount INT NOT NULL, + TotalNumberPeptides INT NOT NULL, + PctSpectrumIds REAL NULL, + PercentCoverage REAL NULL, + ProteinProbability REAL NOT NULL DEFAULT 0, + ErrorRate REAL NULL, + + CONSTRAINT PK_MS2ProteinGroups PRIMARY KEY (RowId), + CONSTRAINT UQ_MS2ProteinGroups UNIQUE NONCLUSTERED (ProteinProphetFileId, GroupNumber, IndistinguishableCollectionId), + CONSTRAINT FK_MS2ProteinGroup_MS2ProteinProphetFileId FOREIGN KEY (ProteinProphetFileId) REFERENCES ms2.ProteinProphetFiles(RowId) +); + +CREATE TABLE ms2.ProteinGroupMemberships +( + ProteinGroupId INT NOT NULL, + SeqId INT NOT NULL, + Probability REAL NOT NULL, + + CONSTRAINT PK_MS2ProteinGroupMemberships PRIMARY KEY (ProteinGroupId, SeqId), + CONSTRAINT FK_MS2ProteinGroupMemberships_ProtSequences FOREIGN KEY (SeqId) REFERENCES prot.Sequences (SeqId), + CONSTRAINT FK_MS2ProteinGroupMembership_MS2ProteinGroups FOREIGN KEY (ProteinGroupId) REFERENCES ms2.ProteinGroups (RowId) +); + +CREATE INDEX IX_ProteinGroupMemberships_SeqId ON ms2.ProteinGroupMemberships(SeqId, ProteinGroupId, Probability); + +CREATE TABLE ms2.PeptideMemberships +( + PeptideId BIGINT NOT NULL, + ProteinGroupId INT NOT NULL, + NSPAdjustedProbability REAL NOT NULL, + Weight REAL NOT NULL, + NondegenerateEvidence BIT NOT NULL, + EnzymaticTermini INT NOT NULL, + SiblingPeptides REAL NOT NULL, + SiblingPeptidesBin INT NOT NULL, + Instances INT NOT NULL, + ContributingEvidence BIT NOT NULL, + CalcNeutralPepMass REAL NOT NULL, + + CONSTRAINT pk_ms2peptidememberships PRIMARY KEY (proteingroupid, peptideid), + CONSTRAINT fk_ms2peptidemembership_ms2peptidesdata FOREIGN KEY (peptideid) REFERENCES ms2.PeptidesData (rowid), + CONSTRAINT fk_ms2peptidemembership_ms2proteingroup FOREIGN KEY (proteingroupid) REFERENCES ms2.ProteinGroups (rowid) +); + +-- Index to speed up deletes from MS2PeptidesData. +CREATE INDEX IX_MS2PeptideMemberships_PeptideId ON ms2.PeptideMemberships(PeptideId); +CREATE INDEX IX_Peptidemembership_ProteingroupId ON ms2.PeptideMemberships(ProteinGroupId) + +CREATE TABLE ms2.Quantitation +( + PeptideId BIGINT NOT NULL, + LightFirstscan INT NOT NULL, + LightLastscan INT NOT NULL, + LightMass REAL NOT NULL, + HeavyFirstscan INT NOT NULL, + HeavyLastscan INT NOT NULL, + HeavyMass REAL NOT NULL, + Ratio VARCHAR(20) NULL, -- q3 does not generate string representations of ratios + Heavy2lightRatio VARCHAR(20) NULL, -- q3 does not generate string representations of ratios + LightArea REAL NOT NULL, + HeavyArea REAL NOT NULL, + DecimalRatio REAL NOT NULL, + QuantId INT NOT NULL, -- QuantId must be non-null; eventually (PeptideId, QuantId) should become a compound PK + + CONSTRAINT PK_Quantitation PRIMARY KEY (PeptideId), + CONSTRAINT FK_Quantitation_MS2PeptidesData FOREIGN KEY (PeptideId) REFERENCES ms2.PeptidesData(RowId) +); + +CREATE TABLE ms2.ProteinQuantitation +( + ProteinGroupId INT NOT NULL, + RatioMean REAL NOT NULL, + RatioStandardDev REAL NOT NULL, + RatioNumberPeptides INT NOT NULL, + Heavy2LightRatioMean REAL NOT NULL, + Heavy2LightRatioStandardDev REAL NOT NULL, + + CONSTRAINT PK_ProteinQuantitation PRIMARY KEY (ProteinGroupId), + CONSTRAINT FK_ProteinQuantitation_ProteinGroup FOREIGN KEY (ProteinGroupId) REFERENCES ms2.ProteinGroups (RowId) +); + +CREATE INDEX IX_ProteinQuantitation_ProteinGroupId ON ms2.ProteinQuantitation(ProteinGroupId); + +-- Add a quantitation summary table +CREATE TABLE ms2.QuantSummaries +( + QuantId INT IDENTITY(1,1) NOT NULL, + Run INT NOT NULL, + AnalysisType NVARCHAR(20) NOT NULL, + AnalysisTime DATETIME NULL, + Version NVARCHAR(80) NULL, + LabeledResidues NVARCHAR(20) NULL, + MassDiff NVARCHAR(80) NULL, + MassTol REAL NOT NULL, + SameScanRange CHAR(1) NULL, + XpressLight INT NULL, + + CONSTRAINT PK_QuantSummaries PRIMARY KEY (QuantId), + CONSTRAINT FK_QuantSummaries_MS2Runs FOREIGN KEY (Run) REFERENCES ms2.Runs (Run), + -- Current restrictions allow only one quantitation analysis per run + CONSTRAINT UQ_QuantSummaries UNIQUE (Run) +); + +CREATE TABLE ms2.PeptideProphetData +( + PeptideId BIGINT NOT NULL, + ProphetFVal REAL NOT NULL, + ProphetDeltaMass REAL NULL, + ProphetNumTrypticTerm INT NULL, + ProphetNumMissedCleav INT NULL, + + CONSTRAINT PK_PeptideProphetData PRIMARY KEY (PeptideId), + CONSTRAINT FK_PeptideProphetData_MS2PeptidesData FOREIGN KEY (PeptideId) REFERENCES ms2.PeptidesData(RowId) +); + +-- Bug 2195 restructure prot.FastaSequences +CREATE TABLE prot.FastaSequences +( + FastaId INT NOT NULL, + LookupString VARCHAR (200) NOT NULL, + SeqId INT NULL, + + CONSTRAINT PK_FastaSequences PRIMARY KEY (LookupString, FastaId), + CONSTRAINT FK_FastaSequences_Sequences FOREIGN KEY (SeqId) REFERENCES prot.Sequences (SeqId) +); + +CREATE INDEX IX_FastaSequences_FastaId_SeqId ON prot.FastaSequences(FastaId, SeqId) +CREATE INDEX IX_FastaSequences_SeqId ON prot.FastaSequences(SeqId) + +--Bug 2193 +CREATE INDEX IX_SequencesSource ON prot.Sequences(SourceId); + +CREATE TABLE prot.CustomAnnotationSet +( + CustomAnnotationSetId INT IDENTITY(1, 1) NOT NULL, + Container EntityId NOT NULL, + Name VARCHAR(200) NOT NULL, + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, + CustomAnnotationType VARCHAR(20) NOT NULL, + Lsid lsidtype, + + CONSTRAINT PK_CustomAnnotationSet PRIMARY KEY (CustomAnnotationSetId), + CONSTRAINT FK_CustomAnnotationSet_Container FOREIGN KEY (Container) REFERENCES core.Containers(EntityId), + CONSTRAINT UQ_CustomAnnotationSet UNIQUE (Container, Name) +); + +CREATE INDEX IX_CustomAnnotationSet_Container ON prot.CustomAnnotationSet(Container); + +CREATE TABLE prot.CustomAnnotation +( + CustomAnnotationId INT IDENTITY(1, 1) NOT NULL, + CustomAnnotationSetId INT NOT NULL, + ObjectURI LsidType NOT NULL, + LookupString VARCHAR(200) NOT NULL, + + CONSTRAINT PK_CustomAnnotation PRIMARY KEY (CustomAnnotationId), + CONSTRAINT fk_CustomAnnotation_CustomAnnotationSetId FOREIGN KEY (CustomAnnotationSetId) REFERENCES prot.CustomAnnotationSet(CustomAnnotationSetId), + CONSTRAINT UQ_CustomAnnotation_LookupString_SetId UNIQUE (LookupString, CustomAnnotationSetId), + CONSTRAINT UQ_CustomAnnotation_ObjectURI UNIQUE (ObjectURI) +); + +CREATE INDEX IX_CustomAnnotation_CustomAnnotationSetId ON prot.CustomAnnotation(CustomAnnotationSetId); + +UPDATE exp.DataInput SET Role = 'Spectra' WHERE Role = 'mzXML'; + +GO + +CREATE PROCEDURE prot.create_go_indexes AS +BEGIN + ALTER TABLE prot.goterm ADD CONSTRAINT pk_goterm PRIMARY KEY (id) + CREATE INDEX IX_GoTerm_Name ON prot.GoTerm(name) + CREATE INDEX IX_GoTerm_TermType ON prot.GoTerm(termtype) + CREATE UNIQUE INDEX UQ_GoTerm_Acc ON prot.GoTerm(acc) + + ALTER TABLE prot.goterm2term ADD CONSTRAINT pk_goterm2term PRIMARY KEY (id) + CREATE INDEX IX_GoTerm2Term_term1Id ON prot.GoTerm2Term(term1Id) + CREATE INDEX IX_GoTerm2Term_term2Id ON prot.GoTerm2Term(term2Id) + CREATE INDEX IX_GoTerm2Term_term1_2_Id ON prot.GoTerm2Term(term1Id,term2Id) + CREATE INDEX IX_GoTerm2Term_relationshipTypeId ON prot.GoTerm2Term(relationshipTypeId) + CREATE UNIQUE INDEX UQ_GoTerm2Term_1_2_R ON prot.GoTerm2Term(term1Id,term2Id,relationshipTypeId) + + ALTER TABLE prot.gographpath ADD CONSTRAINT pk_gographpath PRIMARY KEY (id) + CREATE INDEX IX_GoGraphPath_term1Id ON prot.GoGraphPath(term1Id) + CREATE INDEX IX_GoGraphPath_term2Id ON prot.GoGraphPath(term2Id) + CREATE INDEX IX_GoGraphPath_term1_2_Id ON prot.GoGraphPath(term1Id,term2Id) + CREATE INDEX IX_GoGraphPath_t1_distance ON prot.GoGraphPath(term1Id,distance) + + CREATE INDEX IX_GoTermDefinition_dbXrefId ON prot.GoTermDefinition(dbXrefId) + CREATE UNIQUE INDEX UQ_GoTermDefinition_termId ON prot.GoTermDefinition(termId) + + CREATE INDEX IX_GoTermSynonym_SynonymTypeId ON prot.GoTermSynonym(synonymTypeId) + CREATE INDEX IX_GoTermSynonym_TermId ON prot.GoTermSynonym(termId) + CREATE INDEX IX_GoTermSynonym_termSynonym ON prot.GoTermSynonym(termSynonym) + CREATE UNIQUE INDEX UQ_GoTermSynonym_termId_termSynonym ON prot.GoTermSynonym(termId,termSynonym); +END + +GO + +CREATE PROCEDURE prot.drop_go_indexes AS +BEGIN + EXEC core.fn_dropifexists 'goterm', 'prot', 'Constraint', 'PK_GoTerm' + EXEC core.fn_dropifexists 'goterm', 'prot', 'Index', 'IX_GoTerm_Name' + EXEC core.fn_dropifexists 'goterm', 'prot', 'Index', 'IX_GoTerm_TermType' + EXEC core.fn_dropifexists 'goterm', 'prot', 'Index', 'UQ_GoTerm_Acc' + + EXEC core.fn_dropifexists 'goterm2term', 'prot', 'Constraint', 'PK_GoTerm2Term' + EXEC core.fn_dropifexists 'goterm2term', 'prot', 'Index', 'IX_GoTerm2Term_term1Id' + EXEC core.fn_dropifexists 'goterm2term', 'prot', 'Index', 'IX_GoTerm2Term_term2Id' + EXEC core.fn_dropifexists 'goterm2term', 'prot', 'Index', 'IX_GoTerm2Term_term1_2_Id' + EXEC core.fn_dropifexists 'goterm2term', 'prot', 'Index', 'IX_GoTerm2Term_relationshipTypeId' + EXEC core.fn_dropifexists 'goterm2term', 'prot', 'Index', 'UQ_GoTerm2Term_1_2_R' + + EXEC core.fn_dropifexists 'gographpath', 'prot', 'Constraint', 'PK_GoGraphPath' + EXEC core.fn_dropifexists 'gographpath', 'prot', 'Index', 'IX_GoGraphPath_term1Id' + EXEC core.fn_dropifexists 'gographpath', 'prot', 'Index', 'IX_GoGraphPath_term2Id' + EXEC core.fn_dropifexists 'gographpath', 'prot', 'Index', 'IX_GoGraphPath_term1_2_Id' + EXEC core.fn_dropifexists 'gographpath', 'prot', 'Index', 'IX_GoGraphPath_t1_distance' + + EXEC core.fn_dropifexists 'gotermdefinition', 'prot', 'Index', 'IX_GoTermDefinition_dbXrefId' + EXEC core.fn_dropifexists 'gotermdefinition', 'prot', 'Index', 'UQ_GoTermDefinition_termId' + + EXEC core.fn_dropifexists 'gotermsynonym', 'prot', 'Index', 'IX_GoTermSynonym_SynonymTypeId' + EXEC core.fn_dropifexists 'gotermsynonym', 'prot', 'Index', 'IX_GoTermSynonym_TermId' + EXEC core.fn_dropifexists 'gotermsynonym', 'prot', 'Index', 'IX_GoTermSynonym_termSynonym' + EXEC core.fn_dropifexists 'gotermsynonym', 'prot', 'Index', 'UQ_GoTermSynonym_termId_termSynonym'; +END + +GO + +/* ms2-9.20-9.30.sql */ + +UPDATE prot.InfoSources SET Url = 'http://www.genecards.org/cgi-bin/carddisp.pl?gene={}' + WHERE Name = 'GeneCards'; + +ALTER TABLE ms2.peptidesdata ALTER COLUMN score1 REAL NULL; +ALTER TABLE ms2.peptidesdata ALTER COLUMN score2 REAL NULL; +ALTER TABLE ms2.peptidesdata ALTER COLUMN score3 REAL NULL; + +-- It's a real pain to drop defaults in SQL Server if they weren't created with a specific name +declare @name NVARCHAR(32), + @sql NVARCHAR(1000) + +-- find constraint name for first score column +select @name = O.name +from sysobjects AS O +left join sysobjects AS T + on O.parent_obj = T.id +where isnull(objectproperty(O.id,'IsMSShipped'),1) = 0 + and O.name not like '%dtproper%' + and O.name not like 'dt[_]%' + and T.name = 'peptidesdata' + and O.name like 'DF__MS2Peptid%__Score%' +-- delete if found +if not @name is null +begin + select @sql = 'ALTER TABLE ms2.peptidesdata DROP CONSTRAINT [' + @name + ']' + execute sp_executesql @sql +end + +select @name = null + +-- find constraint name for second score column +select @name = O.name +from sysobjects AS O +left join sysobjects AS T + on O.parent_obj = T.id +where isnull(objectproperty(O.id,'IsMSShipped'),1) = 0 + and O.name not like '%dtproper%' + and O.name not like 'dt[_]%' + and T.name = 'peptidesdata' + and O.name like 'DF__MS2Peptid%__Score%' +-- delete if found +if not @name is null +begin + select @sql = 'ALTER TABLE ms2.peptidesdata DROP CONSTRAINT [' + @name + ']' + execute sp_executesql @sql +end + +select @name = null + +-- find constraint name for third score column +select @name = O.name +from sysobjects AS O +left join sysobjects AS T + on O.parent_obj = T.id +where isnull(objectproperty(O.id,'IsMSShipped'),1) = 0 + and O.name not like '%dtproper%' + and O.name not like 'dt[_]%' + and T.name = 'peptidesdata' + and O.name like 'DF__MS2Peptid%__Score%' +-- delete if found +if not @name is null +begin + select @sql = 'ALTER TABLE ms2.peptidesdata DROP CONSTRAINT [' + @name + ']' + execute sp_executesql @sql +end + +ALTER TABLE ms2.Quantitation ADD Invalidated BIT; +GO + +ALTER TABLE ms2.Fractions ADD ScanCount INT +GO +ALTER TABLE ms2.Fractions ADD MS1ScanCount INT +GO +ALTER TABLE ms2.Fractions ADD MS2ScanCount INT +GO +ALTER TABLE ms2.Fractions ADD MS3ScanCount INT +GO +ALTER TABLE ms2.Fractions ADD MS4ScanCount INT +GO + +/* ms2-11.20-11.30.sql */ + +CREATE TABLE ms2.iTraqPeptideQuantitation +( + PeptideId BIGINT NOT NULL, + TargetMass1 REAL, + AbsoluteMass1 REAL, + Normalized1 REAL, + TargetMass2 REAL, + AbsoluteMass2 REAL, + Normalized2 REAL, + TargetMass3 REAL, + AbsoluteMass3 REAL, + Normalized3 REAL, + TargetMass4 REAL, + AbsoluteMass4 REAL, + Normalized4 REAL, + TargetMass5 REAL, + AbsoluteMass5 REAL, + Normalized5 REAL, + TargetMass6 REAL, + AbsoluteMass6 REAL, + Normalized6 REAL, + TargetMass7 REAL, + AbsoluteMass7 REAL, + Normalized7 REAL, + TargetMass8 REAL, + AbsoluteMass8 REAL, + Normalized8 REAL, + + CONSTRAINT PK_iTraqPeptideQuantitation PRIMARY KEY (PeptideId), + CONSTRAINT FK_iTraqPeptideQuantitation_MS2PeptidesData FOREIGN KEY (PeptideId) REFERENCES ms2.PeptidesData(RowId) +) +GO + +CREATE TABLE ms2.iTraqProteinQuantitation +( + ProteinGroupId INT NOT NULL, + Ratio1 REAL, + Error1 REAL, + Ratio2 REAL, + Error2 REAL, + Ratio3 REAL, + Error3 REAL, + Ratio4 REAL, + Error4 REAL, + Ratio5 REAL, + Error5 REAL, + Ratio6 REAL, + Error6 REAL, + Ratio7 REAL, + Error7 REAL, + Ratio8 REAL, + Error8 REAL, + + CONSTRAINT PK_iTraqProteinQuantitation PRIMARY KEY (ProteinGroupId), + CONSTRAINT FK_iTraqProteinQuantitation_ProteinGroups FOREIGN KEY (ProteinGroupId) REFERENCES ms2.ProteinGroups(RowId) +) +GO + +EXEC sp_rename 'ms2.iTraqPeptideQuantitation.AbsoluteMass1', 'AbsoluteIntensity1', 'COLUMN' +EXEC sp_rename 'ms2.iTraqPeptideQuantitation.AbsoluteMass2', 'AbsoluteIntensity2', 'COLUMN' +EXEC sp_rename 'ms2.iTraqPeptideQuantitation.AbsoluteMass3', 'AbsoluteIntensity3', 'COLUMN' +EXEC sp_rename 'ms2.iTraqPeptideQuantitation.AbsoluteMass4', 'AbsoluteIntensity4', 'COLUMN' +EXEC sp_rename 'ms2.iTraqPeptideQuantitation.AbsoluteMass5', 'AbsoluteIntensity5', 'COLUMN' +EXEC sp_rename 'ms2.iTraqPeptideQuantitation.AbsoluteMass6', 'AbsoluteIntensity6', 'COLUMN' +EXEC sp_rename 'ms2.iTraqPeptideQuantitation.AbsoluteMass7', 'AbsoluteIntensity7', 'COLUMN' +EXEC sp_rename 'ms2.iTraqPeptideQuantitation.AbsoluteMass8', 'AbsoluteIntensity8', 'COLUMN' +GO + +/* ms2-12.10-12.20.sql */ + +UPDATE prot.InfoSources SET URL = 'http://www.uniprot.org/uniprot/{}' WHERE Name = 'NiceProt'; + +UPDATE prot.InfoSources SET URL = 'http://www.ncbi.nlm.nih.gov/protein/{}' WHERE Name = 'Genbank'; + +/* ms2-13.10-13.20.sql */ + +ALTER TABLE ms2.proteinprophetfiles ALTER COLUMN FilePath NVARCHAR(512); + +/* ms2-13.20-13.30.sql */ + +UPDATE ms2.Runs SET Type = 'LegacyComet' WHERE Type = 'Comet'; + +ALTER TABLE ms2.PeptidesData ADD score6 REAL; + +ALTER TABLE prot.AnnotInsertions ALTER COLUMN FileName NVARCHAR(400); + +/* ms2-14.10-14.20.sql */ + +UPDATE prot.infosources SET url = 'http://amigo.geneontology.org/amigo/term/{}' WHERE Name = 'GO'; +GO + +/* ms2-15.10-15.20.sql */ + +CREATE TABLE ms2.ExpressionData ( + RowId INT IDENTITY (1,1) NOT NULL, + Value REAL, + SeqId INT NOT NULL, + SampleId INT NOT NULL, + DataId INT NOT NULL, + + CONSTRAINT PK_ExpressionData PRIMARY KEY (RowId), + CONSTRAINT FK_ExpressionData_SeqId FOREIGN KEY (SeqId) REFERENCES prot.sequences (SeqId), + CONSTRAINT FK_ExpressionData_SampleId FOREIGN KEY (SampleId) REFERENCES exp.material (RowId), + CONSTRAINT FK_ExpressionData_DataId FOREIGN KEY (DataId) REFERENCES exp.data (RowId) +); + +CREATE INDEX IX_ExpressionData_SeqId ON ms2.ExpressionData(SeqId); +CREATE INDEX IX_ExpressionData_SampleId ON ms2.ExpressionData(SampleId); +CREATE INDEX IX_ExpressionData_DataId ON ms2.ExpressionData(DataId); + +ALTER TABLE ms2.ExpressionData ADD CONSTRAINT UQ_ExpressionData_DataId_SeqId_SampleId UNIQUE (DataId, SeqId, SampleId); + +DROP INDEX IX_ExpressionData_DataId ON ms2.ExpressionData; + +/* ms2-15.30-16.10.sql */ + +ALTER TABLE ms2.Runs ADD MascotFile NVARCHAR(300) NULL; +ALTER TABLE ms2.Runs ADD DistillerRawFile NVARCHAR(500) NULL; + + +ALTER TABLE ms2.PeptidesData ADD QueryNumber int NULL; +ALTER TABLE ms2.PeptidesData ADD HitRank int NOT NULL DEFAULT 1; +ALTER TABLE ms2.PeptidesData ADD Decoy bit NOT NULL DEFAULT 0; + +-- Issue 25276: MS2 script rollup for 16.1 should not create UQ_MS2PeptidesData_FractionScanCharge index twice +-- EXEC core.fn_dropifexists 'PeptidesData', 'ms2', 'INDEX', 'UQ_MS2PeptidesData_FractionScanCharge'; +-- CREATE UNIQUE CLUSTERED INDEX UQ_MS2PeptidesData_FractionScanCharge ON ms2.PeptidesData(Fraction, Scan, EndScan, Charge, HitRank, Decoy); + +ALTER TABLE ms2.PeptidesData ALTER COLUMN PeptideProphet REAL NULL; + +ALTER TABLE ms2.peptidesdata + ADD CONSTRAINT FK_ms2PeptidesData_ProtSequences FOREIGN KEY (seqid) REFERENCES prot.sequences (seqid); + +-- This index should replace the one created in ms2-15.30-15.31.sql. There is no need to create the older one first. +EXEC core.fn_dropifexists 'PeptidesData', 'ms2', 'INDEX', 'UQ_MS2PeptidesData_FractionScanCharge'; +CREATE UNIQUE CLUSTERED INDEX UQ_MS2PeptidesData_FractionScanCharge ON ms2.PeptidesData(Fraction, Scan, EndScan, Charge, HitRank, Decoy, QueryNumber); + +-- Create a new set of properties for Mascot settings +INSERT INTO prop.propertysets (category, objectid, userid) SELECT 'MascotConfig' AS Category, EntityId, -1 AS UserId FROM core.containers WHERE parent IS NULL; + +-- Migrate existing Mascot settings +UPDATE prop.properties SET "set" = (SELECT MAX("set") FROM prop.propertysets) + WHERE name LIKE 'Mascot%' AND "set" = (SELECT "set" FROM prop.propertysets WHERE category = 'SiteConfig' AND userid = -1 AND objectid = (SELECT entityid FROM core.containers WHERE parent IS NULL)); + +CREATE TABLE ms2.FastaRunMapping ( + Run INT NOT NULL, + FastaId INT NOT NULL, + + CONSTRAINT PK_FastaRunMapping PRIMARY KEY (Run, FastaId), + CONSTRAINT FK_FastaRunMapping_Run FOREIGN KEY (Run) REFERENCES ms2.Runs (Run), + CONSTRAINT FK_FastaRunMapping_FastaId FOREIGN KEY (FastaId) REFERENCES prot.FastaFiles (FastaId) +); + +INSERT INTO ms2.FastaRunMapping( Run, FastaId ) SELECT Run, FastaId FROM ms2.Runs WHERE FastaId IN (SELECT FastaId FROM prot.FastaFiles); + +CREATE INDEX IX_FastaRunMapping_FastaId ON ms2.FastaRunMapping(FastaId); + +EXEC core.fn_dropifexists @objname='Runs', @objschema='ms2', @objtype='DEFAULT', @subobjname='FastaId'; + +ALTER TABLE ms2.Runs DROP COLUMN FastaId; + +/* ms2-16.10-16.20.sql */ + +-- Issue 26074: Equals filter fails on protein.Sequence.ProtSequence column on SqlServer +ALTER TABLE prot.Sequences ALTER COLUMN ProtSequence VARCHAR(MAX); + +/* ms2-16.20-16.30.sql */ + +-- Issue 27667 - Importing failed due to data type length limitation +ALTER TABLE ms2.Runs ALTER COLUMN mascotfile NVARCHAR(MAX); + +/* ms2-16.30-17.10.sql */ + +ALTER TABLE ms2.itraqproteinquantitation ADD Ratio9 REAL; +ALTER TABLE ms2.itraqproteinquantitation ADD Error9 REAL; +ALTER TABLE ms2.itraqproteinquantitation ADD Ratio10 REAL; +ALTER TABLE ms2.itraqproteinquantitation ADD Error10 REAL; + +ALTER TABLE ms2.itraqpeptidequantitation ADD TargetMass9 REAL; +ALTER TABLE ms2.itraqpeptidequantitation ADD AbsoluteIntensity9 REAL; +ALTER TABLE ms2.itraqpeptidequantitation ADD Normalized9 REAL; +ALTER TABLE ms2.itraqpeptidequantitation ADD TargetMass10 REAL; +ALTER TABLE ms2.itraqpeptidequantitation ADD AbsoluteIntensity10 REAL; +ALTER TABLE ms2.itraqpeptidequantitation ADD Normalized10 REAL; \ No newline at end of file diff --git a/ms2/resources/schemas/dbscripts/sqlserver/ms2-0.00-16.30.sql b/ms2/resources/schemas/dbscripts/sqlserver/obsolete/ms2-0.00-16.30.sql similarity index 100% rename from ms2/resources/schemas/dbscripts/sqlserver/ms2-0.00-16.30.sql rename to ms2/resources/schemas/dbscripts/sqlserver/obsolete/ms2-0.00-16.30.sql diff --git a/ms2/resources/schemas/dbscripts/sqlserver/ms2-16.30-17.10.sql b/ms2/resources/schemas/dbscripts/sqlserver/obsolete/ms2-16.30-17.10.sql similarity index 100% rename from ms2/resources/schemas/dbscripts/sqlserver/ms2-16.30-17.10.sql rename to ms2/resources/schemas/dbscripts/sqlserver/obsolete/ms2-16.30-17.10.sql diff --git a/nab/resources/schemas/dbscripts/postgresql/nab-0.00-17.10.sql b/nab/resources/schemas/dbscripts/postgresql/nab-0.00-17.10.sql new file mode 100644 index 0000000000..071d01a517 --- /dev/null +++ b/nab/resources/schemas/dbscripts/postgresql/nab-0.00-17.10.sql @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2017-2018 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* nab-12.30-13.10.sql */ + +CREATE SCHEMA nab; + +CREATE TABLE nab.cutoffvalue +( + rowid SERIAL NOT NULL, + nabspecimenid INT NOT NULL, + cutoff DOUBLE PRECISION, + point DOUBLE PRECISION, + pointoorindicator VARCHAR(20), + + ic_poly DOUBLE PRECISION, + ic_polyoorindicator VARCHAR(20), + ic_4pl DOUBLE PRECISION, + ic_4ploorindicator VARCHAR(20), + ic_5pl DOUBLE PRECISION, + ic_5ploorindicator VARCHAR(20), + + CONSTRAINT pk_nab_cutoffvalue PRIMARY KEY (rowid) +); + +CREATE TABLE nab.nabspecimen +( + rowid SERIAL NOT NULL, + dataid INT, + runid INT NOT NULL, + specimenlsid lsidtype NOT NULL, + FitError DOUBLE PRECISION, + WellgroupName VARCHAR(100), + + auc_poly DOUBLE PRECISION, + positiveauc_poly DOUBLE PRECISION, + auc_4pl DOUBLE PRECISION, + positiveauc_4pl DOUBLE PRECISION, + auc_5pl DOUBLE PRECISION, + positiveauc_5pl DOUBLE PRECISION, + + -- For legacy migration purposes + objecturi VARCHAR(300), + objectid INT NOT NULL, + protocolid INT, + viruslsid lsidtype, + + CONSTRAINT pk_nab_specimen PRIMARY KEY (rowid), + CONSTRAINT fk_nabspecimen_experimentrun FOREIGN KEY (runid) + REFERENCES exp.experimentrun (rowid) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT fk_nabspecimen_specimenlsid FOREIGN KEY (specimenlsid) + REFERENCES exp.material (lsid) + ON UPDATE NO ACTION ON DELETE NO ACTION +); + +CREATE INDEX idx_nabspecimen_runid ON nab.nabspecimen(runid); +CREATE INDEX idx_nabspecimen_objectid ON nab.nabspecimen(objectid); +CREATE INDEX idx_nabspecimen_dataid ON nab.nabspecimen(dataid); + +ALTER TABLE nab.cutoffvalue ADD CONSTRAINT fk_cutoffvalue_nabspecimen FOREIGN KEY (nabspecimenid) + REFERENCES nab.nabspecimen (rowid) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE NO ACTION; +ALTER TABLE nab.nabspecimen ADD CONSTRAINT fk_nabspecimen_protocolid FOREIGN KEY (protocolid) + REFERENCES exp.protocol (rowid) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE NO ACTION; + + +CREATE INDEX IDX_NAbSpecimen_ProtocolId ON nab.NAbSpecimen(ProtocolId); +CREATE INDEX IDX_CutoffValue_NabSpecimenId ON nab.cutoffvalue USING btree (NabSpecimenId); + +/* nab-14.20-14.30.sql */ + +CREATE SCHEMA nabvirus; + +/* nab-15.10-15.11.sql */ + +CREATE INDEX IDX_NAbSpecimen_SpecimenLSID ON nab.NAbSpecimen(SpecimenLSID); + +/* nab-15.20-15.21.sql */ + +CREATE TABLE nab.dilutiondata +( + RowId SERIAL NOT NULL, + Dilution DOUBLE PRECISION, + DilutionOrder INT, + PercentNeutralization DOUBLE PRECISION, + NeutralizationPlusMinus DOUBLE PRECISION, + Min DOUBLE PRECISION, + Max DOUBLE PRECISION, + Mean DOUBLE PRECISION, + StdDev DOUBLE PRECISION, + WellgroupName VARCHAR(100), + ReplicateName VARCHAR(100), + RunDataId INT, + MinDilution DOUBLE PRECISION, + MaxDilution DOUBLE PRECISION, + PlateNumber INT, + RunId INT, + ProtocolId INT, + Container ENTITYID NOT NULL, + + CONSTRAINT pk_dilutiondata PRIMARY KEY (RowId) + +); + +ALTER TABLE nab.dilutiondata ADD CONSTRAINT fk_dilutiondata_experimentrun FOREIGN KEY (RunId) + REFERENCES exp.experimentrun (RowId) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION; +ALTER TABLE nab.dilutiondata ADD CONSTRAINT fk_dilutiondata_rundataid FOREIGN KEY (RunDataId) + REFERENCES nab.nabspecimen (RowId) ON UPDATE NO ACTION ON DELETE NO ACTION; + +CREATE INDEX IDX_DilutionData_RunId ON nab.DilutionData(RunId); + +CREATE TABLE nab.welldata +( + RowId SERIAL NOT NULL, + RunId INT NOT NULL, + SpecimenLsid lsidtype, + RunDataId INT, + DilutionDataId INT, + ProtocolId INT, + "Row" INT, + "Column" INT, + Value REAL, + ControlWellgroup VARCHAR(100), + VirusWellgroup VARCHAR(100), + SpecimenWellgroup VARCHAR(100), + ReplicateWellgroup VARCHAR(100), + ReplicateNumber INT, + Container ENTITYID NOT NULL, + PlateNumber INT, + PlateVirusName VARCHAR(100), + +CONSTRAINT pk_welldata PRIMARY KEY (RowId), + CONSTRAINT fk_welldata_experimentrun FOREIGN KEY (RunId) + REFERENCES exp.experimentrun (RowId) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT fk_welldata_specimenlsid FOREIGN KEY (SpecimenLsid) + REFERENCES exp.material (Lsid) + ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT fk_welldata_rundataid FOREIGN KEY (RunDataId) + REFERENCES nab.nabspecimen (RowId) + ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT fk_welldata_dilutiondataid FOREIGN KEY (DilutionDataId) + REFERENCES nab.dilutiondata (RowId) + ON UPDATE NO ACTION ON DELETE NO ACTION + +); + +CREATE INDEX idx_welldata_runid ON nab.welldata(RunId); + +/* nab-16.20-16.30.sql */ + +-- note : nab-16.20-nab-16.21 was backported to release 16.2 to fix issue : 27040 +-- when scripts are consolidated for 16.3 we will need to account for both 16.20-16.30 and 16.21-16.30 upgrade paths +CREATE INDEX IDX_WellData_DilutionDataId ON nab.wellData(dilutionDataId); + +-- conditionally create the index, this is necessary because the index creation did not exist initially +-- in script: nab-16.20-16.21 but was added later to fix issue 27040 +CREATE FUNCTION nab.ensureIndex() RETURNS void AS $$ +BEGIN + IF NOT EXISTS(SELECT * FROM pg_indexes WHERE SchemaName = 'nab' AND TableName = 'welldata' AND IndexName = 'idx_welldata_dilutiondataid') THEN + EXECUTE 'CREATE INDEX IDX_WellData_DilutionDataId ON nab.wellData(dilutionDataId)'; + END IF; +END +$$ LANGUAGE plpgsql; + +SELECT nab.ensureIndex(); +DROP FUNCTION nab.ensureIndex(); + +/* nab-16.30-17.10.sql */ + +/* nab-16.30-16.31.sql */ + +ALTER TABLE nab.WellData ADD Excluded BOOLEAN NOT NULL DEFAULT FALSE; \ No newline at end of file diff --git a/nab/resources/schemas/dbscripts/postgresql/nab-0.00-16.30.sql b/nab/resources/schemas/dbscripts/postgresql/obsolete/nab-0.00-16.30.sql similarity index 100% rename from nab/resources/schemas/dbscripts/postgresql/nab-0.00-16.30.sql rename to nab/resources/schemas/dbscripts/postgresql/obsolete/nab-0.00-16.30.sql diff --git a/nab/resources/schemas/dbscripts/postgresql/nab-16.30-17.10.sql b/nab/resources/schemas/dbscripts/postgresql/obsolete/nab-16.30-17.10.sql similarity index 100% rename from nab/resources/schemas/dbscripts/postgresql/nab-16.30-17.10.sql rename to nab/resources/schemas/dbscripts/postgresql/obsolete/nab-16.30-17.10.sql diff --git a/nab/resources/schemas/dbscripts/sqlserver/nab-0.00-17.10.sql b/nab/resources/schemas/dbscripts/sqlserver/nab-0.00-17.10.sql new file mode 100644 index 0000000000..22215fd6d5 --- /dev/null +++ b/nab/resources/schemas/dbscripts/sqlserver/nab-0.00-17.10.sql @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2015-2017 LabKey Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* nab-12.30-13.10.sql */ + +CREATE SCHEMA nab; +GO + +CREATE TABLE nab.CutoffValue +( + RowId INT IDENTITY (1, 1) NOT NULL, + NAbSpecimenId INT NOT NULL, + Cutoff DOUBLE PRECISION, + Point DOUBLE PRECISION, + PointOORIndicator NVARCHAR(20), + + IC_Poly DOUBLE PRECISION, + IC_PolyOORIndicator NVARCHAR(20), + IC_4pl DOUBLE PRECISION, + IC_4plOORIndicator NVARCHAR(20), + IC_5pl DOUBLE PRECISION, + IC_5plOORIndicator NVARCHAR(20), + + CONSTRAINT PK_NAb_CutoffValue PRIMARY KEY (RowId) +); + +CREATE TABLE nab.NAbSpecimen +( + RowId INT IDENTITY (1, 1) NOT NULL, + DataId INT, + RunId INT NOT NULL, + SpecimenLSID LSIDtype NOT NULL, + FitError DOUBLE PRECISION, + WellgroupName NVARCHAR(100), + + AUC_poly DOUBLE PRECISION, + PositiveAUC_Poly DOUBLE PRECISION, + AUC_4pl DOUBLE PRECISION, + PositiveAUC_4pl DOUBLE PRECISION, + AUC_5pl DOUBLE PRECISION, + PositiveAUC_5pl DOUBLE PRECISION, + + -- For legacy migration purposes + ObjectUri NVARCHAR(300), + ObjectId INT NOT NULL, + ProtocolId INT, + viruslsid lsidtype, + + CONSTRAINT PK_NAb_Specimen PRIMARY KEY (RowId), + CONSTRAINT FK_NAbSpecimen_ExperimentRun FOREIGN KEY (RunId) + REFERENCES Exp.ExperimentRun (RowId) + ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT FK_NAbSpecimen_SpecimenLSID FOREIGN KEY (SpecimenLSID) + REFERENCES Exp.Material (LSID) + ON UPDATE NO ACTION ON DELETE NO ACTION +); + +CREATE INDEX IDX_NAbSpecimen_RunId ON nab.NAbSpecimen(RunId); +CREATE INDEX IDX_NAbSpecimen_ObjectId ON nab.NAbSpecimen(ObjectId); +CREATE INDEX IDX_NAbSpecimen_DataId ON nab.NAbSpecimen(DataId); + +ALTER TABLE nab.CutoffValue ADD CONSTRAINT FK_CutoffValue_NAbSpecimen FOREIGN KEY (NAbSpecimenId) + REFERENCES nab.NAbSpecimen (rowid); +ALTER TABLE nab.NAbSpecimen ADD CONSTRAINT FK_NAbSpecimen_ProtocolId FOREIGN KEY (ProtocolId) + REFERENCES Exp.Protocol (rowid); + + +CREATE INDEX IDX_NAbSpecimen_ProtocolId ON nab.NAbSpecimen(ProtocolId); +CREATE INDEX IDX_CutoffValue_NabSpecimenId ON nab.cutoffvalue(NabSpecimenId); +GO + +/* nab-14.20-14.30.sql */ + +CREATE SCHEMA nabvirus; +GO + +/* nab-15.10-15.11.sql */ + +CREATE INDEX IDX_NAbSpecimen_SpecimenLSID ON nab.NAbSpecimen(SpecimenLSID); + +/* nab-15.20-15.21.sql */ + +CREATE TABLE nab.DilutionData +( + RowId INT IDENTITY (1, 1) NOT NULL, + Dilution DOUBLE PRECISION, + DilutionOrder INT, + PercentNeutralization DOUBLE PRECISION, + NeutralizationPlusMinus DOUBLE PRECISION, + Min DOUBLE PRECISION, + Max DOUBLE PRECISION, + Mean DOUBLE PRECISION, + StdDev DOUBLE PRECISION, + WellgroupName NVARCHAR(100), + ReplicateName NVARCHAR(100), + RunDataId INT, + MaxDilution DOUBLE PRECISION, + MinDilution DOUBLE PRECISION, + PlateNumber INT, + RunId INT, + ProtocolId INT, + Container ENTITYID NOT NULL, + + CONSTRAINT PK_NAb_DilutionData PRIMARY KEY (RowId) +); + +ALTER TABLE nab.DilutionData ADD CONSTRAINT FK_DilutionData_ExperimentRun FOREIGN KEY (RunId) + REFERENCES Exp.ExperimentRun (RowId) + ON UPDATE NO ACTION ON DELETE NO ACTION; +ALTER TABLE nab.DilutionData ADD CONSTRAINT FK_DilutionData_RunDataId FOREIGN KEY (RunDataId) + REFERENCES nab.NAbSpecimen (RowId) + ON UPDATE NO ACTION ON DELETE NO ACTION; + +CREATE INDEX IDX_DilutionData_RunId ON nab.DilutionData(RunId); + +CREATE TABLE nab.WellData +( + RowId INT IDENTITY (1, 1) NOT NULL, + RunId INT NOT NULL, + SpecimenLsid LSIDtype NULL, + RunDataId INT NULL, + DilutionDataId INT, + ProtocolId INT, + "Row" INT, + "Column" INT, + Value REAL, + ControlWellgroup NVARCHAR(100), + VirusWellgroup NVARCHAR(100), + SpecimenWellgroup NVARCHAR(100), + ReplicateWellgroup NVARCHAR(100), + ReplicateNumber INT, + Container EntityId NOT NULL, + PlateNumber INT, + PlateVirusName NVARCHAR(100), + + CONSTRAINT PK_NAb_WellData PRIMARY KEY (RowId), + CONSTRAINT FK_WellData_ExperimentRun FOREIGN KEY (RunId) + REFERENCES Exp.ExperimentRun (RowId) + ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT FK_WellData_SpecimenLSID FOREIGN KEY (SpecimenLSID) + REFERENCES Exp.Material (LSID) + ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT FK_WellData_RunDataId FOREIGN KEY (RunDataId) + REFERENCES NAb.NAbSpecimen (RowId) + ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT FK_WellData_DilutionDataId FOREIGN KEY (DilutionDataId) + REFERENCES NAb.DilutionData (RowId) + ON UPDATE NO ACTION ON DELETE NO ACTION + +); + +CREATE INDEX IDX_WellData_RunId ON nab.WellData(RunId); + +/* nab-16.20-16.30.sql */ + +-- note : nab-16.20-nab-16.21 was backported to release 16.2 to fix issue : 27040 +-- when scripts are consolidated for 16.3 we will need to account for both 16.20-16.30 and 16.21-16.30 upgrade paths +CREATE INDEX IDX_WellData_DilutionDataId ON nab.wellData(dilutionDataId); + +GO + +-- conditionally create the index, this is necessary because the index creation did not exist initially +-- in script: nab-16.20-16.21 but was added later to fix issue 27040 +CREATE PROCEDURE nab.ensureIndex AS + BEGIN + IF NOT EXISTS(SELECT * FROM sys.indexes WHERE name = 'IDX_WellData_DilutionDataId') + BEGIN + execute('CREATE INDEX IDX_WellData_DilutionDataId ON nab.wellData(dilutionDataId)'); + END + END; +GO + +EXEC nab.ensureIndex +GO + +DROP PROCEDURE nab.ensureIndex +GO + +/* nab-16.30-17.10.sql */ + +ALTER TABLE nab.WellData ADD Excluded BIT NOT NULL DEFAULT 0; \ No newline at end of file diff --git a/nab/resources/schemas/dbscripts/sqlserver/nab-0.00-16.30.sql b/nab/resources/schemas/dbscripts/sqlserver/obsolete/nab-0.00-16.30.sql similarity index 100% rename from nab/resources/schemas/dbscripts/sqlserver/nab-0.00-16.30.sql rename to nab/resources/schemas/dbscripts/sqlserver/obsolete/nab-0.00-16.30.sql diff --git a/nab/resources/schemas/dbscripts/sqlserver/nab-16.30-17.10.sql b/nab/resources/schemas/dbscripts/sqlserver/obsolete/nab-16.30-17.10.sql similarity index 100% rename from nab/resources/schemas/dbscripts/sqlserver/nab-16.30-17.10.sql rename to nab/resources/schemas/dbscripts/sqlserver/obsolete/nab-16.30-17.10.sql