From dd08454c71065709eb134c8d3fc383e5422569c8 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Mon, 6 Apr 2026 10:51:35 -0700 Subject: [PATCH 01/10] Clean up SND script and migrate to PostgreSQL --- .../dbscripts/sqlserver/snd-0.000-25.000.sql | 45 +------------------ 1 file changed, 1 insertion(+), 44 deletions(-) diff --git a/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql b/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql index 9ba2bdd02..5c480b459 100644 --- a/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql +++ b/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql @@ -14,41 +14,6 @@ * limitations under the License. */ -/* snd-17.20-17.30.sql */ - -EXEC core.fn_dropifexists 'CodedEvents','codedprocs','TABLE'; -GO - -EXEC core.fn_dropifexists 'EventNotes','codedprocs','TABLE'; -GO - -EXEC core.fn_dropifexists 'EventsCache','codedprocs','TABLE'; -GO - -EXEC core.fn_dropifexists 'PkgCategoryJunction','codedprocs','TABLE'; -GO - -EXEC core.fn_dropifexists 'ProjectItems','codedprocs','TABLE'; -GO - -EXEC core.fn_dropifexists 'SuperPkgs','codedprocs','TABLE'; -GO - -EXEC core.fn_dropifexists 'PkgCategories','codedprocs','TABLE'; -GO - -EXEC core.fn_dropifexists 'Pkgs','codedprocs','TABLE'; -GO - -EXEC core.fn_dropifexists 'Events','codedprocs','TABLE'; -GO - -EXEC core.fn_dropifexists 'Projects','codedprocs','TABLE'; -GO - -EXEC core.fn_dropifexists NULL,'codedprocs','SCHEMA'; -GO - CREATE SCHEMA snd; GO @@ -98,7 +63,6 @@ CREATE TABLE snd.SuperPkgs ( CONSTRAINT PK_SND_SUPERPKGS PRIMARY KEY (SuperPkgId), CONSTRAINT FK_SND_SUPERPKGS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), CONSTRAINT FK_SND_SUPERPKGS_PKGID FOREIGN KEY (PkgId) REFERENCES snd.Pkgs (PkgId) - ) GO @@ -124,7 +88,6 @@ CREATE TABLE snd.PkgCategories ( CONSTRAINT PK_SND_PKGCATEGORIES PRIMARY KEY (CategoryId), CONSTRAINT FK_SND_PKGCATEGORIES_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) - ) GO @@ -148,7 +111,6 @@ CREATE TABLE snd.PkgCategoryJunction ( CONSTRAINT FK_SND_PKGCATEGORYJUNCTION_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), CONSTRAINT FK_SND_PKGCATEGORYJUNCTION_PKGID FOREIGN KEY (PkgId) REFERENCES snd.Pkgs (PkgId), CONSTRAINT FK_SND_PKGCATEGORYJUNCTION_CATEGORYID FOREIGN KEY (CategoryId) REFERENCES snd.PkgCategories (CategoryId) - ) GO @@ -177,7 +139,6 @@ CREATE TABLE snd.Projects ( CONSTRAINT PK_SND_PROJECTS PRIMARY KEY (ProjectId, RevisionNum), CONSTRAINT FK_SND_PROJECTS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) - ) GO @@ -204,7 +165,6 @@ CREATE TABLE snd.ProjectItems ( CONSTRAINT FK_SND_PROJECTITEMS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), CONSTRAINT FK_SND_PROJECTITEMS_SUPERPKGID FOREIGN KEY (SuperPkgId) REFERENCES snd.SuperPkgs (SuperPkgId), CONSTRAINT FK_SND_PROJECTITEMS_PARENTOBJECTID FOREIGN KEY (ParentObjectId) REFERENCES snd.Projects (ObjectId) - ) GO @@ -234,7 +194,6 @@ CREATE TABLE snd.Events ( CONSTRAINT FK_SND_EVENTS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), CONSTRAINT FK_SND_EVENTS_QCSTATE FOREIGN Key (QcState) REFERENCES core.DataStates (RowId), CONSTRAINT FK_SND_EVENTS_PARENTOBJECTID FOREIGN KEY (ParentObjectId) REFERENCES snd.Projects (ObjectId) - ) GO @@ -262,7 +221,6 @@ CREATE TABLE snd.CodedEvents ( CONSTRAINT FK_SND_CODEDEVENTS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), CONSTRAINT FK_SND_CODEDEVENTS_EVENTID FOREIGN KEY (EventId) REFERENCES snd.Events (EventId), CONSTRAINT FK_SND_CODEDEVENTS_SUPERPKGID FOREIGN KEY (SuperPkgId) REFERENCES snd.SuperPkgs(SuperPkgId) - ) GO @@ -288,7 +246,6 @@ CREATE TABLE snd.EventNotes ( CONSTRAINT PK_SND_EVENTNOTES PRIMARY KEY (EventNoteId), CONSTRAINT FK_SND_EVENTNOTES_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), CONSTRAINT FK_SND_EVENTNOTES_EVENTNOTEID FOREIGN KEY (EventNoteId) REFERENCES snd.Events (EventId) - ) GO @@ -1101,4 +1058,4 @@ DEALLOCATE @loopCursor; RETURN; END; -GO \ No newline at end of file +GO From d966251915380780298218f09e913868827ff258 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Mon, 6 Apr 2026 11:11:51 -0700 Subject: [PATCH 02/10] Add semicolons --- .../dbscripts/sqlserver/snd-0.000-25.000.sql | 72 +++++++++---------- 1 file changed, 35 insertions(+), 37 deletions(-) diff --git a/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql b/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql index 5c480b459..f7c3725e6 100644 --- a/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql +++ b/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql @@ -37,8 +37,7 @@ CREATE TABLE snd.Pkgs ( CONSTRAINT PK_SND_PKGS PRIMARY KEY (PkgId), CONSTRAINT FK_SND_PKGS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), CONSTRAINT FK_SND_PKGS_QCSTATE FOREIGN Key (QcState) REFERENCES core.DataStates (RowId) - -) +); GO CREATE INDEX IDX_SND_PKGS_CONTAINER ON snd.Pkgs(Container); @@ -63,7 +62,7 @@ CREATE TABLE snd.SuperPkgs ( CONSTRAINT PK_SND_SUPERPKGS PRIMARY KEY (SuperPkgId), CONSTRAINT FK_SND_SUPERPKGS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), CONSTRAINT FK_SND_SUPERPKGS_PKGID FOREIGN KEY (PkgId) REFERENCES snd.Pkgs (PkgId) -) +); GO CREATE INDEX IDX_SND_SUPERPKGS_CONTAINER ON snd.SuperPkgs(Container); @@ -88,7 +87,7 @@ CREATE TABLE snd.PkgCategories ( CONSTRAINT PK_SND_PKGCATEGORIES PRIMARY KEY (CategoryId), CONSTRAINT FK_SND_PKGCATEGORIES_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) -) +); GO CREATE INDEX IDX_SND_PKGCATEGORIES_CONTAINER ON snd.PkgCategories(Container); @@ -111,7 +110,7 @@ CREATE TABLE snd.PkgCategoryJunction ( CONSTRAINT FK_SND_PKGCATEGORYJUNCTION_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), CONSTRAINT FK_SND_PKGCATEGORYJUNCTION_PKGID FOREIGN KEY (PkgId) REFERENCES snd.Pkgs (PkgId), CONSTRAINT FK_SND_PKGCATEGORYJUNCTION_CATEGORYID FOREIGN KEY (CategoryId) REFERENCES snd.PkgCategories (CategoryId) -) +); GO CREATE INDEX IDX_SND_PKGCATEGORYJUNCTION_CONTAINER ON snd.PkgCategoryJunction(Container); @@ -139,7 +138,7 @@ CREATE TABLE snd.Projects ( CONSTRAINT PK_SND_PROJECTS PRIMARY KEY (ProjectId, RevisionNum), CONSTRAINT FK_SND_PROJECTS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) -) +); GO CREATE INDEX IDX_SND_PROJECTS_CONTAINER ON snd.Projects(Container); @@ -165,7 +164,7 @@ CREATE TABLE snd.ProjectItems ( CONSTRAINT FK_SND_PROJECTITEMS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), CONSTRAINT FK_SND_PROJECTITEMS_SUPERPKGID FOREIGN KEY (SuperPkgId) REFERENCES snd.SuperPkgs (SuperPkgId), CONSTRAINT FK_SND_PROJECTITEMS_PARENTOBJECTID FOREIGN KEY (ParentObjectId) REFERENCES snd.Projects (ObjectId) -) +); GO CREATE INDEX IDX_SND_PROJECTITEMS_CONTAINER ON snd.ProjectItems(Container); @@ -194,7 +193,7 @@ CREATE TABLE snd.Events ( CONSTRAINT FK_SND_EVENTS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), CONSTRAINT FK_SND_EVENTS_QCSTATE FOREIGN Key (QcState) REFERENCES core.DataStates (RowId), CONSTRAINT FK_SND_EVENTS_PARENTOBJECTID FOREIGN KEY (ParentObjectId) REFERENCES snd.Projects (ObjectId) -) +); GO CREATE INDEX IDX_SND_EVENTS_CONTAINER ON snd.Events(Container); @@ -221,7 +220,7 @@ CREATE TABLE snd.CodedEvents ( CONSTRAINT FK_SND_CODEDEVENTS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), CONSTRAINT FK_SND_CODEDEVENTS_EVENTID FOREIGN KEY (EventId) REFERENCES snd.Events (EventId), CONSTRAINT FK_SND_CODEDEVENTS_SUPERPKGID FOREIGN KEY (SuperPkgId) REFERENCES snd.SuperPkgs(SuperPkgId) -) +); GO CREATE INDEX IDX_SND_CODEDEVENTS_CONTAINER ON snd.CodedEvents(Container); @@ -246,7 +245,7 @@ CREATE TABLE snd.EventNotes ( CONSTRAINT PK_SND_EVENTNOTES PRIMARY KEY (EventNoteId), CONSTRAINT FK_SND_EVENTNOTES_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), CONSTRAINT FK_SND_EVENTNOTES_EVENTNOTEID FOREIGN KEY (EventNoteId) REFERENCES snd.Events (EventId) -) +); GO CREATE INDEX IDX_SND_EVENTNOTES_CONTAINER ON snd.EventNotes(Container); @@ -282,7 +281,7 @@ CREATE TABLE snd.LookupSets ( CONSTRAINT PK_SND_LOOKUPSETS PRIMARY KEY (LookupSetId), CONSTRAINT FK_SND_LOOKUPSETS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) -) +); GO CREATE INDEX IDX_SND_LOOKUPSETS_CONTAINER ON snd.LookupSets(Container); @@ -306,7 +305,7 @@ CREATE TABLE snd.Lookups ( CONSTRAINT PK_SND_LOOKUPS PRIMARY KEY (LookupSetId, Value), CONSTRAINT FK_SND_LOOKUPS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), CONSTRAINT FK_SND_LOOKUPS_LOOKUPSETID FOREIGN KEY (LookupSetId) REFERENCES snd.LookupSets (LookupSetId) -) +); CREATE INDEX IDX_SND_LOOKUPS_CONTAINER ON snd.Lookups(Container); CREATE INDEX IDX_SND_LOOKUPS_LOOKUPSETID ON snd.Lookups(LookupSetId); @@ -314,10 +313,10 @@ GO ALTER TABLE snd.SuperPkgs ADD SortOrder INTEGER; -DROP TABLE snd.Lookups +DROP TABLE snd.Lookups; GO -DROP TABLE snd.LookupSets +DROP TABLE snd.LookupSets; GO /*==============================================================*/ @@ -337,7 +336,7 @@ CREATE TABLE snd.LookupSets ( CONSTRAINT PK_SND_LOOKUPSETS PRIMARY KEY (LookupSetId), CONSTRAINT FK_SND_LOOKUPSETS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) -) +); GO CREATE INDEX IDX_SND_LOOKUPSETS_CONTAINER ON snd.LookupSets(Container); @@ -361,7 +360,7 @@ CREATE TABLE snd.Lookups ( CONSTRAINT PK_SND_LOOKUPS PRIMARY KEY (LookupSetId, Value), CONSTRAINT FK_SND_LOOKUPS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), CONSTRAINT FK_SND_LOOKUPS_LOOKUPSETID FOREIGN KEY (LookupSetId) REFERENCES snd.LookupSets (LookupSetId) -) +); CREATE INDEX IDX_SND_LOOKUPS_CONTAINER ON snd.Lookups(Container); CREATE INDEX IDX_SND_LOOKUPS_LOOKUPSETID ON snd.Lookups(LookupSetId); @@ -447,13 +446,13 @@ ALTER TABLE snd.PkgCategoryJunction ADD Objectid uniqueidentifier NOT NULL DEFAU ALTER TABLE snd.ProjectItems ADD Objectid uniqueidentifier NOT NULL DEFAULT newid(); -ALTER TABLE snd.Lookups ADD LookupId INT IDENTITY(1,1) -ALTER TABLE snd.Lookups DROP CONSTRAINT PK_SND_LOOKUPS +ALTER TABLE snd.Lookups ADD LookupId INT IDENTITY(1,1); +ALTER TABLE snd.Lookups DROP CONSTRAINT PK_SND_LOOKUPS; GO -ALTER TABLE snd.Lookups ADD CONSTRAINT PK_SND_LOOKUPS PRIMARY KEY (LookupId) +ALTER TABLE snd.Lookups ADD CONSTRAINT PK_SND_LOOKUPS PRIMARY KEY (LookupId); -CREATE UNIQUE INDEX IDX_SND_LOOKUPS_LOOKUPSETID_VALUE ON snd.Lookups(LookupSetId, Value) +CREATE UNIQUE INDEX IDX_SND_LOOKUPS_LOOKUPSETID_VALUE ON snd.Lookups(LookupSetId, Value); /* snd-17.30-18.10.sql */ @@ -463,7 +462,7 @@ EXEC core.fn_dropifexists 'ProjectItems', 'snd', 'CONSTRAINT', 'FK_SND_PROJECTIT EXEC core.fn_dropifexists 'Events', 'snd', 'CONSTRAINT', 'FK_SND_EVENTS_PARENTOBJECTID'; GO -EXEC core.fn_dropifexists 'Projects', 'snd', 'TABLE', NULL +EXEC core.fn_dropifexists 'Projects', 'snd', 'TABLE', NULL; GO CREATE TABLE snd.Projects ( @@ -885,26 +884,26 @@ go -- move Events table cluster index to AnimalId, Date -- -- need to drop foreign key constraints that reference the cluster index -EXEC core.fn_dropifexists 'EventNotes', 'snd', 'CONSTRAINT', 'FK_SND_EVENTNOTES_EVENTID' -EXEC core.fn_dropifexists 'EventData', 'snd', 'CONSTRAINT', 'FK_SND_EVENTDATA_EVENTID' -EXEC core.fn_dropifexists 'EventsCache', 'snd', 'CONSTRAINT', 'FK_EventsCache_EventId' +EXEC core.fn_dropifexists 'EventNotes', 'snd', 'CONSTRAINT', 'FK_SND_EVENTNOTES_EVENTID'; +EXEC core.fn_dropifexists 'EventData', 'snd', 'CONSTRAINT', 'FK_SND_EVENTDATA_EVENTID'; +EXEC core.fn_dropifexists 'EventsCache', 'snd', 'CONSTRAINT', 'FK_EventsCache_EventId'; -- drop the snd.Events PK constraint (clustered index) -EXEC core.fn_dropifexists 'Events', 'snd', 'CONSTRAINT', 'PK_SND_EVENTS' +EXEC core.fn_dropifexists 'Events', 'snd', 'CONSTRAINT', 'PK_SND_EVENTS'; -- Add new snd.Events table PK constraint (non-clustered) ALTER TABLE snd.Events ADD CONSTRAINT PK_SND_EVENTS PRIMARY KEY NONCLUSTERED ( EventId ASC - )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); GO -- Create new clustered index on snd.Events -EXEC core.fn_dropifexists 'Events', 'snd', 'INDEX', 'IDX_SND_EVENTS_SUBJECTID_DATE' +EXEC core.fn_dropifexists 'Events', 'snd', 'INDEX', 'IDX_SND_EVENTS_SUBJECTID_DATE'; CREATE CLUSTERED INDEX IDX_SND_EVENTS_SUBJECTID_DATE ON snd.Events ( SubjectId ASC, Date DESC - )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); GO @@ -912,26 +911,26 @@ GO -- -- EventNotes ALTER TABLE snd.EventNotes WITH CHECK ADD CONSTRAINT FK_SND_EVENTNOTES_EVENTID FOREIGN KEY(EventId) - REFERENCES snd.Events (EventId) + REFERENCES snd.Events (EventId); GO -ALTER TABLE snd.EventNotes CHECK CONSTRAINT FK_SND_EVENTNOTES_EVENTID +ALTER TABLE snd.EventNotes CHECK CONSTRAINT FK_SND_EVENTNOTES_EVENTID; GO -- EventData ALTER TABLE snd.EventData WITH CHECK ADD CONSTRAINT FK_SND_EVENTDATA_EVENTID FOREIGN KEY(EventId) - REFERENCES snd.Events (EventId) + REFERENCES snd.Events (EventId); GO -ALTER TABLE snd.EventData CHECK CONSTRAINT FK_SND_EVENTDATA_EVENTID +ALTER TABLE snd.EventData CHECK CONSTRAINT FK_SND_EVENTDATA_EVENTID; GO -- EventsCache ALTER TABLE snd.EventsCache WITH CHECK ADD CONSTRAINT FK_EVENTSCACHE_EVENTID FOREIGN KEY(EventId) - REFERENCES snd.Events (EventId) + REFERENCES snd.Events (EventId); GO -ALTER TABLE snd.EventsCache CHECK CONSTRAINT FK_EventsCache_EventId +ALTER TABLE snd.EventsCache CHECK CONSTRAINT FK_EventsCache_EventId; GO /* 21.xxx SQL scripts */ @@ -942,7 +941,7 @@ WHERE TypeURI = 'urn:lsid:labkey.com:PropertyValidator:length' SELECT PropertyId FROM exp.PropertyDescriptor WHERE PropertyURI LIKE '%:package-snd%Package%' - ) + ); GO @@ -974,8 +973,7 @@ WHERE i.QcState IS NULL END GO -CREATE UNIQUE INDEX IDX_LookupSets_SetName -ON snd.LookupSets (SetName) +CREATE UNIQUE INDEX IDX_LookupSets_SetName ON snd.LookupSets (SetName); ALTER TABLE snd.EventData ADD SortOrder INTEGER NULL; From 32f1ae0095c279985ee19e841c838594d62d366a Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Mon, 6 Apr 2026 12:13:00 -0700 Subject: [PATCH 03/10] Reorder script --- .../dbscripts/sqlserver/snd-0.000-25.000.sql | 574 +++++++++--------- 1 file changed, 287 insertions(+), 287 deletions(-) diff --git a/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql b/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql index f7c3725e6..94ee8e49a 100644 --- a/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql +++ b/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql @@ -44,6 +44,9 @@ CREATE INDEX IDX_SND_PKGS_CONTAINER ON snd.Pkgs(Container); CREATE INDEX IDX_SND_PKGS_QCSTATE ON snd.Pkgs(QcState); GO +CREATE INDEX IDX_SND_PKGS_LSID ON snd.Pkgs(Lsid); +ALTER TABLE snd.Pkgs ADD Narrative NVARCHAR(MAX) NULL; + /*==============================================================*/ /* Table: SuperPkgs */ /*==============================================================*/ @@ -69,6 +72,11 @@ CREATE INDEX IDX_SND_SUPERPKGS_CONTAINER ON snd.SuperPkgs(Container); CREATE INDEX IDX_SND_SUPERPKGS_PKGID ON snd.SuperPkgs(PkgId); GO +CREATE INDEX IDX_SND_SUPERPKGS_LSID ON snd.SuperPkgs(Lsid); +ALTER TABLE snd.SuperPkgs ADD SortOrder INTEGER; + +ALTER TABLE snd.SuperPkgs +ADD Required BIT NOT NULL DEFAULT 0; /*==============================================================*/ /* Table: PkgCategories */ /*==============================================================*/ @@ -93,6 +101,9 @@ GO CREATE INDEX IDX_SND_PKGCATEGORIES_CONTAINER ON snd.PkgCategories(Container); GO +CREATE INDEX IDX_SND_PKGCATEGORIES_LSID ON snd.PkgCategories(Lsid); +ALTER TABLE snd.PkgCategories ADD Objectid uniqueidentifier NOT NULL DEFAULT newid(); + /*==============================================================*/ /* Table: PkgCategoryJunction */ /*==============================================================*/ @@ -118,6 +129,9 @@ CREATE INDEX IDX_SND_PKGCATEGORYJUNCTION_PKGID ON snd.PkgCategoryJunction(PkgId) CREATE INDEX IDX_SND_PKGCATEGORYJUNCTION_CATEGORYID ON snd.PkgCategoryJunction(CategoryId); GO +CREATE INDEX IDX_SND_PKGCATEGORYJUNCTION_LSID ON snd.PkgCategoryJunction(Lsid); +ALTER TABLE snd.PkgCategoryJunction ADD Objectid uniqueidentifier NOT NULL DEFAULT newid(); + /*==============================================================*/ /* Table: Projects */ /*==============================================================*/ @@ -145,6 +159,40 @@ CREATE INDEX IDX_SND_PROJECTS_CONTAINER ON snd.Projects(Container); CREATE UNIQUE INDEX IDX_SND_PROJECTS_OBJECTID ON snd.Projects(ObjectId); GO +CREATE INDEX IDX_SND_PROJECTS_LSID ON snd.Projects(Lsid); +/* snd-17.30-18.10.sql */ + +EXEC core.fn_dropifexists 'Projects', 'snd', 'CONSTRAINT', 'IDX_SND_PROJECTS_CONTAINER'; +EXEC core.fn_dropifexists 'Projects', 'snd', 'CONSTRAINT', 'IDX_SND_PROJECTS_OBJECTID'; +EXEC core.fn_dropifexists 'Projects', 'snd', 'TABLE', NULL; +GO + +CREATE TABLE snd.Projects ( + ProjectId INTEGER NOT NULL, + RevisionNum INTEGER NOT NULL, + ReferenceId INTEGER NOT NULL, + StartDate date NOT NULL, + EndDate date, + Description NVARCHAR(4000) NOT NULL, + Active BIT NOT NULL, + ObjectId UNIQUEIDENTIFIER NOT NULL DEFAULT newid(), + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, + Lsid LSIDType, + + CONSTRAINT PK_SND_PROJECTS PRIMARY KEY NONCLUSTERED (ObjectId), + CONSTRAINT FK_SND_PROJECTS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) + +) +GO + +CREATE INDEX IDX_SND_PROJECTS_CONTAINER ON snd.Projects(Container); +CREATE UNIQUE CLUSTERED INDEX IDX_SND_PROJECTS_PROJECTID_REVNUM ON snd.Projects(ProjectId, RevisionNum); +GO + /*==============================================================*/ /* Table: ProjectItems */ /*==============================================================*/ @@ -172,6 +220,15 @@ CREATE INDEX IDX_SND_PROJECTITEMS_SUPERPKGID ON snd.ProjectItems(SuperPkgId); CREATE INDEX IDX_SND_PROJECTITEMS_PARENTOBJECTID ON snd.ProjectItems(ParentObjectId); GO +CREATE INDEX IDX_SND_PROJECTITEMS_LSID ON snd.ProjectItems(Lsid); +ALTER TABLE snd.ProjectItems ADD Objectid uniqueidentifier NOT NULL DEFAULT newid(); + +EXEC core.fn_dropifexists 'ProjectItems', 'snd', 'CONSTRAINT', 'FK_SND_PROJECTITEMS_PARENTOBJECTID'; +EXEC core.fn_dropifexists 'ProjectItems', 'snd', 'CONSTRAINT', 'FK_SND_PROJECTITEMS_PARENTOBJECTID'; +DELETE FROM snd.ProjectItems; +ALTER TABLE snd.ProjectItems +ADD CONSTRAINT FK_SND_PROJECTITEMS_PARENTOBJECTID FOREIGN KEY (ParentObjectId) REFERENCES snd.Projects (ObjectId); + /*==============================================================*/ /* Table: Events */ /*==============================================================*/ @@ -201,6 +258,46 @@ CREATE INDEX IDX_SND_EVENTS_QCSTATE ON snd.Events(QcState); CREATE INDEX IDX_SND_EVENTS_PARENTOBJECTID ON snd.Events(ParentObjectId); GO +CREATE INDEX IDX_SND_EVENTS_LSID ON snd.Events(Lsid); +EXEC core.fn_dropifexists 'Events', 'snd', 'CONSTRAINT', 'FK_SND_EVENTS_PARENTOBJECTID'; +GO + +EXEC core.fn_dropifexists 'Events', 'snd', 'CONSTRAINT', 'FK_SND_EVENTS_PARENTOBJECTID'; +GO + +DELETE FROM snd.Events; +GO + +ALTER TABLE snd.Events +ADD CONSTRAINT FK_SND_EVENTS_PARENTOBJECTID FOREIGN KEY (ParentObjectId) REFERENCES snd.Projects (ObjectId); +GO + +EXEC sp_rename 'snd.Events.Id', 'ParticipantId', 'COLUMN'; + +/* snd-18.10-18.20.sql */ + +EXEC sp_rename 'snd.Events.ParticipantId', 'SubjectId', 'COLUMN'; + +-- drop the snd.Events PK constraint (clustered index) +EXEC core.fn_dropifexists 'Events', 'snd', 'CONSTRAINT', 'PK_SND_EVENTS'; + +-- Add new snd.Events table PK constraint (non-clustered) +ALTER TABLE snd.Events ADD CONSTRAINT PK_SND_EVENTS PRIMARY KEY NONCLUSTERED + ( + EventId ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); +GO + +-- Create new clustered index on snd.Events +EXEC core.fn_dropifexists 'Events', 'snd', 'INDEX', 'IDX_SND_EVENTS_SUBJECTID_DATE'; +CREATE CLUSTERED INDEX IDX_SND_EVENTS_SUBJECTID_DATE ON snd.Events + ( + SubjectId ASC, + Date DESC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); +GO + + /*==============================================================*/ /* Table: CodedEvents */ /*==============================================================*/ @@ -228,6 +325,12 @@ CREATE INDEX IDX_SND_CODEDEVENTS_EVENTID ON snd.CodedEvents(EventId); CREATE INDEX IDX_SND_CODEDEVENTS_SUPERPKGID ON snd.CodedEvents(SuperPkgId); GO +CREATE INDEX IDX_SND_CODEDEVENTS_LSID ON snd.CodedEvents(Lsid); +DELETE FROM snd.CodedEvents; +/* Recreate EventData table */ +EXEC core.fn_dropifexists 'CodedEvents','snd','TABLE'; +GO + /*==============================================================*/ /* Table: EventNotes */ /*==============================================================*/ @@ -252,17 +355,60 @@ CREATE INDEX IDX_SND_EVENTNOTES_CONTAINER ON snd.EventNotes(Container); CREATE INDEX IDX_SND_EVENTNOTES_EVENTNOTEID ON snd.EventNotes(EventNoteId); GO -CREATE INDEX IDX_SND_PKGS_LSID ON snd.Pkgs(Lsid); -CREATE INDEX IDX_SND_SUPERPKGS_LSID ON snd.SuperPkgs(Lsid); -CREATE INDEX IDX_SND_PKGCATEGORIES_LSID ON snd.PkgCategories(Lsid); -CREATE INDEX IDX_SND_PKGCATEGORYJUNCTION_LSID ON snd.PkgCategoryJunction(Lsid); -CREATE INDEX IDX_SND_PROJECTS_LSID ON snd.Projects(Lsid); -CREATE INDEX IDX_SND_PROJECTITEMS_LSID ON snd.ProjectItems(Lsid); -CREATE INDEX IDX_SND_EVENTS_LSID ON snd.Events(Lsid); -CREATE INDEX IDX_SND_CODEDEVENTS_LSID ON snd.CodedEvents(Lsid); CREATE INDEX IDX_SND_EVENTNOTES_LSID ON snd.EventNotes(Lsid); -ALTER TABLE snd.Pkgs ADD Narrative NVARCHAR(MAX) NULL; +/* Recreate EventNoteId not as identity column for etls */ +ALTER TABLE snd.EventNotes DROP PK_SND_EVENTNOTES; +ALTER TABLE snd.EventNotes DROP CONSTRAINT FK_SND_EVENTNOTES_EVENTNOTEID; +DROP INDEX IDX_SND_EVENTNOTES_EVENTNOTEID ON snd.EventNotes; +GO + +ALTER TABLE snd.EventNotes DROP COLUMN EventNoteId; +GO + +ALTER TABLE snd.EventNotes ADD EventNoteId INTEGER NOT NULL; +GO + +ALTER TABLE snd.EventNotes ADD CONSTRAINT PK_SND_EVENTNOTES PRIMARY KEY (EventNoteId); +ALTER TABLE snd.EventNotes ADD CONSTRAINT FK_SND_EVENTNOTES_EVENTNOTEID FOREIGN KEY (EventNoteId) REFERENCES snd.Events (EventId) +CREATE INDEX IDX_SND_EVENTNOTES_EVENTNOTEID ON snd.EventNotes(EventNoteId); +GO + +EXEC core.fn_dropifexists 'EventNotes', 'snd', 'CONSTRAINT', 'FK_SND_EVENTNOTES_EVENTNOTEID'; +GO + +ALTER TABLE snd.EventNotes ADD CONSTRAINT FK_SND_EVENTNOTES_EVENTID FOREIGN KEY (EventId) REFERENCES snd.Events (EventId) +GO + +ALTER TABLE snd.EventNotes +DROP CONSTRAINT PK_SND_EVENTNOTES; +DROP INDEX IDX_SND_EVENTNOTES_EVENTNOTEID ON snd.EventNotes; +GO + +ALTER TABLE snd.EventNotes +DROP COLUMN EventNoteId; +GO + +ALTER TABLE snd.EventNotes ADD EventNoteId INT IDENTITY(1, 1) NOT NULL; +GO + +ALTER TABLE snd.EventNotes ADD CONSTRAINT PK_SND_EVENTNOTES PRIMARY KEY (EventNoteId); +CREATE INDEX IDX_SND_EVENTNOTES_EVENTNOTEID ON snd.EventNotes(EventNoteId); + + +-- move Events table cluster index to AnimalId, Date +-- +-- need to drop foreign key constraints that reference the cluster index +EXEC core.fn_dropifexists 'EventNotes', 'snd', 'CONSTRAINT', 'FK_SND_EVENTNOTES_EVENTID'; +-- restore constraints +-- +-- EventNotes +ALTER TABLE snd.EventNotes WITH CHECK ADD CONSTRAINT FK_SND_EVENTNOTES_EVENTID FOREIGN KEY(EventId) + REFERENCES snd.Events (EventId); +GO + +ALTER TABLE snd.EventNotes CHECK CONSTRAINT FK_SND_EVENTNOTES_EVENTID; +GO /*==============================================================*/ /* Table: LookupSets */ @@ -287,6 +433,38 @@ GO CREATE INDEX IDX_SND_LOOKUPSETS_CONTAINER ON snd.LookupSets(Container); GO +DROP TABLE snd.LookupSets; +GO + +/*==============================================================*/ +/* Table: LookupSets */ +/*==============================================================*/ +CREATE TABLE snd.LookupSets ( + LookupSetId INTEGER IDENTITY(1,1) NOT NULL, + SetName NVARCHAR(128) NOT NULL, + Label NVARCHAR(128), + Description NVARCHAR(900), + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, + Lsid LSIDType, + + CONSTRAINT PK_SND_LOOKUPSETS PRIMARY KEY (LookupSetId), + CONSTRAINT FK_SND_LOOKUPSETS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) +); +GO + +CREATE INDEX IDX_SND_LOOKUPSETS_CONTAINER ON snd.LookupSets(Container); +GO + +ALTER TABLE snd.LookupSets ADD [ObjectId] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(); +CREATE UNIQUE INDEX idx_snd_lookupSets_objectid ON snd.lookupSets (ObjectId); +GO + +CREATE UNIQUE INDEX IDX_LookupSets_SetName ON snd.LookupSets (SetName); + /*==============================================================*/ /* Table: Lookups */ /*==============================================================*/ @@ -311,22 +489,17 @@ CREATE INDEX IDX_SND_LOOKUPS_CONTAINER ON snd.Lookups(Container); CREATE INDEX IDX_SND_LOOKUPS_LOOKUPSETID ON snd.Lookups(LookupSetId); GO -ALTER TABLE snd.SuperPkgs ADD SortOrder INTEGER; - DROP TABLE snd.Lookups; GO -DROP TABLE snd.LookupSets; -GO - /*==============================================================*/ -/* Table: LookupSets */ +/* Table: Lookups */ /*==============================================================*/ -CREATE TABLE snd.LookupSets ( - LookupSetId INTEGER IDENTITY(1,1) NOT NULL, - SetName NVARCHAR(128) NOT NULL, - Label NVARCHAR(128), - Description NVARCHAR(900), +CREATE TABLE snd.Lookups ( + LookupSetId INTEGER NOT NULL, + Value NVARCHAR(446) NOT NULL, + Displayable BIT NOT NULL, + SortOrder INTEGER, Container ENTITYID NOT NULL, CreatedBy USERID, Created DATETIME, @@ -334,36 +507,113 @@ CREATE TABLE snd.LookupSets ( Modified DATETIME, Lsid LSIDType, - CONSTRAINT PK_SND_LOOKUPSETS PRIMARY KEY (LookupSetId), - CONSTRAINT FK_SND_LOOKUPSETS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) + CONSTRAINT PK_SND_LOOKUPS PRIMARY KEY (LookupSetId, Value), + CONSTRAINT FK_SND_LOOKUPS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), + CONSTRAINT FK_SND_LOOKUPS_LOOKUPSETID FOREIGN KEY (LookupSetId) REFERENCES snd.LookupSets (LookupSetId) ); + +CREATE INDEX IDX_SND_LOOKUPS_CONTAINER ON snd.Lookups(Container); +CREATE INDEX IDX_SND_LOOKUPS_LOOKUPSETID ON snd.Lookups(LookupSetId); GO -CREATE INDEX IDX_SND_LOOKUPSETS_CONTAINER ON snd.LookupSets(Container); +ALTER TABLE snd.Lookups ADD LookupId INT IDENTITY(1,1); +ALTER TABLE snd.Lookups DROP CONSTRAINT PK_SND_LOOKUPS; GO +ALTER TABLE snd.Lookups ADD CONSTRAINT PK_SND_LOOKUPS PRIMARY KEY (LookupId); + +CREATE UNIQUE INDEX IDX_SND_LOOKUPS_LOOKUPSETID_VALUE ON snd.Lookups(LookupSetId, Value); + +ALTER TABLE snd.Lookups ADD [ObjectId] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(); +CREATE UNIQUE INDEX idx_snd_lookups_objectid ON snd.lookups (ObjectId); + /*==============================================================*/ -/* Table: Lookups */ +/* Table: EventData */ /*==============================================================*/ -CREATE TABLE snd.Lookups ( - LookupSetId INTEGER NOT NULL, - Value NVARCHAR(446) NOT NULL, - Displayable BIT NOT NULL, - SortOrder INTEGER, - Container ENTITYID NOT NULL, +CREATE TABLE snd.EventData ( + EventDataId INTEGER NOT NULL, + EventId INTEGER NOT NULL, + SuperPkgId INTEGER NOT NULL, + ObjectURI LsidType NOT NULL, + Container ENTITYID NOT NULL, CreatedBy USERID, Created DATETIME, ModifiedBy USERID, Modified DATETIME, - Lsid LSIDType, + Lsid LSIDType, - CONSTRAINT PK_SND_LOOKUPS PRIMARY KEY (LookupSetId, Value), - CONSTRAINT FK_SND_LOOKUPS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), - CONSTRAINT FK_SND_LOOKUPS_LOOKUPSETID FOREIGN KEY (LookupSetId) REFERENCES snd.LookupSets (LookupSetId) -); + CONSTRAINT PK_SND_EVENTDATA PRIMARY KEY (EventDataId), + CONSTRAINT FK_SND_EVENTDATA_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), + CONSTRAINT FK_SND_EVENTDATA_EVENTID FOREIGN KEY (EventId) REFERENCES snd.Events (EventId), + CONSTRAINT FK_SND_EVENTDATA_SUPERPKGID FOREIGN KEY (SuperPkgId) REFERENCES snd.SuperPkgs(SuperPkgId) +) +GO + +ALTER TABLE snd.EventData ADD ParentEventDataId INT; +ALTER TABLE snd.EventData DROP COLUMN Modified; +ALTER TABLE snd.EventData DROP COLUMN ModifiedBy; +ALTER TABLE snd.EventData DROP COLUMN Created; +ALTER TABLE snd.EventData DROP COLUMN CreatedBy; +GO + +ALTER TABLE snd.EventData ADD ObjectId UNIQUEIDENTIFIER NOT NULL DEFAULT newid(); +GO + +EXEC core.fn_dropifexists 'EventData', 'snd', 'COLUMN', 'ObjectId'; + +CREATE INDEX IDX_SND_EVENTDATA_SUPERPKGID ON snd.EventData(SuperPkgId); +CREATE INDEX IDX_SND_EVENTDATA_EVENTID ON snd.EventData(EventId); + +EXEC core.fn_dropifexists 'EventData', 'snd', 'CONSTRAINT', 'FK_SND_EVENTDATA_EVENTID'; +-- EventData +ALTER TABLE snd.EventData WITH CHECK ADD CONSTRAINT FK_SND_EVENTDATA_EVENTID FOREIGN KEY(EventId) + REFERENCES snd.Events (EventId); +GO + +ALTER TABLE snd.EventData CHECK CONSTRAINT FK_SND_EVENTDATA_EVENTID; +GO + +ALTER TABLE snd.EventData ADD SortOrder INTEGER NULL; + +/*==============================================================*/ +/* Table: EventsCache */ +/*==============================================================*/ +CREATE TABLE snd.EventsCache ( + EventId INTEGER NOT NULL, + HtmlNarrative NVARCHAR(MAX), + + CONSTRAINT PK_SND_EVENTS_CACHE PRIMARY KEY (EventId) +) +GO + +ALTER TABLE snd.EventsCache + ADD CONSTRAINT FK_EventsCache_EventId FOREIGN KEY (EventId) REFERENCES snd.Events (EventId); +GO + +ALTER TABLE snd.EventsCache ADD Container entityid; +ALTER TABLE snd.EventsCache ADD CONSTRAINT FK_SND_EVENTSCACHE_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId); +CREATE INDEX IDX_SND_EVENTSCACHE_CONTAINER ON snd.EventsCache(Container); +GO + +EXEC core.fn_dropifexists 'EventsCache', 'snd', 'CONSTRAINT', 'FK_EventsCache_EventId'; +-- EventsCache +ALTER TABLE snd.EventsCache WITH CHECK ADD CONSTRAINT FK_EVENTSCACHE_EVENTID FOREIGN KEY(EventId) + REFERENCES snd.Events (EventId); +GO + +ALTER TABLE snd.EventsCache CHECK CONSTRAINT FK_EventsCache_EventId; +GO + +/* 21.xxx SQL scripts */ + +UPDATE exp.PropertyValidator SET TypeURI = 'urn:lsid:labkey.com:PropertyValidator:textlength' +WHERE TypeURI = 'urn:lsid:labkey.com:PropertyValidator:length' + AND PropertyId IN ( + SELECT PropertyId + FROM exp.PropertyDescriptor + WHERE PropertyURI LIKE '%:package-snd%Package%' + ); -CREATE INDEX IDX_SND_LOOKUPS_CONTAINER ON snd.Lookups(Container); -CREATE INDEX IDX_SND_LOOKUPS_LOOKUPSETID ON snd.Lookups(LookupSetId); GO CREATE FUNCTION snd.fGetSuperPkg ( @TopLevelPkgId INT ) @@ -440,73 +690,6 @@ RETURN ); GO -ALTER TABLE snd.PkgCategories ADD Objectid uniqueidentifier NOT NULL DEFAULT newid(); - -ALTER TABLE snd.PkgCategoryJunction ADD Objectid uniqueidentifier NOT NULL DEFAULT newid(); - -ALTER TABLE snd.ProjectItems ADD Objectid uniqueidentifier NOT NULL DEFAULT newid(); - -ALTER TABLE snd.Lookups ADD LookupId INT IDENTITY(1,1); -ALTER TABLE snd.Lookups DROP CONSTRAINT PK_SND_LOOKUPS; -GO - -ALTER TABLE snd.Lookups ADD CONSTRAINT PK_SND_LOOKUPS PRIMARY KEY (LookupId); - -CREATE UNIQUE INDEX IDX_SND_LOOKUPS_LOOKUPSETID_VALUE ON snd.Lookups(LookupSetId, Value); - -/* snd-17.30-18.10.sql */ - -EXEC core.fn_dropifexists 'Projects', 'snd', 'CONSTRAINT', 'IDX_SND_PROJECTS_CONTAINER'; -EXEC core.fn_dropifexists 'Projects', 'snd', 'CONSTRAINT', 'IDX_SND_PROJECTS_OBJECTID'; -EXEC core.fn_dropifexists 'ProjectItems', 'snd', 'CONSTRAINT', 'FK_SND_PROJECTITEMS_PARENTOBJECTID'; -EXEC core.fn_dropifexists 'Events', 'snd', 'CONSTRAINT', 'FK_SND_EVENTS_PARENTOBJECTID'; -GO - -EXEC core.fn_dropifexists 'Projects', 'snd', 'TABLE', NULL; -GO - -CREATE TABLE snd.Projects ( - ProjectId INTEGER NOT NULL, - RevisionNum INTEGER NOT NULL, - ReferenceId INTEGER NOT NULL, - StartDate date NOT NULL, - EndDate date, - Description NVARCHAR(4000) NOT NULL, - Active BIT NOT NULL, - ObjectId UNIQUEIDENTIFIER NOT NULL DEFAULT newid(), - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, - Lsid LSIDType, - - CONSTRAINT PK_SND_PROJECTS PRIMARY KEY NONCLUSTERED (ObjectId), - CONSTRAINT FK_SND_PROJECTS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) - -) -GO - -CREATE INDEX IDX_SND_PROJECTS_CONTAINER ON snd.Projects(Container); -CREATE UNIQUE CLUSTERED INDEX IDX_SND_PROJECTS_PROJECTID_REVNUM ON snd.Projects(ProjectId, RevisionNum); -GO - -EXEC core.fn_dropifexists 'ProjectItems', 'snd', 'CONSTRAINT', 'FK_SND_PROJECTITEMS_PARENTOBJECTID'; -EXEC core.fn_dropifexists 'Events', 'snd', 'CONSTRAINT', 'FK_SND_EVENTS_PARENTOBJECTID'; -GO - -DELETE FROM snd.ProjectItems; -DELETE FROM snd.CodedEvents; -DELETE FROM snd.Events; -GO - -ALTER TABLE snd.ProjectItems -ADD CONSTRAINT FK_SND_PROJECTITEMS_PARENTOBJECTID FOREIGN KEY (ParentObjectId) REFERENCES snd.Projects (ObjectId); - -ALTER TABLE snd.Events -ADD CONSTRAINT FK_SND_EVENTS_PARENTOBJECTID FOREIGN KEY (ParentObjectId) REFERENCES snd.Projects (ObjectId); -GO - EXEC core.fn_dropifexists 'fGetProjectItems','snd', 'FUNCTION'; GO @@ -664,117 +847,6 @@ WITH CTE1 ( ProjectId, RevisionNum, ProjectItemId, ParentObjectId, ParentSupe ); GO -/* Recreate EventData table */ -EXEC core.fn_dropifexists 'CodedEvents','snd','TABLE'; -GO - -/*==============================================================*/ -/* Table: EventData */ -/*==============================================================*/ -CREATE TABLE snd.EventData ( - EventDataId INTEGER NOT NULL, - EventId INTEGER NOT NULL, - SuperPkgId INTEGER NOT NULL, - ObjectURI LsidType NOT NULL, - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, - Lsid LSIDType, - - CONSTRAINT PK_SND_EVENTDATA PRIMARY KEY (EventDataId), - CONSTRAINT FK_SND_EVENTDATA_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), - CONSTRAINT FK_SND_EVENTDATA_EVENTID FOREIGN KEY (EventId) REFERENCES snd.Events (EventId), - CONSTRAINT FK_SND_EVENTDATA_SUPERPKGID FOREIGN KEY (SuperPkgId) REFERENCES snd.SuperPkgs(SuperPkgId) -) -GO - -/* Recreate EventNoteId not as identity column for etls */ -ALTER TABLE snd.EventNotes DROP PK_SND_EVENTNOTES; -ALTER TABLE snd.EventNotes DROP CONSTRAINT FK_SND_EVENTNOTES_EVENTNOTEID; -DROP INDEX IDX_SND_EVENTNOTES_EVENTNOTEID ON snd.EventNotes; -GO - -ALTER TABLE snd.EventNotes DROP COLUMN EventNoteId; -GO - -ALTER TABLE snd.EventNotes ADD EventNoteId INTEGER NOT NULL; -GO - -ALTER TABLE snd.EventNotes ADD CONSTRAINT PK_SND_EVENTNOTES PRIMARY KEY (EventNoteId); -ALTER TABLE snd.EventNotes ADD CONSTRAINT FK_SND_EVENTNOTES_EVENTNOTEID FOREIGN KEY (EventNoteId) REFERENCES snd.Events (EventId) -CREATE INDEX IDX_SND_EVENTNOTES_EVENTNOTEID ON snd.EventNotes(EventNoteId); -GO - -EXEC sp_rename 'snd.Events.Id', 'ParticipantId', 'COLUMN'; - -EXEC core.fn_dropifexists 'EventNotes', 'snd', 'CONSTRAINT', 'FK_SND_EVENTNOTES_EVENTNOTEID'; -GO - -ALTER TABLE snd.EventNotes ADD CONSTRAINT FK_SND_EVENTNOTES_EVENTID FOREIGN KEY (EventId) REFERENCES snd.Events (EventId) -GO - -ALTER TABLE snd.Lookups ADD [ObjectId] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(); -CREATE UNIQUE INDEX idx_snd_lookups_objectid ON snd.lookups (ObjectId); - -ALTER TABLE snd.LookupSets ADD [ObjectId] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(); -CREATE UNIQUE INDEX idx_snd_lookupSets_objectid ON snd.lookupSets (ObjectId); -GO - -ALTER TABLE snd.EventData ADD ParentEventDataId INT; -ALTER TABLE snd.EventData DROP COLUMN Modified; -ALTER TABLE snd.EventData DROP COLUMN ModifiedBy; -ALTER TABLE snd.EventData DROP COLUMN Created; -ALTER TABLE snd.EventData DROP COLUMN CreatedBy; -GO - -/* snd-18.10-18.20.sql */ - -sp_rename 'snd.Events.ParticipantId', 'SubjectId', 'COLUMN'; - -/*==============================================================*/ -/* Table: EventsCache */ -/*==============================================================*/ -CREATE TABLE snd.EventsCache ( - EventId INTEGER NOT NULL, - HtmlNarrative NVARCHAR(MAX), - - CONSTRAINT PK_SND_EVENTS_CACHE PRIMARY KEY (EventId) -) -GO - -ALTER TABLE snd.EventsCache - ADD CONSTRAINT FK_EventsCache_EventId FOREIGN KEY (EventId) REFERENCES snd.Events (EventId); -GO - -ALTER TABLE snd.EventData ADD ObjectId UNIQUEIDENTIFIER NOT NULL DEFAULT newid(); -GO - -ALTER TABLE snd.EventsCache ADD Container entityid; -ALTER TABLE snd.EventsCache ADD CONSTRAINT FK_SND_EVENTSCACHE_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId); -CREATE INDEX IDX_SND_EVENTSCACHE_CONTAINER ON snd.EventsCache(Container); -GO - -ALTER TABLE snd.EventNotes -DROP CONSTRAINT PK_SND_EVENTNOTES; -DROP INDEX IDX_SND_EVENTNOTES_EVENTNOTEID ON snd.EventNotes; -GO - -ALTER TABLE snd.EventNotes -DROP COLUMN EventNoteId; -GO - -ALTER TABLE snd.EventNotes ADD EventNoteId INT IDENTITY(1, 1) NOT NULL; -GO - -ALTER TABLE snd.EventNotes ADD CONSTRAINT PK_SND_EVENTNOTES PRIMARY KEY (EventNoteId); -CREATE INDEX IDX_SND_EVENTNOTES_EVENTNOTEID ON snd.EventNotes(EventNoteId); - -EXEC core.fn_dropifexists 'EventData', 'snd', 'COLUMN', 'ObjectId'; - -ALTER TABLE snd.SuperPkgs -ADD Required BIT NOT NULL DEFAULT 0; EXEC core.fn_dropifexists 'fGetSuperPkg', 'snd', 'FUNCTION', INT; GO @@ -856,9 +928,6 @@ RETURN ); GO -CREATE INDEX IDX_SND_EVENTDATA_SUPERPKGID ON snd.EventData(SuperPkgId); -CREATE INDEX IDX_SND_EVENTDATA_EVENTID ON snd.EventData(EventId); - /* Changes to improve snd.Events CRUD performance and add default QcState */ @@ -880,71 +949,6 @@ BEGIN WHERE i.QcState IS NULL END go - --- move Events table cluster index to AnimalId, Date --- --- need to drop foreign key constraints that reference the cluster index -EXEC core.fn_dropifexists 'EventNotes', 'snd', 'CONSTRAINT', 'FK_SND_EVENTNOTES_EVENTID'; -EXEC core.fn_dropifexists 'EventData', 'snd', 'CONSTRAINT', 'FK_SND_EVENTDATA_EVENTID'; -EXEC core.fn_dropifexists 'EventsCache', 'snd', 'CONSTRAINT', 'FK_EventsCache_EventId'; --- drop the snd.Events PK constraint (clustered index) -EXEC core.fn_dropifexists 'Events', 'snd', 'CONSTRAINT', 'PK_SND_EVENTS'; - --- Add new snd.Events table PK constraint (non-clustered) -ALTER TABLE snd.Events ADD CONSTRAINT PK_SND_EVENTS PRIMARY KEY NONCLUSTERED - ( - EventId ASC - )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); -GO - --- Create new clustered index on snd.Events -EXEC core.fn_dropifexists 'Events', 'snd', 'INDEX', 'IDX_SND_EVENTS_SUBJECTID_DATE'; -CREATE CLUSTERED INDEX IDX_SND_EVENTS_SUBJECTID_DATE ON snd.Events - ( - SubjectId ASC, - Date DESC - )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); -GO - - --- restore constraints --- --- EventNotes -ALTER TABLE snd.EventNotes WITH CHECK ADD CONSTRAINT FK_SND_EVENTNOTES_EVENTID FOREIGN KEY(EventId) - REFERENCES snd.Events (EventId); -GO - -ALTER TABLE snd.EventNotes CHECK CONSTRAINT FK_SND_EVENTNOTES_EVENTID; -GO - --- EventData -ALTER TABLE snd.EventData WITH CHECK ADD CONSTRAINT FK_SND_EVENTDATA_EVENTID FOREIGN KEY(EventId) - REFERENCES snd.Events (EventId); -GO - -ALTER TABLE snd.EventData CHECK CONSTRAINT FK_SND_EVENTDATA_EVENTID; -GO - --- EventsCache -ALTER TABLE snd.EventsCache WITH CHECK ADD CONSTRAINT FK_EVENTSCACHE_EVENTID FOREIGN KEY(EventId) - REFERENCES snd.Events (EventId); -GO - -ALTER TABLE snd.EventsCache CHECK CONSTRAINT FK_EventsCache_EventId; -GO - -/* 21.xxx SQL scripts */ - -UPDATE exp.PropertyValidator SET TypeURI = 'urn:lsid:labkey.com:PropertyValidator:textlength' -WHERE TypeURI = 'urn:lsid:labkey.com:PropertyValidator:length' - AND PropertyId IN ( - SELECT PropertyId - FROM exp.PropertyDescriptor - WHERE PropertyURI LIKE '%:package-snd%Package%' - ); - -GO - ALTER TRIGGER snd.ti_after_Events ON snd.Events FOR INSERT AS BEGIN SET NOCOUNT ON; @@ -973,10 +977,6 @@ WHERE i.QcState IS NULL END GO -CREATE UNIQUE INDEX IDX_LookupSets_SetName ON snd.LookupSets (SetName); - -ALTER TABLE snd.EventData ADD SortOrder INTEGER NULL; - EXEC core.fn_dropifexists 'fGetAllSuperPkgs', 'snd', 'function'; go From d5483ff75179ccb6523364f93770ddec9c7e5f52 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Mon, 6 Apr 2026 12:52:04 -0700 Subject: [PATCH 04/10] Clean up script - coalesce most ALTER statements into CREATE, eliminate pointless CREATE/ALTER/DROP combinations, etc. --- .../dbscripts/sqlserver/snd-0.000-25.000.sql | 712 ++++-------------- 1 file changed, 133 insertions(+), 579 deletions(-) diff --git a/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql b/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql index 94ee8e49a..db4a4e56d 100644 --- a/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql +++ b/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql @@ -23,29 +23,28 @@ GO CREATE TABLE snd.Pkgs ( PkgId INTEGER NOT NULL, Description NVARCHAR(4000) NOT NULL, + Narrative NVARCHAR(MAX) NULL, Active BIT, Repeatable BIT, QcState INTEGER, ObjectId UNIQUEIDENTIFIER NOT NULL DEFAULT newid(), - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, Lsid LSIDType, CONSTRAINT PK_SND_PKGS PRIMARY KEY (PkgId), CONSTRAINT FK_SND_PKGS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), - CONSTRAINT FK_SND_PKGS_QCSTATE FOREIGN Key (QcState) REFERENCES core.DataStates (RowId) + CONSTRAINT FK_SND_PKGS_QCSTATE FOREIGN KEY (QcState) REFERENCES core.DataStates (RowId) ); GO CREATE INDEX IDX_SND_PKGS_CONTAINER ON snd.Pkgs(Container); CREATE INDEX IDX_SND_PKGS_QCSTATE ON snd.Pkgs(QcState); -GO - CREATE INDEX IDX_SND_PKGS_LSID ON snd.Pkgs(Lsid); -ALTER TABLE snd.Pkgs ADD Narrative NVARCHAR(MAX) NULL; +GO /*==============================================================*/ /* Table: SuperPkgs */ @@ -55,11 +54,13 @@ CREATE TABLE snd.SuperPkgs ( ParentSuperPkgId INTEGER, PkgId INTEGER NOT NULL, SuperPkgPath VARCHAR(900) NOT NULL, - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, + SortOrder INTEGER, + Required BIT NOT NULL DEFAULT 0, + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, Lsid LSIDType, CONSTRAINT PK_SND_SUPERPKGS PRIMARY KEY (SuperPkgId), @@ -70,13 +71,9 @@ GO CREATE INDEX IDX_SND_SUPERPKGS_CONTAINER ON snd.SuperPkgs(Container); CREATE INDEX IDX_SND_SUPERPKGS_PKGID ON snd.SuperPkgs(PkgId); -GO - CREATE INDEX IDX_SND_SUPERPKGS_LSID ON snd.SuperPkgs(Lsid); -ALTER TABLE snd.SuperPkgs ADD SortOrder INTEGER; +GO -ALTER TABLE snd.SuperPkgs -ADD Required BIT NOT NULL DEFAULT 0; /*==============================================================*/ /* Table: PkgCategories */ /*==============================================================*/ @@ -86,11 +83,12 @@ CREATE TABLE snd.PkgCategories ( Comment NVARCHAR(4000), Active BIT NOT NULL, SortOrder INTEGER, - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, + ObjectId UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(), + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, Lsid LSIDType, CONSTRAINT PK_SND_PKGCATEGORIES PRIMARY KEY (CategoryId), @@ -99,10 +97,8 @@ CREATE TABLE snd.PkgCategories ( GO CREATE INDEX IDX_SND_PKGCATEGORIES_CONTAINER ON snd.PkgCategories(Container); -GO - CREATE INDEX IDX_SND_PKGCATEGORIES_LSID ON snd.PkgCategories(Lsid); -ALTER TABLE snd.PkgCategories ADD Objectid uniqueidentifier NOT NULL DEFAULT newid(); +GO /*==============================================================*/ /* Table: PkgCategoryJunction */ @@ -110,11 +106,12 @@ ALTER TABLE snd.PkgCategories ADD Objectid uniqueidentifier NOT NULL DEFAULT new CREATE TABLE snd.PkgCategoryJunction ( PkgId INTEGER NOT NULL, CategoryId INTEGER NOT NULL, - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, + ObjectId UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(), + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, Lsid LSIDType, CONSTRAINT PK_SND_PKGCATEGORYJUNCTION PRIMARY KEY (PkgId, CategoryId), @@ -127,10 +124,8 @@ GO CREATE INDEX IDX_SND_PKGCATEGORYJUNCTION_CONTAINER ON snd.PkgCategoryJunction(Container); CREATE INDEX IDX_SND_PKGCATEGORYJUNCTION_PKGID ON snd.PkgCategoryJunction(PkgId); CREATE INDEX IDX_SND_PKGCATEGORYJUNCTION_CATEGORYID ON snd.PkgCategoryJunction(CategoryId); -GO - CREATE INDEX IDX_SND_PKGCATEGORYJUNCTION_LSID ON snd.PkgCategoryJunction(Lsid); -ALTER TABLE snd.PkgCategoryJunction ADD Objectid uniqueidentifier NOT NULL DEFAULT newid(); +GO /*==============================================================*/ /* Table: Projects */ @@ -142,51 +137,18 @@ CREATE TABLE snd.Projects ( StartDate date NOT NULL, EndDate date, Description NVARCHAR(4000) NOT NULL, + Active BIT NOT NULL, ObjectId UNIQUEIDENTIFIER NOT NULL DEFAULT newid(), - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, - Lsid LSIDType, - - CONSTRAINT PK_SND_PROJECTS PRIMARY KEY (ProjectId, RevisionNum), - CONSTRAINT FK_SND_PROJECTS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) -); -GO - -CREATE INDEX IDX_SND_PROJECTS_CONTAINER ON snd.Projects(Container); -CREATE UNIQUE INDEX IDX_SND_PROJECTS_OBJECTID ON snd.Projects(ObjectId); -GO - -CREATE INDEX IDX_SND_PROJECTS_LSID ON snd.Projects(Lsid); -/* snd-17.30-18.10.sql */ - -EXEC core.fn_dropifexists 'Projects', 'snd', 'CONSTRAINT', 'IDX_SND_PROJECTS_CONTAINER'; -EXEC core.fn_dropifexists 'Projects', 'snd', 'CONSTRAINT', 'IDX_SND_PROJECTS_OBJECTID'; -EXEC core.fn_dropifexists 'Projects', 'snd', 'TABLE', NULL; -GO - -CREATE TABLE snd.Projects ( - ProjectId INTEGER NOT NULL, - RevisionNum INTEGER NOT NULL, - ReferenceId INTEGER NOT NULL, - StartDate date NOT NULL, - EndDate date, - Description NVARCHAR(4000) NOT NULL, - Active BIT NOT NULL, - ObjectId UNIQUEIDENTIFIER NOT NULL DEFAULT newid(), - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, Lsid LSIDType, CONSTRAINT PK_SND_PROJECTS PRIMARY KEY NONCLUSTERED (ObjectId), CONSTRAINT FK_SND_PROJECTS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) - -) +); GO CREATE INDEX IDX_SND_PROJECTS_CONTAINER ON snd.Projects(Container); @@ -201,11 +163,12 @@ CREATE TABLE snd.ProjectItems ( ParentObjectId UNIQUEIDENTIFIER, SuperPkgId INTEGER NOT NULL, Active BIT NOT NULL DEFAULT 1, - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, + ObjectId UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(), + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, Lsid LSIDType, CONSTRAINT PK_SND_PROJECTITEMS PRIMARY KEY (ProjectItemId), @@ -218,37 +181,29 @@ GO CREATE INDEX IDX_SND_PROJECTITEMS_CONTAINER ON snd.ProjectItems(Container); CREATE INDEX IDX_SND_PROJECTITEMS_SUPERPKGID ON snd.ProjectItems(SuperPkgId); CREATE INDEX IDX_SND_PROJECTITEMS_PARENTOBJECTID ON snd.ProjectItems(ParentObjectId); -GO - CREATE INDEX IDX_SND_PROJECTITEMS_LSID ON snd.ProjectItems(Lsid); -ALTER TABLE snd.ProjectItems ADD Objectid uniqueidentifier NOT NULL DEFAULT newid(); - -EXEC core.fn_dropifexists 'ProjectItems', 'snd', 'CONSTRAINT', 'FK_SND_PROJECTITEMS_PARENTOBJECTID'; -EXEC core.fn_dropifexists 'ProjectItems', 'snd', 'CONSTRAINT', 'FK_SND_PROJECTITEMS_PARENTOBJECTID'; -DELETE FROM snd.ProjectItems; -ALTER TABLE snd.ProjectItems -ADD CONSTRAINT FK_SND_PROJECTITEMS_PARENTOBJECTID FOREIGN KEY (ParentObjectId) REFERENCES snd.Projects (ObjectId); +GO /*==============================================================*/ /* Table: Events */ /*==============================================================*/ CREATE TABLE snd.Events ( EventId INTEGER NOT NULL, - Id NVARCHAR(32) NOT NULL, + SubjectId NVARCHAR(32) NOT NULL, ParentObjectId UNIQUEIDENTIFIER, Date DATETIME NOT NULL, QcState int, ObjectId UNIQUEIDENTIFIER NOT NULL DEFAULT newid(), - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, Lsid LSIDType, - CONSTRAINT PK_SND_EVENTS PRIMARY KEY (EventId), + CONSTRAINT PK_SND_EVENTS PRIMARY KEY NONCLUSTERED (EventId), CONSTRAINT FK_SND_EVENTS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), - CONSTRAINT FK_SND_EVENTS_QCSTATE FOREIGN Key (QcState) REFERENCES core.DataStates (RowId), + CONSTRAINT FK_SND_EVENTS_QCSTATE FOREIGN KEY (QcState) REFERENCES core.DataStates (RowId), CONSTRAINT FK_SND_EVENTS_PARENTOBJECTID FOREIGN KEY (ParentObjectId) REFERENCES snd.Projects (ObjectId) ); GO @@ -256,98 +211,31 @@ GO CREATE INDEX IDX_SND_EVENTS_CONTAINER ON snd.Events(Container); CREATE INDEX IDX_SND_EVENTS_QCSTATE ON snd.Events(QcState); CREATE INDEX IDX_SND_EVENTS_PARENTOBJECTID ON snd.Events(ParentObjectId); -GO - CREATE INDEX IDX_SND_EVENTS_LSID ON snd.Events(Lsid); -EXEC core.fn_dropifexists 'Events', 'snd', 'CONSTRAINT', 'FK_SND_EVENTS_PARENTOBJECTID'; -GO - -EXEC core.fn_dropifexists 'Events', 'snd', 'CONSTRAINT', 'FK_SND_EVENTS_PARENTOBJECTID'; -GO - -DELETE FROM snd.Events; -GO - -ALTER TABLE snd.Events -ADD CONSTRAINT FK_SND_EVENTS_PARENTOBJECTID FOREIGN KEY (ParentObjectId) REFERENCES snd.Projects (ObjectId); -GO - -EXEC sp_rename 'snd.Events.Id', 'ParticipantId', 'COLUMN'; - -/* snd-18.10-18.20.sql */ - -EXEC sp_rename 'snd.Events.ParticipantId', 'SubjectId', 'COLUMN'; - --- drop the snd.Events PK constraint (clustered index) -EXEC core.fn_dropifexists 'Events', 'snd', 'CONSTRAINT', 'PK_SND_EVENTS'; - --- Add new snd.Events table PK constraint (non-clustered) -ALTER TABLE snd.Events ADD CONSTRAINT PK_SND_EVENTS PRIMARY KEY NONCLUSTERED - ( - EventId ASC - )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); -GO - --- Create new clustered index on snd.Events -EXEC core.fn_dropifexists 'Events', 'snd', 'INDEX', 'IDX_SND_EVENTS_SUBJECTID_DATE'; CREATE CLUSTERED INDEX IDX_SND_EVENTS_SUBJECTID_DATE ON snd.Events ( SubjectId ASC, Date DESC - )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); -GO - - -/*==============================================================*/ -/* Table: CodedEvents */ -/*==============================================================*/ -CREATE TABLE snd.CodedEvents ( - CodedEventId INTEGER IDENTITY, - EventId INTEGER NOT NULL, - SuperPkgId INTEGER NOT NULL, - ObjectId UNIQUEIDENTIFIER NULL DEFAULT newid(), - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, - Lsid LSIDType, - - CONSTRAINT PK_SND_CODEDEVENTS PRIMARY KEY (CodedEventId), - CONSTRAINT FK_SND_CODEDEVENTS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), - CONSTRAINT FK_SND_CODEDEVENTS_EVENTID FOREIGN KEY (EventId) REFERENCES snd.Events (EventId), - CONSTRAINT FK_SND_CODEDEVENTS_SUPERPKGID FOREIGN KEY (SuperPkgId) REFERENCES snd.SuperPkgs(SuperPkgId) -); -GO - -CREATE INDEX IDX_SND_CODEDEVENTS_CONTAINER ON snd.CodedEvents(Container); -CREATE INDEX IDX_SND_CODEDEVENTS_EVENTID ON snd.CodedEvents(EventId); -CREATE INDEX IDX_SND_CODEDEVENTS_SUPERPKGID ON snd.CodedEvents(SuperPkgId); -GO - -CREATE INDEX IDX_SND_CODEDEVENTS_LSID ON snd.CodedEvents(Lsid); -DELETE FROM snd.CodedEvents; -/* Recreate EventData table */ -EXEC core.fn_dropifexists 'CodedEvents','snd','TABLE'; + ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON); GO /*==============================================================*/ /* Table: EventNotes */ /*==============================================================*/ CREATE TABLE snd.EventNotes ( - EventNoteId INTEGER IDENTITY, + EventNoteId INT IDENTITY(1, 1) NOT NULL, EventId INTEGER, Note NVARCHAR(MAX) NOT NULL, - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, Lsid LSIDType, CONSTRAINT PK_SND_EVENTNOTES PRIMARY KEY (EventNoteId), CONSTRAINT FK_SND_EVENTNOTES_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), - CONSTRAINT FK_SND_EVENTNOTES_EVENTNOTEID FOREIGN KEY (EventNoteId) REFERENCES snd.Events (EventId) + CONSTRAINT FK_SND_EVENTNOTES_EVENTID FOREIGN KEY (EventId) REFERENCES snd.Events (EventId) ); GO @@ -355,87 +243,6 @@ CREATE INDEX IDX_SND_EVENTNOTES_CONTAINER ON snd.EventNotes(Container); CREATE INDEX IDX_SND_EVENTNOTES_EVENTNOTEID ON snd.EventNotes(EventNoteId); GO -CREATE INDEX IDX_SND_EVENTNOTES_LSID ON snd.EventNotes(Lsid); - -/* Recreate EventNoteId not as identity column for etls */ -ALTER TABLE snd.EventNotes DROP PK_SND_EVENTNOTES; -ALTER TABLE snd.EventNotes DROP CONSTRAINT FK_SND_EVENTNOTES_EVENTNOTEID; -DROP INDEX IDX_SND_EVENTNOTES_EVENTNOTEID ON snd.EventNotes; -GO - -ALTER TABLE snd.EventNotes DROP COLUMN EventNoteId; -GO - -ALTER TABLE snd.EventNotes ADD EventNoteId INTEGER NOT NULL; -GO - -ALTER TABLE snd.EventNotes ADD CONSTRAINT PK_SND_EVENTNOTES PRIMARY KEY (EventNoteId); -ALTER TABLE snd.EventNotes ADD CONSTRAINT FK_SND_EVENTNOTES_EVENTNOTEID FOREIGN KEY (EventNoteId) REFERENCES snd.Events (EventId) -CREATE INDEX IDX_SND_EVENTNOTES_EVENTNOTEID ON snd.EventNotes(EventNoteId); -GO - -EXEC core.fn_dropifexists 'EventNotes', 'snd', 'CONSTRAINT', 'FK_SND_EVENTNOTES_EVENTNOTEID'; -GO - -ALTER TABLE snd.EventNotes ADD CONSTRAINT FK_SND_EVENTNOTES_EVENTID FOREIGN KEY (EventId) REFERENCES snd.Events (EventId) -GO - -ALTER TABLE snd.EventNotes -DROP CONSTRAINT PK_SND_EVENTNOTES; -DROP INDEX IDX_SND_EVENTNOTES_EVENTNOTEID ON snd.EventNotes; -GO - -ALTER TABLE snd.EventNotes -DROP COLUMN EventNoteId; -GO - -ALTER TABLE snd.EventNotes ADD EventNoteId INT IDENTITY(1, 1) NOT NULL; -GO - -ALTER TABLE snd.EventNotes ADD CONSTRAINT PK_SND_EVENTNOTES PRIMARY KEY (EventNoteId); -CREATE INDEX IDX_SND_EVENTNOTES_EVENTNOTEID ON snd.EventNotes(EventNoteId); - - --- move Events table cluster index to AnimalId, Date --- --- need to drop foreign key constraints that reference the cluster index -EXEC core.fn_dropifexists 'EventNotes', 'snd', 'CONSTRAINT', 'FK_SND_EVENTNOTES_EVENTID'; --- restore constraints --- --- EventNotes -ALTER TABLE snd.EventNotes WITH CHECK ADD CONSTRAINT FK_SND_EVENTNOTES_EVENTID FOREIGN KEY(EventId) - REFERENCES snd.Events (EventId); -GO - -ALTER TABLE snd.EventNotes CHECK CONSTRAINT FK_SND_EVENTNOTES_EVENTID; -GO - -/*==============================================================*/ -/* Table: LookupSets */ -/*==============================================================*/ -CREATE TABLE snd.LookupSets ( - LookupSetId INTEGER NOT NULL, - SetName NVARCHAR(128) NOT NULL, - Label NVARCHAR(128), - Description NVARCHAR(900), - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, - Lsid LSIDType, - - CONSTRAINT PK_SND_LOOKUPSETS PRIMARY KEY (LookupSetId), - CONSTRAINT FK_SND_LOOKUPSETS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) -); -GO - -CREATE INDEX IDX_SND_LOOKUPSETS_CONTAINER ON snd.LookupSets(Container); -GO - -DROP TABLE snd.LookupSets; -GO - /*==============================================================*/ /* Table: LookupSets */ /*==============================================================*/ @@ -444,11 +251,12 @@ CREATE TABLE snd.LookupSets ( SetName NVARCHAR(128) NOT NULL, Label NVARCHAR(128), Description NVARCHAR(900), - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, + ObjectId UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(), + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, Lsid LSIDType, CONSTRAINT PK_SND_LOOKUPSETS PRIMARY KEY (LookupSetId), @@ -457,154 +265,81 @@ CREATE TABLE snd.LookupSets ( GO CREATE INDEX IDX_SND_LOOKUPSETS_CONTAINER ON snd.LookupSets(Container); -GO - -ALTER TABLE snd.LookupSets ADD [ObjectId] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(); -CREATE UNIQUE INDEX idx_snd_lookupSets_objectid ON snd.lookupSets (ObjectId); -GO - -CREATE UNIQUE INDEX IDX_LookupSets_SetName ON snd.LookupSets (SetName); - -/*==============================================================*/ -/* Table: Lookups */ -/*==============================================================*/ -CREATE TABLE snd.Lookups ( - LookupSetId INTEGER NOT NULL, - Value VARCHAR(896) NOT NULL, - Displayable BIT NOT NULL, - SortOrder INTEGER, - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, - Lsid LSIDType, - - CONSTRAINT PK_SND_LOOKUPS PRIMARY KEY (LookupSetId, Value), - CONSTRAINT FK_SND_LOOKUPS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), - CONSTRAINT FK_SND_LOOKUPS_LOOKUPSETID FOREIGN KEY (LookupSetId) REFERENCES snd.LookupSets (LookupSetId) -); - -CREATE INDEX IDX_SND_LOOKUPS_CONTAINER ON snd.Lookups(Container); -CREATE INDEX IDX_SND_LOOKUPS_LOOKUPSETID ON snd.Lookups(LookupSetId); -GO - -DROP TABLE snd.Lookups; +CREATE UNIQUE INDEX idx_snd_lookupSets_objectid ON snd.LookupSets(ObjectId); +CREATE UNIQUE INDEX IDX_LookupSets_SetName ON snd.LookupSets(SetName); GO /*==============================================================*/ /* Table: Lookups */ /*==============================================================*/ CREATE TABLE snd.Lookups ( + LookupId INT IDENTITY(1,1) NOT NULL, LookupSetId INTEGER NOT NULL, Value NVARCHAR(446) NOT NULL, Displayable BIT NOT NULL, SortOrder INTEGER, - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, + ObjectId UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(), + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created DATETIME, + ModifiedBy USERID, + Modified DATETIME, Lsid LSIDType, - CONSTRAINT PK_SND_LOOKUPS PRIMARY KEY (LookupSetId, Value), + CONSTRAINT PK_SND_LOOKUPS PRIMARY KEY (LookupId), CONSTRAINT FK_SND_LOOKUPS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), CONSTRAINT FK_SND_LOOKUPS_LOOKUPSETID FOREIGN KEY (LookupSetId) REFERENCES snd.LookupSets (LookupSetId) ); +GO CREATE INDEX IDX_SND_LOOKUPS_CONTAINER ON snd.Lookups(Container); CREATE INDEX IDX_SND_LOOKUPS_LOOKUPSETID ON snd.Lookups(LookupSetId); -GO - -ALTER TABLE snd.Lookups ADD LookupId INT IDENTITY(1,1); -ALTER TABLE snd.Lookups DROP CONSTRAINT PK_SND_LOOKUPS; -GO - -ALTER TABLE snd.Lookups ADD CONSTRAINT PK_SND_LOOKUPS PRIMARY KEY (LookupId); - CREATE UNIQUE INDEX IDX_SND_LOOKUPS_LOOKUPSETID_VALUE ON snd.Lookups(LookupSetId, Value); - -ALTER TABLE snd.Lookups ADD [ObjectId] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(); -CREATE UNIQUE INDEX idx_snd_lookups_objectid ON snd.lookups (ObjectId); +CREATE UNIQUE INDEX idx_snd_lookups_objectid ON snd.Lookups(ObjectId); +GO /*==============================================================*/ /* Table: EventData */ /*==============================================================*/ CREATE TABLE snd.EventData ( - EventDataId INTEGER NOT NULL, - EventId INTEGER NOT NULL, - SuperPkgId INTEGER NOT NULL, - ObjectURI LsidType NOT NULL, - Container ENTITYID NOT NULL, - CreatedBy USERID, - Created DATETIME, - ModifiedBy USERID, - Modified DATETIME, - Lsid LSIDType, + EventDataId INTEGER NOT NULL, + EventId INTEGER NOT NULL, + SuperPkgId INTEGER NOT NULL, + ObjectURI LsidType NOT NULL, + ParentEventDataId INT, + SortOrder INTEGER NULL, + Container ENTITYID NOT NULL, + Lsid LSIDType, CONSTRAINT PK_SND_EVENTDATA PRIMARY KEY (EventDataId), CONSTRAINT FK_SND_EVENTDATA_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), CONSTRAINT FK_SND_EVENTDATA_EVENTID FOREIGN KEY (EventId) REFERENCES snd.Events (EventId), - CONSTRAINT FK_SND_EVENTDATA_SUPERPKGID FOREIGN KEY (SuperPkgId) REFERENCES snd.SuperPkgs(SuperPkgId) -) -GO - -ALTER TABLE snd.EventData ADD ParentEventDataId INT; -ALTER TABLE snd.EventData DROP COLUMN Modified; -ALTER TABLE snd.EventData DROP COLUMN ModifiedBy; -ALTER TABLE snd.EventData DROP COLUMN Created; -ALTER TABLE snd.EventData DROP COLUMN CreatedBy; -GO - -ALTER TABLE snd.EventData ADD ObjectId UNIQUEIDENTIFIER NOT NULL DEFAULT newid(); + CONSTRAINT FK_SND_EVENTDATA_SUPERPKGID FOREIGN KEY (SuperPkgId) REFERENCES snd.SuperPkgs (SuperPkgId) +); GO -EXEC core.fn_dropifexists 'EventData', 'snd', 'COLUMN', 'ObjectId'; - CREATE INDEX IDX_SND_EVENTDATA_SUPERPKGID ON snd.EventData(SuperPkgId); CREATE INDEX IDX_SND_EVENTDATA_EVENTID ON snd.EventData(EventId); - -EXEC core.fn_dropifexists 'EventData', 'snd', 'CONSTRAINT', 'FK_SND_EVENTDATA_EVENTID'; --- EventData -ALTER TABLE snd.EventData WITH CHECK ADD CONSTRAINT FK_SND_EVENTDATA_EVENTID FOREIGN KEY(EventId) - REFERENCES snd.Events (EventId); -GO - -ALTER TABLE snd.EventData CHECK CONSTRAINT FK_SND_EVENTDATA_EVENTID; GO -ALTER TABLE snd.EventData ADD SortOrder INTEGER NULL; - /*==============================================================*/ /* Table: EventsCache */ /*==============================================================*/ CREATE TABLE snd.EventsCache ( - EventId INTEGER NOT NULL, - HtmlNarrative NVARCHAR(MAX), - - CONSTRAINT PK_SND_EVENTS_CACHE PRIMARY KEY (EventId) -) -GO + EventId INTEGER NOT NULL, + HtmlNarrative NVARCHAR(MAX), + Container ENTITYID, -ALTER TABLE snd.EventsCache - ADD CONSTRAINT FK_EventsCache_EventId FOREIGN KEY (EventId) REFERENCES snd.Events (EventId); + CONSTRAINT PK_SND_EVENTS_CACHE PRIMARY KEY (EventId), + CONSTRAINT FK_EVENTSCACHE_EVENTID FOREIGN KEY (EventId) REFERENCES snd.Events (EventId), + CONSTRAINT FK_SND_EVENTSCACHE_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) +); GO -ALTER TABLE snd.EventsCache ADD Container entityid; -ALTER TABLE snd.EventsCache ADD CONSTRAINT FK_SND_EVENTSCACHE_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId); CREATE INDEX IDX_SND_EVENTSCACHE_CONTAINER ON snd.EventsCache(Container); GO -EXEC core.fn_dropifexists 'EventsCache', 'snd', 'CONSTRAINT', 'FK_EventsCache_EventId'; --- EventsCache -ALTER TABLE snd.EventsCache WITH CHECK ADD CONSTRAINT FK_EVENTSCACHE_EVENTID FOREIGN KEY(EventId) - REFERENCES snd.Events (EventId); -GO - -ALTER TABLE snd.EventsCache CHECK CONSTRAINT FK_EventsCache_EventId; -GO - -/* 21.xxx SQL scripts */ +/* 21.xxx: Update PropertyValidator TypeURI for length validators on SND package properties */ UPDATE exp.PropertyValidator SET TypeURI = 'urn:lsid:labkey.com:PropertyValidator:textlength' WHERE TypeURI = 'urn:lsid:labkey.com:PropertyValidator:length' @@ -613,7 +348,9 @@ WHERE TypeURI = 'urn:lsid:labkey.com:PropertyValidator:length' FROM exp.PropertyDescriptor WHERE PropertyURI LIKE '%:package-snd%Package%' ); +GO +EXEC core.fn_dropifexists 'fGetSuperPkg', 'snd', 'FUNCTION'; GO CREATE FUNCTION snd.fGetSuperPkg ( @TopLevelPkgId INT ) @@ -621,15 +358,15 @@ RETURNS TABLE AS -- ========================================================================================== --- Author: Terry Hawkins --- Creation date: 9/22/2017 +-- Author: Terry Hawkins +-- Creation date: 9/22/2017 -- Description: Table valued function to return hierarchical view of a superPkg -- ========================================================================================== RETURN ( - WITH CTE1 ( TopLevelPkgId, SuperPkgId, ParentSuperPkgId, PkgId, TreePath, SuperPkgPath, SortOrder, DESCRIPTION, Narrative, Active, Repeatable, Level ) + WITH CTE1 ( TopLevelPkgId, SuperPkgId, ParentSuperPkgId, PkgId, TreePath, SuperPkgPath, SortOrder, Required, DESCRIPTION, Narrative, Active, Repeatable, Level ) AS ( - + -- anchor member definition SELECT @TopLevelPkgId AS TopLevelPkgId , sp.SuperPkgId AS SuperPkgId , @@ -640,6 +377,7 @@ RETURN 3) AS TreePath , sp.SuperPkgPath AS SuperPkgPath , sp.SortOrder AS SortOrder , + sp.Required AS Required , p.Description AS Description , p.Narrative AS Narrative , p.Active AS Active , @@ -659,16 +397,17 @@ RETURN 10)), 3) AS TreePath , sp.SuperPkgPath AS SuperPkgPath , sp.SortOrder AS SortOrder , + sp.Required AS Required , p.Description AS Description , p.Narrative AS Narrative , p.Active AS Active , p.Repeatable AS Repeatable , c.Level + 1 AS Level FROM snd.SuperPkgs AS sp - INNER JOIN CTE1 AS c ON - -- add subpackages - sp.ParentSuperPkgId = c.SuperPkgId - -- add children of subpackages + INNER JOIN CTE1 AS c ON + -- add subpackages + sp.ParentSuperPkgId = c.SuperPkgId + -- add children of subpackages OR sp.ParentSuperPkgId IN (SELECT sp2.SuperPkgId FROM snd.SuperPkgs AS sp2 WHERE c.PkgId = sp2.PkgId AND sp2.ParentSuperPkgId IS NULL ) INNER JOIN snd.Pkgs AS p ON sp.PkgId = p.PkgId @@ -680,89 +419,13 @@ RETURN c.TreePath AS TreePath , c.SuperPkgPath AS SuperPkgPath , c.SortOrder AS SortOrder , + c.Required AS Required , c.DESCRIPTION AS Description , c.Narrative AS Narrative , c.Active AS Active , c.Repeatable AS Repeatable , c.Level AS Level FROM CTE1 c - -); -GO - -EXEC core.fn_dropifexists 'fGetProjectItems','snd', 'FUNCTION'; -GO - -CREATE FUNCTION [snd].[fGetProjectItems] - ( - @projectId INT , - @revisionNum INT - ) -RETURNS TABLE -AS - --- ========================================================================================== --- Author: Terry Hawkins --- Creation date: 12/14/2017 --- Description: Returns the list of ProjectItems for a Project/Revision along with --- sub packages for each ProjectItem --- ========================================================================================== -RETURN - ( -WITH CTE1 ( ProjectId, RevisionNum, ProjectItemId, ParentObjectId, ParentSuperPkgId, SuperPkgId, PkgId, Active, TreePath, Level, Description ) - AS ( SELECT @projectId AS ProjectId , - @revisionNum AS RevisionNum , - pi.ProjectItemId , - pi.ParentObjectId AS ParentObjectId , - sp.ParentSuperPkgId AS ParentSuperPkgId , - sp.SuperPkgId AS SuperPkgId , - sp.PkgId AS PkgId , - p.Active , - RIGHT(SPACE(3) - + CONVERT(VARCHAR(MAX), ROW_NUMBER() OVER ( ORDER BY pi.ProjectItemId, sp.SuperPkgId )), - 3) AS TreePath , - 1 AS Level , - pkg.Description - FROM snd.ProjectItems AS pi - INNER JOIN snd.Projects AS p ON pi.ParentObjectId = p.ObjectId - INNER JOIN snd.SuperPkgs AS sp ON pi.SuperPkgId = sp.SuperPkgId - INNER JOIN snd.Pkgs pkg ON sp.PkgId = pkg.PkgId - WHERE p.ProjectId = @projectId - AND p.RevisionNum = @revisionNum - UNION ALL - SELECT c.ProjectId AS ProjectId , - c.RevisionNum AS RevisionNum , - c.ProjectItemId , - c.ParentObjectId AS ParentObjectId , - sp.ParentSuperPkgId AS ParentSuperPkgId , - sp.SuperPkgId AS SuperPkgId , - sp.PkgId AS PkgId , - c.Active , - c.TreePath + '/' + RIGHT(SPACE(3) - + CONVERT(VARCHAR(MAX), RIGHT(ROW_NUMBER() OVER ( ORDER BY sp.SortOrder ), - 10)), 3) AS TreePath , - c.Level + 1 AS Level , - pkg.Description - FROM snd.SuperPkgs AS sp - INNER JOIN snd.Pkgs AS pkg ON sp.PkgId = pkg.PkgId - INNER JOIN CTE1 AS c ON sp.ParentSuperPkgId = c.SuperPkgId - -- get the sub-pkg hierarchy from the top-level super pkg definition - OR sp.ParentSuperPkgId IN ( - SELECT sp2.SuperPkgId - FROM snd.SuperPkgs AS sp2 - WHERE c.PkgId = sp2.PkgId - AND sp2.ParentSuperPkgId IS NULL) - ) - SELECT @projectId AS ProjectId , - @revisionNum AS RevisionNum , - c.ProjectItemId , - c.SuperPkgId AS SuperPkgId , - c.PkgId AS PkgId , - c.TreePath AS TreePath , - c.Level AS Level , - c.Active AS Active , - c.Description - FROM CTE1 c ); GO @@ -825,7 +488,7 @@ WITH CTE1 ( ProjectId, RevisionNum, ProjectItemId, ParentObjectId, ParentSupe FROM snd.SuperPkgs AS sp INNER JOIN snd.Pkgs AS pkg ON sp.PkgId = pkg.PkgId INNER JOIN CTE1 AS c ON sp.ParentSuperPkgId = c.SuperPkgId - -- get the sub-pkg hierarchy from the top-level super pkg definition + -- get the sub-pkg hierarchy from the top-level super pkg definition OR sp.ParentSuperPkgId IN ( SELECT sp2.SuperPkgId FROM snd.SuperPkgs AS sp2 @@ -847,138 +510,8 @@ WITH CTE1 ( ProjectId, RevisionNum, ProjectItemId, ParentObjectId, ParentSupe ); GO -EXEC core.fn_dropifexists 'fGetSuperPkg', 'snd', 'FUNCTION', INT; -GO - -CREATE FUNCTION snd.fGetSuperPkg ( @TopLevelPkgId INT ) -RETURNS TABLE -AS - --- ========================================================================================== --- Author: Terry Hawkins --- Creation date: 9/22/2017 --- Description: Table valued function to return hierarchical view of a superPkg --- ========================================================================================== --- Revising 4/3/2018 to add Required column -RETURN - ( - WITH CTE1 ( TopLevelPkgId, SuperPkgId, ParentSuperPkgId, PkgId, TreePath, SuperPkgPath, SortOrder, Required, DESCRIPTION, Narrative, Active, Repeatable, Level ) - AS ( - - -- anchor member definition - SELECT @TopLevelPkgId AS TopLevelPkgId , - sp.SuperPkgId AS SuperPkgId , - sp.ParentSuperPkgId AS ParentSuperPkgId , - sp.PkgId AS PkgId , - RIGHT(SPACE(3) - + CONVERT(VARCHAR(MAX), ROW_NUMBER() OVER ( ORDER BY sp.SortOrder )), - 3) AS TreePath , - sp.SuperPkgPath AS SuperPkgPath , - sp.SortOrder AS SortOrder , - sp.Required AS Required , - p.Description AS Description , - p.Narrative AS Narrative , - p.Active AS Active , - p.Repeatable AS Repeatable , - 1 AS Level - FROM snd.SuperPkgs sp - INNER JOIN snd.Pkgs p ON sp.PkgId = p.PkgId - WHERE sp.PkgId = @TopLevelPkgId - AND sp.ParentSuperPkgId IS NULL - UNION ALL - SELECT @TopLevelPkgId AS TopLevelPkgId , - sp.SuperPkgId AS SuperPkgId , - c.SuperPkgId AS ParentSuperPkgId , - sp.PkgId AS PkgId , - c.TreePath + '/' + RIGHT(SPACE(3) - + CONVERT(VARCHAR(MAX), RIGHT(ROW_NUMBER() OVER ( ORDER BY sp.SortOrder ), - 10)), 3) AS TreePath , - sp.SuperPkgPath AS SuperPkgPath , - sp.SortOrder AS SortOrder , - sp.Required AS Required , - p.Description AS Description , - p.Narrative AS Narrative , - p.Active AS Active , - p.Repeatable AS Repeatable , - c.Level + 1 AS Level - FROM snd.SuperPkgs AS sp - INNER JOIN CTE1 AS c ON - -- add subpackages - sp.ParentSuperPkgId = c.SuperPkgId - -- add children of subpackages - OR sp.ParentSuperPkgId IN (SELECT sp2.SuperPkgId FROM snd.SuperPkgs AS sp2 WHERE c.PkgId = sp2.PkgId AND sp2.ParentSuperPkgId IS NULL ) - - INNER JOIN snd.Pkgs AS p ON sp.PkgId = p.PkgId - ) - SELECT @TopLevelPkgId AS TopLevelPkgId , - c.SuperPkgId AS SuperPkgId , - c.ParentSuperPkgId AS ParentSuperPkgId , - c.PkgId AS PkgId , - c.TreePath AS TreePath , - c.SuperPkgPath AS SuperPkgPath , - c.SortOrder AS SortOrder , - c.Required AS Required , - c.DESCRIPTION AS Description , - c.Narrative AS Narrative , - c.Active AS Active , - c.Repeatable AS Repeatable , - c.Level AS Level - FROM CTE1 c - -); -GO - -/* - Changes to improve snd.Events CRUD performance and add default QcState -*/ - --- delete the trigger if it exists -IF (OBJECT_ID(N'snd.ti_after_Events') IS NOT NULL) - BEGIN - DROP TRIGGER snd.ti_after_Events; - END; -GO --- if QcState is null, set it to 'Completed' -CREATE TRIGGER snd.ti_after_Events ON snd.Events FOR INSERT AS -BEGIN - SET NOCOUNT ON; - UPDATE snd.Events - SET QcState = (SELECT TOP(1) q.rowId FROM core.Qcstate AS q WHERE q.Label = 'Completed' ORDER BY q.rowId) - FROM inserted AS i - INNER JOIN snd.Events AS e ON i.EventId = e.EventId - WHERE i.QcState IS NULL -END -go -ALTER TRIGGER snd.ti_after_Events ON snd.Events FOR INSERT AS -BEGIN - SET NOCOUNT ON; -UPDATE snd.Events -SET QcState = (SELECT TOP(1) q.rowId FROM core.DataStates AS q WHERE q.Label = 'Completed' ORDER BY q.rowId) - FROM inserted AS i - INNER JOIN snd.Events AS e ON i.EventId = e.EventId -WHERE i.QcState IS NULL -END -GO - -/* 23.xxx SQL scripts */ - -ALTER TRIGGER snd.ti_after_Events ON snd.Events FOR INSERT AS -BEGIN - SET NOCOUNT ON; - DECLARE - @Container ENTITYID - - SELECT @Container = INSERTED.[Container] FROM INSERTED -UPDATE snd.Events -SET QcState = (SELECT TOP(1) q.rowId FROM core.DataStates AS q WHERE q.Label = 'Completed' AND q.Container = @Container ORDER BY q.rowId) - FROM INSERTED AS i - INNER JOIN snd.Events AS e ON i.EventId = e.EventId -WHERE i.QcState IS NULL -END -GO - EXEC core.fn_dropifexists 'fGetAllSuperPkgs', 'snd', 'function'; -go +GO CREATE FUNCTION snd.fGetAllSuperPkgs () @@ -1057,3 +590,24 @@ DEALLOCATE @loopCursor; RETURN; END; GO + +IF (OBJECT_ID(N'snd.ti_after_Events') IS NOT NULL) + BEGIN + DROP TRIGGER snd.ti_after_Events; + END; +GO + +CREATE TRIGGER snd.ti_after_Events ON snd.Events FOR INSERT AS +BEGIN + SET NOCOUNT ON; + DECLARE + @Container ENTITYID + + SELECT @Container = INSERTED.[Container] FROM INSERTED + UPDATE snd.Events + SET QcState = (SELECT TOP(1) q.rowId FROM core.DataStates AS q WHERE q.Label = 'Completed' AND q.Container = @Container ORDER BY q.rowId) + FROM INSERTED AS i + INNER JOIN snd.Events AS e ON i.EventId = e.EventId + WHERE i.QcState IS NULL +END +GO From 09253507d5350f80259496a111acecf37702322f Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Mon, 6 Apr 2026 13:23:43 -0700 Subject: [PATCH 05/10] Remove unnecessary drops and update --- .../dbscripts/sqlserver/snd-0.000-25.000.sql | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql b/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql index db4a4e56d..371e48685 100644 --- a/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql +++ b/snd/resources/schemas/dbscripts/sqlserver/snd-0.000-25.000.sql @@ -339,20 +339,6 @@ GO CREATE INDEX IDX_SND_EVENTSCACHE_CONTAINER ON snd.EventsCache(Container); GO -/* 21.xxx: Update PropertyValidator TypeURI for length validators on SND package properties */ - -UPDATE exp.PropertyValidator SET TypeURI = 'urn:lsid:labkey.com:PropertyValidator:textlength' -WHERE TypeURI = 'urn:lsid:labkey.com:PropertyValidator:length' - AND PropertyId IN ( - SELECT PropertyId - FROM exp.PropertyDescriptor - WHERE PropertyURI LIKE '%:package-snd%Package%' - ); -GO - -EXEC core.fn_dropifexists 'fGetSuperPkg', 'snd', 'FUNCTION'; -GO - CREATE FUNCTION snd.fGetSuperPkg ( @TopLevelPkgId INT ) RETURNS TABLE AS @@ -430,9 +416,6 @@ RETURN ); GO -EXEC core.fn_dropifexists 'fGetProjectItems','snd', 'FUNCTION'; -GO - CREATE FUNCTION [snd].[fGetProjectItems] ( @projectId INT , @@ -510,9 +493,6 @@ WITH CTE1 ( ProjectId, RevisionNum, ProjectItemId, ParentObjectId, ParentSupe ); GO -EXEC core.fn_dropifexists 'fGetAllSuperPkgs', 'snd', 'function'; -GO - CREATE FUNCTION snd.fGetAllSuperPkgs () RETURNS @expandedSuperPackages TABLE @@ -591,12 +571,6 @@ DEALLOCATE @loopCursor; END; GO -IF (OBJECT_ID(N'snd.ti_after_Events') IS NOT NULL) - BEGIN - DROP TRIGGER snd.ti_after_Events; - END; -GO - CREATE TRIGGER snd.ti_after_Events ON snd.Events FOR INSERT AS BEGIN SET NOCOUNT ON; From 93b23993819d3ba7c5b618623b7eeeaead366c20 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Mon, 6 Apr 2026 14:05:58 -0700 Subject: [PATCH 06/10] PostgreSQL script. Claim support for PostgreSQL (for now). --- snd/module.properties | 1 - .../dbscripts/postgresql/snd-0.000-25.000.sql | 538 ++++++++++++++++++ 2 files changed, 538 insertions(+), 1 deletion(-) create mode 100644 snd/resources/schemas/dbscripts/postgresql/snd-0.000-25.000.sql diff --git a/snd/module.properties b/snd/module.properties index 7fc96536a..0ba351e96 100644 --- a/snd/module.properties +++ b/snd/module.properties @@ -3,5 +3,4 @@ Label: Structured Narrative Datasets Description: Dynamically defined hierarchical datasets. License: Apache 2.0 LicenseURL: http://www.apache.org/licenses/LICENSE-2.0 -SupportedDatabases: mssql ManageVersion: true diff --git a/snd/resources/schemas/dbscripts/postgresql/snd-0.000-25.000.sql b/snd/resources/schemas/dbscripts/postgresql/snd-0.000-25.000.sql new file mode 100644 index 000000000..9575a5ed3 --- /dev/null +++ b/snd/resources/schemas/dbscripts/postgresql/snd-0.000-25.000.sql @@ -0,0 +1,538 @@ +/* + * Copyright (c) 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. + */ + +CREATE SCHEMA snd; + +/*==============================================================*/ +/* Table: Pkgs */ +/*==============================================================*/ +CREATE TABLE snd.Pkgs ( + PkgId INTEGER NOT NULL, + Description VARCHAR(4000) NOT NULL, + Narrative TEXT NULL, + Active BOOLEAN, + Repeatable BOOLEAN, + QcState INTEGER, + ObjectId ENTITYID NOT NULL DEFAULT gen_random_uuid(), + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created TIMESTAMP, + ModifiedBy USERID, + Modified TIMESTAMP, + Lsid LSIDType, + + CONSTRAINT PK_SND_PKGS PRIMARY KEY (PkgId), + CONSTRAINT FK_SND_PKGS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), + CONSTRAINT FK_SND_PKGS_QCSTATE FOREIGN KEY (QcState) REFERENCES core.DataStates (RowId) +); + +CREATE INDEX IDX_SND_PKGS_CONTAINER ON snd.Pkgs(Container); +CREATE INDEX IDX_SND_PKGS_QCSTATE ON snd.Pkgs(QcState); +CREATE INDEX IDX_SND_PKGS_LSID ON snd.Pkgs(Lsid); + +/*==============================================================*/ +/* Table: SuperPkgs */ +/*==============================================================*/ +CREATE TABLE snd.SuperPkgs ( + SuperPkgId INTEGER NOT NULL, + ParentSuperPkgId INTEGER, + PkgId INTEGER NOT NULL, + SuperPkgPath VARCHAR(900) NOT NULL, + SortOrder INTEGER, + Required BOOLEAN NOT NULL DEFAULT FALSE, + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created TIMESTAMP, + ModifiedBy USERID, + Modified TIMESTAMP, + Lsid LSIDType, + + CONSTRAINT PK_SND_SUPERPKGS PRIMARY KEY (SuperPkgId), + CONSTRAINT FK_SND_SUPERPKGS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), + CONSTRAINT FK_SND_SUPERPKGS_PKGID FOREIGN KEY (PkgId) REFERENCES snd.Pkgs (PkgId) +); + +CREATE INDEX IDX_SND_SUPERPKGS_CONTAINER ON snd.SuperPkgs(Container); +CREATE INDEX IDX_SND_SUPERPKGS_PKGID ON snd.SuperPkgs(PkgId); +CREATE INDEX IDX_SND_SUPERPKGS_LSID ON snd.SuperPkgs(Lsid); + +/*==============================================================*/ +/* Table: PkgCategories */ +/*==============================================================*/ +CREATE TABLE snd.PkgCategories ( + CategoryId INTEGER NOT NULL, + Description VARCHAR(4000) NOT NULL, + Comment VARCHAR(4000), + Active BOOLEAN NOT NULL, + SortOrder INTEGER, + ObjectId ENTITYID NOT NULL DEFAULT gen_random_uuid(), + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created TIMESTAMP, + ModifiedBy USERID, + Modified TIMESTAMP, + Lsid LSIDType, + + CONSTRAINT PK_SND_PKGCATEGORIES PRIMARY KEY (CategoryId), + CONSTRAINT FK_SND_PKGCATEGORIES_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) +); + +CREATE INDEX IDX_SND_PKGCATEGORIES_CONTAINER ON snd.PkgCategories(Container); +CREATE INDEX IDX_SND_PKGCATEGORIES_LSID ON snd.PkgCategories(Lsid); + +/*==============================================================*/ +/* Table: PkgCategoryJunction */ +/*==============================================================*/ +CREATE TABLE snd.PkgCategoryJunction ( + PkgId INTEGER NOT NULL, + CategoryId INTEGER NOT NULL, + ObjectId ENTITYID NOT NULL DEFAULT gen_random_uuid(), + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created TIMESTAMP, + ModifiedBy USERID, + Modified TIMESTAMP, + Lsid LSIDType, + + CONSTRAINT PK_SND_PKGCATEGORYJUNCTION PRIMARY KEY (PkgId, CategoryId), + CONSTRAINT FK_SND_PKGCATEGORYJUNCTION_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), + CONSTRAINT FK_SND_PKGCATEGORYJUNCTION_PKGID FOREIGN KEY (PkgId) REFERENCES snd.Pkgs (PkgId), + CONSTRAINT FK_SND_PKGCATEGORYJUNCTION_CATEGORYID FOREIGN KEY (CategoryId) REFERENCES snd.PkgCategories (CategoryId) +); + +CREATE INDEX IDX_SND_PKGCATEGORYJUNCTION_CONTAINER ON snd.PkgCategoryJunction(Container); +CREATE INDEX IDX_SND_PKGCATEGORYJUNCTION_PKGID ON snd.PkgCategoryJunction(PkgId); +CREATE INDEX IDX_SND_PKGCATEGORYJUNCTION_CATEGORYID ON snd.PkgCategoryJunction(CategoryId); +CREATE INDEX IDX_SND_PKGCATEGORYJUNCTION_LSID ON snd.PkgCategoryJunction(Lsid); + +/*==============================================================*/ +/* Table: Projects */ +/*==============================================================*/ +CREATE TABLE snd.Projects ( + ProjectId INTEGER NOT NULL, + RevisionNum INTEGER NOT NULL, + ReferenceId INTEGER NOT NULL, + StartDate DATE NOT NULL, + EndDate DATE, + Description VARCHAR(4000) NOT NULL, + Active BOOLEAN NOT NULL, + ObjectId ENTITYID NOT NULL DEFAULT gen_random_uuid(), + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created TIMESTAMP, + ModifiedBy USERID, + Modified TIMESTAMP, + Lsid LSIDType, + + CONSTRAINT PK_SND_PROJECTS PRIMARY KEY (ObjectId), + CONSTRAINT FK_SND_PROJECTS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) +); + +CREATE INDEX IDX_SND_PROJECTS_CONTAINER ON snd.Projects(Container); +CREATE UNIQUE INDEX IDX_SND_PROJECTS_PROJECTID_REVNUM ON snd.Projects(ProjectId, RevisionNum); + +/*==============================================================*/ +/* Table: ProjectItems */ +/*==============================================================*/ +CREATE TABLE snd.ProjectItems ( + ProjectItemId SERIAL, + ParentObjectId ENTITYID, + SuperPkgId INTEGER NOT NULL, + Active BOOLEAN NOT NULL DEFAULT TRUE, + ObjectId ENTITYID NOT NULL DEFAULT gen_random_uuid(), + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created TIMESTAMP, + ModifiedBy USERID, + Modified TIMESTAMP, + Lsid LSIDType, + + CONSTRAINT PK_SND_PROJECTITEMS PRIMARY KEY (ProjectItemId), + CONSTRAINT FK_SND_PROJECTITEMS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), + CONSTRAINT FK_SND_PROJECTITEMS_SUPERPKGID FOREIGN KEY (SuperPkgId) REFERENCES snd.SuperPkgs (SuperPkgId), + CONSTRAINT FK_SND_PROJECTITEMS_PARENTOBJECTID FOREIGN KEY (ParentObjectId) REFERENCES snd.Projects (ObjectId) +); + +CREATE INDEX IDX_SND_PROJECTITEMS_CONTAINER ON snd.ProjectItems(Container); +CREATE INDEX IDX_SND_PROJECTITEMS_SUPERPKGID ON snd.ProjectItems(SuperPkgId); +CREATE INDEX IDX_SND_PROJECTITEMS_PARENTOBJECTID ON snd.ProjectItems(ParentObjectId); +CREATE INDEX IDX_SND_PROJECTITEMS_LSID ON snd.ProjectItems(Lsid); + +/*==============================================================*/ +/* Table: Events */ +/*==============================================================*/ +CREATE TABLE snd.Events ( + EventId INTEGER NOT NULL, + SubjectId VARCHAR(32) NOT NULL, + ParentObjectId ENTITYID, + Date TIMESTAMP NOT NULL, + QcState INTEGER, + ObjectId ENTITYID NOT NULL DEFAULT gen_random_uuid(), + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created TIMESTAMP, + ModifiedBy USERID, + Modified TIMESTAMP, + Lsid LSIDType, + + CONSTRAINT PK_SND_EVENTS PRIMARY KEY (EventId), + CONSTRAINT FK_SND_EVENTS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), + CONSTRAINT FK_SND_EVENTS_QCSTATE FOREIGN KEY (QcState) REFERENCES core.DataStates (RowId), + CONSTRAINT FK_SND_EVENTS_PARENTOBJECTID FOREIGN KEY (ParentObjectId) REFERENCES snd.Projects (ObjectId) +); + +CREATE INDEX IDX_SND_EVENTS_CONTAINER ON snd.Events(Container); +CREATE INDEX IDX_SND_EVENTS_QCSTATE ON snd.Events(QcState); +CREATE INDEX IDX_SND_EVENTS_PARENTOBJECTID ON snd.Events(ParentObjectId); +CREATE INDEX IDX_SND_EVENTS_LSID ON snd.Events(Lsid); +CREATE INDEX IDX_SND_EVENTS_SUBJECTID_DATE ON snd.Events (SubjectId ASC, Date DESC); + +/*==============================================================*/ +/* Table: EventNotes */ +/*==============================================================*/ +CREATE TABLE snd.EventNotes ( + EventNoteId SERIAL NOT NULL, + EventId INTEGER, + Note TEXT NOT NULL, + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created TIMESTAMP, + ModifiedBy USERID, + Modified TIMESTAMP, + Lsid LSIDType, + + CONSTRAINT PK_SND_EVENTNOTES PRIMARY KEY (EventNoteId), + CONSTRAINT FK_SND_EVENTNOTES_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), + CONSTRAINT FK_SND_EVENTNOTES_EVENTID FOREIGN KEY (EventId) REFERENCES snd.Events (EventId) +); + +CREATE INDEX IDX_SND_EVENTNOTES_CONTAINER ON snd.EventNotes(Container); +CREATE INDEX IDX_SND_EVENTNOTES_EVENTNOTEID ON snd.EventNotes(EventNoteId); + +/*==============================================================*/ +/* Table: LookupSets */ +/*==============================================================*/ +CREATE TABLE snd.LookupSets ( + LookupSetId SERIAL NOT NULL, + SetName VARCHAR(128) NOT NULL, + Label VARCHAR(128), + Description VARCHAR(900), + ObjectId ENTITYID NOT NULL DEFAULT gen_random_uuid(), + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created TIMESTAMP, + ModifiedBy USERID, + Modified TIMESTAMP, + Lsid LSIDType, + + CONSTRAINT PK_SND_LOOKUPSETS PRIMARY KEY (LookupSetId), + CONSTRAINT FK_SND_LOOKUPSETS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) +); + +CREATE INDEX IDX_SND_LOOKUPSETS_CONTAINER ON snd.LookupSets(Container); +CREATE UNIQUE INDEX idx_snd_lookupSets_objectid ON snd.LookupSets(ObjectId); +CREATE UNIQUE INDEX IDX_LookupSets_SetName ON snd.LookupSets(SetName); + +/*==============================================================*/ +/* Table: Lookups */ +/*==============================================================*/ +CREATE TABLE snd.Lookups ( + LookupId SERIAL NOT NULL, + LookupSetId INTEGER NOT NULL, + Value VARCHAR(446) NOT NULL, + Displayable BOOLEAN NOT NULL, + SortOrder INTEGER, + ObjectId ENTITYID NOT NULL DEFAULT gen_random_uuid(), + Container ENTITYID NOT NULL, + CreatedBy USERID, + Created TIMESTAMP, + ModifiedBy USERID, + Modified TIMESTAMP, + Lsid LSIDType, + + CONSTRAINT PK_SND_LOOKUPS PRIMARY KEY (LookupId), + CONSTRAINT FK_SND_LOOKUPS_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), + CONSTRAINT FK_SND_LOOKUPS_LOOKUPSETID FOREIGN KEY (LookupSetId) REFERENCES snd.LookupSets (LookupSetId) +); + +CREATE INDEX IDX_SND_LOOKUPS_CONTAINER ON snd.Lookups(Container); +CREATE INDEX IDX_SND_LOOKUPS_LOOKUPSETID ON snd.Lookups(LookupSetId); +CREATE UNIQUE INDEX IDX_SND_LOOKUPS_LOOKUPSETID_VALUE ON snd.Lookups(LookupSetId, Value); +CREATE UNIQUE INDEX idx_snd_lookups_objectid ON snd.Lookups(ObjectId); + +/*==============================================================*/ +/* Table: EventData */ +/*==============================================================*/ +CREATE TABLE snd.EventData ( + EventDataId INTEGER NOT NULL, + EventId INTEGER NOT NULL, + SuperPkgId INTEGER NOT NULL, + ObjectURI LSIDType NOT NULL, + ParentEventDataId INTEGER, + SortOrder INTEGER NULL, + Container ENTITYID NOT NULL, + Lsid LSIDType, + + CONSTRAINT PK_SND_EVENTDATA PRIMARY KEY (EventDataId), + CONSTRAINT FK_SND_EVENTDATA_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId), + CONSTRAINT FK_SND_EVENTDATA_EVENTID FOREIGN KEY (EventId) REFERENCES snd.Events (EventId), + CONSTRAINT FK_SND_EVENTDATA_SUPERPKGID FOREIGN KEY (SuperPkgId) REFERENCES snd.SuperPkgs (SuperPkgId) +); + +CREATE INDEX IDX_SND_EVENTDATA_SUPERPKGID ON snd.EventData(SuperPkgId); +CREATE INDEX IDX_SND_EVENTDATA_EVENTID ON snd.EventData(EventId); + +/*==============================================================*/ +/* Table: EventsCache */ +/*==============================================================*/ +CREATE TABLE snd.EventsCache ( + EventId INTEGER NOT NULL, + HtmlNarrative TEXT, + Container ENTITYID, + + CONSTRAINT PK_SND_EVENTS_CACHE PRIMARY KEY (EventId), + CONSTRAINT FK_EVENTSCACHE_EVENTID FOREIGN KEY (EventId) REFERENCES snd.Events (EventId), + CONSTRAINT FK_SND_EVENTSCACHE_CONTAINER FOREIGN KEY (Container) REFERENCES core.Containers (EntityId) +); + +CREATE INDEX IDX_SND_EVENTSCACHE_CONTAINER ON snd.EventsCache(Container); + +-- ========================================================================================== +-- Function: fGetSuperPkg +-- Author: Terry Hawkins +-- Creation date: 9/22/2017 +-- Description: Table valued function to return hierarchical view of a superPkg +-- ========================================================================================== +-- NOTE: ROW_NUMBER() OVER (...) cannot be used in the recursive term of WITH RECURSIVE in +-- PostgreSQL. The TreePath is computed using SortOrder directly, which preserves ordering +-- semantics while remaining compatible with PostgreSQL's recursive CTE restrictions. +-- ========================================================================================== +CREATE FUNCTION snd.fGetSuperPkg(_pkgId INT) +RETURNS TABLE ( + TopLevelPkgId INTEGER, + SuperPkgId INTEGER, + ParentSuperPkgId INTEGER, + PkgId INTEGER, + TreePath VARCHAR, + SuperPkgPath VARCHAR, + SortOrder INTEGER, + Required BOOLEAN, + Description VARCHAR, + Narrative TEXT, + Active BOOLEAN, + Repeatable BOOLEAN, + Level INTEGER +) +LANGUAGE sql AS $$ + WITH RECURSIVE CTE1 (TopLevelPkgId, SuperPkgId, ParentSuperPkgId, PkgId, TreePath, SuperPkgPath, SortOrder, Required, Description, Narrative, Active, Repeatable, Level) AS ( + + -- anchor member + SELECT _pkgId::INTEGER AS TopLevelPkgId, + sp.SuperPkgId, + sp.ParentSuperPkgId, + sp.PkgId, + RIGHT(REPEAT(' ', 3) || COALESCE(sp.SortOrder, 0)::VARCHAR, 3) AS TreePath, + sp.SuperPkgPath, + sp.SortOrder, + sp.Required, + p.Description, + p.Narrative, + p.Active, + p.Repeatable, + 1 AS Level + FROM snd.SuperPkgs sp + INNER JOIN snd.Pkgs p ON sp.PkgId = p.PkgId + WHERE sp.PkgId = _pkgId + AND sp.ParentSuperPkgId IS NULL + + UNION ALL + + -- recursive member + SELECT _pkgId::INTEGER AS TopLevelPkgId, + sp.SuperPkgId, + c.SuperPkgId AS ParentSuperPkgId, + sp.PkgId, + c.TreePath || '/' || RIGHT(REPEAT(' ', 3) || COALESCE(sp.SortOrder, 0)::VARCHAR, 3) AS TreePath, + sp.SuperPkgPath, + sp.SortOrder, + sp.Required, + p.Description, + p.Narrative, + p.Active, + p.Repeatable, + c.Level + 1 AS Level + FROM snd.SuperPkgs AS sp + INNER JOIN CTE1 AS c ON + sp.ParentSuperPkgId = c.SuperPkgId + OR sp.ParentSuperPkgId IN ( + SELECT sp2.SuperPkgId + FROM snd.SuperPkgs AS sp2 + WHERE c.PkgId = sp2.PkgId + AND sp2.ParentSuperPkgId IS NULL) + INNER JOIN snd.Pkgs AS p ON sp.PkgId = p.PkgId + ) + SELECT _pkgId::INTEGER AS TopLevelPkgId, + c.SuperPkgId, + c.ParentSuperPkgId, + c.PkgId, + c.TreePath, + c.SuperPkgPath, + c.SortOrder, + c.Required, + c.Description, + c.Narrative, + c.Active, + c.Repeatable, + c.Level + FROM CTE1 c; +$$; + +-- ========================================================================================== +-- Function: fGetProjectItems +-- Author: Terry Hawkins +-- Creation date: 12/14/2017 +-- Description: Returns the list of ProjectItems for a Project/Revision along with +-- sub packages for each ProjectItem +-- ========================================================================================== +CREATE FUNCTION snd.fGetProjectItems(_projectId INT, _revisionNum INT) +RETURNS TABLE ( + ProjectId INTEGER, + RevisionNum INTEGER, + ProjectItemId INTEGER, + SuperPkgId INTEGER, + PkgId INTEGER, + TreePath VARCHAR, + Level INTEGER, + ProjectActive BOOLEAN, + Active BOOLEAN, + Description VARCHAR +) +LANGUAGE sql AS $$ + WITH RECURSIVE CTE1 (ProjectId, RevisionNum, ProjectItemId, ParentObjectId, ParentSuperPkgId, SuperPkgId, PkgId, ProjectActive, Active, TreePath, Level, Description) AS ( + + -- anchor member + SELECT _projectId::INTEGER AS ProjectId, + _revisionNum::INTEGER AS RevisionNum, + pi.ProjectItemId, + pi.ParentObjectId, + sp.ParentSuperPkgId, + sp.SuperPkgId, + sp.PkgId, + p.Active AS ProjectActive, + pi.Active, + RIGHT(REPEAT(' ', 3) || COALESCE(sp.SuperPkgId, 0)::VARCHAR, 3) AS TreePath, + 1 AS Level, + pkg.Description + FROM snd.ProjectItems AS pi + INNER JOIN snd.Projects AS p ON pi.ParentObjectId = p.ObjectId + INNER JOIN snd.SuperPkgs AS sp ON pi.SuperPkgId = sp.SuperPkgId + INNER JOIN snd.Pkgs pkg ON sp.PkgId = pkg.PkgId + WHERE p.ProjectId = _projectId + AND p.RevisionNum = _revisionNum + + UNION ALL + + -- recursive member + SELECT c.ProjectId, + c.RevisionNum, + c.ProjectItemId, + c.ParentObjectId, + sp.ParentSuperPkgId, + sp.SuperPkgId, + sp.PkgId, + c.ProjectActive, + c.Active, + c.TreePath || '/' || RIGHT(REPEAT(' ', 3) || COALESCE(sp.SortOrder, 0)::VARCHAR, 3) AS TreePath, + c.Level + 1 AS Level, + pkg.Description + FROM snd.SuperPkgs AS sp + INNER JOIN snd.Pkgs AS pkg ON sp.PkgId = pkg.PkgId + INNER JOIN CTE1 AS c ON + sp.ParentSuperPkgId = c.SuperPkgId + OR sp.ParentSuperPkgId IN ( + SELECT sp2.SuperPkgId + FROM snd.SuperPkgs AS sp2 + WHERE c.PkgId = sp2.PkgId + AND sp2.ParentSuperPkgId IS NULL) + ) + SELECT _projectId::INTEGER AS ProjectId, + _revisionNum::INTEGER AS RevisionNum, + c.ProjectItemId, + c.SuperPkgId, + c.PkgId, + c.TreePath, + c.Level, + c.ProjectActive, + c.Active, + c.Description + FROM CTE1 c; +$$; + +-- ========================================================================================== +-- Function: fGetAllSuperPkgs +-- Description: Returns the full expanded super-package hierarchy for all top-level packages. +-- Uses CROSS JOIN LATERAL instead of a cursor loop for idiomatic PostgreSQL. +-- ========================================================================================== +CREATE FUNCTION snd.fGetAllSuperPkgs() +RETURNS TABLE ( + TopLevelPkgId INTEGER, + SuperPkgId INTEGER, + ParentSuperPkgId INTEGER, + PkgId INTEGER, + TreePath VARCHAR, + SuperPkgPath VARCHAR, + SortOrder INTEGER, + Required BOOLEAN, + Description VARCHAR, + Narrative TEXT, + Active BOOLEAN, + Repeatable BOOLEAN, + Level INTEGER +) +LANGUAGE sql AS $$ + SELECT g.* + FROM snd.SuperPkgs AS tl + CROSS JOIN LATERAL snd.fGetSuperPkg(tl.PkgId) AS g + WHERE tl.ParentSuperPkgId IS NULL; +$$; + +-- ========================================================================================== +-- Trigger: ti_after_events +-- Description: On INSERT, sets QcState to the container-scoped 'Completed' state when +-- QcState is not supplied. Implemented as a BEFORE INSERT trigger so that +-- NEW can be modified before the row is written. +-- ========================================================================================== +CREATE FUNCTION snd.ti_after_events_fn() + RETURNS trigger + LANGUAGE plpgsql AS $$ +BEGIN + IF NEW.QcState IS NULL THEN + NEW.QcState := ( + SELECT q.RowId + FROM core.DataStates AS q + WHERE q.Label = 'Completed' + AND q.Container = NEW.Container + ORDER BY q.RowId + LIMIT 1 + ); + END IF; + RETURN NEW; +END; +$$; + +CREATE TRIGGER ti_after_events + BEFORE INSERT ON snd.Events + FOR EACH ROW EXECUTE PROCEDURE snd.ti_after_events_fn(); From 6f62a96dd2375dc3ce5f14ed57d0c473ca45793b Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Mon, 6 Apr 2026 14:38:24 -0700 Subject: [PATCH 07/10] Support PostgreSQL (kind of) --- snd/test/src/org/labkey/test/tests/snd/SNDTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/snd/test/src/org/labkey/test/tests/snd/SNDTest.java b/snd/test/src/org/labkey/test/tests/snd/SNDTest.java index d72f6e327..d3af1937a 100644 --- a/snd/test/src/org/labkey/test/tests/snd/SNDTest.java +++ b/snd/test/src/org/labkey/test/tests/snd/SNDTest.java @@ -61,7 +61,6 @@ import org.labkey.test.util.Maps; import org.labkey.test.util.OptionalFeatureHelper; import org.labkey.test.util.PortalHelper; -import org.labkey.test.util.SqlserverOnlyTest; import org.labkey.test.util.StudyHelper; import org.labkey.test.util.core.webdav.WebDavUploadHelper; import org.openqa.selenium.support.ui.ExpectedConditions; @@ -89,7 +88,7 @@ @Category ({Git.class}) @BaseWebDriverTest.ClassTimeout(minutes = 15) -public class SNDTest extends BaseWebDriverTest implements SqlserverOnlyTest +public class SNDTest extends BaseWebDriverTest { private static final String PROJECTNAME = "SNDTest Project"; private static final String TEST1SUBFOLDER = "Test1"; From cbe19dc75fb41c97c67bc3dc18d2d15c0adb7865 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Mon, 6 Apr 2026 17:06:40 -0700 Subject: [PATCH 08/10] Active=1 won't fly on PostgreSQL; use a parameter --- snd/src/org/labkey/snd/CategoryUserSchema.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/snd/src/org/labkey/snd/CategoryUserSchema.java b/snd/src/org/labkey/snd/CategoryUserSchema.java index f1648836c..dd48ccc66 100644 --- a/snd/src/org/labkey/snd/CategoryUserSchema.java +++ b/snd/src/org/labkey/snd/CategoryUserSchema.java @@ -38,7 +38,9 @@ public Set getSchemaNames() @Override public Set getTableNames() { - var sql = new SQLFragment("SELECT Description FROM snd.PkgCategories WHERE Active=1 AND Container=").appendValue(getContainer()); + var sql = new SQLFragment("SELECT Description FROM snd.PkgCategories WHERE Active = ? AND Container = ?") + .add(true) + .add(getContainer()); List list = new SqlSelector(getDbSchema(), sql).getArrayList(String.class); // check for duplicates @@ -55,8 +57,10 @@ public Set getTableNames() @Override public @Nullable TableInfo createTable(String name, ContainerFilter cf) { - var sql = new SQLFragment("SELECT CategoryId, Description FROM snd.PkgCategories WHERE Active=1 AND Container=").appendValue(getContainer()) - .append(" AND lower(description) = lower(").appendValue(name).append(")"); + var sql = new SQLFragment("SELECT CategoryId, Description FROM snd.PkgCategories WHERE Active = ? AND Container = ?") + .add(true) + .add(getContainer()) + .append(" AND lower(description) = lower(").appendValue(name).append(")"); Map[] rs = new SqlSelector(getDbSchema(), sql).getMapArray(); if (rs.length != 1) return null; From 298ee9c48df0757949d0f60db5005281da48f9b3 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Mon, 6 Apr 2026 18:19:01 -0700 Subject: [PATCH 09/10] Pass a Date object --- snd/src/org/labkey/snd/SNDManager.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/snd/src/org/labkey/snd/SNDManager.java b/snd/src/org/labkey/snd/SNDManager.java index 46803cc1e..f73285baa 100644 --- a/snd/src/org/labkey/snd/SNDManager.java +++ b/snd/src/org/labkey/snd/SNDManager.java @@ -1554,7 +1554,8 @@ public void createProject(Container c, User u, Project project, BatchValidationE */ //TODO: Use QUS to update columns - pass Project.objectId - private void updateProjectField(Container c, User u, int id, int rev, String field, String value) + // Note: EndDate is the only field that's updated with this + private void updateProjectField(Container c, User u, int id, int rev, String field, Object value) { UserSchema schema = getSndUserSchema(c, u); @@ -1578,7 +1579,7 @@ public void reviseProject(Container c, User u, Project project, BatchValidationE List> updatedProjectItems = new ArrayList<>(); updateProjectField(c, u, project.getProjectId(), project.getRevisionNum(), "EndDate", - project.getEndDateRevised() == null ? null : DateUtil.toISO(project.getEndDateRevised())); + project.getEndDateRevised() == null ? null : project.getEndDateRevised()); if (project.isCopyRevisedPkgs()) { From e87c52f57cc0d8b255f11f677f45b9aff92efc0f Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Tue, 7 Apr 2026 07:34:16 -0700 Subject: [PATCH 10/10] Still need to support SQL Server --- snd/module.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/snd/module.properties b/snd/module.properties index 0ba351e96..35cf9cb92 100644 --- a/snd/module.properties +++ b/snd/module.properties @@ -3,4 +3,5 @@ Label: Structured Narrative Datasets Description: Dynamically defined hierarchical datasets. License: Apache 2.0 LicenseURL: http://www.apache.org/licenses/LICENSE-2.0 +SupportedDatabases: mssql, pgsql ManageVersion: true