From f83560e422913e32d70e368102db999bf0bbf74f Mon Sep 17 00:00:00 2001 From: Anil Mahajan Date: Tue, 31 Oct 2023 19:37:48 +0530 Subject: [PATCH] Removes Sql Schema Versions (7,8,9,10) --- .../Features/Schema/Migrations/10.sql | 2865 ----------------- .../Features/Schema/Migrations/7.sql | 1943 ----------- .../Features/Schema/Migrations/8.sql | 2721 ---------------- .../Features/Schema/Migrations/9.sql | 2865 ----------------- .../CompartmentAssignmentV1RowGenerator.cs | 98 - .../DateTimeSearchParameterV1RowGenerator.cs | 45 - .../NumberSearchParameterV1RowGenerator.cs | 31 - .../QuantitySearchParameterV1RowGenerator.cs | 33 - .../ReferenceSearchParameterV2RowGenerator.cs | 30 - ...nCompositeSearchParameterV2RowGenerator.cs | 47 - .../ResourceWriteClaimV1RowGenerator.cs | 30 - .../StringSearchParameterV1RowGenerator.cs | 40 - ...eCompositeSearchParameterV1RowGenerator.cs | 43 - ...rCompositeSearchParameterV1RowGenerator.cs | 49 - ...yCompositeSearchParameterV1RowGenerator.cs | 45 - .../TokenSearchParameterV1RowGenerator.cs | 41 - ...gCompositeSearchParameterV1RowGenerator.cs | 42 - .../TokenTextSearchParameterV1RowGenerator.cs | 30 - ...nCompositeSearchParameterV1RowGenerator.cs | 40 - .../UriSearchParameterV1RowGenerator.cs | 24 - 20 files changed, 11062 deletions(-) delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Schema/Migrations/10.sql delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Schema/Migrations/7.sql delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Schema/Migrations/8.sql delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Schema/Migrations/9.sql delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/CompartmentAssignmentV1RowGenerator.cs delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/DateTimeSearchParameterV1RowGenerator.cs delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/NumberSearchParameterV1RowGenerator.cs delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/QuantitySearchParameterV1RowGenerator.cs delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/ReferenceSearchParameterV2RowGenerator.cs delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/ReferenceTokenCompositeSearchParameterV2RowGenerator.cs delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/ResourceWriteClaimV1RowGenerator.cs delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/StringSearchParameterV1RowGenerator.cs delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenDateTimeCompositeSearchParameterV1RowGenerator.cs delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenNumberNumberCompositeSearchParameterV1RowGenerator.cs delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenQuantityCompositeSearchParameterV1RowGenerator.cs delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenSearchParameterV1RowGenerator.cs delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenStringCompositeSearchParameterV1RowGenerator.cs delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenTextSearchParameterV1RowGenerator.cs delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenTokenCompositeSearchParameterV1RowGenerator.cs delete mode 100644 src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/UriSearchParameterV1RowGenerator.cs diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Schema/Migrations/10.sql b/src/Microsoft.Health.Fhir.SqlServer/Features/Schema/Migrations/10.sql deleted file mode 100644 index 65e1926e00..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Schema/Migrations/10.sql +++ /dev/null @@ -1,2865 +0,0 @@ --- Style guide: please see: https://github.com/ktaranov/sqlserver-kit/blob/master/SQL%20Server%20Name%20Convention%20and%20T-SQL%20Programming%20Style.md - -/************************************************************* - Schema Version -**************************************************************/ - -INSERT INTO dbo.SchemaVersion -VALUES - (10, 'started') - -GO - -/************************************************************* - Migration progress -**************************************************************/ - -CREATE TABLE dbo.SchemaMigrationProgress -( - Timestamp datetime2(3) default CURRENT_TIMESTAMP, - Message nvarchar(max) -) - -GO - -CREATE PROCEDURE dbo.LogSchemaMigrationProgress - @message varchar(max) -AS - INSERT INTO dbo.SchemaMigrationProgress (Message) VALUES (@message) -GO - -/************************************************************* - Partitioning function and scheme -**************************************************************/ - -CREATE PARTITION FUNCTION PartitionFunction_ResourceTypeId (smallint) -AS RANGE RIGHT FOR VALUES (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150); - -CREATE PARTITION SCHEME PartitionScheme_ResourceTypeId -AS PARTITION PartitionFunction_ResourceTypeId ALL TO ([PRIMARY]); - -/************************************************************* - Model tables -**************************************************************/ - -CREATE TABLE dbo.SearchParam -( - SearchParamId smallint IDENTITY(1,1) NOT NULL, - Uri varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - Status varchar(10) NULL, - LastUpdated datetimeoffset(7) NULL, - IsPartiallySupported bit NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_SearchParam ON dbo.SearchParam -( - Uri -) - -CREATE TABLE dbo.ResourceType -( - ResourceTypeId smallint IDENTITY(1,1) NOT NULL, - Name nvarchar(50) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_ResourceType on dbo.ResourceType -( - Name -) - --- Create System and QuantityCode tables - -CREATE TABLE dbo.System -( - SystemId int IDENTITY(1,1) NOT NULL, - Value nvarchar(256) NOT NULL, -) - -CREATE UNIQUE CLUSTERED INDEX IXC_System ON dbo.System -( - Value -) - -CREATE TABLE dbo.QuantityCode -( - QuantityCodeId int IDENTITY(1,1) NOT NULL, - Value nvarchar(256) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_QuantityCode on dbo.QuantityCode -( - Value -) - -/************************************************************* - Resource table -**************************************************************/ - -CREATE TABLE dbo.Resource -( - ResourceTypeId smallint NOT NULL, - ResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - Version int NOT NULL, - IsHistory bit NOT NULL, - ResourceSurrogateId bigint NOT NULL, - IsDeleted bit NOT NULL, - RequestMethod varchar(10) NULL, - RawResource varbinary(max) NOT NULL, - IsRawResourceMetaSet bit NOT NULL DEFAULT 0, - SearchParamHash varchar(64) NULL -) - -ALTER TABLE dbo.Resource SET ( LOCK_ESCALATION = AUTO ) - -CREATE UNIQUE CLUSTERED INDEX IXC_Resource ON dbo.Resource -( - ResourceTypeId, - ResourceSurrogateId -) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - - -CREATE UNIQUE NONCLUSTERED INDEX IX_Resource_ResourceTypeId_ResourceId_Version ON dbo.Resource -( - ResourceTypeId, - ResourceId, - Version -) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE UNIQUE NONCLUSTERED INDEX IX_Resource_ResourceTypeId_ResourceId ON dbo.Resource -( - ResourceTypeId, - ResourceId -) -INCLUDE -- We want the query in UpsertResource, which is done with UPDLOCK AND HOLDLOCK, to not require a key lookup -( - Version, - IsDeleted -) -WHERE IsHistory = 0 -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE UNIQUE NONCLUSTERED INDEX IX_Resource_ResourceTypeId_ResourceSurrgateId ON dbo.Resource -( - ResourceTypeId, - ResourceSurrogateId -) -WHERE IsHistory = 0 AND IsDeleted = 0 -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_Resource_ResourceSurrogateId ON dbo.Resource -( - ResourceSurrogateId -) -ON [Primary] - -/************************************************************* - Capture claims on write -**************************************************************/ - -CREATE TABLE dbo.ClaimType -( - ClaimTypeId tinyint IDENTITY(1,1) NOT NULL, - Name varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_Claim on dbo.ClaimType -( - Name -) - -CREATE TYPE dbo.BulkResourceWriteClaimTableType_1 AS TABLE -( - Offset int NOT NULL, - ClaimTypeId tinyint NOT NULL, - ClaimValue nvarchar(128) NOT NULL -) - -CREATE TABLE dbo.ResourceWriteClaim -( - ResourceSurrogateId bigint NOT NULL, - ClaimTypeId tinyint NOT NULL, - ClaimValue nvarchar(128) NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_ResourceWriteClaim on dbo.ResourceWriteClaim -( - ResourceSurrogateId, - ClaimTypeId -) - -/************************************************************* - Compartments -**************************************************************/ - -CREATE TABLE dbo.CompartmentType -( - CompartmentTypeId tinyint IDENTITY(1,1) NOT NULL, - Name varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_CompartmentType on dbo.CompartmentType -( - Name -) - -CREATE TYPE dbo.BulkCompartmentAssignmentTableType_1 AS TABLE -( - Offset int NOT NULL, - CompartmentTypeId tinyint NOT NULL, - ReferenceResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.CompartmentAssignment -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - CompartmentTypeId tinyint NOT NULL, - ReferenceResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL, -) - -ALTER TABLE dbo.CompartmentAssignment SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_CompartmentAssignment -ON dbo.CompartmentAssignment -( - ResourceTypeId, - ResourceSurrogateId, - CompartmentTypeId, - ReferenceResourceId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_CompartmentAssignment_CompartmentTypeId_ReferenceResourceId -ON dbo.CompartmentAssignment -( - ResourceTypeId, - CompartmentTypeId, - ReferenceResourceId, - ResourceSurrogateId -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Reference Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkReferenceSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - BaseUri varchar(128) COLLATE Latin1_General_100_CS_AS NULL, - ReferenceResourceTypeId smallint NULL, - ReferenceResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ReferenceResourceVersion int NULL -) - -CREATE TABLE dbo.ReferenceSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - BaseUri varchar(128) COLLATE Latin1_General_100_CS_AS NULL, - ReferenceResourceTypeId smallint NULL, - ReferenceResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ReferenceResourceVersion int NULL, - IsHistory bit NOT NULL, -) - -ALTER TABLE dbo.ReferenceSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_ReferenceSearchParam -ON dbo.ReferenceSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_ReferenceSearchParam_SearchParamId_ReferenceResourceTypeId_ReferenceResourceId_BaseUri_ReferenceResourceVersion -ON dbo.ReferenceSearchParam -( - ResourceTypeId, - SearchParamId, - ReferenceResourceId, - ReferenceResourceTypeId, - BaseUri, - ResourceSurrogateId -) -INCLUDE -( - ReferenceResourceVersion -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Token Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkTokenSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId int NULL, - Code varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.TokenSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId int NULL, - Code varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL, -) - -ALTER TABLE dbo.TokenSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_TokenSearchParam -ON dbo.TokenSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenSeachParam_SearchParamId_Code_SystemId -ON dbo.TokenSearchParam -( - ResourceTypeId, - SearchParamId, - Code, - ResourceSurrogateId -) -INCLUDE -( - SystemId -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Token Text -**************************************************************/ - -CREATE TYPE dbo.BulkTokenTextTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - Text nvarchar(400) COLLATE Latin1_General_CI_AI NOT NULL -) - -CREATE TABLE dbo.TokenText -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - Text nvarchar(400) COLLATE Latin1_General_CI_AI NOT NULL, - IsHistory bit NOT NULL -) - -ALTER TABLE dbo.TokenText SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_TokenText -ON dbo.TokenText -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenText_SearchParamId_Text -ON dbo.TokenText -( - ResourceTypeId, - SearchParamId, - Text, - ResourceSurrogateId -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - String Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkStringSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - Text nvarchar(256) COLLATE Latin1_General_100_CI_AI_SC NOT NULL, - TextOverflow nvarchar(max) COLLATE Latin1_General_100_CI_AI_SC NULL -) - -CREATE TABLE dbo.StringSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - Text nvarchar(256) COLLATE Latin1_General_100_CI_AI_SC NOT NULL, - TextOverflow nvarchar(max) COLLATE Latin1_General_100_CI_AI_SC NULL, - IsHistory bit NOT NULL -) - -ALTER TABLE dbo.StringSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_StringSearchParam -ON dbo.StringSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_StringSearchParam_SearchParamId_Text -ON dbo.StringSearchParam -( - ResourceTypeId, - SearchParamId, - Text, - ResourceSurrogateId -) -INCLUDE -( - TextOverflow -- will not be needed when all servers are targeting at least this version. -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_StringSearchParam_SearchParamId_TextWithOverflow -ON dbo.StringSearchParam -( - ResourceTypeId, - SearchParamId, - Text, - ResourceSurrogateId -) -WHERE IsHistory = 0 AND TextOverflow IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - URI Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkUriSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - Uri varchar(256) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.UriSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - Uri varchar(256) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL -) - -ALTER TABLE dbo.UriSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_UriSearchParam -ON dbo.UriSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_UriSearchParam_SearchParamId_Uri -ON dbo.UriSearchParam -( - ResourceTypeId, - SearchParamId, - Uri, - ResourceSurrogateId -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - - -/************************************************************* - Number Search Param -**************************************************************/ - --- We support the underlying value being a range, though we expect the vast majority of entries to be a single value. --- Either: --- (1) SingleValue is not null and LowValue and HighValue are both null, or --- (2) SingleValue is null and LowValue and HighValue are both not null --- We make use of filtered nonclustered indexes to keep queries over the ranges limited to those rows that actually have ranges - -CREATE TYPE dbo.BulkNumberSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SingleValue decimal(18,6) NULL, - LowValue decimal(18,6) NULL, - HighValue decimal(18,6) NULL -) - -CREATE TABLE dbo.NumberSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SingleValue decimal(18,6) NULL, - LowValue decimal(18,6) SPARSE NULL, - HighValue decimal(18,6) SPARSE NULL, - IsHistory bit NOT NULL -) - -ALTER TABLE dbo.NumberSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_NumberSearchParam -ON dbo.NumberSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_NumberSearchParam_SearchParamId_SingleValue -ON dbo.NumberSearchParam -( - ResourceTypeId, - SearchParamId, - SingleValue, - ResourceSurrogateId -) -WHERE IsHistory = 0 AND SingleValue IS NOT NULL -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_NumberSearchParam_SearchParamId_LowValue_HighValue -ON dbo.NumberSearchParam -( - ResourceTypeId, - SearchParamId, - LowValue, - HighValue, - ResourceSurrogateId -) -WHERE IsHistory = 0 AND LowValue IS NOT NULL -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_NumberSearchParam_SearchParamId_HighValue_LowValue -ON dbo.NumberSearchParam -( - ResourceTypeId, - SearchParamId, - HighValue, - LowValue, - ResourceSurrogateId -) -WHERE IsHistory = 0 AND LowValue IS NOT NULL -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Quantity Search Param -**************************************************************/ - --- See comment above for number search params for how we store ranges - -CREATE TYPE dbo.BulkQuantitySearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId int NULL, - QuantityCodeId int NULL, - SingleValue decimal(18,6) NULL, - LowValue decimal(18,6) NULL, - HighValue decimal(18,6) NULL -) - -CREATE TABLE dbo.QuantitySearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId int NULL, - QuantityCodeId int NULL, - SingleValue decimal(18,6) NULL, - LowValue decimal(18,6) SPARSE NULL, - HighValue decimal(18,6) SPARSE NULL, - IsHistory bit NOT NULL -) - -ALTER TABLE dbo.QuantitySearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_QuantitySearchParam -ON dbo.QuantitySearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_QuantitySearchParam_SearchParamId_QuantityCodeId_SingleValue -ON dbo.QuantitySearchParam -( - ResourceTypeId, - SearchParamId, - QuantityCodeId, - SingleValue, - ResourceSurrogateId -) -INCLUDE -( - SystemId -) -WHERE IsHistory = 0 AND SingleValue IS NOT NULL -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_QuantitySearchParam_SearchParamId_QuantityCodeId_LowValue_HighValue -ON dbo.QuantitySearchParam -( - ResourceTypeId, - SearchParamId, - QuantityCodeId, - LowValue, - HighValue, - ResourceSurrogateId -) -INCLUDE -( - SystemId -) -WHERE IsHistory = 0 AND LowValue IS NOT NULL -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_QuantitySearchParam_SearchParamId_QuantityCodeId_HighValue_LowValue -ON dbo.QuantitySearchParam -( - ResourceTypeId, - SearchParamId, - QuantityCodeId, - HighValue, - LowValue, - ResourceSurrogateId -) -INCLUDE -( - SystemId -) -WHERE IsHistory = 0 AND LowValue IS NOT NULL -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Date Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkDateTimeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - StartDateTime datetimeoffset(7) NOT NULL, - EndDateTime datetimeoffset(7) NOT NULL, - IsLongerThanADay bit NOT NULL -) - -CREATE TABLE dbo.DateTimeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - StartDateTime datetime2(7) NOT NULL, - EndDateTime datetime2(7) NOT NULL, - IsLongerThanADay bit NOT NULL, - IsHistory bit NOT NULL -) - -ALTER TABLE dbo.DateTimeSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_DateTimeSearchParam -ON dbo.DateTimeSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_DateTimeSearchParam_SearchParamId_StartDateTime_EndDateTime -ON dbo.DateTimeSearchParam -( - ResourceTypeId, - SearchParamId, - StartDateTime, - EndDateTime, - ResourceSurrogateId -) -INCLUDE -( - IsLongerThanADay -) -WHERE IsHistory = 0 -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_DateTimeSearchParam_SearchParamId_EndDateTime_StartDateTime -ON dbo.DateTimeSearchParam -( - ResourceTypeId, - SearchParamId, - EndDateTime, - StartDateTime, - ResourceSurrogateId -) -INCLUDE -( - IsLongerThanADay -) -WHERE IsHistory = 0 -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_DateTimeSearchParam_SearchParamId_StartDateTime_EndDateTime_Long -ON dbo.DateTimeSearchParam -( - ResourceTypeId, - SearchParamId, - StartDateTime, - EndDateTime, - ResourceSurrogateId -) -WHERE IsHistory = 0 AND IsLongerThanADay = 1 -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_DateTimeSearchParam_SearchParamId_EndDateTime_StartDateTime_Long -ON dbo.DateTimeSearchParam -( - ResourceTypeId, - SearchParamId, - EndDateTime, - StartDateTime, - ResourceSurrogateId -) -WHERE IsHistory = 0 AND IsLongerThanADay = 1 -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Reference$Token Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkReferenceTokenCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - BaseUri1 varchar(128) COLLATE Latin1_General_100_CS_AS NULL, - ReferenceResourceTypeId1 smallint NULL, - ReferenceResourceId1 varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ReferenceResourceVersion1 int NULL, - SystemId2 int NULL, - Code2 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.ReferenceTokenCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - BaseUri1 varchar(128) COLLATE Latin1_General_100_CS_AS NULL, - ReferenceResourceTypeId1 smallint NULL, - ReferenceResourceId1 varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ReferenceResourceVersion1 int NULL, - SystemId2 int NULL, - Code2 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL, -) - -ALTER TABLE dbo.ReferenceTokenCompositeSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_ReferenceTokenCompositeSearchParam -ON dbo.ReferenceTokenCompositeSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_ReferenceTokenCompositeSearchParam_ReferenceResourceId1_Code2 -ON dbo.ReferenceTokenCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - ReferenceResourceId1, - Code2, - ResourceSurrogateId -) -INCLUDE -( - ReferenceResourceTypeId1, - BaseUri1, - SystemId2 -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Token$Token Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkTokenTokenCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SystemId2 int NULL, - Code2 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.TokenTokenCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SystemId2 int NULL, - Code2 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL -) - -ALTER TABLE dbo.TokenTokenCompositeSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_TokenTokenCompositeSearchParam -ON dbo.TokenTokenCompositeSearchParam -( - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenTokenCompositeSearchParam_Code1_Code2 -ON dbo.TokenTokenCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - Code2, - ResourceSurrogateId -) -INCLUDE -( - SystemId1, - SystemId2 -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Token$DateTime Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkTokenDateTimeCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - StartDateTime2 datetimeoffset(7) NOT NULL, - EndDateTime2 datetimeoffset(7) NOT NULL, - IsLongerThanADay2 bit NOT NULL -) - -CREATE TABLE dbo.TokenDateTimeCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - StartDateTime2 datetime2(7) NOT NULL, - EndDateTime2 datetime2(7) NOT NULL, - IsLongerThanADay2 bit NOT NULL, - IsHistory bit NOT NULL, -) - -ALTER TABLE dbo.TokenDateTimeCompositeSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_TokenDateTimeCompositeSearchParam -ON dbo.TokenDateTimeCompositeSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenDateTimeCompositeSearchParam_Code1_StartDateTime2_EndDateTime2 -ON dbo.TokenDateTimeCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - StartDateTime2, - EndDateTime2, - ResourceSurrogateId -) -INCLUDE -( - SystemId1, - IsLongerThanADay2 -) - -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenDateTimeCompositeSearchParam_Code1_EndDateTime2_StartDateTime2 -ON dbo.TokenDateTimeCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - EndDateTime2, - StartDateTime2, - ResourceSurrogateId -) -INCLUDE -( - SystemId1, - IsLongerThanADay2 -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenDateTimeCompositeSearchParam_Code1_StartDateTime2_EndDateTime2_Long -ON dbo.TokenDateTimeCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - StartDateTime2, - EndDateTime2, - ResourceSurrogateId -) -INCLUDE -( - SystemId1 -) - -WHERE IsHistory = 0 AND IsLongerThanADay2 = 1 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenDateTimeCompositeSearchParam_Code1_EndDateTime2_StartDateTime2_Long -ON dbo.TokenDateTimeCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - EndDateTime2, - StartDateTime2, - ResourceSurrogateId -) -INCLUDE -( - SystemId1 -) -WHERE IsHistory = 0 AND IsLongerThanADay2 = 1 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Token$Quantity Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkTokenQuantityCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SystemId2 int NULL, - QuantityCodeId2 int NULL, - SingleValue2 decimal(18,6) NULL, - LowValue2 decimal(18,6) NULL, - HighValue2 decimal(18,6) NULL -) - -CREATE TABLE dbo.TokenQuantityCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SystemId2 int NULL, - QuantityCodeId2 int NULL, - SingleValue2 decimal(18,6) NULL, - LowValue2 decimal(18,6) NULL, - HighValue2 decimal(18,6) NULL, - IsHistory bit NOT NULL, -) - -ALTER TABLE dbo.TokenQuantityCompositeSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_TokenQuantityCompositeSearchParam -ON dbo.TokenQuantityCompositeSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenQuantityCompositeSearchParam_SearchParamId_Code1_QuantityCodeId2_SingleValue2 -ON dbo.TokenQuantityCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - SingleValue2, - ResourceSurrogateId -) -INCLUDE -( - QuantityCodeId2, - SystemId1, - SystemId2 -) -WHERE IsHistory = 0 AND SingleValue2 IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenQuantityCompositeSearchParam_SearchParamId_Code1_QuantityCodeId2_LowValue2_HighValue2 -ON dbo.TokenQuantityCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - LowValue2, - HighValue2, - ResourceSurrogateId -) -INCLUDE -( - QuantityCodeId2, - SystemId1, - SystemId2 -) -WHERE IsHistory = 0 AND LowValue2 IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenQuantityCompositeSearchParam_SearchParamId_Code1_QuantityCodeId2_HighValue2_LowValue2 -ON dbo.TokenQuantityCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - HighValue2, - LowValue2, - ResourceSurrogateId -) -INCLUDE -( - QuantityCodeId2, - SystemId1, - SystemId2 -) -WHERE IsHistory = 0 AND LowValue2 IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Token$String Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkTokenStringCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - Text2 nvarchar(256) COLLATE Latin1_General_100_CI_AI_SC NOT NULL, - TextOverflow2 nvarchar(max) COLLATE Latin1_General_100_CI_AI_SC NULL -) - -CREATE TABLE dbo.TokenStringCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - Text2 nvarchar(256) COLLATE Latin1_General_CI_AI NOT NULL, - TextOverflow2 nvarchar(max) COLLATE Latin1_General_CI_AI NULL, - IsHistory bit NOT NULL, -) - -ALTER TABLE dbo.TokenStringCompositeSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_TokenStringCompositeSearchParam -ON dbo.TokenStringCompositeSearchParam -( - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenStringCompositeSearchParam_SearchParamId_Code1_Text2 -ON dbo.TokenStringCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - Text2, - ResourceSurrogateId -) -INCLUDE -( - SystemId1, - TextOverflow2 -- will not be needed when all servers are targeting at least this version. -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenStringCompositeSearchParam_SearchParamId_Code1_Text2WithOverflow -ON dbo.TokenStringCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - Text2, - ResourceSurrogateId -) -INCLUDE -( - SystemId1 -) -WHERE IsHistory = 0 AND TextOverflow2 IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - - -/************************************************************* - Token$Number$Number Composite Search Param -**************************************************************/ - --- See number search param for how we deal with null. We apply a similar pattern here, --- except that we pass in a HasRange bit though the TVP. The alternative would have --- for a computed column, but a computed column cannot be used in as a index filter --- (even if it is a persisted computed column). - -CREATE TYPE dbo.BulkTokenNumberNumberCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SingleValue2 decimal(18,6) NULL, - LowValue2 decimal(18,6) NULL, - HighValue2 decimal(18,6) NULL, - SingleValue3 decimal(18,6) NULL, - LowValue3 decimal(18,6) NULL, - HighValue3 decimal(18,6) NULL, - HasRange bit NOT NULL -) - -CREATE TABLE dbo.TokenNumberNumberCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SingleValue2 decimal(18,6) NULL, - LowValue2 decimal(18,6) NULL, - HighValue2 decimal(18,6) NULL, - SingleValue3 decimal(18,6) NULL, - LowValue3 decimal(18,6) NULL, - HighValue3 decimal(18,6) NULL, - HasRange bit NOT NULL, - IsHistory bit NOT NULL, -) - -ALTER TABLE dbo.TokenNumberNumberCompositeSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_TokenNumberNumberCompositeSearchParam -ON dbo.TokenNumberNumberCompositeSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenNumberNumberCompositeSearchParam_SearchParamId_Code1_Text2 -ON dbo.TokenNumberNumberCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - SingleValue2, - SingleValue3, - ResourceSurrogateId -) -INCLUDE -( - SystemId1 -) -WHERE IsHistory = 0 AND HasRange = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenNumberNumberCompositeSearchParam_SearchParamId_Code1_LowValue2_HighValue2_LowValue3_HighValue3 -ON dbo.TokenNumberNumberCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - LowValue2, - HighValue2, - LowValue3, - HighValue3, - ResourceSurrogateId -) -INCLUDE -( - SystemId1 -) -WHERE IsHistory = 0 AND HasRange = 1 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Sequence for generating unique 12.5ns "tick" components that are added - to a base ID based on the timestamp to form a unique resource surrogate ID -**************************************************************/ - -CREATE SEQUENCE dbo.ResourceSurrogateIdUniquifierSequence - AS int - START WITH 0 - INCREMENT BY 1 - MINVALUE 0 - MAXVALUE 79999 - CYCLE - CACHE 1000000 -GO - -/************************************************************* - Stored procedures for creating and deleting -**************************************************************/ - --- --- STORED PROCEDURE --- UpsertResource_3 --- --- DESCRIPTION --- Creates or updates (including marking deleted) a FHIR resource --- --- PARAMETERS --- @baseResourceSurrogateId --- * A bigint to which a value between [0, 80000) is added, forming a unique ResourceSurrogateId. --- * This value should be the current UTC datetime, truncated to millisecond precision, with its 100ns ticks component bitshifted left by 3. --- @resourceTypeId --- * The ID of the resource type (See ResourceType table) --- @resourceId --- * The resource ID (must be the same as the in the resource itself) --- @etag --- * If specified, the version of the resource to update --- @allowCreate --- * If false, an error is thrown if the resource does not already exist --- @isDeleted --- * Whether this resource marks the resource as deleted --- @keepHistory --- * Whether the existing version of the resource should be preserved --- @requestMethod --- * The HTTP method/verb used for the request --- @searchParamHash --- * A hash of the resource's latest indexed search parameters --- @rawResource --- * A compressed UTF16-encoded JSON document --- @resourceWriteClaims --- * Claims on the principal that performed the write --- @compartmentAssignments --- * Compartments that the resource is part of --- @referenceSearchParams --- * Extracted reference search params --- @tokenSearchParams --- * Extracted token search params --- @tokenTextSearchParams --- * The text representation of extracted token search params --- @stringSearchParams --- * Extracted string search params --- @numberSearchParams --- * Extracted number search params --- @quantitySearchParams --- * Extracted quantity search params --- @uriSearchParams --- * Extracted URI search params --- @dateTimeSearchParms --- * Extracted datetime search params --- @referenceTokenCompositeSearchParams --- * Extracted reference$token search params --- @tokenTokenCompositeSearchParams --- * Extracted token$token tokensearch params --- @tokenDateTimeCompositeSearchParams --- * Extracted token$datetime search params --- @tokenQuantityCompositeSearchParams --- * Extracted token$quantity search params --- @tokenStringCompositeSearchParams --- * Extracted token$string search params --- @tokenNumberNumberCompositeSearchParams --- * Extracted token$number$number search params --- --- RETURN VALUE --- The version of the resource as a result set. Will be empty if no insertion was done. --- -CREATE PROCEDURE dbo.UpsertResource_3 - @baseResourceSurrogateId bigint, - @resourceTypeId smallint, - @resourceId varchar(64), - @eTag int = NULL, - @allowCreate bit, - @isDeleted bit, - @keepHistory bit, - @requestMethod varchar(10), - @searchParamHash varchar(64), - @rawResource varbinary(max), - @resourceWriteClaims dbo.BulkResourceWriteClaimTableType_1 READONLY, - @compartmentAssignments dbo.BulkCompartmentAssignmentTableType_1 READONLY, - @referenceSearchParams dbo.BulkReferenceSearchParamTableType_1 READONLY, - @tokenSearchParams dbo.BulkTokenSearchParamTableType_1 READONLY, - @tokenTextSearchParams dbo.BulkTokenTextTableType_1 READONLY, - @stringSearchParams dbo.BulkStringSearchParamTableType_1 READONLY, - @numberSearchParams dbo.BulkNumberSearchParamTableType_1 READONLY, - @quantitySearchParams dbo.BulkQuantitySearchParamTableType_1 READONLY, - @uriSearchParams dbo.BulkUriSearchParamTableType_1 READONLY, - @dateTimeSearchParms dbo.BulkDateTimeSearchParamTableType_1 READONLY, - @referenceTokenCompositeSearchParams dbo.BulkReferenceTokenCompositeSearchParamTableType_1 READONLY, - @tokenTokenCompositeSearchParams dbo.BulkTokenTokenCompositeSearchParamTableType_1 READONLY, - @tokenDateTimeCompositeSearchParams dbo.BulkTokenDateTimeCompositeSearchParamTableType_1 READONLY, - @tokenQuantityCompositeSearchParams dbo.BulkTokenQuantityCompositeSearchParamTableType_1 READONLY, - @tokenStringCompositeSearchParams dbo.BulkTokenStringCompositeSearchParamTableType_1 READONLY, - @tokenNumberNumberCompositeSearchParams dbo.BulkTokenNumberNumberCompositeSearchParamTableType_1 READONLY -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - -- variables for the existing version of the resource that will be replaced - DECLARE @previousResourceSurrogateId bigint - DECLARE @previousVersion bigint - DECLARE @previousIsDeleted bit - - -- This should place a range lock on a row in the IX_Resource_ResourceTypeId_ResourceId nonclustered filtered index - SELECT @previousResourceSurrogateId = ResourceSurrogateId, @previousVersion = Version, @previousIsDeleted = IsDeleted - FROM dbo.Resource WITH (UPDLOCK, HOLDLOCK) - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId AND IsHistory = 0 - - IF (@etag IS NOT NULL AND @etag <> @previousVersion) BEGIN - THROW 50412, 'Precondition failed', 1; - END - - DECLARE @version int -- the version of the resource being written - - IF (@previousResourceSurrogateId IS NULL) BEGIN - -- There is no previous version of this resource - - IF (@isDeleted = 1) BEGIN - -- Don't bother marking the resource as deleted since it already does not exist. - COMMIT TRANSACTION - RETURN - END - - IF (@etag IS NOT NULL) BEGIN - -- You can't update a resource with a specified version if the resource does not exist - THROW 50404, 'Resource with specified version not found', 1; - END - - IF (@allowCreate = 0) BEGIN - THROW 50405, 'Resource does not exist and create is not allowed', 1; - END - - SET @version = 1 - END - ELSE BEGIN - -- There is a previous version - - IF (@isDeleted = 1 AND @previousIsDeleted = 1) BEGIN - -- Already deleted - don't create a new version - COMMIT TRANSACTION - RETURN - END - - SET @version = @previousVersion + 1 - - IF (@keepHistory = 1) BEGIN - - -- Set the existing resource as history - UPDATE dbo.Resource - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - -- Set the indexes for this resource as history. - -- Note there is no IsHistory column on ResourceWriteClaim since we do not query it. - - UPDATE dbo.CompartmentAssignment - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.ReferenceSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenText - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.StringSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.UriSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.NumberSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.QuantitySearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.DateTimeSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.ReferenceTokenCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenTokenCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenDateTimeCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenQuantityCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenStringCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenNumberNumberCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - END - ELSE BEGIN - - -- Not keeping history. Delete the current resource and all associated indexes. - - DELETE FROM dbo.Resource - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.ResourceWriteClaim - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.CompartmentAssignment - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.ReferenceSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenText - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.StringSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.UriSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.NumberSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.QuantitySearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.DateTimeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.ReferenceTokenCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenTokenCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenDateTimeCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenQuantityCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenStringCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenNumberNumberCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - END - END - - DECLARE @resourceSurrogateId bigint = @baseResourceSurrogateId + (NEXT VALUE FOR ResourceSurrogateIdUniquifierSequence) - DECLARE @isRawResourceMetaSet bit - - IF (@version = 1) BEGIN SET @isRawResourceMetaSet = 1 END ELSE BEGIN SET @isRawResourceMetaSet = 0 END - - INSERT INTO dbo.Resource - (ResourceTypeId, ResourceId, Version, IsHistory, ResourceSurrogateId, IsDeleted, RequestMethod, RawResource, IsRawResourceMetaSet, SearchParamHash) - VALUES - (@resourceTypeId, @resourceId, @version, 0, @resourceSurrogateId, @isDeleted, @requestMethod, @rawResource, @isRawResourceMetaSet, @searchParamHash) - - INSERT INTO dbo.ResourceWriteClaim - (ResourceSurrogateId, ClaimTypeId, ClaimValue) - SELECT @resourceSurrogateId, ClaimTypeId, ClaimValue - FROM @resourceWriteClaims - - INSERT INTO dbo.CompartmentAssignment - (ResourceTypeId, ResourceSurrogateId, CompartmentTypeId, ReferenceResourceId, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, CompartmentTypeId, ReferenceResourceId, 0 - FROM @compartmentAssignments - - INSERT INTO dbo.ReferenceSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri, ReferenceResourceTypeId, ReferenceResourceId, ReferenceResourceVersion, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, BaseUri, ReferenceResourceTypeId, ReferenceResourceId, ReferenceResourceVersion, 0 - FROM @referenceSearchParams - - INSERT INTO dbo.TokenSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, Code, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId, Code, 0 - FROM @tokenSearchParams - - INSERT INTO dbo.TokenText - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Text, 0 - FROM @tokenTextSearchParams - - INSERT INTO dbo.StringSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, TextOverflow, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Text, TextOverflow, 0 - FROM @stringSearchParams - - INSERT INTO dbo.UriSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Uri, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Uri, 0 - FROM @uriSearchParams - - INSERT INTO dbo.NumberSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SingleValue, LowValue, HighValue, 0 - FROM @numberSearchParams - - INSERT INTO dbo.QuantitySearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, QuantityCodeId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId, QuantityCodeId, SingleValue, LowValue, HighValue, 0 - FROM @quantitySearchParams - - INSERT INTO dbo.DateTimeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, StartDateTime, EndDateTime, IsLongerThanADay, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, StartDateTime, EndDateTime, IsLongerThanADay, 0 - FROM @dateTimeSearchParms - - INSERT INTO dbo.ReferenceTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri1, ReferenceResourceTypeId1, ReferenceResourceId1, ReferenceResourceVersion1, SystemId2, Code2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, BaseUri1, ReferenceResourceTypeId1, ReferenceResourceId1, ReferenceResourceVersion1, SystemId2, Code2, 0 - FROM @referenceTokenCompositeSearchParams - - INSERT INTO dbo.TokenTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SystemId2, Code2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SystemId2, Code2, 0 - FROM @tokenTokenCompositeSearchParams - - INSERT INTO dbo.TokenDateTimeCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, StartDateTime2, EndDateTime2, IsLongerThanADay2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, StartDateTime2, EndDateTime2, IsLongerThanADay2, 0 - FROM @tokenDateTimeCompositeSearchParams - - INSERT INTO dbo.TokenQuantityCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, SystemId2, QuantityCodeId2, LowValue2, HighValue2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, SystemId2, QuantityCodeId2, LowValue2, HighValue2, 0 - FROM @tokenQuantityCompositeSearchParams - - INSERT INTO dbo.TokenStringCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, Text2, TextOverflow2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, Text2, TextOverflow2, 0 - FROM @tokenStringCompositeSearchParams - - INSERT INTO dbo.TokenNumberNumberCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, LowValue2, HighValue2, SingleValue3, LowValue3, HighValue3, HasRange, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, LowValue2, HighValue2, SingleValue3, LowValue3, HighValue3, HasRange, 0 - FROM @tokenNumberNumberCompositeSearchParams - - SELECT @version - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- ReadResource --- --- DESCRIPTION --- Reads a single resource, optionally a specific version of the resource. --- --- PARAMETERS --- @resourceTypeId --- * The ID of the resource type (See ResourceType table) --- @resourceId --- * The resource ID --- @version --- * A specific version of the resource. If null, returns the latest version. --- RETURN VALUE --- A result set with 0 or 1 rows. --- -CREATE PROCEDURE dbo.ReadResource - @resourceTypeId smallint, - @resourceId varchar(64), - @version int = NULL -AS - SET NOCOUNT ON - - IF (@version IS NULL) BEGIN - SELECT ResourceSurrogateId, Version, IsDeleted, IsHistory, RawResource, IsRawResourceMetaSet, SearchParamHash - FROM dbo.Resource - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId AND IsHistory = 0 - END - ELSE BEGIN - SELECT ResourceSurrogateId, Version, IsDeleted, IsHistory, RawResource, IsRawResourceMetaSet, SearchParamHash - FROM dbo.Resource - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId AND Version = @version - END -GO - --- --- STORED PROCEDURE --- Deletes a single resource --- --- DESCRIPTION --- Permanently deletes all data related to a resource. --- Data remains recoverable from the transaction log, however. --- --- PARAMETERS --- @resourceTypeId --- * The ID of the resource type (See ResourceType table) --- @resourceId --- * The resource ID (must be the same as in the resource itself) --- -CREATE PROCEDURE dbo.HardDeleteResource - @resourceTypeId smallint, - @resourceId varchar(64) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @resourceSurrogateIds TABLE(ResourceSurrogateId bigint NOT NULL) - - DELETE FROM dbo.Resource - OUTPUT deleted.ResourceSurrogateId - INTO @resourceSurrogateIds - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId - - DELETE FROM dbo.ResourceWriteClaim - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.CompartmentAssignment - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.ReferenceSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenText - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.StringSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.UriSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.NumberSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.QuantitySearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.DateTimeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.ReferenceTokenCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenTokenCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenDateTimeCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenQuantityCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenStringCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenNumberNumberCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - COMMIT TRANSACTION -GO - -/************************************************************* - Export Job -**************************************************************/ -CREATE TABLE dbo.ExportJob -( - Id varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - Hash varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - Status varchar(10) NOT NULL, - HeartbeatDateTime datetime2(7) NULL, - RawJobRecord varchar(max) NOT NULL, - JobVersion rowversion NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_ExportJob ON dbo.ExportJob -( - Id -) - -CREATE UNIQUE NONCLUSTERED INDEX IX_ExportJob_Hash_Status_HeartbeatDateTime ON dbo.ExportJob -( - Hash, - Status, - HeartbeatDateTime -) - -GO - -/************************************************************* - Stored procedures for exporting -**************************************************************/ --- --- STORED PROCEDURE --- Creates an export job. --- --- DESCRIPTION --- Creates a new row to the ExportJob table, adding a new job to the queue of jobs to be processed. --- --- PARAMETERS --- @id --- * The ID of the export job record --- @hash --- * The SHA256 hash of the export job record ID --- @status --- * The status of the export job --- @rawJobRecord --- * A JSON document --- --- RETURN VALUE --- The row version of the created export job. --- -CREATE PROCEDURE dbo.CreateExportJob - @id varchar(64), - @hash varchar(64), - @status varchar(10), - @rawJobRecord varchar(max) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - INSERT INTO dbo.ExportJob - (Id, Hash, Status, HeartbeatDateTime, RawJobRecord) - VALUES - (@id, @hash, @status, @heartbeatDateTime, @rawJobRecord) - - SELECT CAST(MIN_ACTIVE_ROWVERSION() AS INT) - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- Gets an export job given its ID. --- --- DESCRIPTION --- Retrieves the export job record from the ExportJob table that has the matching ID. --- --- PARAMETERS --- @id --- * The ID of the export job record to retrieve --- --- RETURN VALUE --- The matching export job. --- -CREATE PROCEDURE dbo.GetExportJobById - @id varchar(64) -AS - SET NOCOUNT ON - - SELECT RawJobRecord, JobVersion - FROM dbo.ExportJob - WHERE Id = @id -GO - --- --- STORED PROCEDURE --- Gets an export job given the hash of its ID. --- --- DESCRIPTION --- Retrieves the export job record from the ExportJob table that has the matching hash. --- --- PARAMETERS --- @hash --- * The SHA256 hash of the export job record ID --- --- RETURN VALUE --- The matching export job. --- -CREATE PROCEDURE dbo.GetExportJobByHash - @hash varchar(64) -AS - SET NOCOUNT ON - - SELECT TOP(1) RawJobRecord, JobVersion - FROM dbo.ExportJob - WHERE Hash = @hash AND (Status = 'Queued' OR Status = 'Running') - ORDER BY HeartbeatDateTime ASC -GO - --- --- STORED PROCEDURE --- Updates an export job. --- --- DESCRIPTION --- Modifies an existing job in the ExportJob table. --- --- PARAMETERS --- @id --- * The ID of the export job record --- @status --- * The status of the export job --- @rawJobRecord --- * A JSON document --- @jobVersion --- * The version of the job to update must match this --- --- RETURN VALUE --- The row version of the updated export job. --- -CREATE PROCEDURE dbo.UpdateExportJob - @id varchar(64), - @status varchar(10), - @rawJobRecord varchar(max), - @jobVersion binary(8) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @currentJobVersion binary(8) - - -- Acquire and hold an update lock on a row in the ExportJob table for the entire transaction. - -- This ensures the version check and update occur atomically. - SELECT @currentJobVersion = JobVersion - FROM dbo.ExportJob WITH (UPDLOCK, HOLDLOCK) - WHERE Id = @id - - IF (@currentJobVersion IS NULL) BEGIN - THROW 50404, 'Export job record not found', 1; - END - - IF (@jobVersion <> @currentJobVersion) BEGIN - THROW 50412, 'Precondition failed', 1; - END - - -- We will timestamp the jobs when we update them to track stale jobs. - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - UPDATE dbo.ExportJob - SET Status = @status, HeartbeatDateTime = @heartbeatDateTime, RawJobRecord = @rawJobRecord - WHERE Id = @id - - SELECT @@DBTS - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- Acquires export jobs. --- --- DESCRIPTION --- Timestamps the available export jobs and sets their statuses to running. --- --- PARAMETERS --- @jobHeartbeatTimeoutThresholdInSeconds --- * The number of seconds that must pass before an export job is considered stale --- @maximumNumberOfConcurrentJobsAllowed --- * The maximum number of running jobs we can have at once --- --- RETURN VALUE --- The updated jobs that are now running. --- -CREATE PROCEDURE dbo.AcquireExportJobs - @jobHeartbeatTimeoutThresholdInSeconds bigint, - @maximumNumberOfConcurrentJobsAllowed int -AS - SET NOCOUNT ON - SET XACT_ABORT ON - - SET TRANSACTION ISOLATION LEVEL SERIALIZABLE - BEGIN TRANSACTION - - -- We will consider a job to be stale if its timestamp is smaller than or equal to this. - DECLARE @expirationDateTime dateTime2(7) - SELECT @expirationDateTime = DATEADD(second, -@jobHeartbeatTimeoutThresholdInSeconds, SYSUTCDATETIME()) - - -- Get the number of jobs that are running and not stale. - -- Acquire and hold an exclusive table lock for the entire transaction to prevent jobs from being created, updated or deleted during acquisitions. - DECLARE @numberOfRunningJobs int - SELECT @numberOfRunningJobs = COUNT(*) FROM dbo.ExportJob WITH (TABLOCKX) WHERE Status = 'Running' AND HeartbeatDateTime > @expirationDateTime - - -- Determine how many available jobs we can pick up. - DECLARE @limit int = @maximumNumberOfConcurrentJobsAllowed - @numberOfRunningJobs; - - DECLARE @availableJobs TABLE (Id varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, JobVersion binary(8) NOT NULL) - - -- Get the available jobs, which are export jobs that are queued or stale. - -- Older jobs will be prioritized over newer ones. - INSERT INTO @availableJobs - SELECT TOP(@limit) Id, JobVersion - FROM dbo.ExportJob - WHERE (Status = 'Queued' OR (Status = 'Running' AND HeartbeatDateTime <= @expirationDateTime)) - ORDER BY HeartbeatDateTime - - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - -- Update each available job's status to running both in the export table's status column and in the raw export job record JSON. - UPDATE dbo.ExportJob - SET Status = 'Running', HeartbeatDateTime = @heartbeatDateTime, RawJobRecord = JSON_MODIFY(RawJobRecord,'$.status', 'Running') - OUTPUT inserted.RawJobRecord, inserted.JobVersion - FROM dbo.ExportJob job INNER JOIN @availableJobs availableJob ON job.Id = availableJob.Id AND job.JobVersion = availableJob.JobVersion - - COMMIT TRANSACTION -GO - -/************************************************************* - Search Parameter Status Information -**************************************************************/ - --- We adopted this naming convention for table-valued parameters because they are immutable. -CREATE TYPE dbo.SearchParamTableType_1 AS TABLE -( - Uri varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - Status varchar(10) NOT NULL, - IsPartiallySupported bit NOT NULL -) - -GO - -/************************************************************* - Stored procedures for search parameter information -**************************************************************/ --- --- STORED PROCEDURE --- GetSearchParamStatuses --- --- DESCRIPTION --- Gets all the search parameters and their statuses. --- --- RETURN VALUE --- The search parameters and their statuses. --- -CREATE PROCEDURE dbo.GetSearchParamStatuses -AS - SET NOCOUNT ON - - SELECT Uri, Status, LastUpdated, IsPartiallySupported FROM dbo.SearchParam -GO - --- --- STORED PROCEDURE --- UpsertSearchParams --- --- DESCRIPTION --- Given a set of search parameters, creates or updates the parameters. --- --- PARAMETERS --- @searchParams --- * The updated existing search parameters or the new search parameters --- --- RETURN VALUE --- The IDs and URIs of the search parameters that were inserted (not updated). --- -CREATE PROCEDURE dbo.UpsertSearchParams - @searchParams dbo.SearchParamTableType_1 READONLY -AS - SET NOCOUNT ON - SET XACT_ABORT ON - - SET TRANSACTION ISOLATION LEVEL SERIALIZABLE - BEGIN TRANSACTION - - DECLARE @lastUpdated datetimeoffset(7) = SYSDATETIMEOFFSET() - - DECLARE @summaryOfChanges TABLE(Uri varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, Action varchar(20) NOT NULL) - - -- Acquire and hold an exclusive table lock for the entire transaction to prevent parameters from being added or modified during upsert. - MERGE INTO dbo.SearchParam WITH (TABLOCKX) AS target - USING @searchParams AS source - ON target.Uri = source.Uri - WHEN MATCHED THEN - UPDATE - SET Status = source.Status, LastUpdated = @lastUpdated, IsPartiallySupported = source.IsPartiallySupported - WHEN NOT MATCHED BY target THEN - INSERT - (Uri, Status, LastUpdated, IsPartiallySupported) - VALUES (source.Uri, source.Status, @lastUpdated, source.IsPartiallySupported) - OUTPUT source.Uri, $action INTO @summaryOfChanges; - - SELECT SearchParamId, SearchParam.Uri - FROM dbo.SearchParam searchParam - INNER JOIN @summaryOfChanges upsertedSearchParam - ON searchParam.Uri = upsertedSearchParam.Uri - WHERE upsertedSearchParam.Action = 'INSERT' - - COMMIT TRANSACTION -GO - -/************************************************************* - Reindex Job -**************************************************************/ -CREATE TABLE dbo.ReindexJob -( - Id varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - Status varchar(10) NOT NULL, - HeartbeatDateTime datetime2(7) NULL, - RawJobRecord varchar(max) NOT NULL, - JobVersion rowversion NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_ReindexJob ON dbo.ReindexJob -( - Id -) - -GO - -/************************************************************* - Stored procedures for reindexing -**************************************************************/ --- --- STORED PROCEDURE --- Creates an reindex job. --- --- DESCRIPTION --- Creates a new row to the ReindexJob table, adding a new job to the queue of jobs to be processed. --- --- PARAMETERS --- @id --- * The ID of the reindex job record --- @status --- * The status of the reindex job --- @rawJobRecord --- * A JSON document --- --- RETURN VALUE --- The row version of the created reindex job. --- -CREATE PROCEDURE dbo.CreateReindexJob - @id varchar(64), - @status varchar(10), - @rawJobRecord varchar(max) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - INSERT INTO dbo.ReindexJob - (Id, Status, HeartbeatDateTime, RawJobRecord) - VALUES - (@id, @status, @heartbeatDateTime, @rawJobRecord) - - SELECT CAST(MIN_ACTIVE_ROWVERSION() AS INT) - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- Gets an reindex job given its ID. --- --- DESCRIPTION --- Retrieves the reindex job record from the ReindexJob table that has the matching ID. --- --- PARAMETERS --- @id --- * The ID of the reindex job record to retrieve --- --- RETURN VALUE --- The matching reindex job. --- -CREATE PROCEDURE dbo.GetReindexJobById - @id varchar(64) -AS - SET NOCOUNT ON - - SELECT RawJobRecord, JobVersion - FROM dbo.ReindexJob - WHERE Id = @id -GO - --- --- STORED PROCEDURE --- Updates a reindex job. --- --- DESCRIPTION --- Modifies an existing job in the ReindexJob table. --- --- PARAMETERS --- @id --- * The ID of the reindex job record --- @status --- * The status of the reindex job --- @rawJobRecord --- * A JSON document --- @jobVersion --- * The version of the job to update must match this --- --- RETURN VALUE --- The row version of the updated reindex job. --- -CREATE PROCEDURE dbo.UpdateReindexJob - @id varchar(64), - @status varchar(10), - @rawJobRecord varchar(max), - @jobVersion binary(8) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @currentJobVersion binary(8) - - -- Acquire and hold an update lock on a row in the ReindexJob table for the entire transaction. - -- This ensures the version check and update occur atomically. - SELECT @currentJobVersion = JobVersion - FROM dbo.ReindexJob WITH (UPDLOCK, HOLDLOCK) - WHERE Id = @id - - IF (@currentJobVersion IS NULL) BEGIN - THROW 50404, 'Reindex job record not found', 1; - END - - IF (@jobVersion <> @currentJobVersion) BEGIN - THROW 50412, 'Precondition failed', 1; - END - - -- We will timestamp the jobs when we update them to track stale jobs. - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - UPDATE dbo.ReindexJob - SET Status = @status, HeartbeatDateTime = @heartbeatDateTime, RawJobRecord = @rawJobRecord - WHERE Id = @id - - SELECT @@DBTS - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- Acquires reindex jobs. --- --- DESCRIPTION --- Timestamps the available reindex jobs and sets their statuses to running. --- --- PARAMETERS --- @jobHeartbeatTimeoutThresholdInSeconds --- * The number of seconds that must pass before a reindex job is considered stale --- @maximumNumberOfConcurrentJobsAllowed --- * The maximum number of running jobs we can have at once --- --- RETURN VALUE --- The updated jobs that are now running. --- -CREATE PROCEDURE dbo.AcquireReindexJobs - @jobHeartbeatTimeoutThresholdInSeconds bigint, - @maximumNumberOfConcurrentJobsAllowed int -AS - SET NOCOUNT ON - SET XACT_ABORT ON - - SET TRANSACTION ISOLATION LEVEL SERIALIZABLE - BEGIN TRANSACTION - - -- We will consider a job to be stale if its timestamp is smaller than or equal to this. - DECLARE @expirationDateTime dateTime2(7) - SELECT @expirationDateTime = DATEADD(second, -@jobHeartbeatTimeoutThresholdInSeconds, SYSUTCDATETIME()) - - -- Get the number of jobs that are running and not stale. - -- Acquire and hold an exclusive table lock for the entire transaction to prevent jobs from being created, updated or deleted during acquisitions. - DECLARE @numberOfRunningJobs int - SELECT @numberOfRunningJobs = COUNT(*) FROM dbo.ReindexJob WITH (TABLOCKX) WHERE Status = 'Running' AND HeartbeatDateTime > @expirationDateTime - - -- Determine how many available jobs we can pick up. - DECLARE @limit int = @maximumNumberOfConcurrentJobsAllowed - @numberOfRunningJobs; - - IF (@limit > 0) BEGIN - - DECLARE @availableJobs TABLE (Id varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, JobVersion binary(8) NOT NULL) - - -- Get the available jobs, which are reindex jobs that are queued or stale. - -- Older jobs will be prioritized over newer ones. - INSERT INTO @availableJobs - SELECT TOP(@limit) Id, JobVersion - FROM dbo.ReindexJob - WHERE (Status = 'Queued' OR (Status = 'Running' AND HeartbeatDateTime <= @expirationDateTime)) - ORDER BY HeartbeatDateTime - - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - -- Update each available job's status to running both in the reindex table's status column and in the raw reindex job record JSON. - UPDATE dbo.ReindexJob - SET Status = 'Running', HeartbeatDateTime = @heartbeatDateTime, RawJobRecord = JSON_MODIFY(RawJobRecord,'$.status', 'Running') - OUTPUT inserted.RawJobRecord, inserted.JobVersion - FROM dbo.ReindexJob job INNER JOIN @availableJobs availableJob ON job.Id = availableJob.Id AND job.JobVersion = availableJob.JobVersion - - END - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- Checks if there are any active reindex jobs. --- --- DESCRIPTION --- Queries the datastore for any reindex job documents with a status of running, queued or paused. --- --- RETURN VALUE --- The job IDs of any active reindex jobs. --- -CREATE PROCEDURE dbo.CheckActiveReindexJobs -AS - SET NOCOUNT ON - - SELECT Id - FROM dbo.ReindexJob - WHERE Status = 'Running' OR Status = 'Queued' OR Status = 'Paused' -GO - --- --- STORED PROCEDURE --- ReindexResource --- --- DESCRIPTION --- Updates the search indices of a given resource --- --- PARAMETERS --- @resourceTypeId --- * The ID of the resource type (See ResourceType table) --- @resourceId --- * The resource ID (must be the same as the in the resource itself) --- @etag --- * If specified, the version of the resource to update --- @searchParamHash --- * A hash of the resource's latest indexed search parameters --- @resourceWriteClaims --- * Claims on the principal that performed the write --- @compartmentAssignments --- * Compartments that the resource is part of --- @referenceSearchParams --- * Extracted reference search params --- @tokenSearchParams --- * Extracted token search params --- @tokenTextSearchParams --- * The text representation of extracted token search params --- @stringSearchParams --- * Extracted string search params --- @numberSearchParams --- * Extracted number search params --- @quantitySearchParams --- * Extracted quantity search params --- @uriSearchParams --- * Extracted URI search params --- @dateTimeSearchParms --- * Extracted datetime search params --- @referenceTokenCompositeSearchParams --- * Extracted reference$token search params --- @tokenTokenCompositeSearchParams --- * Extracted token$token tokensearch params --- @tokenDateTimeCompositeSearchParams --- * Extracted token$datetime search params --- @tokenQuantityCompositeSearchParams --- * Extracted token$quantity search params --- @tokenStringCompositeSearchParams --- * Extracted token$string search params --- @tokenNumberNumberCompositeSearchParams --- * Extracted token$number$number search params --- -CREATE PROCEDURE dbo.ReindexResource - @resourceTypeId smallint, - @resourceId varchar(64), - @eTag int = NULL, - @searchParamHash varchar(64), - @resourceWriteClaims dbo.BulkResourceWriteClaimTableType_1 READONLY, - @compartmentAssignments dbo.BulkCompartmentAssignmentTableType_1 READONLY, - @referenceSearchParams dbo.BulkReferenceSearchParamTableType_1 READONLY, - @tokenSearchParams dbo.BulkTokenSearchParamTableType_1 READONLY, - @tokenTextSearchParams dbo.BulkTokenTextTableType_1 READONLY, - @stringSearchParams dbo.BulkStringSearchParamTableType_1 READONLY, - @numberSearchParams dbo.BulkNumberSearchParamTableType_1 READONLY, - @quantitySearchParams dbo.BulkQuantitySearchParamTableType_1 READONLY, - @uriSearchParams dbo.BulkUriSearchParamTableType_1 READONLY, - @dateTimeSearchParms dbo.BulkDateTimeSearchParamTableType_1 READONLY, - @referenceTokenCompositeSearchParams dbo.BulkReferenceTokenCompositeSearchParamTableType_1 READONLY, - @tokenTokenCompositeSearchParams dbo.BulkTokenTokenCompositeSearchParamTableType_1 READONLY, - @tokenDateTimeCompositeSearchParams dbo.BulkTokenDateTimeCompositeSearchParamTableType_1 READONLY, - @tokenQuantityCompositeSearchParams dbo.BulkTokenQuantityCompositeSearchParamTableType_1 READONLY, - @tokenStringCompositeSearchParams dbo.BulkTokenStringCompositeSearchParamTableType_1 READONLY, - @tokenNumberNumberCompositeSearchParams dbo.BulkTokenNumberNumberCompositeSearchParamTableType_1 READONLY -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @resourceSurrogateId bigint - DECLARE @version bigint - - -- This should place a range lock on a row in the IX_Resource_ResourceTypeId_ResourceId nonclustered filtered index - SELECT @resourceSurrogateId = ResourceSurrogateId, @version = Version - FROM dbo.Resource WITH (UPDLOCK, HOLDLOCK) - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId AND IsHistory = 0 - - IF (@etag IS NOT NULL AND @etag <> @version) BEGIN - THROW 50412, 'Precondition failed', 1; - END - - IF (@resourceSurrogateId IS NULL) BEGIN - -- You can't reindex a resource if the resource does not exist - THROW 50404, 'Resource not found', 1; - END - - UPDATE dbo.Resource - SET SearchParamHash = @searchParamHash - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - -- First, delete all the resource's indices. - DELETE FROM dbo.ResourceWriteClaim - WHERE ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.CompartmentAssignment - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.ReferenceSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenText - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.StringSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.UriSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.NumberSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.QuantitySearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.DateTimeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.ReferenceTokenCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenTokenCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenDateTimeCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenQuantityCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenStringCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenNumberNumberCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - -- Next, insert all the new indices. - INSERT INTO dbo.ResourceWriteClaim - (ResourceSurrogateId, ClaimTypeId, ClaimValue) - SELECT @resourceSurrogateId, ClaimTypeId, ClaimValue - FROM @resourceWriteClaims - - INSERT INTO dbo.CompartmentAssignment - (ResourceTypeId, ResourceSurrogateId, CompartmentTypeId, ReferenceResourceId, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, CompartmentTypeId, ReferenceResourceId, 0 - FROM @compartmentAssignments - - INSERT INTO dbo.ReferenceSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri, ReferenceResourceTypeId, ReferenceResourceId, ReferenceResourceVersion, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, BaseUri, ReferenceResourceTypeId, ReferenceResourceId, ReferenceResourceVersion, 0 - FROM @referenceSearchParams - - INSERT INTO dbo.TokenSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, Code, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId, Code, 0 - FROM @tokenSearchParams - - INSERT INTO dbo.TokenText - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Text, 0 - FROM @tokenTextSearchParams - - INSERT INTO dbo.StringSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, TextOverflow, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Text, TextOverflow, 0 - FROM @stringSearchParams - - INSERT INTO dbo.UriSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Uri, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Uri, 0 - FROM @uriSearchParams - - INSERT INTO dbo.NumberSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SingleValue, LowValue, HighValue, 0 - FROM @numberSearchParams - - INSERT INTO dbo.QuantitySearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, QuantityCodeId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId, QuantityCodeId, SingleValue, LowValue, HighValue, 0 - FROM @quantitySearchParams - - INSERT INTO dbo.DateTimeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, StartDateTime, EndDateTime, IsLongerThanADay, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, StartDateTime, EndDateTime, IsLongerThanADay, 0 - FROM @dateTimeSearchParms - - INSERT INTO dbo.ReferenceTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri1, ReferenceResourceTypeId1, ReferenceResourceId1, ReferenceResourceVersion1, SystemId2, Code2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, BaseUri1, ReferenceResourceTypeId1, ReferenceResourceId1, ReferenceResourceVersion1, SystemId2, Code2, 0 - FROM @referenceTokenCompositeSearchParams - - INSERT INTO dbo.TokenTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SystemId2, Code2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SystemId2, Code2, 0 - FROM @tokenTokenCompositeSearchParams - - INSERT INTO dbo.TokenDateTimeCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, StartDateTime2, EndDateTime2, IsLongerThanADay2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, StartDateTime2, EndDateTime2, IsLongerThanADay2, 0 - FROM @tokenDateTimeCompositeSearchParams - - INSERT INTO dbo.TokenQuantityCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, SystemId2, QuantityCodeId2, LowValue2, HighValue2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, SystemId2, QuantityCodeId2, LowValue2, HighValue2, 0 - FROM @tokenQuantityCompositeSearchParams - - INSERT INTO dbo.TokenStringCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, Text2, TextOverflow2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, Text2, TextOverflow2, 0 - FROM @tokenStringCompositeSearchParams - - INSERT INTO dbo.TokenNumberNumberCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, LowValue2, HighValue2, SingleValue3, LowValue3, HighValue3, HasRange, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, LowValue2, HighValue2, SingleValue3, LowValue3, HighValue3, HasRange, 0 - FROM @tokenNumberNumberCompositeSearchParams - - COMMIT TRANSACTION -GO - -CREATE TYPE dbo.BulkReindexResourceTableType_1 AS TABLE -( - Offset int NOT NULL, - ResourceTypeId smallint NOT NULL, - ResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ETag int NULL, - SearchParamHash varchar(64) NOT NULL -) - -GO - --- --- STORED PROCEDURE --- BulkReindexResources --- --- DESCRIPTION --- Updates the search indices of a batch of resources --- --- PARAMETERS --- @resourcesToReindex --- * The type IDs, IDs, eTags and hashes of the resources to reindex --- @resourceWriteClaims --- * Claims on the principal that performed the write --- @compartmentAssignments --- * Compartments that the resource is part of --- @referenceSearchParams --- * Extracted reference search params --- @tokenSearchParams --- * Extracted token search params --- @tokenTextSearchParams --- * The text representation of extracted token search params --- @stringSearchParams --- * Extracted string search params --- @numberSearchParams --- * Extracted number search params --- @quantitySearchParams --- * Extracted quantity search params --- @uriSearchParams --- * Extracted URI search params --- @dateTimeSearchParms --- * Extracted datetime search params --- @referenceTokenCompositeSearchParams --- * Extracted reference$token search params --- @tokenTokenCompositeSearchParams --- * Extracted token$token tokensearch params --- @tokenDateTimeCompositeSearchParams --- * Extracted token$datetime search params --- @tokenQuantityCompositeSearchParams --- * Extracted token$quantity search params --- @tokenStringCompositeSearchParams --- * Extracted token$string search params --- @tokenNumberNumberCompositeSearchParams --- * Extracted token$number$number search params --- -CREATE PROCEDURE dbo.BulkReindexResources - @resourcesToReindex dbo.BulkReindexResourceTableType_1 READONLY, - @resourceWriteClaims dbo.BulkResourceWriteClaimTableType_1 READONLY, - @compartmentAssignments dbo.BulkCompartmentAssignmentTableType_1 READONLY, - @referenceSearchParams dbo.BulkReferenceSearchParamTableType_1 READONLY, - @tokenSearchParams dbo.BulkTokenSearchParamTableType_1 READONLY, - @tokenTextSearchParams dbo.BulkTokenTextTableType_1 READONLY, - @stringSearchParams dbo.BulkStringSearchParamTableType_1 READONLY, - @numberSearchParams dbo.BulkNumberSearchParamTableType_1 READONLY, - @quantitySearchParams dbo.BulkQuantitySearchParamTableType_1 READONLY, - @uriSearchParams dbo.BulkUriSearchParamTableType_1 READONLY, - @dateTimeSearchParms dbo.BulkDateTimeSearchParamTableType_1 READONLY, - @referenceTokenCompositeSearchParams dbo.BulkReferenceTokenCompositeSearchParamTableType_1 READONLY, - @tokenTokenCompositeSearchParams dbo.BulkTokenTokenCompositeSearchParamTableType_1 READONLY, - @tokenDateTimeCompositeSearchParams dbo.BulkTokenDateTimeCompositeSearchParamTableType_1 READONLY, - @tokenQuantityCompositeSearchParams dbo.BulkTokenQuantityCompositeSearchParamTableType_1 READONLY, - @tokenStringCompositeSearchParams dbo.BulkTokenStringCompositeSearchParamTableType_1 READONLY, - @tokenNumberNumberCompositeSearchParams dbo.BulkTokenNumberNumberCompositeSearchParamTableType_1 READONLY -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @computedValues TABLE - ( - Offset int NOT NULL, - ResourceTypeId smallint NOT NULL, - VersionProvided bigint NULL, - SearchParamHash varchar(64) NOT NULL, - ResourceSurrogateId bigint NULL, - VersionInDatabase bigint NULL - ) - - INSERT INTO @computedValues - SELECT - resourceToReindex.Offset, - resourceToReindex.ResourceTypeId, - resourceToReindex.ETag, - resourceToReindex.SearchParamHash, - resourceInDB.ResourceSurrogateId, - resourceInDB.Version - FROM @resourcesToReindex resourceToReindex - LEFT OUTER JOIN dbo.Resource resourceInDB WITH (UPDLOCK, INDEX(IX_Resource_ResourceTypeId_ResourceId)) - ON resourceInDB.ResourceTypeId = resourceToReindex.ResourceTypeId - AND resourceInDB.ResourceId = resourceToReindex.ResourceId - AND resourceInDB.IsHistory = 0 - - DECLARE @resourcesNotInDatabase int - SET @resourcesNotInDatabase = (SELECT COUNT(*) FROM @computedValues WHERE ResourceSurrogateId IS NULL) - - IF (@resourcesNotInDatabase > 0) BEGIN - -- We can't reindex a resource if the resource does not exist - THROW 50404, 'One or more resources not found', 1; - END - - DECLARE @versionDiff int - SET @versionDiff = (SELECT COUNT(*) FROM @computedValues WHERE VersionProvided IS NOT NULL AND VersionProvided <> VersionInDatabase) - - IF (@versionDiff > 0) BEGIN - -- The resource has been updated since the reindex job kicked off - THROW 50412, 'Precondition failed', 1; - END - - -- Update the search parameter hash value in the main resource table - UPDATE resourceInDB - SET resourceInDB.SearchParamHash = resourceToReindex.SearchParamHash - FROM @computedValues resourceToReindex - INNER JOIN dbo.Resource resourceInDB - ON resourceInDB.ResourceTypeId = resourceToReindex.ResourceTypeId AND resourceInDB.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - -- First, delete all the indices of the resources to reindex. - DELETE searchIndex FROM dbo.ResourceWriteClaim searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.CompartmentAssignment searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.ReferenceSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenText searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.StringSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.UriSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.NumberSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.QuantitySearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.DateTimeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.ReferenceTokenCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenTokenCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenDateTimeCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenQuantityCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenStringCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenNumberNumberCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - -- Next, insert all the new indices. - INSERT INTO dbo.ResourceWriteClaim - (ResourceSurrogateId, ClaimTypeId, ClaimValue) - SELECT DISTINCT resourceToReindex.ResourceSurrogateId, searchIndex.ClaimTypeId, searchIndex.ClaimValue - FROM @resourceWriteClaims searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.CompartmentAssignment - (ResourceTypeId, ResourceSurrogateId, CompartmentTypeId, ReferenceResourceId, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.CompartmentTypeId, searchIndex.ReferenceResourceId, 0 - FROM @compartmentAssignments searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.ReferenceSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri, ReferenceResourceTypeId, ReferenceResourceId, ReferenceResourceVersion, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.BaseUri, searchIndex.ReferenceResourceTypeId, searchIndex.ReferenceResourceId, searchIndex.ReferenceResourceVersion, 0 - FROM @referenceSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, Code, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId, searchIndex.Code, 0 - FROM @tokenSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenText - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.Text, 0 - FROM @tokenTextSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.StringSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, TextOverflow, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.Text, searchIndex.TextOverflow, 0 - FROM @stringSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.UriSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Uri, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.Uri, 0 - FROM @uriSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.NumberSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SingleValue, searchIndex.LowValue, searchIndex.HighValue, 0 - FROM @numberSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.QuantitySearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, QuantityCodeId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId, searchIndex.QuantityCodeId, searchIndex.SingleValue, searchIndex.LowValue, searchIndex.HighValue, 0 - FROM @quantitySearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.DateTimeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, StartDateTime, EndDateTime, IsLongerThanADay, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.StartDateTime, searchIndex.EndDateTime, searchIndex.IsLongerThanADay, 0 - FROM @dateTimeSearchParms searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.ReferenceTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri1, ReferenceResourceTypeId1, ReferenceResourceId1, ReferenceResourceVersion1, SystemId2, Code2, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.BaseUri1, searchIndex.ReferenceResourceTypeId1, searchIndex.ReferenceResourceId1, searchIndex.ReferenceResourceVersion1, searchIndex.SystemId2, searchIndex.Code2, 0 - FROM @referenceTokenCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SystemId2, Code2, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId1, searchIndex.Code1, searchIndex.SystemId2, searchIndex.Code2, 0 - FROM @tokenTokenCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenDateTimeCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, StartDateTime2, EndDateTime2, IsLongerThanADay2, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId1, searchIndex.Code1, searchIndex.StartDateTime2, searchIndex.EndDateTime2, searchIndex.IsLongerThanADay2, 0 - FROM @tokenDateTimeCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenQuantityCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, SystemId2, QuantityCodeId2, LowValue2, HighValue2, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId1, searchIndex.Code1, searchIndex.SingleValue2, searchIndex.SystemId2, searchIndex.QuantityCodeId2, searchIndex.LowValue2, searchIndex.HighValue2, 0 - FROM @tokenQuantityCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenStringCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, Text2, TextOverflow2, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId1, searchIndex.Code1, searchIndex.Text2, searchIndex.TextOverflow2, 0 - FROM @tokenStringCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenNumberNumberCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, LowValue2, HighValue2, SingleValue3, LowValue3, HighValue3, HasRange, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId1, searchIndex.Code1, searchIndex.SingleValue2, searchIndex.LowValue2, searchIndex.HighValue2, searchIndex.SingleValue3, searchIndex.LowValue3, searchIndex.HighValue3, searchIndex.HasRange, 0 - FROM @tokenNumberNumberCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - COMMIT TRANSACTION -GO diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Schema/Migrations/7.sql b/src/Microsoft.Health.Fhir.SqlServer/Features/Schema/Migrations/7.sql deleted file mode 100644 index d7e0e994a6..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Schema/Migrations/7.sql +++ /dev/null @@ -1,1943 +0,0 @@ --- Style guide: please see: https://github.com/ktaranov/sqlserver-kit/blob/master/SQL%20Server%20Name%20Convention%20and%20T-SQL%20Programming%20Style.md - -/************************************************************* - Schema Version -**************************************************************/ - -INSERT INTO dbo.SchemaVersion -VALUES - (7, 'started') - -GO - -/************************************************************* - Model tables -**************************************************************/ - -CREATE TABLE dbo.SearchParam -( - SearchParamId smallint IDENTITY(1,1) NOT NULL, - Uri varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - Status varchar(10) NULL, - LastUpdated datetimeoffset(7) NULL, - IsPartiallySupported bit NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_SearchParam ON dbo.SearchParam -( - Uri -) - -CREATE TABLE dbo.ResourceType -( - ResourceTypeId smallint IDENTITY(1,1) NOT NULL, - Name nvarchar(50) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_ResourceType on dbo.ResourceType -( - Name -) - --- Create System and QuantityCode tables - -CREATE TABLE dbo.System -( - SystemId int IDENTITY(1,1) NOT NULL, - Value nvarchar(256) NOT NULL, -) - -CREATE UNIQUE CLUSTERED INDEX IXC_System ON dbo.System -( - Value -) - -CREATE TABLE dbo.QuantityCode -( - QuantityCodeId int IDENTITY(1,1) NOT NULL, - Value nvarchar(256) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_QuantityCode on dbo.QuantityCode -( - Value -) - -/************************************************************* - Resource table -**************************************************************/ - -CREATE TABLE dbo.Resource -( - ResourceTypeId smallint NOT NULL, - ResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - Version int NOT NULL, - IsHistory bit NOT NULL, - ResourceSurrogateId bigint NOT NULL, - IsDeleted bit NOT NULL, - RequestMethod varchar(10) NULL, - RawResource varbinary(max) NOT NULL, - IsRawResourceMetaSet bit NOT NULL DEFAULT 0 -) - -CREATE UNIQUE CLUSTERED INDEX IXC_Resource ON dbo.Resource -( - ResourceSurrogateId -) - -CREATE UNIQUE NONCLUSTERED INDEX IX_Resource_ResourceTypeId_ResourceId_Version ON dbo.Resource -( - ResourceTypeId, - ResourceId, - Version -) - -CREATE UNIQUE NONCLUSTERED INDEX IX_Resource_ResourceTypeId_ResourceId ON dbo.Resource -( - ResourceTypeId, - ResourceId -) -INCLUDE -- We want the query in UpsertResource, which is done with UPDLOCK AND HOLDLOCK, to not require a key lookup -( - Version, - IsDeleted -) -WHERE IsHistory = 0 - -CREATE UNIQUE NONCLUSTERED INDEX IX_Resource_ResourceTypeId_ResourceSurrgateId ON dbo.Resource -( - ResourceTypeId, - ResourceSurrogateId -) -WHERE IsHistory = 0 AND IsDeleted = 0 - -/************************************************************* - Capture claims on write -**************************************************************/ - -CREATE TABLE dbo.ClaimType -( - ClaimTypeId tinyint IDENTITY(1,1) NOT NULL, - Name varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_Claim on dbo.ClaimType -( - Name -) - -CREATE TYPE dbo.ResourceWriteClaimTableType_1 AS TABLE -( - ClaimTypeId tinyint NOT NULL, - ClaimValue nvarchar(128) NOT NULL -) - -CREATE TABLE dbo.ResourceWriteClaim -( - ResourceSurrogateId bigint NOT NULL, - ClaimTypeId tinyint NOT NULL, - ClaimValue nvarchar(128) NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_ResourceWriteClaim on dbo.ResourceWriteClaim -( - ResourceSurrogateId, - ClaimTypeId -) - -/************************************************************* - Compartments -**************************************************************/ - -CREATE TABLE dbo.CompartmentType -( - CompartmentTypeId tinyint IDENTITY(1,1) NOT NULL, - Name varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_CompartmentType on dbo.CompartmentType -( - Name -) - -CREATE TYPE dbo.CompartmentAssignmentTableType_1 AS TABLE -( - CompartmentTypeId tinyint NOT NULL, - ReferenceResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.CompartmentAssignment -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - CompartmentTypeId tinyint NOT NULL, - ReferenceResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_CompartmentAssignment -ON dbo.CompartmentAssignment -( - ResourceSurrogateId, - CompartmentTypeId, - ReferenceResourceId -) - -CREATE NONCLUSTERED INDEX IX_CompartmentAssignment_CompartmentTypeId_ReferenceResourceId -ON dbo.CompartmentAssignment -( - CompartmentTypeId, - ReferenceResourceId -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - Reference Search Param -**************************************************************/ - -CREATE TYPE dbo.ReferenceSearchParamTableType_2 AS TABLE -( - SearchParamId smallint NOT NULL, - BaseUri varchar(128) COLLATE Latin1_General_100_CS_AS NULL, - ReferenceResourceTypeId smallint NULL, - ReferenceResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ReferenceResourceVersion int NULL -) - -CREATE TABLE dbo.ReferenceSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - BaseUri varchar(128) COLLATE Latin1_General_100_CS_AS NULL, - ReferenceResourceTypeId smallint NULL, - ReferenceResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ReferenceResourceVersion int NULL, - IsHistory bit NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_ReferenceSearchParam -ON dbo.ReferenceSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_ReferenceSearchParam_SearchParamId_ReferenceResourceTypeId_ReferenceResourceId_BaseUri_ReferenceResourceVersion -ON dbo.ReferenceSearchParam -( - SearchParamId, - ReferenceResourceId, - ReferenceResourceTypeId, - BaseUri -) -INCLUDE -( - ResourceTypeId, - ReferenceResourceVersion -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - Token Search Param -**************************************************************/ - -CREATE TYPE dbo.TokenSearchParamTableType_1 AS TABLE -( - SearchParamId smallint NOT NULL, - SystemId int NULL, - Code varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.TokenSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId int NULL, - Code varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_TokenSearchParam -ON dbo.TokenSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_TokenSeachParam_SearchParamId_Code_SystemId -ON dbo.TokenSearchParam -( - SearchParamId, - Code, - SystemId -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - Token Text -**************************************************************/ - -CREATE TYPE dbo.TokenTextTableType_1 AS TABLE -( - SearchParamId smallint NOT NULL, - Text nvarchar(400) COLLATE Latin1_General_CI_AI NOT NULL -) - -CREATE TABLE dbo.TokenText -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - Text nvarchar(400) COLLATE Latin1_General_CI_AI NOT NULL, - IsHistory bit NOT NULL -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_TokenText -ON dbo.TokenText -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_TokenText_SearchParamId_Text -ON dbo.TokenText -( - SearchParamId, - Text -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - String Search Param -**************************************************************/ - -CREATE TYPE dbo.StringSearchParamTableType_1 AS TABLE -( - SearchParamId smallint NOT NULL, - Text nvarchar(256) COLLATE Latin1_General_100_CI_AI_SC NOT NULL, - TextOverflow nvarchar(max) COLLATE Latin1_General_100_CI_AI_SC NULL -) - -CREATE TABLE dbo.StringSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - Text nvarchar(256) COLLATE Latin1_General_100_CI_AI_SC NOT NULL, - TextOverflow nvarchar(max) COLLATE Latin1_General_100_CI_AI_SC NULL, - IsHistory bit NOT NULL -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_StringSearchParam -ON dbo.StringSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_StringSearchParam_SearchParamId_Text -ON dbo.StringSearchParam -( - SearchParamId, - Text -) -INCLUDE -( - ResourceTypeId, - TextOverflow -- workaround for https://support.microsoft.com/en-gb/help/3051225/a-filtered-index-that-you-create-together-with-the-is-null-predicate-i -) -WHERE IsHistory = 0 AND TextOverflow IS NULL -WITH (DATA_COMPRESSION = PAGE) - -CREATE NONCLUSTERED INDEX IX_StringSearchParam_SearchParamId_TextWithOverflow -ON dbo.StringSearchParam -( - SearchParamId, - Text -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 AND TextOverflow IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - URI Search Param -**************************************************************/ - -CREATE TYPE dbo.UriSearchParamTableType_1 AS TABLE -( - SearchParamId smallint NOT NULL, - Uri varchar(256) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.UriSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - Uri varchar(256) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_UriSearchParam -ON dbo.UriSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_UriSearchParam_SearchParamId_Uri -ON dbo.UriSearchParam -( - SearchParamId, - Uri -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -GO - - -/************************************************************* - Number Search Param -**************************************************************/ - --- We support the underlying value being a range, though we expect the vast majority of entries to be a single value. --- Either: --- (1) SingleValue is not null and LowValue and HighValue are both null, or --- (2) SingleValue is null and LowValue and HighValue are both not null --- We make use of filtered nonclustered indexes to keep queries over the ranges limited to those rows that actually have ranges - -CREATE TYPE dbo.NumberSearchParamTableType_1 AS TABLE -( - SearchParamId smallint NOT NULL, - SingleValue decimal(18,6) NULL, - LowValue decimal(18,6) NULL, - HighValue decimal(18,6) NULL -) - -CREATE TABLE dbo.NumberSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SingleValue decimal(18,6) NULL, - LowValue decimal(18,6) SPARSE NULL, - HighValue decimal(18,6) SPARSE NULL, - IsHistory bit NOT NULL -) - -CREATE CLUSTERED INDEX IXC_NumberSearchParam -ON dbo.NumberSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_NumberSearchParam_SearchParamId_SingleValue -ON dbo.NumberSearchParam -( - SearchParamId, - SingleValue -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 AND SingleValue IS NOT NULL - -CREATE NONCLUSTERED INDEX IX_NumberSearchParam_SearchParamId_LowValue_HighValue -ON dbo.NumberSearchParam -( - SearchParamId, - LowValue, - HighValue -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 AND LowValue IS NOT NULL - -CREATE NONCLUSTERED INDEX IX_NumberSearchParam_SearchParamId_HighValue_LowValue -ON dbo.NumberSearchParam -( - SearchParamId, - HighValue, - LowValue -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 AND LowValue IS NOT NULL - -GO - -/************************************************************* - Quantity Search Param -**************************************************************/ - --- See comment above for number search params for how we store ranges - -CREATE TYPE dbo.QuantitySearchParamTableType_1 AS TABLE -( - SearchParamId smallint NOT NULL, - SystemId int NULL, - QuantityCodeId int NULL, - SingleValue decimal(18,6) NULL, - LowValue decimal(18,6) NULL, - HighValue decimal(18,6) NULL -) - -CREATE TABLE dbo.QuantitySearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId int NULL, - QuantityCodeId int NULL, - SingleValue decimal(18,6) NULL, - LowValue decimal(18,6) SPARSE NULL, - HighValue decimal(18,6) SPARSE NULL, - IsHistory bit NOT NULL -) - -CREATE CLUSTERED INDEX IXC_QuantitySearchParam -ON dbo.QuantitySearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_QuantitySearchParam_SearchParamId_QuantityCodeId_SingleValue -ON dbo.QuantitySearchParam -( - SearchParamId, - QuantityCodeId, - SingleValue -) -INCLUDE -( - ResourceTypeId, - SystemId -) -WHERE IsHistory = 0 AND SingleValue IS NOT NULL - -CREATE NONCLUSTERED INDEX IX_QuantitySearchParam_SearchParamId_QuantityCodeId_LowValue_HighValue -ON dbo.QuantitySearchParam -( - SearchParamId, - QuantityCodeId, - LowValue, - HighValue -) -INCLUDE -( - ResourceTypeId, - SystemId -) -WHERE IsHistory = 0 AND LowValue IS NOT NULL - -CREATE NONCLUSTERED INDEX IX_QuantitySearchParam_SearchParamId_QuantityCodeId_HighValue_LowValue -ON dbo.QuantitySearchParam -( - SearchParamId, - QuantityCodeId, - HighValue, - LowValue -) -INCLUDE -( - ResourceTypeId, - SystemId -) -WHERE IsHistory = 0 AND LowValue IS NOT NULL - -GO - -/************************************************************* - Date Search Param -**************************************************************/ - -CREATE TYPE dbo.DateTimeSearchParamTableType_1 AS TABLE -( - SearchParamId smallint NOT NULL, - StartDateTime datetimeoffset(7) NOT NULL, - EndDateTime datetimeoffset(7) NOT NULL, - IsLongerThanADay bit NOT NULL -) - -CREATE TABLE dbo.DateTimeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - StartDateTime datetime2(7) NOT NULL, - EndDateTime datetime2(7) NOT NULL, - IsLongerThanADay bit NOT NULL, - IsHistory bit NOT NULL -) - -CREATE CLUSTERED INDEX IXC_DateTimeSearchParam -ON dbo.DateTimeSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_DateTimeSearchParam_SearchParamId_StartDateTime_EndDateTime -ON dbo.DateTimeSearchParam -( - SearchParamId, - StartDateTime, - EndDateTime -) -INCLUDE -( - ResourceTypeId, - IsLongerThanADay -) -WHERE IsHistory = 0 - -CREATE NONCLUSTERED INDEX IX_DateTimeSearchParam_SearchParamId_EndDateTime_StartDateTime -ON dbo.DateTimeSearchParam -( - SearchParamId, - EndDateTime, - StartDateTime -) -INCLUDE -( - ResourceTypeId, - IsLongerThanADay -) -WHERE IsHistory = 0 - - -CREATE NONCLUSTERED INDEX IX_DateTimeSearchParam_SearchParamId_StartDateTime_EndDateTime_Long -ON dbo.DateTimeSearchParam -( - SearchParamId, - StartDateTime, - EndDateTime -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 AND IsLongerThanADay = 1 - -CREATE NONCLUSTERED INDEX IX_DateTimeSearchParam_SearchParamId_EndDateTime_StartDateTime_Long -ON dbo.DateTimeSearchParam -( - SearchParamId, - EndDateTime, - StartDateTime -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 AND IsLongerThanADay = 1 - -GO - -/************************************************************* - Reference$Token Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.ReferenceTokenCompositeSearchParamTableType_2 AS TABLE -( - SearchParamId smallint NOT NULL, - BaseUri1 varchar(128) COLLATE Latin1_General_100_CS_AS NULL, - ReferenceResourceTypeId1 smallint NULL, - ReferenceResourceId1 varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ReferenceResourceVersion1 int NULL, - SystemId2 int NULL, - Code2 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.ReferenceTokenCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - BaseUri1 varchar(128) COLLATE Latin1_General_100_CS_AS NULL, - ReferenceResourceTypeId1 smallint NULL, - ReferenceResourceId1 varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ReferenceResourceVersion1 int NULL, - SystemId2 int NULL, - Code2 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_ReferenceTokenCompositeSearchParam -ON dbo.ReferenceTokenCompositeSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_ReferenceTokenCompositeSearchParam_ReferenceResourceId1_Code2 -ON dbo.ReferenceTokenCompositeSearchParam -( - SearchParamId, - ReferenceResourceId1, - Code2 -) -INCLUDE -( - ResourceTypeId, - ReferenceResourceTypeId1, - BaseUri1, - SystemId2 -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - Token$Token Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.TokenTokenCompositeSearchParamTableType_1 AS TABLE -( - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SystemId2 int NULL, - Code2 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.TokenTokenCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SystemId2 int NULL, - Code2 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_TokenTokenCompositeSearchParam -ON dbo.TokenTokenCompositeSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_TokenTokenCompositeSearchParam_Code1_Code2 -ON dbo.TokenTokenCompositeSearchParam -( - SearchParamId, - Code1, - Code2 -) -INCLUDE -( - ResourceTypeId, - SystemId1, - SystemId2 -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - Token$DateTime Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.TokenDateTimeCompositeSearchParamTableType_1 AS TABLE -( - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - StartDateTime2 datetimeoffset(7) NOT NULL, - EndDateTime2 datetimeoffset(7) NOT NULL, - IsLongerThanADay2 bit NOT NULL -) - -CREATE TABLE dbo.TokenDateTimeCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - StartDateTime2 datetime2(7) NOT NULL, - EndDateTime2 datetime2(7) NOT NULL, - IsLongerThanADay2 bit NOT NULL, - IsHistory bit NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_TokenDateTimeCompositeSearchParam -ON dbo.TokenDateTimeCompositeSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_TokenDateTimeCompositeSearchParam_Code1_StartDateTime2_EndDateTime2 -ON dbo.TokenDateTimeCompositeSearchParam -( - SearchParamId, - Code1, - StartDateTime2, - EndDateTime2 -) -INCLUDE -( - ResourceTypeId, - SystemId1, - IsLongerThanADay2 -) - -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -CREATE NONCLUSTERED INDEX IX_TokenDateTimeCompositeSearchParam_Code1_EndDateTime2_StartDateTime2 -ON dbo.TokenDateTimeCompositeSearchParam -( - SearchParamId, - Code1, - EndDateTime2, - StartDateTime2 -) -INCLUDE -( - ResourceTypeId, - SystemId1, - IsLongerThanADay2 -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -CREATE NONCLUSTERED INDEX IX_TokenDateTimeCompositeSearchParam_Code1_StartDateTime2_EndDateTime2_Long -ON dbo.TokenDateTimeCompositeSearchParam -( - SearchParamId, - Code1, - StartDateTime2, - EndDateTime2 -) -INCLUDE -( - ResourceTypeId, - SystemId1 -) - -WHERE IsHistory = 0 AND IsLongerThanADay2 = 1 -WITH (DATA_COMPRESSION = PAGE) - -CREATE NONCLUSTERED INDEX IX_TokenDateTimeCompositeSearchParam_Code1_EndDateTime2_StartDateTime2_Long -ON dbo.TokenDateTimeCompositeSearchParam -( - SearchParamId, - Code1, - EndDateTime2, - StartDateTime2 -) -INCLUDE -( - ResourceTypeId, - SystemId1 -) -WHERE IsHistory = 0 AND IsLongerThanADay2 = 1 -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - Token$Quantity Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.TokenQuantityCompositeSearchParamTableType_1 AS TABLE -( - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SystemId2 int NULL, - QuantityCodeId2 int NULL, - SingleValue2 decimal(18,6) NULL, - LowValue2 decimal(18,6) NULL, - HighValue2 decimal(18,6) NULL -) - -CREATE TABLE dbo.TokenQuantityCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SystemId2 int NULL, - QuantityCodeId2 int NULL, - SingleValue2 decimal(18,6) NULL, - LowValue2 decimal(18,6) NULL, - HighValue2 decimal(18,6) NULL, - IsHistory bit NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_TokenQuantityCompositeSearchParam -ON dbo.TokenQuantityCompositeSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_TokenQuantityCompositeSearchParam_SearchParamId_Code1_QuantityCodeId2_SingleValue2 -ON dbo.TokenQuantityCompositeSearchParam -( - SearchParamId, - Code1, - SingleValue2 -) -INCLUDE -( - ResourceTypeId, - QuantityCodeId2, - SystemId1, - SystemId2 -) -WHERE IsHistory = 0 AND SingleValue2 IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) - -CREATE NONCLUSTERED INDEX IX_TokenQuantityCompositeSearchParam_SearchParamId_Code1_QuantityCodeId2_LowValue2_HighValue2 -ON dbo.TokenQuantityCompositeSearchParam -( - SearchParamId, - Code1, - LowValue2, - HighValue2 -) -INCLUDE -( - ResourceTypeId, - QuantityCodeId2, - SystemId1, - SystemId2 -) -WHERE IsHistory = 0 AND LowValue2 IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) - -CREATE NONCLUSTERED INDEX IX_TokenQuantityCompositeSearchParam_SearchParamId_Code1_QuantityCodeId2_HighValue2_LowValue2 -ON dbo.TokenQuantityCompositeSearchParam -( - SearchParamId, - Code1, - HighValue2, - LowValue2 -) -INCLUDE -( - ResourceTypeId, - QuantityCodeId2, - SystemId1, - SystemId2 -) -WHERE IsHistory = 0 AND LowValue2 IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - Token$String Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.TokenStringCompositeSearchParamTableType_1 AS TABLE -( - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - Text2 nvarchar(256) COLLATE Latin1_General_100_CI_AI_SC NOT NULL, - TextOverflow2 nvarchar(max) COLLATE Latin1_General_100_CI_AI_SC NULL -) - -CREATE TABLE dbo.TokenStringCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - Text2 nvarchar(256) COLLATE Latin1_General_CI_AI NOT NULL, - TextOverflow2 nvarchar(max) COLLATE Latin1_General_CI_AI NULL, - IsHistory bit NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_TokenStringCompositeSearchParam -ON dbo.TokenStringCompositeSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_TokenStringCompositeSearchParam_SearchParamId_Code1_Text2 -ON dbo.TokenStringCompositeSearchParam -( - SearchParamId, - Code1, - Text2 -) -INCLUDE -( - ResourceTypeId, - SystemId1, - TextOverflow2 -- workaround for https://support.microsoft.com/en-gb/help/3051225/a-filtered-index-that-you-create-together-with-the-is-null-predicate-i -) -WHERE IsHistory = 0 AND TextOverflow2 IS NULL -WITH (DATA_COMPRESSION = PAGE) - -CREATE NONCLUSTERED INDEX IX_TokenStringCompositeSearchParam_SearchParamId_Code1_Text2WithOverflow -ON dbo.TokenStringCompositeSearchParam -( - SearchParamId, - Code1, - Text2 -) -INCLUDE -( - ResourceTypeId, - SystemId1 -) -WHERE IsHistory = 0 AND TextOverflow2 IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) - -GO - - -/************************************************************* - Token$Number$Number Composite Search Param -**************************************************************/ - --- See number search param for how we deal with null. We apply a similar pattern here, --- except that we pass in a HasRange bit though the TVP. The alternative would have --- for a computed column, but a computed column cannot be used in as a index filter --- (even if it is a persisted computed column). - - -CREATE TYPE dbo.TokenNumberNumberCompositeSearchParamTableType_1 AS TABLE -( - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SingleValue2 decimal(18,6) NULL, - LowValue2 decimal(18,6) NULL, - HighValue2 decimal(18,6) NULL, - SingleValue3 decimal(18,6) NULL, - LowValue3 decimal(18,6) NULL, - HighValue3 decimal(18,6) NULL, - HasRange bit NOT NULL -) - -CREATE TABLE dbo.TokenNumberNumberCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SingleValue2 decimal(18,6) NULL, - LowValue2 decimal(18,6) NULL, - HighValue2 decimal(18,6) NULL, - SingleValue3 decimal(18,6) NULL, - LowValue3 decimal(18,6) NULL, - HighValue3 decimal(18,6) NULL, - HasRange bit NOT NULL, - IsHistory bit NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_TokenNumberNumberCompositeSearchParam -ON dbo.TokenNumberNumberCompositeSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_TokenNumberNumberCompositeSearchParam_SearchParamId_Code1_Text2 -ON dbo.TokenNumberNumberCompositeSearchParam -( - SearchParamId, - Code1, - SingleValue2, - SingleValue3 -) -INCLUDE -( - ResourceTypeId, - SystemId1 -) -WHERE IsHistory = 0 AND HasRange = 0 -WITH (DATA_COMPRESSION = PAGE) - -CREATE NONCLUSTERED INDEX IX_TokenNumberNumberCompositeSearchParam_SearchParamId_Code1_LowValue2_HighValue2_LowValue3_HighValue3 -ON dbo.TokenNumberNumberCompositeSearchParam -( - SearchParamId, - Code1, - LowValue2, - HighValue2, - LowValue3, - HighValue3 -) -INCLUDE -( - ResourceTypeId, - SystemId1 -) -WHERE IsHistory = 0 AND HasRange = 1 -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - Sequence for generating unique 12.5ns "tick" components that are added - to a base ID based on the timestamp to form a unique resource surrogate ID -**************************************************************/ - -CREATE SEQUENCE dbo.ResourceSurrogateIdUniquifierSequence - AS int - START WITH 0 - INCREMENT BY 1 - MINVALUE 0 - MAXVALUE 79999 - CYCLE - CACHE 1000000 -GO - -/************************************************************* - Stored procedures for creating and deleting -**************************************************************/ - --- --- STORED PROCEDURE --- UpsertResource_2 --- --- DESCRIPTION --- Creates or updates (including marking deleted) a FHIR resource --- --- PARAMETERS --- @baseResourceSurrogateId --- * A bigint to which a value between [0, 80000) is added, forming a unique ResourceSurrogateId. --- * This value should be the current UTC datetime, truncated to millisecond precision, with its 100ns ticks component bitshifted left by 3. --- @resourceTypeId --- * The ID of the resource type (See ResourceType table) --- @resourceid --- * The resource ID (must be the same as the in the resource itself) --- @allowCreate --- * If false, an error is thrown if the resource does not already exist --- @isDeleted --- * Whether this resource marks the resource as deleted --- @updatedDateTime --- * The last modified time in the resource --- @keepHistory --- * Whether the existing version of the resource should be preserved --- @requestMethod --- * The HTTP method/verb used for the request --- @rawResource --- * A compressed UTF16-encoded JSON document --- @resourceWriteClaims --- * Claims on the principal that performed the write --- @compartmentAssignments --- * Compartments that the resource is part of --- @referenceSearchParams --- * Extracted reference search params --- @tokenSearchParams --- * Extracted token search params --- @tokenTextSearchParams --- * The text representation of extracted token search params --- @stringSearchParams --- * Extracted string search params --- @numberSearchParams --- * Extracted number search params --- @quantitySearchParams --- * Extracted quantity search params --- @uriSearchParams --- * Extracted URI search params --- @dateTimeSearchParms --- * Extracted datetime search params --- @referenceTokenCompositeSearchParams --- * Extracted reference$token search params --- @tokenTokenCompositeSearchParams --- * Extracted token$token tokensearch params --- @tokenDateTimeCompositeSearchParams --- * Extracted token$datetime search params --- @tokenQuantityCompositeSearchParams --- * Extracted token$quantity search params --- @tokenStringCompositeSearchParams --- * Extracted token$string search params --- @tokenNumberNumberCompositeSearchParams --- * Extracted token$number$number search params --- --- RETURN VALUE --- The version of the resource as a result set. Will be empty if no insertion was done. --- -CREATE PROCEDURE dbo.UpsertResource_2 - @baseResourceSurrogateId bigint, - @resourceTypeId smallint, - @resourceId varchar(64), - @eTag int = NULL, - @allowCreate bit, - @isDeleted bit, - @keepHistory bit, - @requestMethod varchar(10), - @rawResource varbinary(max), - @resourceWriteClaims dbo.ResourceWriteClaimTableType_1 READONLY, - @compartmentAssignments dbo.CompartmentAssignmentTableType_1 READONLY, - @referenceSearchParams dbo.ReferenceSearchParamTableType_2 READONLY, - @tokenSearchParams dbo.TokenSearchParamTableType_1 READONLY, - @tokenTextSearchParams dbo.TokenTextTableType_1 READONLY, - @stringSearchParams dbo.StringSearchParamTableType_1 READONLY, - @numberSearchParams dbo.NumberSearchParamTableType_1 READONLY, - @quantitySearchParams dbo.QuantitySearchParamTableType_1 READONLY, - @uriSearchParams dbo.UriSearchParamTableType_1 READONLY, - @dateTimeSearchParms dbo.DateTimeSearchParamTableType_1 READONLY, - @referenceTokenCompositeSearchParams dbo.ReferenceTokenCompositeSearchParamTableType_2 READONLY, - @tokenTokenCompositeSearchParams dbo.TokenTokenCompositeSearchParamTableType_1 READONLY, - @tokenDateTimeCompositeSearchParams dbo.TokenDateTimeCompositeSearchParamTableType_1 READONLY, - @tokenQuantityCompositeSearchParams dbo.TokenQuantityCompositeSearchParamTableType_1 READONLY, - @tokenStringCompositeSearchParams dbo.TokenStringCompositeSearchParamTableType_1 READONLY, - @tokenNumberNumberCompositeSearchParams dbo.TokenNumberNumberCompositeSearchParamTableType_1 READONLY -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - -- variables for the existing version of the resource that will be replaced - DECLARE @previousResourceSurrogateId bigint - DECLARE @previousVersion bigint - DECLARE @previousIsDeleted bit - - -- This should place a range lock on a row in the IX_Resource_ResourceTypeId_ResourceId nonclustered filtered index - SELECT @previousResourceSurrogateId = ResourceSurrogateId, @previousVersion = Version, @previousIsDeleted = IsDeleted - FROM dbo.Resource WITH (UPDLOCK, HOLDLOCK) - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId AND IsHistory = 0 - - IF (@etag IS NOT NULL AND @etag <> @previousVersion) BEGIN - THROW 50412, 'Precondition failed', 1; - END - - DECLARE @version int -- the version of the resource being written - - IF (@previousResourceSurrogateId IS NULL) BEGIN - -- There is no previous version of this resource - - IF (@isDeleted = 1) BEGIN - -- Don't bother marking the resource as deleted since it already does not exist. - COMMIT TRANSACTION - RETURN - END - - IF (@etag IS NOT NULL) BEGIN - -- You can't update a resource with a specified version if the resource does not exist - THROW 50404, 'Resource with specified version not found', 1; - END - - IF (@allowCreate = 0) BEGIN - THROW 50405, 'Resource does not exist and create is not allowed', 1; - END - - SET @version = 1 - END - ELSE BEGIN - -- There is a previous version - - IF (@isDeleted = 1 AND @previousIsDeleted = 1) BEGIN - -- Already deleted - don't create a new version - COMMIT TRANSACTION - RETURN - END - - SET @version = @previousVersion + 1 - - IF (@keepHistory = 1) BEGIN - - -- Set the existing resource as history - UPDATE dbo.Resource - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - -- Set the indexes for this resource as history. - -- Note there is no IsHistory column on ResourceWriteClaim since we do not query it. - - UPDATE dbo.CompartmentAssignment - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.ReferenceSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenText - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.StringSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.UriSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.NumberSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.QuantitySearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.DateTimeSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.ReferenceTokenCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenTokenCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenDateTimeCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenQuantityCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenStringCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenNumberNumberCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - END - ELSE BEGIN - - -- Not keeping history. Delete the current resource and all associated indexes. - - DELETE FROM dbo.Resource - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.ResourceWriteClaim - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.CompartmentAssignment - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.ReferenceSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenText - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.StringSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.UriSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.NumberSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.QuantitySearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.DateTimeSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.ReferenceTokenCompositeSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenTokenCompositeSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenDateTimeCompositeSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenQuantityCompositeSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenStringCompositeSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenNumberNumberCompositeSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - END - END - - DECLARE @resourceSurrogateId bigint = @baseResourceSurrogateId + (NEXT VALUE FOR ResourceSurrogateIdUniquifierSequence) - DECLARE @isRawResourceMetaSet bit - - IF (@version = 1) BEGIN SET @isRawResourceMetaSet = 1 END ELSE BEGIN SET @isRawResourceMetaSet = 0 END - - INSERT INTO dbo.Resource - (ResourceTypeId, ResourceId, Version, IsHistory, ResourceSurrogateId, IsDeleted, RequestMethod, RawResource, IsRawResourceMetaSet) - VALUES - (@resourceTypeId, @resourceId, @version, 0, @resourceSurrogateId, @isDeleted, @requestMethod, @rawResource, @isRawResourceMetaSet) - - INSERT INTO dbo.ResourceWriteClaim - (ResourceSurrogateId, ClaimTypeId, ClaimValue) - SELECT @resourceSurrogateId, ClaimTypeId, ClaimValue - FROM @resourceWriteClaims - - INSERT INTO dbo.CompartmentAssignment - (ResourceTypeId, ResourceSurrogateId, CompartmentTypeId, ReferenceResourceId, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, CompartmentTypeId, ReferenceResourceId, 0 - FROM @compartmentAssignments - - INSERT INTO dbo.ReferenceSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri, ReferenceResourceTypeId, ReferenceResourceId, ReferenceResourceVersion, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, BaseUri, ReferenceResourceTypeId, ReferenceResourceId, ReferenceResourceVersion, 0 - FROM @referenceSearchParams - - INSERT INTO dbo.TokenSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, Code, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId, Code, 0 - FROM @tokenSearchParams - - INSERT INTO dbo.TokenText - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Text, 0 - FROM @tokenTextSearchParams - - INSERT INTO dbo.StringSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, TextOverflow, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Text, TextOverflow, 0 - FROM @stringSearchParams - - INSERT INTO dbo.UriSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Uri, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Uri, 0 - FROM @uriSearchParams - - INSERT INTO dbo.NumberSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SingleValue, LowValue, HighValue, 0 - FROM @numberSearchParams - - INSERT INTO dbo.QuantitySearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, QuantityCodeId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId, QuantityCodeId, SingleValue, LowValue, HighValue, 0 - FROM @quantitySearchParams - - INSERT INTO dbo.DateTimeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, StartDateTime, EndDateTime, IsLongerThanADay, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, StartDateTime, EndDateTime, IsLongerThanADay, 0 - FROM @dateTimeSearchParms - - INSERT INTO dbo.ReferenceTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri1, ReferenceResourceTypeId1, ReferenceResourceId1, ReferenceResourceVersion1, SystemId2, Code2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, BaseUri1, ReferenceResourceTypeId1, ReferenceResourceId1, ReferenceResourceVersion1, SystemId2, Code2, 0 - FROM @referenceTokenCompositeSearchParams - - INSERT INTO dbo.TokenTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SystemId2, Code2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SystemId2, Code2, 0 - FROM @tokenTokenCompositeSearchParams - - INSERT INTO dbo.TokenDateTimeCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, StartDateTime2, EndDateTime2, IsLongerThanADay2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, StartDateTime2, EndDateTime2, IsLongerThanADay2, 0 - FROM @tokenDateTimeCompositeSearchParams - - INSERT INTO dbo.TokenQuantityCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, SystemId2, QuantityCodeId2, LowValue2, HighValue2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, SystemId2, QuantityCodeId2, LowValue2, HighValue2, 0 - FROM @tokenQuantityCompositeSearchParams - - INSERT INTO dbo.TokenStringCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, Text2, TextOverflow2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, Text2, TextOverflow2, 0 - FROM @tokenStringCompositeSearchParams - - INSERT INTO dbo.TokenNumberNumberCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, LowValue2, HighValue2, SingleValue3, LowValue3, HighValue3, HasRange, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, LowValue2, HighValue2, SingleValue3, LowValue3, HighValue3, HasRange, 0 - FROM @tokenNumberNumberCompositeSearchParams - - SELECT @version - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- ReadResource --- --- DESCRIPTION --- Reads a single resource, optionally a specific version of the resource. --- --- PARAMETERS --- @resourceTypeId --- * The ID of the resource type (See ResourceType table) --- @resourceId --- * The resource ID --- @version --- * A specific version of the resource. If null, returns the latest version. --- RETURN VALUE --- A result set with 0 or 1 rows. --- -CREATE PROCEDURE dbo.ReadResource - @resourceTypeId smallint, - @resourceId varchar(64), - @version int = NULL -AS - SET NOCOUNT ON - - IF (@version IS NULL) BEGIN - SELECT ResourceSurrogateId, Version, IsDeleted, IsHistory, RawResource, IsRawResourceMetaSet - FROM dbo.Resource - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId AND IsHistory = 0 - END - ELSE BEGIN - SELECT ResourceSurrogateId, Version, IsDeleted, IsHistory, RawResource, IsRawResourceMetaSet - FROM dbo.Resource - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId AND Version = @version - END -GO - --- --- STORED PROCEDURE --- Deletes a single resource --- --- DESCRIPTION --- Permanently deletes all data related to a resource. --- Data remains recoverable from the transaction log, however. --- --- PARAMETERS --- @resourceTypeId --- * The ID of the resource type (See ResourceType table) --- @resourceId --- * The resource ID (must be the same as in the resource itself) --- -CREATE PROCEDURE dbo.HardDeleteResource - @resourceTypeId smallint, - @resourceId varchar(64) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @resourceSurrogateIds TABLE(ResourceSurrogateId bigint NOT NULL) - - DELETE FROM dbo.Resource - OUTPUT deleted.ResourceSurrogateId - INTO @resourceSurrogateIds - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId - - DELETE FROM dbo.ResourceWriteClaim - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.CompartmentAssignment - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.ReferenceSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenText - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.StringSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.UriSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.NumberSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.QuantitySearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.DateTimeSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.ReferenceTokenCompositeSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenTokenCompositeSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenDateTimeCompositeSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenQuantityCompositeSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenStringCompositeSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenNumberNumberCompositeSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - COMMIT TRANSACTION -GO - -/************************************************************* - Export Job -**************************************************************/ -CREATE TABLE dbo.ExportJob -( - Id varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - Hash varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - Status varchar(10) NOT NULL, - HeartbeatDateTime datetime2(7) NULL, - RawJobRecord varchar(max) NOT NULL, - JobVersion rowversion NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_ExportJob ON dbo.ExportJob -( - Id -) - -CREATE UNIQUE NONCLUSTERED INDEX IX_ExportJob_Hash_Status_HeartbeatDateTime ON dbo.ExportJob -( - Hash, - Status, - HeartbeatDateTime -) - -GO - -/************************************************************* - Stored procedures for exporting -**************************************************************/ --- --- STORED PROCEDURE --- Creates an export job. --- --- DESCRIPTION --- Creates a new row to the ExportJob table, adding a new job to the queue of jobs to be processed. --- --- PARAMETERS --- @id --- * The ID of the export job record --- @hash --- * The SHA256 hash of the export job record ID --- @status --- * The status of the export job --- @rawJobRecord --- * A JSON document --- --- RETURN VALUE --- The row version of the created export job. --- -CREATE PROCEDURE dbo.CreateExportJob - @id varchar(64), - @hash varchar(64), - @status varchar(10), - @rawJobRecord varchar(max) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - INSERT INTO dbo.ExportJob - (Id, Hash, Status, HeartbeatDateTime, RawJobRecord) - VALUES - (@id, @hash, @status, @heartbeatDateTime, @rawJobRecord) - - SELECT CAST(MIN_ACTIVE_ROWVERSION() AS INT) - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- Gets an export job given its ID. --- --- DESCRIPTION --- Retrieves the export job record from the ExportJob table that has the matching ID. --- --- PARAMETERS --- @id --- * The ID of the export job record to retrieve --- --- RETURN VALUE --- The matching export job. --- -CREATE PROCEDURE dbo.GetExportJobById - @id varchar(64) -AS - SET NOCOUNT ON - - SELECT RawJobRecord, JobVersion - FROM dbo.ExportJob - WHERE Id = @id -GO - --- --- STORED PROCEDURE --- Gets an export job given the hash of its ID. --- --- DESCRIPTION --- Retrieves the export job record from the ExportJob table that has the matching hash. --- --- PARAMETERS --- @hash --- * The SHA256 hash of the export job record ID --- --- RETURN VALUE --- The matching export job. --- -CREATE PROCEDURE dbo.GetExportJobByHash - @hash varchar(64) -AS - SET NOCOUNT ON - - SELECT TOP(1) RawJobRecord, JobVersion - FROM dbo.ExportJob - WHERE Hash = @hash AND (Status = 'Queued' OR Status = 'Running') - ORDER BY HeartbeatDateTime ASC -GO - --- --- STORED PROCEDURE --- Updates an export job. --- --- DESCRIPTION --- Modifies an existing job in the ExportJob table. --- --- PARAMETERS --- @id --- * The ID of the export job record --- @status --- * The status of the export job --- @rawJobRecord --- * A JSON document --- @jobVersion --- * The version of the job to update must match this --- --- RETURN VALUE --- The row version of the updated export job. --- -CREATE PROCEDURE dbo.UpdateExportJob - @id varchar(64), - @status varchar(10), - @rawJobRecord varchar(max), - @jobVersion binary(8) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @currentJobVersion binary(8) - - -- Acquire and hold an update lock on a row in the ExportJob table for the entire transaction. - -- This ensures the version check and update occur atomically. - SELECT @currentJobVersion = JobVersion - FROM dbo.ExportJob WITH (UPDLOCK, HOLDLOCK) - WHERE Id = @id - - IF (@currentJobVersion IS NULL) BEGIN - THROW 50404, 'Export job record not found', 1; - END - - IF (@jobVersion <> @currentJobVersion) BEGIN - THROW 50412, 'Precondition failed', 1; - END - - -- We will timestamp the jobs when we update them to track stale jobs. - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - UPDATE dbo.ExportJob - SET Status = @status, HeartbeatDateTime = @heartbeatDateTime, RawJobRecord = @rawJobRecord - WHERE Id = @id - - SELECT MIN_ACTIVE_ROWVERSION() - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- Acquires export jobs. --- --- DESCRIPTION --- Timestamps the available export jobs and sets their statuses to running. --- --- PARAMETERS --- @jobHeartbeatTimeoutThresholdInSeconds --- * The number of seconds that must pass before an export job is considered stale --- @maximumNumberOfConcurrentJobsAllowed --- * The maximum number of running jobs we can have at once --- --- RETURN VALUE --- The updated jobs that are now running. --- -CREATE PROCEDURE dbo.AcquireExportJobs - @jobHeartbeatTimeoutThresholdInSeconds bigint, - @maximumNumberOfConcurrentJobsAllowed int -AS - SET NOCOUNT ON - SET XACT_ABORT ON - - SET TRANSACTION ISOLATION LEVEL SERIALIZABLE - BEGIN TRANSACTION - - -- We will consider a job to be stale if its timestamp is smaller than or equal to this. - DECLARE @expirationDateTime dateTime2(7) - SELECT @expirationDateTime = DATEADD(second, -@jobHeartbeatTimeoutThresholdInSeconds, SYSUTCDATETIME()) - - -- Get the number of jobs that are running and not stale. - -- Acquire and hold an exclusive table lock for the entire transaction to prevent jobs from being created, updated or deleted during acquisitions. - DECLARE @numberOfRunningJobs int - SELECT @numberOfRunningJobs = COUNT(*) FROM dbo.ExportJob WITH (TABLOCKX) WHERE Status = 'Running' AND HeartbeatDateTime > @expirationDateTime - - -- Determine how many available jobs we can pick up. - DECLARE @limit int = @maximumNumberOfConcurrentJobsAllowed - @numberOfRunningJobs; - - DECLARE @availableJobs TABLE (Id varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, JobVersion binary(8) NOT NULL) - - -- Get the available jobs, which are export jobs that are queued or stale. - -- Older jobs will be prioritized over newer ones. - INSERT INTO @availableJobs - SELECT TOP(@limit) Id, JobVersion - FROM dbo.ExportJob - WHERE (Status = 'Queued' OR (Status = 'Running' AND HeartbeatDateTime <= @expirationDateTime)) - ORDER BY HeartbeatDateTime - - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - -- Update each available job's status to running both in the export table's status column and in the raw export job record JSON. - UPDATE dbo.ExportJob - SET Status = 'Running', HeartbeatDateTime = @heartbeatDateTime, RawJobRecord = JSON_MODIFY(RawJobRecord,'$.status', 'Running') - OUTPUT inserted.RawJobRecord, inserted.JobVersion - FROM dbo.ExportJob job INNER JOIN @availableJobs availableJob ON job.Id = availableJob.Id AND job.JobVersion = availableJob.JobVersion - - COMMIT TRANSACTION -GO - -/************************************************************* - Search Parameter Status Information -**************************************************************/ - --- We adopted this naming convention for table-valued parameters because they are immutable. -CREATE TYPE dbo.SearchParamTableType_1 AS TABLE -( - Uri varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - Status varchar(10) NOT NULL, - IsPartiallySupported bit NOT NULL -) - -GO - -/************************************************************* - Stored procedures for search parameter information -**************************************************************/ --- --- STORED PROCEDURE --- GetSearchParamStatuses --- --- DESCRIPTION --- Gets all the search parameters and their statuses. --- --- RETURN VALUE --- The search parameters and their statuses. --- -CREATE PROCEDURE dbo.GetSearchParamStatuses -AS - SET NOCOUNT ON - - SELECT Uri, Status, LastUpdated, IsPartiallySupported FROM dbo.SearchParam -GO - --- --- STORED PROCEDURE --- UpsertSearchParams --- --- DESCRIPTION --- Given a set of search parameters, creates or updates the parameters. --- --- PARAMETERS --- @searchParams --- * The updated existing search parameters or the new search parameters --- -CREATE PROCEDURE dbo.UpsertSearchParams - @searchParams dbo.SearchParamTableType_1 READONLY -AS - SET NOCOUNT ON - SET XACT_ABORT ON - - SET TRANSACTION ISOLATION LEVEL SERIALIZABLE - BEGIN TRANSACTION - - DECLARE @lastUpdated datetimeoffset(7) = SYSDATETIMEOFFSET() - - -- Acquire and hold an exclusive table lock for the entire transaction to prevent parameters from being added or modified during upsert. - MERGE INTO dbo.SearchParam WITH (TABLOCKX) AS target - USING @searchParams AS source - ON target.Uri = source.Uri - WHEN MATCHED THEN - UPDATE - SET Status = source.Status, LastUpdated = @lastUpdated, IsPartiallySupported = source.IsPartiallySupported - WHEN NOT MATCHED BY target THEN - INSERT - (Uri, Status, LastUpdated, IsPartiallySupported) - VALUES (source.Uri, source.Status, @lastUpdated, source.IsPartiallySupported); - - COMMIT TRANSACTION -GO diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Schema/Migrations/8.sql b/src/Microsoft.Health.Fhir.SqlServer/Features/Schema/Migrations/8.sql deleted file mode 100644 index 4f7003174a..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Schema/Migrations/8.sql +++ /dev/null @@ -1,2721 +0,0 @@ --- Style guide: please see: https://github.com/ktaranov/sqlserver-kit/blob/master/SQL%20Server%20Name%20Convention%20and%20T-SQL%20Programming%20Style.md - -/************************************************************* - Schema Version -**************************************************************/ - -INSERT INTO dbo.SchemaVersion -VALUES - (8, 'started') - -GO - -/************************************************************* - Model tables -**************************************************************/ - -CREATE TABLE dbo.SearchParam -( - SearchParamId smallint IDENTITY(1,1) NOT NULL, - Uri varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - Status varchar(10) NULL, - LastUpdated datetimeoffset(7) NULL, - IsPartiallySupported bit NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_SearchParam ON dbo.SearchParam -( - Uri -) - -CREATE TABLE dbo.ResourceType -( - ResourceTypeId smallint IDENTITY(1,1) NOT NULL, - Name nvarchar(50) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_ResourceType on dbo.ResourceType -( - Name -) - --- Create System and QuantityCode tables - -CREATE TABLE dbo.System -( - SystemId int IDENTITY(1,1) NOT NULL, - Value nvarchar(256) NOT NULL, -) - -CREATE UNIQUE CLUSTERED INDEX IXC_System ON dbo.System -( - Value -) - -CREATE TABLE dbo.QuantityCode -( - QuantityCodeId int IDENTITY(1,1) NOT NULL, - Value nvarchar(256) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_QuantityCode on dbo.QuantityCode -( - Value -) - -/************************************************************* - Resource table -**************************************************************/ - -CREATE TABLE dbo.Resource -( - ResourceTypeId smallint NOT NULL, - ResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - Version int NOT NULL, - IsHistory bit NOT NULL, - ResourceSurrogateId bigint NOT NULL, - IsDeleted bit NOT NULL, - RequestMethod varchar(10) NULL, - RawResource varbinary(max) NOT NULL, - IsRawResourceMetaSet bit NOT NULL DEFAULT 0, - SearchParamHash varchar(64) NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_Resource ON dbo.Resource -( - ResourceSurrogateId -) - -CREATE UNIQUE NONCLUSTERED INDEX IX_Resource_ResourceTypeId_ResourceId_Version ON dbo.Resource -( - ResourceTypeId, - ResourceId, - Version -) - -CREATE UNIQUE NONCLUSTERED INDEX IX_Resource_ResourceTypeId_ResourceId ON dbo.Resource -( - ResourceTypeId, - ResourceId -) -INCLUDE -- We want the query in UpsertResource, which is done with UPDLOCK AND HOLDLOCK, to not require a key lookup -( - Version, - IsDeleted -) -WHERE IsHistory = 0 - -CREATE UNIQUE NONCLUSTERED INDEX IX_Resource_ResourceTypeId_ResourceSurrgateId ON dbo.Resource -( - ResourceTypeId, - ResourceSurrogateId -) -WHERE IsHistory = 0 AND IsDeleted = 0 - -/************************************************************* - Capture claims on write -**************************************************************/ - -CREATE TABLE dbo.ClaimType -( - ClaimTypeId tinyint IDENTITY(1,1) NOT NULL, - Name varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_Claim on dbo.ClaimType -( - Name -) - -CREATE TYPE dbo.BulkResourceWriteClaimTableType_1 AS TABLE -( - Offset int NOT NULL, - ClaimTypeId tinyint NOT NULL, - ClaimValue nvarchar(128) NOT NULL -) - -CREATE TABLE dbo.ResourceWriteClaim -( - ResourceSurrogateId bigint NOT NULL, - ClaimTypeId tinyint NOT NULL, - ClaimValue nvarchar(128) NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_ResourceWriteClaim on dbo.ResourceWriteClaim -( - ResourceSurrogateId, - ClaimTypeId -) - -/************************************************************* - Compartments -**************************************************************/ - -CREATE TABLE dbo.CompartmentType -( - CompartmentTypeId tinyint IDENTITY(1,1) NOT NULL, - Name varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_CompartmentType on dbo.CompartmentType -( - Name -) - -CREATE TYPE dbo.BulkCompartmentAssignmentTableType_1 AS TABLE -( - Offset int NOT NULL, - CompartmentTypeId tinyint NOT NULL, - ReferenceResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.CompartmentAssignment -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - CompartmentTypeId tinyint NOT NULL, - ReferenceResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_CompartmentAssignment -ON dbo.CompartmentAssignment -( - ResourceSurrogateId, - CompartmentTypeId, - ReferenceResourceId -) - -CREATE NONCLUSTERED INDEX IX_CompartmentAssignment_CompartmentTypeId_ReferenceResourceId -ON dbo.CompartmentAssignment -( - CompartmentTypeId, - ReferenceResourceId -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - Reference Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkReferenceSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - BaseUri varchar(128) COLLATE Latin1_General_100_CS_AS NULL, - ReferenceResourceTypeId smallint NULL, - ReferenceResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ReferenceResourceVersion int NULL -) - -CREATE TABLE dbo.ReferenceSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - BaseUri varchar(128) COLLATE Latin1_General_100_CS_AS NULL, - ReferenceResourceTypeId smallint NULL, - ReferenceResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ReferenceResourceVersion int NULL, - IsHistory bit NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_ReferenceSearchParam -ON dbo.ReferenceSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_ReferenceSearchParam_SearchParamId_ReferenceResourceTypeId_ReferenceResourceId_BaseUri_ReferenceResourceVersion -ON dbo.ReferenceSearchParam -( - SearchParamId, - ReferenceResourceId, - ReferenceResourceTypeId, - BaseUri -) -INCLUDE -( - ResourceTypeId, - ReferenceResourceVersion -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - Token Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkTokenSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId int NULL, - Code varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.TokenSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId int NULL, - Code varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_TokenSearchParam -ON dbo.TokenSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_TokenSeachParam_SearchParamId_Code_SystemId -ON dbo.TokenSearchParam -( - SearchParamId, - Code, - SystemId -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - Token Text -**************************************************************/ - -CREATE TYPE dbo.BulkTokenTextTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - Text nvarchar(400) COLLATE Latin1_General_CI_AI NOT NULL -) - -CREATE TABLE dbo.TokenText -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - Text nvarchar(400) COLLATE Latin1_General_CI_AI NOT NULL, - IsHistory bit NOT NULL -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_TokenText -ON dbo.TokenText -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_TokenText_SearchParamId_Text -ON dbo.TokenText -( - SearchParamId, - Text -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - String Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkStringSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - Text nvarchar(256) COLLATE Latin1_General_100_CI_AI_SC NOT NULL, - TextOverflow nvarchar(max) COLLATE Latin1_General_100_CI_AI_SC NULL -) - -CREATE TABLE dbo.StringSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - Text nvarchar(256) COLLATE Latin1_General_100_CI_AI_SC NOT NULL, - TextOverflow nvarchar(max) COLLATE Latin1_General_100_CI_AI_SC NULL, - IsHistory bit NOT NULL -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_StringSearchParam -ON dbo.StringSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_StringSearchParam_SearchParamId_Text -ON dbo.StringSearchParam -( - SearchParamId, - Text -) -INCLUDE -( - ResourceTypeId, - TextOverflow -- workaround for https://support.microsoft.com/en-gb/help/3051225/a-filtered-index-that-you-create-together-with-the-is-null-predicate-i -) -WHERE IsHistory = 0 AND TextOverflow IS NULL -WITH (DATA_COMPRESSION = PAGE) - -CREATE NONCLUSTERED INDEX IX_StringSearchParam_SearchParamId_TextWithOverflow -ON dbo.StringSearchParam -( - SearchParamId, - Text -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 AND TextOverflow IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - URI Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkUriSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - Uri varchar(256) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.UriSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - Uri varchar(256) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_UriSearchParam -ON dbo.UriSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_UriSearchParam_SearchParamId_Uri -ON dbo.UriSearchParam -( - SearchParamId, - Uri -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -GO - - -/************************************************************* - Number Search Param -**************************************************************/ - --- We support the underlying value being a range, though we expect the vast majority of entries to be a single value. --- Either: --- (1) SingleValue is not null and LowValue and HighValue are both null, or --- (2) SingleValue is null and LowValue and HighValue are both not null --- We make use of filtered nonclustered indexes to keep queries over the ranges limited to those rows that actually have ranges - -CREATE TYPE dbo.BulkNumberSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SingleValue decimal(18,6) NULL, - LowValue decimal(18,6) NULL, - HighValue decimal(18,6) NULL -) - -CREATE TABLE dbo.NumberSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SingleValue decimal(18,6) NULL, - LowValue decimal(18,6) SPARSE NULL, - HighValue decimal(18,6) SPARSE NULL, - IsHistory bit NOT NULL -) - -CREATE CLUSTERED INDEX IXC_NumberSearchParam -ON dbo.NumberSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_NumberSearchParam_SearchParamId_SingleValue -ON dbo.NumberSearchParam -( - SearchParamId, - SingleValue -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 AND SingleValue IS NOT NULL - -CREATE NONCLUSTERED INDEX IX_NumberSearchParam_SearchParamId_LowValue_HighValue -ON dbo.NumberSearchParam -( - SearchParamId, - LowValue, - HighValue -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 AND LowValue IS NOT NULL - -CREATE NONCLUSTERED INDEX IX_NumberSearchParam_SearchParamId_HighValue_LowValue -ON dbo.NumberSearchParam -( - SearchParamId, - HighValue, - LowValue -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 AND LowValue IS NOT NULL - -GO - -/************************************************************* - Quantity Search Param -**************************************************************/ - --- See comment above for number search params for how we store ranges - -CREATE TYPE dbo.BulkQuantitySearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId int NULL, - QuantityCodeId int NULL, - SingleValue decimal(18,6) NULL, - LowValue decimal(18,6) NULL, - HighValue decimal(18,6) NULL -) - -CREATE TABLE dbo.QuantitySearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId int NULL, - QuantityCodeId int NULL, - SingleValue decimal(18,6) NULL, - LowValue decimal(18,6) SPARSE NULL, - HighValue decimal(18,6) SPARSE NULL, - IsHistory bit NOT NULL -) - -CREATE CLUSTERED INDEX IXC_QuantitySearchParam -ON dbo.QuantitySearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_QuantitySearchParam_SearchParamId_QuantityCodeId_SingleValue -ON dbo.QuantitySearchParam -( - SearchParamId, - QuantityCodeId, - SingleValue -) -INCLUDE -( - ResourceTypeId, - SystemId -) -WHERE IsHistory = 0 AND SingleValue IS NOT NULL - -CREATE NONCLUSTERED INDEX IX_QuantitySearchParam_SearchParamId_QuantityCodeId_LowValue_HighValue -ON dbo.QuantitySearchParam -( - SearchParamId, - QuantityCodeId, - LowValue, - HighValue -) -INCLUDE -( - ResourceTypeId, - SystemId -) -WHERE IsHistory = 0 AND LowValue IS NOT NULL - -CREATE NONCLUSTERED INDEX IX_QuantitySearchParam_SearchParamId_QuantityCodeId_HighValue_LowValue -ON dbo.QuantitySearchParam -( - SearchParamId, - QuantityCodeId, - HighValue, - LowValue -) -INCLUDE -( - ResourceTypeId, - SystemId -) -WHERE IsHistory = 0 AND LowValue IS NOT NULL - -GO - -/************************************************************* - Date Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkDateTimeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - StartDateTime datetimeoffset(7) NOT NULL, - EndDateTime datetimeoffset(7) NOT NULL, - IsLongerThanADay bit NOT NULL -) - -CREATE TABLE dbo.DateTimeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - StartDateTime datetime2(7) NOT NULL, - EndDateTime datetime2(7) NOT NULL, - IsLongerThanADay bit NOT NULL, - IsHistory bit NOT NULL -) - -CREATE CLUSTERED INDEX IXC_DateTimeSearchParam -ON dbo.DateTimeSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_DateTimeSearchParam_SearchParamId_StartDateTime_EndDateTime -ON dbo.DateTimeSearchParam -( - SearchParamId, - StartDateTime, - EndDateTime -) -INCLUDE -( - ResourceTypeId, - IsLongerThanADay -) -WHERE IsHistory = 0 - -CREATE NONCLUSTERED INDEX IX_DateTimeSearchParam_SearchParamId_EndDateTime_StartDateTime -ON dbo.DateTimeSearchParam -( - SearchParamId, - EndDateTime, - StartDateTime -) -INCLUDE -( - ResourceTypeId, - IsLongerThanADay -) -WHERE IsHistory = 0 - - -CREATE NONCLUSTERED INDEX IX_DateTimeSearchParam_SearchParamId_StartDateTime_EndDateTime_Long -ON dbo.DateTimeSearchParam -( - SearchParamId, - StartDateTime, - EndDateTime -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 AND IsLongerThanADay = 1 - -CREATE NONCLUSTERED INDEX IX_DateTimeSearchParam_SearchParamId_EndDateTime_StartDateTime_Long -ON dbo.DateTimeSearchParam -( - SearchParamId, - EndDateTime, - StartDateTime -) -INCLUDE -( - ResourceTypeId -) -WHERE IsHistory = 0 AND IsLongerThanADay = 1 - -GO - -/************************************************************* - Reference$Token Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkReferenceTokenCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - BaseUri1 varchar(128) COLLATE Latin1_General_100_CS_AS NULL, - ReferenceResourceTypeId1 smallint NULL, - ReferenceResourceId1 varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ReferenceResourceVersion1 int NULL, - SystemId2 int NULL, - Code2 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.ReferenceTokenCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - BaseUri1 varchar(128) COLLATE Latin1_General_100_CS_AS NULL, - ReferenceResourceTypeId1 smallint NULL, - ReferenceResourceId1 varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ReferenceResourceVersion1 int NULL, - SystemId2 int NULL, - Code2 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_ReferenceTokenCompositeSearchParam -ON dbo.ReferenceTokenCompositeSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_ReferenceTokenCompositeSearchParam_ReferenceResourceId1_Code2 -ON dbo.ReferenceTokenCompositeSearchParam -( - SearchParamId, - ReferenceResourceId1, - Code2 -) -INCLUDE -( - ResourceTypeId, - ReferenceResourceTypeId1, - BaseUri1, - SystemId2 -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - Token$Token Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkTokenTokenCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SystemId2 int NULL, - Code2 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.TokenTokenCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SystemId2 int NULL, - Code2 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_TokenTokenCompositeSearchParam -ON dbo.TokenTokenCompositeSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_TokenTokenCompositeSearchParam_Code1_Code2 -ON dbo.TokenTokenCompositeSearchParam -( - SearchParamId, - Code1, - Code2 -) -INCLUDE -( - ResourceTypeId, - SystemId1, - SystemId2 -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - Token$DateTime Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkTokenDateTimeCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - StartDateTime2 datetimeoffset(7) NOT NULL, - EndDateTime2 datetimeoffset(7) NOT NULL, - IsLongerThanADay2 bit NOT NULL -) - -CREATE TABLE dbo.TokenDateTimeCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - StartDateTime2 datetime2(7) NOT NULL, - EndDateTime2 datetime2(7) NOT NULL, - IsLongerThanADay2 bit NOT NULL, - IsHistory bit NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_TokenDateTimeCompositeSearchParam -ON dbo.TokenDateTimeCompositeSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_TokenDateTimeCompositeSearchParam_Code1_StartDateTime2_EndDateTime2 -ON dbo.TokenDateTimeCompositeSearchParam -( - SearchParamId, - Code1, - StartDateTime2, - EndDateTime2 -) -INCLUDE -( - ResourceTypeId, - SystemId1, - IsLongerThanADay2 -) - -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -CREATE NONCLUSTERED INDEX IX_TokenDateTimeCompositeSearchParam_Code1_EndDateTime2_StartDateTime2 -ON dbo.TokenDateTimeCompositeSearchParam -( - SearchParamId, - Code1, - EndDateTime2, - StartDateTime2 -) -INCLUDE -( - ResourceTypeId, - SystemId1, - IsLongerThanADay2 -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) - -CREATE NONCLUSTERED INDEX IX_TokenDateTimeCompositeSearchParam_Code1_StartDateTime2_EndDateTime2_Long -ON dbo.TokenDateTimeCompositeSearchParam -( - SearchParamId, - Code1, - StartDateTime2, - EndDateTime2 -) -INCLUDE -( - ResourceTypeId, - SystemId1 -) - -WHERE IsHistory = 0 AND IsLongerThanADay2 = 1 -WITH (DATA_COMPRESSION = PAGE) - -CREATE NONCLUSTERED INDEX IX_TokenDateTimeCompositeSearchParam_Code1_EndDateTime2_StartDateTime2_Long -ON dbo.TokenDateTimeCompositeSearchParam -( - SearchParamId, - Code1, - EndDateTime2, - StartDateTime2 -) -INCLUDE -( - ResourceTypeId, - SystemId1 -) -WHERE IsHistory = 0 AND IsLongerThanADay2 = 1 -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - Token$Quantity Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkTokenQuantityCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SystemId2 int NULL, - QuantityCodeId2 int NULL, - SingleValue2 decimal(18,6) NULL, - LowValue2 decimal(18,6) NULL, - HighValue2 decimal(18,6) NULL -) - -CREATE TABLE dbo.TokenQuantityCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SystemId2 int NULL, - QuantityCodeId2 int NULL, - SingleValue2 decimal(18,6) NULL, - LowValue2 decimal(18,6) NULL, - HighValue2 decimal(18,6) NULL, - IsHistory bit NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_TokenQuantityCompositeSearchParam -ON dbo.TokenQuantityCompositeSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_TokenQuantityCompositeSearchParam_SearchParamId_Code1_QuantityCodeId2_SingleValue2 -ON dbo.TokenQuantityCompositeSearchParam -( - SearchParamId, - Code1, - SingleValue2 -) -INCLUDE -( - ResourceTypeId, - QuantityCodeId2, - SystemId1, - SystemId2 -) -WHERE IsHistory = 0 AND SingleValue2 IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) - -CREATE NONCLUSTERED INDEX IX_TokenQuantityCompositeSearchParam_SearchParamId_Code1_QuantityCodeId2_LowValue2_HighValue2 -ON dbo.TokenQuantityCompositeSearchParam -( - SearchParamId, - Code1, - LowValue2, - HighValue2 -) -INCLUDE -( - ResourceTypeId, - QuantityCodeId2, - SystemId1, - SystemId2 -) -WHERE IsHistory = 0 AND LowValue2 IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) - -CREATE NONCLUSTERED INDEX IX_TokenQuantityCompositeSearchParam_SearchParamId_Code1_QuantityCodeId2_HighValue2_LowValue2 -ON dbo.TokenQuantityCompositeSearchParam -( - SearchParamId, - Code1, - HighValue2, - LowValue2 -) -INCLUDE -( - ResourceTypeId, - QuantityCodeId2, - SystemId1, - SystemId2 -) -WHERE IsHistory = 0 AND LowValue2 IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - Token$String Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkTokenStringCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - Text2 nvarchar(256) COLLATE Latin1_General_100_CI_AI_SC NOT NULL, - TextOverflow2 nvarchar(max) COLLATE Latin1_General_100_CI_AI_SC NULL -) - -CREATE TABLE dbo.TokenStringCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - Text2 nvarchar(256) COLLATE Latin1_General_CI_AI NOT NULL, - TextOverflow2 nvarchar(max) COLLATE Latin1_General_CI_AI NULL, - IsHistory bit NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_TokenStringCompositeSearchParam -ON dbo.TokenStringCompositeSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_TokenStringCompositeSearchParam_SearchParamId_Code1_Text2 -ON dbo.TokenStringCompositeSearchParam -( - SearchParamId, - Code1, - Text2 -) -INCLUDE -( - ResourceTypeId, - SystemId1, - TextOverflow2 -- workaround for https://support.microsoft.com/en-gb/help/3051225/a-filtered-index-that-you-create-together-with-the-is-null-predicate-i -) -WHERE IsHistory = 0 AND TextOverflow2 IS NULL -WITH (DATA_COMPRESSION = PAGE) - -CREATE NONCLUSTERED INDEX IX_TokenStringCompositeSearchParam_SearchParamId_Code1_Text2WithOverflow -ON dbo.TokenStringCompositeSearchParam -( - SearchParamId, - Code1, - Text2 -) -INCLUDE -( - ResourceTypeId, - SystemId1 -) -WHERE IsHistory = 0 AND TextOverflow2 IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) - -GO - - -/************************************************************* - Token$Number$Number Composite Search Param -**************************************************************/ - --- See number search param for how we deal with null. We apply a similar pattern here, --- except that we pass in a HasRange bit though the TVP. The alternative would have --- for a computed column, but a computed column cannot be used in as a index filter --- (even if it is a persisted computed column). - -CREATE TYPE dbo.BulkTokenNumberNumberCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SingleValue2 decimal(18,6) NULL, - LowValue2 decimal(18,6) NULL, - HighValue2 decimal(18,6) NULL, - SingleValue3 decimal(18,6) NULL, - LowValue3 decimal(18,6) NULL, - HighValue3 decimal(18,6) NULL, - HasRange bit NOT NULL -) - -CREATE TABLE dbo.TokenNumberNumberCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SingleValue2 decimal(18,6) NULL, - LowValue2 decimal(18,6) NULL, - HighValue2 decimal(18,6) NULL, - SingleValue3 decimal(18,6) NULL, - LowValue3 decimal(18,6) NULL, - HighValue3 decimal(18,6) NULL, - HasRange bit NOT NULL, - IsHistory bit NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_TokenNumberNumberCompositeSearchParam -ON dbo.TokenNumberNumberCompositeSearchParam -( - ResourceSurrogateId, - SearchParamId -) - -CREATE NONCLUSTERED INDEX IX_TokenNumberNumberCompositeSearchParam_SearchParamId_Code1_Text2 -ON dbo.TokenNumberNumberCompositeSearchParam -( - SearchParamId, - Code1, - SingleValue2, - SingleValue3 -) -INCLUDE -( - ResourceTypeId, - SystemId1 -) -WHERE IsHistory = 0 AND HasRange = 0 -WITH (DATA_COMPRESSION = PAGE) - -CREATE NONCLUSTERED INDEX IX_TokenNumberNumberCompositeSearchParam_SearchParamId_Code1_LowValue2_HighValue2_LowValue3_HighValue3 -ON dbo.TokenNumberNumberCompositeSearchParam -( - SearchParamId, - Code1, - LowValue2, - HighValue2, - LowValue3, - HighValue3 -) -INCLUDE -( - ResourceTypeId, - SystemId1 -) -WHERE IsHistory = 0 AND HasRange = 1 -WITH (DATA_COMPRESSION = PAGE) - -GO - -/************************************************************* - Sequence for generating unique 12.5ns "tick" components that are added - to a base ID based on the timestamp to form a unique resource surrogate ID -**************************************************************/ - -CREATE SEQUENCE dbo.ResourceSurrogateIdUniquifierSequence - AS int - START WITH 0 - INCREMENT BY 1 - MINVALUE 0 - MAXVALUE 79999 - CYCLE - CACHE 1000000 -GO - -/************************************************************* - Stored procedures for creating and deleting -**************************************************************/ - --- --- STORED PROCEDURE --- UpsertResource_3 --- --- DESCRIPTION --- Creates or updates (including marking deleted) a FHIR resource --- --- PARAMETERS --- @baseResourceSurrogateId --- * A bigint to which a value between [0, 80000) is added, forming a unique ResourceSurrogateId. --- * This value should be the current UTC datetime, truncated to millisecond precision, with its 100ns ticks component bitshifted left by 3. --- @resourceTypeId --- * The ID of the resource type (See ResourceType table) --- @resourceId --- * The resource ID (must be the same as the in the resource itself) --- @etag --- * If specified, the version of the resource to update --- @allowCreate --- * If false, an error is thrown if the resource does not already exist --- @isDeleted --- * Whether this resource marks the resource as deleted --- @keepHistory --- * Whether the existing version of the resource should be preserved --- @requestMethod --- * The HTTP method/verb used for the request --- @searchParamHash --- * A hash of the resource's latest indexed search parameters --- @rawResource --- * A compressed UTF16-encoded JSON document --- @resourceWriteClaims --- * Claims on the principal that performed the write --- @compartmentAssignments --- * Compartments that the resource is part of --- @referenceSearchParams --- * Extracted reference search params --- @tokenSearchParams --- * Extracted token search params --- @tokenTextSearchParams --- * The text representation of extracted token search params --- @stringSearchParams --- * Extracted string search params --- @numberSearchParams --- * Extracted number search params --- @quantitySearchParams --- * Extracted quantity search params --- @uriSearchParams --- * Extracted URI search params --- @dateTimeSearchParms --- * Extracted datetime search params --- @referenceTokenCompositeSearchParams --- * Extracted reference$token search params --- @tokenTokenCompositeSearchParams --- * Extracted token$token tokensearch params --- @tokenDateTimeCompositeSearchParams --- * Extracted token$datetime search params --- @tokenQuantityCompositeSearchParams --- * Extracted token$quantity search params --- @tokenStringCompositeSearchParams --- * Extracted token$string search params --- @tokenNumberNumberCompositeSearchParams --- * Extracted token$number$number search params --- --- RETURN VALUE --- The version of the resource as a result set. Will be empty if no insertion was done. --- -CREATE PROCEDURE dbo.UpsertResource_3 - @baseResourceSurrogateId bigint, - @resourceTypeId smallint, - @resourceId varchar(64), - @eTag int = NULL, - @allowCreate bit, - @isDeleted bit, - @keepHistory bit, - @requestMethod varchar(10), - @searchParamHash varchar(64), - @rawResource varbinary(max), - @resourceWriteClaims dbo.BulkResourceWriteClaimTableType_1 READONLY, - @compartmentAssignments dbo.BulkCompartmentAssignmentTableType_1 READONLY, - @referenceSearchParams dbo.BulkReferenceSearchParamTableType_1 READONLY, - @tokenSearchParams dbo.BulkTokenSearchParamTableType_1 READONLY, - @tokenTextSearchParams dbo.BulkTokenTextTableType_1 READONLY, - @stringSearchParams dbo.BulkStringSearchParamTableType_1 READONLY, - @numberSearchParams dbo.BulkNumberSearchParamTableType_1 READONLY, - @quantitySearchParams dbo.BulkQuantitySearchParamTableType_1 READONLY, - @uriSearchParams dbo.BulkUriSearchParamTableType_1 READONLY, - @dateTimeSearchParms dbo.BulkDateTimeSearchParamTableType_1 READONLY, - @referenceTokenCompositeSearchParams dbo.BulkReferenceTokenCompositeSearchParamTableType_1 READONLY, - @tokenTokenCompositeSearchParams dbo.BulkTokenTokenCompositeSearchParamTableType_1 READONLY, - @tokenDateTimeCompositeSearchParams dbo.BulkTokenDateTimeCompositeSearchParamTableType_1 READONLY, - @tokenQuantityCompositeSearchParams dbo.BulkTokenQuantityCompositeSearchParamTableType_1 READONLY, - @tokenStringCompositeSearchParams dbo.BulkTokenStringCompositeSearchParamTableType_1 READONLY, - @tokenNumberNumberCompositeSearchParams dbo.BulkTokenNumberNumberCompositeSearchParamTableType_1 READONLY -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - -- variables for the existing version of the resource that will be replaced - DECLARE @previousResourceSurrogateId bigint - DECLARE @previousVersion bigint - DECLARE @previousIsDeleted bit - - -- This should place a range lock on a row in the IX_Resource_ResourceTypeId_ResourceId nonclustered filtered index - SELECT @previousResourceSurrogateId = ResourceSurrogateId, @previousVersion = Version, @previousIsDeleted = IsDeleted - FROM dbo.Resource WITH (UPDLOCK, HOLDLOCK) - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId AND IsHistory = 0 - - IF (@etag IS NOT NULL AND @etag <> @previousVersion) BEGIN - THROW 50412, 'Precondition failed', 1; - END - - DECLARE @version int -- the version of the resource being written - - IF (@previousResourceSurrogateId IS NULL) BEGIN - -- There is no previous version of this resource - - IF (@isDeleted = 1) BEGIN - -- Don't bother marking the resource as deleted since it already does not exist. - COMMIT TRANSACTION - RETURN - END - - IF (@etag IS NOT NULL) BEGIN - -- You can't update a resource with a specified version if the resource does not exist - THROW 50404, 'Resource with specified version not found', 1; - END - - IF (@allowCreate = 0) BEGIN - THROW 50405, 'Resource does not exist and create is not allowed', 1; - END - - SET @version = 1 - END - ELSE BEGIN - -- There is a previous version - - IF (@isDeleted = 1 AND @previousIsDeleted = 1) BEGIN - -- Already deleted - don't create a new version - COMMIT TRANSACTION - RETURN - END - - SET @version = @previousVersion + 1 - - IF (@keepHistory = 1) BEGIN - - -- Set the existing resource as history - UPDATE dbo.Resource - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - -- Set the indexes for this resource as history. - -- Note there is no IsHistory column on ResourceWriteClaim since we do not query it. - - UPDATE dbo.CompartmentAssignment - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.ReferenceSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenText - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.StringSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.UriSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.NumberSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.QuantitySearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.DateTimeSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.ReferenceTokenCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenTokenCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenDateTimeCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenQuantityCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenStringCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenNumberNumberCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - END - ELSE BEGIN - - -- Not keeping history. Delete the current resource and all associated indexes. - - DELETE FROM dbo.Resource - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.ResourceWriteClaim - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.CompartmentAssignment - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.ReferenceSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenText - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.StringSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.UriSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.NumberSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.QuantitySearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.DateTimeSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.ReferenceTokenCompositeSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenTokenCompositeSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenDateTimeCompositeSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenQuantityCompositeSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenStringCompositeSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenNumberNumberCompositeSearchParam - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - END - END - - DECLARE @resourceSurrogateId bigint = @baseResourceSurrogateId + (NEXT VALUE FOR ResourceSurrogateIdUniquifierSequence) - DECLARE @isRawResourceMetaSet bit - - IF (@version = 1) BEGIN SET @isRawResourceMetaSet = 1 END ELSE BEGIN SET @isRawResourceMetaSet = 0 END - - INSERT INTO dbo.Resource - (ResourceTypeId, ResourceId, Version, IsHistory, ResourceSurrogateId, IsDeleted, RequestMethod, RawResource, IsRawResourceMetaSet, SearchParamHash) - VALUES - (@resourceTypeId, @resourceId, @version, 0, @resourceSurrogateId, @isDeleted, @requestMethod, @rawResource, @isRawResourceMetaSet, @searchParamHash) - - INSERT INTO dbo.ResourceWriteClaim - (ResourceSurrogateId, ClaimTypeId, ClaimValue) - SELECT @resourceSurrogateId, ClaimTypeId, ClaimValue - FROM @resourceWriteClaims - - INSERT INTO dbo.CompartmentAssignment - (ResourceTypeId, ResourceSurrogateId, CompartmentTypeId, ReferenceResourceId, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, CompartmentTypeId, ReferenceResourceId, 0 - FROM @compartmentAssignments - - INSERT INTO dbo.ReferenceSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri, ReferenceResourceTypeId, ReferenceResourceId, ReferenceResourceVersion, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, BaseUri, ReferenceResourceTypeId, ReferenceResourceId, ReferenceResourceVersion, 0 - FROM @referenceSearchParams - - INSERT INTO dbo.TokenSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, Code, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId, Code, 0 - FROM @tokenSearchParams - - INSERT INTO dbo.TokenText - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Text, 0 - FROM @tokenTextSearchParams - - INSERT INTO dbo.StringSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, TextOverflow, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Text, TextOverflow, 0 - FROM @stringSearchParams - - INSERT INTO dbo.UriSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Uri, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Uri, 0 - FROM @uriSearchParams - - INSERT INTO dbo.NumberSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SingleValue, LowValue, HighValue, 0 - FROM @numberSearchParams - - INSERT INTO dbo.QuantitySearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, QuantityCodeId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId, QuantityCodeId, SingleValue, LowValue, HighValue, 0 - FROM @quantitySearchParams - - INSERT INTO dbo.DateTimeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, StartDateTime, EndDateTime, IsLongerThanADay, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, StartDateTime, EndDateTime, IsLongerThanADay, 0 - FROM @dateTimeSearchParms - - INSERT INTO dbo.ReferenceTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri1, ReferenceResourceTypeId1, ReferenceResourceId1, ReferenceResourceVersion1, SystemId2, Code2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, BaseUri1, ReferenceResourceTypeId1, ReferenceResourceId1, ReferenceResourceVersion1, SystemId2, Code2, 0 - FROM @referenceTokenCompositeSearchParams - - INSERT INTO dbo.TokenTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SystemId2, Code2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SystemId2, Code2, 0 - FROM @tokenTokenCompositeSearchParams - - INSERT INTO dbo.TokenDateTimeCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, StartDateTime2, EndDateTime2, IsLongerThanADay2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, StartDateTime2, EndDateTime2, IsLongerThanADay2, 0 - FROM @tokenDateTimeCompositeSearchParams - - INSERT INTO dbo.TokenQuantityCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, SystemId2, QuantityCodeId2, LowValue2, HighValue2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, SystemId2, QuantityCodeId2, LowValue2, HighValue2, 0 - FROM @tokenQuantityCompositeSearchParams - - INSERT INTO dbo.TokenStringCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, Text2, TextOverflow2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, Text2, TextOverflow2, 0 - FROM @tokenStringCompositeSearchParams - - INSERT INTO dbo.TokenNumberNumberCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, LowValue2, HighValue2, SingleValue3, LowValue3, HighValue3, HasRange, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, LowValue2, HighValue2, SingleValue3, LowValue3, HighValue3, HasRange, 0 - FROM @tokenNumberNumberCompositeSearchParams - - SELECT @version - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- ReadResource --- --- DESCRIPTION --- Reads a single resource, optionally a specific version of the resource. --- --- PARAMETERS --- @resourceTypeId --- * The ID of the resource type (See ResourceType table) --- @resourceId --- * The resource ID --- @version --- * A specific version of the resource. If null, returns the latest version. --- RETURN VALUE --- A result set with 0 or 1 rows. --- -CREATE PROCEDURE dbo.ReadResource - @resourceTypeId smallint, - @resourceId varchar(64), - @version int = NULL -AS - SET NOCOUNT ON - - IF (@version IS NULL) BEGIN - SELECT ResourceSurrogateId, Version, IsDeleted, IsHistory, RawResource, IsRawResourceMetaSet, SearchParamHash - FROM dbo.Resource - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId AND IsHistory = 0 - END - ELSE BEGIN - SELECT ResourceSurrogateId, Version, IsDeleted, IsHistory, RawResource, IsRawResourceMetaSet, SearchParamHash - FROM dbo.Resource - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId AND Version = @version - END -GO - --- --- STORED PROCEDURE --- Deletes a single resource --- --- DESCRIPTION --- Permanently deletes all data related to a resource. --- Data remains recoverable from the transaction log, however. --- --- PARAMETERS --- @resourceTypeId --- * The ID of the resource type (See ResourceType table) --- @resourceId --- * The resource ID (must be the same as in the resource itself) --- -CREATE PROCEDURE dbo.HardDeleteResource - @resourceTypeId smallint, - @resourceId varchar(64) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @resourceSurrogateIds TABLE(ResourceSurrogateId bigint NOT NULL) - - DELETE FROM dbo.Resource - OUTPUT deleted.ResourceSurrogateId - INTO @resourceSurrogateIds - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId - - DELETE FROM dbo.ResourceWriteClaim - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.CompartmentAssignment - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.ReferenceSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenText - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.StringSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.UriSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.NumberSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.QuantitySearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.DateTimeSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.ReferenceTokenCompositeSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenTokenCompositeSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenDateTimeCompositeSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenQuantityCompositeSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenStringCompositeSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenNumberNumberCompositeSearchParam - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - COMMIT TRANSACTION -GO - -/************************************************************* - Export Job -**************************************************************/ -CREATE TABLE dbo.ExportJob -( - Id varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - Hash varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - Status varchar(10) NOT NULL, - HeartbeatDateTime datetime2(7) NULL, - RawJobRecord varchar(max) NOT NULL, - JobVersion rowversion NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_ExportJob ON dbo.ExportJob -( - Id -) - -CREATE UNIQUE NONCLUSTERED INDEX IX_ExportJob_Hash_Status_HeartbeatDateTime ON dbo.ExportJob -( - Hash, - Status, - HeartbeatDateTime -) - -GO - -/************************************************************* - Stored procedures for exporting -**************************************************************/ --- --- STORED PROCEDURE --- Creates an export job. --- --- DESCRIPTION --- Creates a new row to the ExportJob table, adding a new job to the queue of jobs to be processed. --- --- PARAMETERS --- @id --- * The ID of the export job record --- @hash --- * The SHA256 hash of the export job record ID --- @status --- * The status of the export job --- @rawJobRecord --- * A JSON document --- --- RETURN VALUE --- The row version of the created export job. --- -CREATE PROCEDURE dbo.CreateExportJob - @id varchar(64), - @hash varchar(64), - @status varchar(10), - @rawJobRecord varchar(max) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - INSERT INTO dbo.ExportJob - (Id, Hash, Status, HeartbeatDateTime, RawJobRecord) - VALUES - (@id, @hash, @status, @heartbeatDateTime, @rawJobRecord) - - SELECT CAST(MIN_ACTIVE_ROWVERSION() AS INT) - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- Gets an export job given its ID. --- --- DESCRIPTION --- Retrieves the export job record from the ExportJob table that has the matching ID. --- --- PARAMETERS --- @id --- * The ID of the export job record to retrieve --- --- RETURN VALUE --- The matching export job. --- -CREATE PROCEDURE dbo.GetExportJobById - @id varchar(64) -AS - SET NOCOUNT ON - - SELECT RawJobRecord, JobVersion - FROM dbo.ExportJob - WHERE Id = @id -GO - --- --- STORED PROCEDURE --- Gets an export job given the hash of its ID. --- --- DESCRIPTION --- Retrieves the export job record from the ExportJob table that has the matching hash. --- --- PARAMETERS --- @hash --- * The SHA256 hash of the export job record ID --- --- RETURN VALUE --- The matching export job. --- -CREATE PROCEDURE dbo.GetExportJobByHash - @hash varchar(64) -AS - SET NOCOUNT ON - - SELECT TOP(1) RawJobRecord, JobVersion - FROM dbo.ExportJob - WHERE Hash = @hash AND (Status = 'Queued' OR Status = 'Running') - ORDER BY HeartbeatDateTime ASC -GO - --- --- STORED PROCEDURE --- Updates an export job. --- --- DESCRIPTION --- Modifies an existing job in the ExportJob table. --- --- PARAMETERS --- @id --- * The ID of the export job record --- @status --- * The status of the export job --- @rawJobRecord --- * A JSON document --- @jobVersion --- * The version of the job to update must match this --- --- RETURN VALUE --- The row version of the updated export job. --- -CREATE PROCEDURE dbo.UpdateExportJob - @id varchar(64), - @status varchar(10), - @rawJobRecord varchar(max), - @jobVersion binary(8) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @currentJobVersion binary(8) - - -- Acquire and hold an update lock on a row in the ExportJob table for the entire transaction. - -- This ensures the version check and update occur atomically. - SELECT @currentJobVersion = JobVersion - FROM dbo.ExportJob WITH (UPDLOCK, HOLDLOCK) - WHERE Id = @id - - IF (@currentJobVersion IS NULL) BEGIN - THROW 50404, 'Export job record not found', 1; - END - - IF (@jobVersion <> @currentJobVersion) BEGIN - THROW 50412, 'Precondition failed', 1; - END - - -- We will timestamp the jobs when we update them to track stale jobs. - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - UPDATE dbo.ExportJob - SET Status = @status, HeartbeatDateTime = @heartbeatDateTime, RawJobRecord = @rawJobRecord - WHERE Id = @id - - SELECT MIN_ACTIVE_ROWVERSION() - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- Acquires export jobs. --- --- DESCRIPTION --- Timestamps the available export jobs and sets their statuses to running. --- --- PARAMETERS --- @jobHeartbeatTimeoutThresholdInSeconds --- * The number of seconds that must pass before an export job is considered stale --- @maximumNumberOfConcurrentJobsAllowed --- * The maximum number of running jobs we can have at once --- --- RETURN VALUE --- The updated jobs that are now running. --- -CREATE PROCEDURE dbo.AcquireExportJobs - @jobHeartbeatTimeoutThresholdInSeconds bigint, - @maximumNumberOfConcurrentJobsAllowed int -AS - SET NOCOUNT ON - SET XACT_ABORT ON - - SET TRANSACTION ISOLATION LEVEL SERIALIZABLE - BEGIN TRANSACTION - - -- We will consider a job to be stale if its timestamp is smaller than or equal to this. - DECLARE @expirationDateTime dateTime2(7) - SELECT @expirationDateTime = DATEADD(second, -@jobHeartbeatTimeoutThresholdInSeconds, SYSUTCDATETIME()) - - -- Get the number of jobs that are running and not stale. - -- Acquire and hold an exclusive table lock for the entire transaction to prevent jobs from being created, updated or deleted during acquisitions. - DECLARE @numberOfRunningJobs int - SELECT @numberOfRunningJobs = COUNT(*) FROM dbo.ExportJob WITH (TABLOCKX) WHERE Status = 'Running' AND HeartbeatDateTime > @expirationDateTime - - -- Determine how many available jobs we can pick up. - DECLARE @limit int = @maximumNumberOfConcurrentJobsAllowed - @numberOfRunningJobs; - - DECLARE @availableJobs TABLE (Id varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, JobVersion binary(8) NOT NULL) - - -- Get the available jobs, which are export jobs that are queued or stale. - -- Older jobs will be prioritized over newer ones. - INSERT INTO @availableJobs - SELECT TOP(@limit) Id, JobVersion - FROM dbo.ExportJob - WHERE (Status = 'Queued' OR (Status = 'Running' AND HeartbeatDateTime <= @expirationDateTime)) - ORDER BY HeartbeatDateTime - - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - -- Update each available job's status to running both in the export table's status column and in the raw export job record JSON. - UPDATE dbo.ExportJob - SET Status = 'Running', HeartbeatDateTime = @heartbeatDateTime, RawJobRecord = JSON_MODIFY(RawJobRecord,'$.status', 'Running') - OUTPUT inserted.RawJobRecord, inserted.JobVersion - FROM dbo.ExportJob job INNER JOIN @availableJobs availableJob ON job.Id = availableJob.Id AND job.JobVersion = availableJob.JobVersion - - COMMIT TRANSACTION -GO - -/************************************************************* - Search Parameter Status Information -**************************************************************/ - --- We adopted this naming convention for table-valued parameters because they are immutable. -CREATE TYPE dbo.SearchParamTableType_1 AS TABLE -( - Uri varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - Status varchar(10) NOT NULL, - IsPartiallySupported bit NOT NULL -) - -GO - -/************************************************************* - Stored procedures for search parameter information -**************************************************************/ --- --- STORED PROCEDURE --- GetSearchParamStatuses --- --- DESCRIPTION --- Gets all the search parameters and their statuses. --- --- RETURN VALUE --- The search parameters and their statuses. --- -CREATE PROCEDURE dbo.GetSearchParamStatuses -AS - SET NOCOUNT ON - - SELECT Uri, Status, LastUpdated, IsPartiallySupported FROM dbo.SearchParam -GO - --- --- STORED PROCEDURE --- UpsertSearchParams --- --- DESCRIPTION --- Given a set of search parameters, creates or updates the parameters. --- --- PARAMETERS --- @searchParams --- * The updated existing search parameters or the new search parameters --- --- RETURN VALUE --- The IDs and URIs of the search parameters that were inserted (not updated). --- -CREATE PROCEDURE dbo.UpsertSearchParams - @searchParams dbo.SearchParamTableType_1 READONLY -AS - SET NOCOUNT ON - SET XACT_ABORT ON - - SET TRANSACTION ISOLATION LEVEL SERIALIZABLE - BEGIN TRANSACTION - - DECLARE @lastUpdated datetimeoffset(7) = SYSDATETIMEOFFSET() - - DECLARE @summaryOfChanges TABLE(Uri varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, Action varchar(20) NOT NULL) - - -- Acquire and hold an exclusive table lock for the entire transaction to prevent parameters from being added or modified during upsert. - MERGE INTO dbo.SearchParam WITH (TABLOCKX) AS target - USING @searchParams AS source - ON target.Uri = source.Uri - WHEN MATCHED THEN - UPDATE - SET Status = source.Status, LastUpdated = @lastUpdated, IsPartiallySupported = source.IsPartiallySupported - WHEN NOT MATCHED BY target THEN - INSERT - (Uri, Status, LastUpdated, IsPartiallySupported) - VALUES (source.Uri, source.Status, @lastUpdated, source.IsPartiallySupported) - OUTPUT source.Uri, $action INTO @summaryOfChanges; - - SELECT SearchParamId, SearchParam.Uri - FROM dbo.SearchParam searchParam - INNER JOIN @summaryOfChanges upsertedSearchParam - ON searchParam.Uri = upsertedSearchParam.Uri - WHERE upsertedSearchParam.Action = 'INSERT' - - COMMIT TRANSACTION -GO - -/************************************************************* - Reindex Job -**************************************************************/ -CREATE TABLE dbo.ReindexJob -( - Id varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - Status varchar(10) NOT NULL, - HeartbeatDateTime datetime2(7) NULL, - RawJobRecord varchar(max) NOT NULL, - JobVersion rowversion NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_ReindexJob ON dbo.ReindexJob -( - Id -) - -GO - -/************************************************************* - Stored procedures for reindexing -**************************************************************/ --- --- STORED PROCEDURE --- Creates an reindex job. --- --- DESCRIPTION --- Creates a new row to the ReindexJob table, adding a new job to the queue of jobs to be processed. --- --- PARAMETERS --- @id --- * The ID of the reindex job record --- @status --- * The status of the reindex job --- @rawJobRecord --- * A JSON document --- --- RETURN VALUE --- The row version of the created reindex job. --- -CREATE PROCEDURE dbo.CreateReindexJob - @id varchar(64), - @status varchar(10), - @rawJobRecord varchar(max) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - INSERT INTO dbo.ReindexJob - (Id, Status, HeartbeatDateTime, RawJobRecord) - VALUES - (@id, @status, @heartbeatDateTime, @rawJobRecord) - - SELECT CAST(MIN_ACTIVE_ROWVERSION() AS INT) - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- Gets an reindex job given its ID. --- --- DESCRIPTION --- Retrieves the reindex job record from the ReindexJob table that has the matching ID. --- --- PARAMETERS --- @id --- * The ID of the reindex job record to retrieve --- --- RETURN VALUE --- The matching reindex job. --- -CREATE PROCEDURE dbo.GetReindexJobById - @id varchar(64) -AS - SET NOCOUNT ON - - SELECT RawJobRecord, JobVersion - FROM dbo.ReindexJob - WHERE Id = @id -GO - --- --- STORED PROCEDURE --- Updates a reindex job. --- --- DESCRIPTION --- Modifies an existing job in the ReindexJob table. --- --- PARAMETERS --- @id --- * The ID of the reindex job record --- @status --- * The status of the reindex job --- @rawJobRecord --- * A JSON document --- @jobVersion --- * The version of the job to update must match this --- --- RETURN VALUE --- The row version of the updated reindex job. --- -CREATE PROCEDURE dbo.UpdateReindexJob - @id varchar(64), - @status varchar(10), - @rawJobRecord varchar(max), - @jobVersion binary(8) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @currentJobVersion binary(8) - - -- Acquire and hold an update lock on a row in the ReindexJob table for the entire transaction. - -- This ensures the version check and update occur atomically. - SELECT @currentJobVersion = JobVersion - FROM dbo.ReindexJob WITH (UPDLOCK, HOLDLOCK) - WHERE Id = @id - - IF (@currentJobVersion IS NULL) BEGIN - THROW 50404, 'Reindex job record not found', 1; - END - - IF (@jobVersion <> @currentJobVersion) BEGIN - THROW 50412, 'Precondition failed', 1; - END - - -- We will timestamp the jobs when we update them to track stale jobs. - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - UPDATE dbo.ReindexJob - SET Status = @status, HeartbeatDateTime = @heartbeatDateTime, RawJobRecord = @rawJobRecord - WHERE Id = @id - - SELECT MIN_ACTIVE_ROWVERSION() - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- Acquires reindex jobs. --- --- DESCRIPTION --- Timestamps the available reindex jobs and sets their statuses to running. --- --- PARAMETERS --- @jobHeartbeatTimeoutThresholdInSeconds --- * The number of seconds that must pass before a reindex job is considered stale --- @maximumNumberOfConcurrentJobsAllowed --- * The maximum number of running jobs we can have at once --- --- RETURN VALUE --- The updated jobs that are now running. --- -CREATE PROCEDURE dbo.AcquireReindexJobs - @jobHeartbeatTimeoutThresholdInSeconds bigint, - @maximumNumberOfConcurrentJobsAllowed int -AS - SET NOCOUNT ON - SET XACT_ABORT ON - - SET TRANSACTION ISOLATION LEVEL SERIALIZABLE - BEGIN TRANSACTION - - -- We will consider a job to be stale if its timestamp is smaller than or equal to this. - DECLARE @expirationDateTime dateTime2(7) - SELECT @expirationDateTime = DATEADD(second, -@jobHeartbeatTimeoutThresholdInSeconds, SYSUTCDATETIME()) - - -- Get the number of jobs that are running and not stale. - -- Acquire and hold an exclusive table lock for the entire transaction to prevent jobs from being created, updated or deleted during acquisitions. - DECLARE @numberOfRunningJobs int - SELECT @numberOfRunningJobs = COUNT(*) FROM dbo.ReindexJob WITH (TABLOCKX) WHERE Status = 'Running' AND HeartbeatDateTime > @expirationDateTime - - -- Determine how many available jobs we can pick up. - DECLARE @limit int = @maximumNumberOfConcurrentJobsAllowed - @numberOfRunningJobs; - - IF (@limit > 0) BEGIN - - DECLARE @availableJobs TABLE (Id varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, JobVersion binary(8) NOT NULL) - - -- Get the available jobs, which are reindex jobs that are queued or stale. - -- Older jobs will be prioritized over newer ones. - INSERT INTO @availableJobs - SELECT TOP(@limit) Id, JobVersion - FROM dbo.ReindexJob - WHERE (Status = 'Queued' OR (Status = 'Running' AND HeartbeatDateTime <= @expirationDateTime)) - ORDER BY HeartbeatDateTime - - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - -- Update each available job's status to running both in the reindex table's status column and in the raw reindex job record JSON. - UPDATE dbo.ReindexJob - SET Status = 'Running', HeartbeatDateTime = @heartbeatDateTime, RawJobRecord = JSON_MODIFY(RawJobRecord,'$.status', 'Running') - OUTPUT inserted.RawJobRecord, inserted.JobVersion - FROM dbo.ReindexJob job INNER JOIN @availableJobs availableJob ON job.Id = availableJob.Id AND job.JobVersion = availableJob.JobVersion - - END - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- Checks if there are any active reindex jobs. --- --- DESCRIPTION --- Queries the datastore for any reindex job documents with a status of running, queued or paused. --- --- RETURN VALUE --- The job IDs of any active reindex jobs. --- -CREATE PROCEDURE dbo.CheckActiveReindexJobs -AS - SET NOCOUNT ON - - SELECT Id - FROM dbo.ReindexJob - WHERE Status = 'Running' OR Status = 'Queued' OR Status = 'Paused' -GO - --- --- STORED PROCEDURE --- ReindexResource --- --- DESCRIPTION --- Updates the search indices of a given resource --- --- PARAMETERS --- @resourceTypeId --- * The ID of the resource type (See ResourceType table) --- @resourceId --- * The resource ID (must be the same as the in the resource itself) --- @etag --- * If specified, the version of the resource to update --- @searchParamHash --- * A hash of the resource's latest indexed search parameters --- @resourceWriteClaims --- * Claims on the principal that performed the write --- @compartmentAssignments --- * Compartments that the resource is part of --- @referenceSearchParams --- * Extracted reference search params --- @tokenSearchParams --- * Extracted token search params --- @tokenTextSearchParams --- * The text representation of extracted token search params --- @stringSearchParams --- * Extracted string search params --- @numberSearchParams --- * Extracted number search params --- @quantitySearchParams --- * Extracted quantity search params --- @uriSearchParams --- * Extracted URI search params --- @dateTimeSearchParms --- * Extracted datetime search params --- @referenceTokenCompositeSearchParams --- * Extracted reference$token search params --- @tokenTokenCompositeSearchParams --- * Extracted token$token tokensearch params --- @tokenDateTimeCompositeSearchParams --- * Extracted token$datetime search params --- @tokenQuantityCompositeSearchParams --- * Extracted token$quantity search params --- @tokenStringCompositeSearchParams --- * Extracted token$string search params --- @tokenNumberNumberCompositeSearchParams --- * Extracted token$number$number search params --- -CREATE PROCEDURE dbo.ReindexResource - @resourceTypeId smallint, - @resourceId varchar(64), - @eTag int = NULL, - @searchParamHash varchar(64), - @resourceWriteClaims dbo.BulkResourceWriteClaimTableType_1 READONLY, - @compartmentAssignments dbo.BulkCompartmentAssignmentTableType_1 READONLY, - @referenceSearchParams dbo.BulkReferenceSearchParamTableType_1 READONLY, - @tokenSearchParams dbo.BulkTokenSearchParamTableType_1 READONLY, - @tokenTextSearchParams dbo.BulkTokenTextTableType_1 READONLY, - @stringSearchParams dbo.BulkStringSearchParamTableType_1 READONLY, - @numberSearchParams dbo.BulkNumberSearchParamTableType_1 READONLY, - @quantitySearchParams dbo.BulkQuantitySearchParamTableType_1 READONLY, - @uriSearchParams dbo.BulkUriSearchParamTableType_1 READONLY, - @dateTimeSearchParms dbo.BulkDateTimeSearchParamTableType_1 READONLY, - @referenceTokenCompositeSearchParams dbo.BulkReferenceTokenCompositeSearchParamTableType_1 READONLY, - @tokenTokenCompositeSearchParams dbo.BulkTokenTokenCompositeSearchParamTableType_1 READONLY, - @tokenDateTimeCompositeSearchParams dbo.BulkTokenDateTimeCompositeSearchParamTableType_1 READONLY, - @tokenQuantityCompositeSearchParams dbo.BulkTokenQuantityCompositeSearchParamTableType_1 READONLY, - @tokenStringCompositeSearchParams dbo.BulkTokenStringCompositeSearchParamTableType_1 READONLY, - @tokenNumberNumberCompositeSearchParams dbo.BulkTokenNumberNumberCompositeSearchParamTableType_1 READONLY -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @resourceSurrogateId bigint - DECLARE @version bigint - - -- This should place a range lock on a row in the IX_Resource_ResourceTypeId_ResourceId nonclustered filtered index - SELECT @resourceSurrogateId = ResourceSurrogateId, @version = Version - FROM dbo.Resource WITH (UPDLOCK, HOLDLOCK) - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId AND IsHistory = 0 - - IF (@etag IS NOT NULL AND @etag <> @version) BEGIN - THROW 50412, 'Precondition failed', 1; - END - - IF (@resourceSurrogateId IS NULL) BEGIN - -- You can't reindex a resource if the resource does not exist - THROW 50404, 'Resource not found', 1; - END - - UPDATE dbo.Resource - SET SearchParamHash = @searchParamHash - WHERE ResourceSurrogateId = @resourceSurrogateId - - -- First, delete all the resource's indices. - DELETE FROM dbo.ResourceWriteClaim - WHERE ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.CompartmentAssignment - WHERE ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.ReferenceSearchParam - WHERE ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenSearchParam - WHERE ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenText - WHERE ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.StringSearchParam - WHERE ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.UriSearchParam - WHERE ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.NumberSearchParam - WHERE ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.QuantitySearchParam - WHERE ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.DateTimeSearchParam - WHERE ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.ReferenceTokenCompositeSearchParam - WHERE ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenTokenCompositeSearchParam - WHERE ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenDateTimeCompositeSearchParam - WHERE ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenQuantityCompositeSearchParam - WHERE ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenStringCompositeSearchParam - WHERE ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenNumberNumberCompositeSearchParam - WHERE ResourceSurrogateId = @resourceSurrogateId - - -- Next, insert all the new indices. - INSERT INTO dbo.ResourceWriteClaim - (ResourceSurrogateId, ClaimTypeId, ClaimValue) - SELECT @resourceSurrogateId, ClaimTypeId, ClaimValue - FROM @resourceWriteClaims - - INSERT INTO dbo.CompartmentAssignment - (ResourceTypeId, ResourceSurrogateId, CompartmentTypeId, ReferenceResourceId, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, CompartmentTypeId, ReferenceResourceId, 0 - FROM @compartmentAssignments - - INSERT INTO dbo.ReferenceSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri, ReferenceResourceTypeId, ReferenceResourceId, ReferenceResourceVersion, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, BaseUri, ReferenceResourceTypeId, ReferenceResourceId, ReferenceResourceVersion, 0 - FROM @referenceSearchParams - - INSERT INTO dbo.TokenSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, Code, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId, Code, 0 - FROM @tokenSearchParams - - INSERT INTO dbo.TokenText - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Text, 0 - FROM @tokenTextSearchParams - - INSERT INTO dbo.StringSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, TextOverflow, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Text, TextOverflow, 0 - FROM @stringSearchParams - - INSERT INTO dbo.UriSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Uri, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Uri, 0 - FROM @uriSearchParams - - INSERT INTO dbo.NumberSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SingleValue, LowValue, HighValue, 0 - FROM @numberSearchParams - - INSERT INTO dbo.QuantitySearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, QuantityCodeId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId, QuantityCodeId, SingleValue, LowValue, HighValue, 0 - FROM @quantitySearchParams - - INSERT INTO dbo.DateTimeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, StartDateTime, EndDateTime, IsLongerThanADay, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, StartDateTime, EndDateTime, IsLongerThanADay, 0 - FROM @dateTimeSearchParms - - INSERT INTO dbo.ReferenceTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri1, ReferenceResourceTypeId1, ReferenceResourceId1, ReferenceResourceVersion1, SystemId2, Code2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, BaseUri1, ReferenceResourceTypeId1, ReferenceResourceId1, ReferenceResourceVersion1, SystemId2, Code2, 0 - FROM @referenceTokenCompositeSearchParams - - INSERT INTO dbo.TokenTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SystemId2, Code2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SystemId2, Code2, 0 - FROM @tokenTokenCompositeSearchParams - - INSERT INTO dbo.TokenDateTimeCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, StartDateTime2, EndDateTime2, IsLongerThanADay2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, StartDateTime2, EndDateTime2, IsLongerThanADay2, 0 - FROM @tokenDateTimeCompositeSearchParams - - INSERT INTO dbo.TokenQuantityCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, SystemId2, QuantityCodeId2, LowValue2, HighValue2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, SystemId2, QuantityCodeId2, LowValue2, HighValue2, 0 - FROM @tokenQuantityCompositeSearchParams - - INSERT INTO dbo.TokenStringCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, Text2, TextOverflow2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, Text2, TextOverflow2, 0 - FROM @tokenStringCompositeSearchParams - - INSERT INTO dbo.TokenNumberNumberCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, LowValue2, HighValue2, SingleValue3, LowValue3, HighValue3, HasRange, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, LowValue2, HighValue2, SingleValue3, LowValue3, HighValue3, HasRange, 0 - FROM @tokenNumberNumberCompositeSearchParams - - COMMIT TRANSACTION -GO - -CREATE TYPE dbo.BulkReindexResourceTableType_1 AS TABLE -( - Offset int NOT NULL, - ResourceTypeId smallint NOT NULL, - ResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ETag int NULL, - SearchParamHash varchar(64) NOT NULL -) - -GO - --- --- STORED PROCEDURE --- BulkReindexResources --- --- DESCRIPTION --- Updates the search indices of a batch of resources --- --- PARAMETERS --- @resourcesToReindex --- * The type IDs, IDs, eTags and hashes of the resources to reindex --- @resourceWriteClaims --- * Claims on the principal that performed the write --- @compartmentAssignments --- * Compartments that the resource is part of --- @referenceSearchParams --- * Extracted reference search params --- @tokenSearchParams --- * Extracted token search params --- @tokenTextSearchParams --- * The text representation of extracted token search params --- @stringSearchParams --- * Extracted string search params --- @numberSearchParams --- * Extracted number search params --- @quantitySearchParams --- * Extracted quantity search params --- @uriSearchParams --- * Extracted URI search params --- @dateTimeSearchParms --- * Extracted datetime search params --- @referenceTokenCompositeSearchParams --- * Extracted reference$token search params --- @tokenTokenCompositeSearchParams --- * Extracted token$token tokensearch params --- @tokenDateTimeCompositeSearchParams --- * Extracted token$datetime search params --- @tokenQuantityCompositeSearchParams --- * Extracted token$quantity search params --- @tokenStringCompositeSearchParams --- * Extracted token$string search params --- @tokenNumberNumberCompositeSearchParams --- * Extracted token$number$number search params --- -CREATE PROCEDURE dbo.BulkReindexResources - @resourcesToReindex dbo.BulkReindexResourceTableType_1 READONLY, - @resourceWriteClaims dbo.BulkResourceWriteClaimTableType_1 READONLY, - @compartmentAssignments dbo.BulkCompartmentAssignmentTableType_1 READONLY, - @referenceSearchParams dbo.BulkReferenceSearchParamTableType_1 READONLY, - @tokenSearchParams dbo.BulkTokenSearchParamTableType_1 READONLY, - @tokenTextSearchParams dbo.BulkTokenTextTableType_1 READONLY, - @stringSearchParams dbo.BulkStringSearchParamTableType_1 READONLY, - @numberSearchParams dbo.BulkNumberSearchParamTableType_1 READONLY, - @quantitySearchParams dbo.BulkQuantitySearchParamTableType_1 READONLY, - @uriSearchParams dbo.BulkUriSearchParamTableType_1 READONLY, - @dateTimeSearchParms dbo.BulkDateTimeSearchParamTableType_1 READONLY, - @referenceTokenCompositeSearchParams dbo.BulkReferenceTokenCompositeSearchParamTableType_1 READONLY, - @tokenTokenCompositeSearchParams dbo.BulkTokenTokenCompositeSearchParamTableType_1 READONLY, - @tokenDateTimeCompositeSearchParams dbo.BulkTokenDateTimeCompositeSearchParamTableType_1 READONLY, - @tokenQuantityCompositeSearchParams dbo.BulkTokenQuantityCompositeSearchParamTableType_1 READONLY, - @tokenStringCompositeSearchParams dbo.BulkTokenStringCompositeSearchParamTableType_1 READONLY, - @tokenNumberNumberCompositeSearchParams dbo.BulkTokenNumberNumberCompositeSearchParamTableType_1 READONLY -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @computedValues TABLE - ( - Offset int NOT NULL, - ResourceTypeId smallint NOT NULL, - VersionProvided bigint NULL, - SearchParamHash varchar(64) NOT NULL, - ResourceSurrogateId bigint NULL, - VersionInDatabase bigint NULL - ) - - INSERT INTO @computedValues - SELECT - resourceToReindex.Offset, - resourceToReindex.ResourceTypeId, - resourceToReindex.ETag, - resourceToReindex.SearchParamHash, - resourceInDB.ResourceSurrogateId, - resourceInDB.Version - FROM @resourcesToReindex resourceToReindex - LEFT OUTER JOIN dbo.Resource resourceInDB WITH (UPDLOCK, INDEX(IX_Resource_ResourceTypeId_ResourceId)) - ON resourceInDB.ResourceTypeId = resourceToReindex.ResourceTypeId - AND resourceInDB.ResourceId = resourceToReindex.ResourceId - AND resourceInDB.IsHistory = 0 - - DECLARE @resourcesNotInDatabase int - SET @resourcesNotInDatabase = (SELECT COUNT(*) FROM @computedValues WHERE ResourceSurrogateId IS NULL) - - IF (@resourcesNotInDatabase > 0) BEGIN - -- We can't reindex a resource if the resource does not exist - THROW 50404, 'One or more resources not found', 1; - END - - DECLARE @versionDiff int - SET @versionDiff = (SELECT COUNT(*) FROM @computedValues WHERE VersionProvided IS NOT NULL AND VersionProvided <> VersionInDatabase) - - IF (@versionDiff > 0) BEGIN - -- The resource has been updated since the reindex job kicked off - THROW 50412, 'Precondition failed', 1; - END - - -- Update the search parameter hash value in the main resource table - UPDATE resourceInDB - SET resourceInDB.SearchParamHash = resourceToReindex.SearchParamHash - FROM @computedValues resourceToReindex - INNER JOIN dbo.Resource resourceInDB - ON resourceInDB.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - -- First, delete all the indices of the resources to reindex. - DELETE searchIndex FROM dbo.ResourceWriteClaim searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.CompartmentAssignment searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.ReferenceSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenText searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.StringSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.UriSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.NumberSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.QuantitySearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.DateTimeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.ReferenceTokenCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenTokenCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenDateTimeCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenQuantityCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenStringCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenNumberNumberCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - -- Next, insert all the new indices. - INSERT INTO dbo.ResourceWriteClaim - (ResourceSurrogateId, ClaimTypeId, ClaimValue) - SELECT DISTINCT resourceToReindex.ResourceSurrogateId, searchIndex.ClaimTypeId, searchIndex.ClaimValue - FROM @resourceWriteClaims searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.CompartmentAssignment - (ResourceTypeId, ResourceSurrogateId, CompartmentTypeId, ReferenceResourceId, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.CompartmentTypeId, searchIndex.ReferenceResourceId, 0 - FROM @compartmentAssignments searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.ReferenceSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri, ReferenceResourceTypeId, ReferenceResourceId, ReferenceResourceVersion, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.BaseUri, searchIndex.ReferenceResourceTypeId, searchIndex.ReferenceResourceId, searchIndex.ReferenceResourceVersion, 0 - FROM @referenceSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, Code, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId, searchIndex.Code, 0 - FROM @tokenSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenText - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.Text, 0 - FROM @tokenTextSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.StringSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, TextOverflow, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.Text, searchIndex.TextOverflow, 0 - FROM @stringSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.UriSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Uri, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.Uri, 0 - FROM @uriSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.NumberSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SingleValue, searchIndex.LowValue, searchIndex.HighValue, 0 - FROM @numberSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.QuantitySearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, QuantityCodeId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId, searchIndex.QuantityCodeId, searchIndex.SingleValue, searchIndex.LowValue, searchIndex.HighValue, 0 - FROM @quantitySearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.DateTimeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, StartDateTime, EndDateTime, IsLongerThanADay, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.StartDateTime, searchIndex.EndDateTime, searchIndex.IsLongerThanADay, 0 - FROM @dateTimeSearchParms searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.ReferenceTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri1, ReferenceResourceTypeId1, ReferenceResourceId1, ReferenceResourceVersion1, SystemId2, Code2, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.BaseUri1, searchIndex.ReferenceResourceTypeId1, searchIndex.ReferenceResourceId1, searchIndex.ReferenceResourceVersion1, searchIndex.SystemId2, searchIndex.Code2, 0 - FROM @referenceTokenCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SystemId2, Code2, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId1, searchIndex.Code1, searchIndex.SystemId2, searchIndex.Code2, 0 - FROM @tokenTokenCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenDateTimeCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, StartDateTime2, EndDateTime2, IsLongerThanADay2, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId1, searchIndex.Code1, searchIndex.StartDateTime2, searchIndex.EndDateTime2, searchIndex.IsLongerThanADay2, 0 - FROM @tokenDateTimeCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenQuantityCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, SystemId2, QuantityCodeId2, LowValue2, HighValue2, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId1, searchIndex.Code1, searchIndex.SingleValue2, searchIndex.SystemId2, searchIndex.QuantityCodeId2, searchIndex.LowValue2, searchIndex.HighValue2, 0 - FROM @tokenQuantityCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenStringCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, Text2, TextOverflow2, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId1, searchIndex.Code1, searchIndex.Text2, searchIndex.TextOverflow2, 0 - FROM @tokenStringCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenNumberNumberCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, LowValue2, HighValue2, SingleValue3, LowValue3, HighValue3, HasRange, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId1, searchIndex.Code1, searchIndex.SingleValue2, searchIndex.LowValue2, searchIndex.HighValue2, searchIndex.SingleValue3, searchIndex.LowValue3, searchIndex.HighValue3, searchIndex.HasRange, 0 - FROM @tokenNumberNumberCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - COMMIT TRANSACTION -GO diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Schema/Migrations/9.sql b/src/Microsoft.Health.Fhir.SqlServer/Features/Schema/Migrations/9.sql deleted file mode 100644 index ca4e5acbf3..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Schema/Migrations/9.sql +++ /dev/null @@ -1,2865 +0,0 @@ --- Style guide: please see: https://github.com/ktaranov/sqlserver-kit/blob/master/SQL%20Server%20Name%20Convention%20and%20T-SQL%20Programming%20Style.md - -/************************************************************* - Schema Version -**************************************************************/ - -INSERT INTO dbo.SchemaVersion -VALUES - (9, 'started') - -GO - -/************************************************************* - Migration progress -**************************************************************/ - -CREATE TABLE dbo.SchemaMigrationProgress -( - Timestamp datetime2(3) default CURRENT_TIMESTAMP, - Message nvarchar(max) -) - -GO - -CREATE PROCEDURE dbo.LogSchemaMigrationProgress - @message varchar(max) -AS - INSERT INTO dbo.SchemaMigrationProgress (Message) VALUES (@message) -GO - -/************************************************************* - Partitioning function and scheme -**************************************************************/ - -CREATE PARTITION FUNCTION PartitionFunction_ResourceTypeId (smallint) -AS RANGE RIGHT FOR VALUES (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150); - -CREATE PARTITION SCHEME PartitionScheme_ResourceTypeId -AS PARTITION PartitionFunction_ResourceTypeId ALL TO ([PRIMARY]); - -/************************************************************* - Model tables -**************************************************************/ - -CREATE TABLE dbo.SearchParam -( - SearchParamId smallint IDENTITY(1,1) NOT NULL, - Uri varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - Status varchar(10) NULL, - LastUpdated datetimeoffset(7) NULL, - IsPartiallySupported bit NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_SearchParam ON dbo.SearchParam -( - Uri -) - -CREATE TABLE dbo.ResourceType -( - ResourceTypeId smallint IDENTITY(1,1) NOT NULL, - Name nvarchar(50) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_ResourceType on dbo.ResourceType -( - Name -) - --- Create System and QuantityCode tables - -CREATE TABLE dbo.System -( - SystemId int IDENTITY(1,1) NOT NULL, - Value nvarchar(256) NOT NULL, -) - -CREATE UNIQUE CLUSTERED INDEX IXC_System ON dbo.System -( - Value -) - -CREATE TABLE dbo.QuantityCode -( - QuantityCodeId int IDENTITY(1,1) NOT NULL, - Value nvarchar(256) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_QuantityCode on dbo.QuantityCode -( - Value -) - -/************************************************************* - Resource table -**************************************************************/ - -CREATE TABLE dbo.Resource -( - ResourceTypeId smallint NOT NULL, - ResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - Version int NOT NULL, - IsHistory bit NOT NULL, - ResourceSurrogateId bigint NOT NULL, - IsDeleted bit NOT NULL, - RequestMethod varchar(10) NULL, - RawResource varbinary(max) NOT NULL, - IsRawResourceMetaSet bit NOT NULL DEFAULT 0, - SearchParamHash varchar(64) NULL -) - -ALTER TABLE dbo.Resource SET ( LOCK_ESCALATION = AUTO ) - -CREATE UNIQUE CLUSTERED INDEX IXC_Resource ON dbo.Resource -( - ResourceTypeId, - ResourceSurrogateId -) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - - -CREATE UNIQUE NONCLUSTERED INDEX IX_Resource_ResourceTypeId_ResourceId_Version ON dbo.Resource -( - ResourceTypeId, - ResourceId, - Version -) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE UNIQUE NONCLUSTERED INDEX IX_Resource_ResourceTypeId_ResourceId ON dbo.Resource -( - ResourceTypeId, - ResourceId -) -INCLUDE -- We want the query in UpsertResource, which is done with UPDLOCK AND HOLDLOCK, to not require a key lookup -( - Version, - IsDeleted -) -WHERE IsHistory = 0 -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE UNIQUE NONCLUSTERED INDEX IX_Resource_ResourceTypeId_ResourceSurrgateId ON dbo.Resource -( - ResourceTypeId, - ResourceSurrogateId -) -WHERE IsHistory = 0 AND IsDeleted = 0 -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_Resource_ResourceSurrogateId ON dbo.Resource -( - ResourceSurrogateId -) -ON [Primary] - -/************************************************************* - Capture claims on write -**************************************************************/ - -CREATE TABLE dbo.ClaimType -( - ClaimTypeId tinyint IDENTITY(1,1) NOT NULL, - Name varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_Claim on dbo.ClaimType -( - Name -) - -CREATE TYPE dbo.BulkResourceWriteClaimTableType_1 AS TABLE -( - Offset int NOT NULL, - ClaimTypeId tinyint NOT NULL, - ClaimValue nvarchar(128) NOT NULL -) - -CREATE TABLE dbo.ResourceWriteClaim -( - ResourceSurrogateId bigint NOT NULL, - ClaimTypeId tinyint NOT NULL, - ClaimValue nvarchar(128) NOT NULL, -) WITH (DATA_COMPRESSION = PAGE) - -CREATE CLUSTERED INDEX IXC_ResourceWriteClaim on dbo.ResourceWriteClaim -( - ResourceSurrogateId, - ClaimTypeId -) - -/************************************************************* - Compartments -**************************************************************/ - -CREATE TABLE dbo.CompartmentType -( - CompartmentTypeId tinyint IDENTITY(1,1) NOT NULL, - Name varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_CompartmentType on dbo.CompartmentType -( - Name -) - -CREATE TYPE dbo.BulkCompartmentAssignmentTableType_1 AS TABLE -( - Offset int NOT NULL, - CompartmentTypeId tinyint NOT NULL, - ReferenceResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.CompartmentAssignment -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - CompartmentTypeId tinyint NOT NULL, - ReferenceResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL, -) - -ALTER TABLE dbo.CompartmentAssignment SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_CompartmentAssignment -ON dbo.CompartmentAssignment -( - ResourceTypeId, - ResourceSurrogateId, - CompartmentTypeId, - ReferenceResourceId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_CompartmentAssignment_CompartmentTypeId_ReferenceResourceId -ON dbo.CompartmentAssignment -( - ResourceTypeId, - CompartmentTypeId, - ReferenceResourceId, - ResourceSurrogateId -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Reference Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkReferenceSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - BaseUri varchar(128) COLLATE Latin1_General_100_CS_AS NULL, - ReferenceResourceTypeId smallint NULL, - ReferenceResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ReferenceResourceVersion int NULL -) - -CREATE TABLE dbo.ReferenceSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - BaseUri varchar(128) COLLATE Latin1_General_100_CS_AS NULL, - ReferenceResourceTypeId smallint NULL, - ReferenceResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ReferenceResourceVersion int NULL, - IsHistory bit NOT NULL, -) - -ALTER TABLE dbo.ReferenceSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_ReferenceSearchParam -ON dbo.ReferenceSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_ReferenceSearchParam_SearchParamId_ReferenceResourceTypeId_ReferenceResourceId_BaseUri_ReferenceResourceVersion -ON dbo.ReferenceSearchParam -( - ResourceTypeId, - SearchParamId, - ReferenceResourceId, - ReferenceResourceTypeId, - BaseUri, - ResourceSurrogateId -) -INCLUDE -( - ReferenceResourceVersion -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Token Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkTokenSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId int NULL, - Code varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.TokenSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId int NULL, - Code varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL, -) - -ALTER TABLE dbo.TokenSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_TokenSearchParam -ON dbo.TokenSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenSeachParam_SearchParamId_Code_SystemId -ON dbo.TokenSearchParam -( - ResourceTypeId, - SearchParamId, - Code, - ResourceSurrogateId -) -INCLUDE -( - SystemId -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Token Text -**************************************************************/ - -CREATE TYPE dbo.BulkTokenTextTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - Text nvarchar(400) COLLATE Latin1_General_CI_AI NOT NULL -) - -CREATE TABLE dbo.TokenText -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - Text nvarchar(400) COLLATE Latin1_General_CI_AI NOT NULL, - IsHistory bit NOT NULL -) - -ALTER TABLE dbo.TokenText SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_TokenText -ON dbo.TokenText -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenText_SearchParamId_Text -ON dbo.TokenText -( - ResourceTypeId, - SearchParamId, - Text, - ResourceSurrogateId -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - String Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkStringSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - Text nvarchar(256) COLLATE Latin1_General_100_CI_AI_SC NOT NULL, - TextOverflow nvarchar(max) COLLATE Latin1_General_100_CI_AI_SC NULL -) - -CREATE TABLE dbo.StringSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - Text nvarchar(256) COLLATE Latin1_General_100_CI_AI_SC NOT NULL, - TextOverflow nvarchar(max) COLLATE Latin1_General_100_CI_AI_SC NULL, - IsHistory bit NOT NULL -) - -ALTER TABLE dbo.StringSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_StringSearchParam -ON dbo.StringSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_StringSearchParam_SearchParamId_Text -ON dbo.StringSearchParam -( - ResourceTypeId, - SearchParamId, - Text, - ResourceSurrogateId -) -INCLUDE -( - TextOverflow -- will not be needed when all servers are targeting at least this version. -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_StringSearchParam_SearchParamId_TextWithOverflow -ON dbo.StringSearchParam -( - ResourceTypeId, - SearchParamId, - Text, - ResourceSurrogateId -) -WHERE IsHistory = 0 AND TextOverflow IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - URI Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkUriSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - Uri varchar(256) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.UriSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - Uri varchar(256) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL -) - -ALTER TABLE dbo.UriSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_UriSearchParam -ON dbo.UriSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_UriSearchParam_SearchParamId_Uri -ON dbo.UriSearchParam -( - ResourceTypeId, - SearchParamId, - Uri, - ResourceSurrogateId -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - - -/************************************************************* - Number Search Param -**************************************************************/ - --- We support the underlying value being a range, though we expect the vast majority of entries to be a single value. --- Either: --- (1) SingleValue is not null and LowValue and HighValue are both null, or --- (2) SingleValue is null and LowValue and HighValue are both not null --- We make use of filtered nonclustered indexes to keep queries over the ranges limited to those rows that actually have ranges - -CREATE TYPE dbo.BulkNumberSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SingleValue decimal(18,6) NULL, - LowValue decimal(18,6) NULL, - HighValue decimal(18,6) NULL -) - -CREATE TABLE dbo.NumberSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SingleValue decimal(18,6) NULL, - LowValue decimal(18,6) SPARSE NULL, - HighValue decimal(18,6) SPARSE NULL, - IsHistory bit NOT NULL -) - -ALTER TABLE dbo.NumberSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_NumberSearchParam -ON dbo.NumberSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_NumberSearchParam_SearchParamId_SingleValue -ON dbo.NumberSearchParam -( - ResourceTypeId, - SearchParamId, - SingleValue, - ResourceSurrogateId -) -WHERE IsHistory = 0 AND SingleValue IS NOT NULL -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_NumberSearchParam_SearchParamId_LowValue_HighValue -ON dbo.NumberSearchParam -( - ResourceTypeId, - SearchParamId, - LowValue, - HighValue, - ResourceSurrogateId -) -WHERE IsHistory = 0 AND LowValue IS NOT NULL -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_NumberSearchParam_SearchParamId_HighValue_LowValue -ON dbo.NumberSearchParam -( - ResourceTypeId, - SearchParamId, - HighValue, - LowValue, - ResourceSurrogateId -) -WHERE IsHistory = 0 AND LowValue IS NOT NULL -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Quantity Search Param -**************************************************************/ - --- See comment above for number search params for how we store ranges - -CREATE TYPE dbo.BulkQuantitySearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId int NULL, - QuantityCodeId int NULL, - SingleValue decimal(18,6) NULL, - LowValue decimal(18,6) NULL, - HighValue decimal(18,6) NULL -) - -CREATE TABLE dbo.QuantitySearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId int NULL, - QuantityCodeId int NULL, - SingleValue decimal(18,6) NULL, - LowValue decimal(18,6) SPARSE NULL, - HighValue decimal(18,6) SPARSE NULL, - IsHistory bit NOT NULL -) - -ALTER TABLE dbo.QuantitySearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_QuantitySearchParam -ON dbo.QuantitySearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_QuantitySearchParam_SearchParamId_QuantityCodeId_SingleValue -ON dbo.QuantitySearchParam -( - ResourceTypeId, - SearchParamId, - QuantityCodeId, - SingleValue, - ResourceSurrogateId -) -INCLUDE -( - SystemId -) -WHERE IsHistory = 0 AND SingleValue IS NOT NULL -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_QuantitySearchParam_SearchParamId_QuantityCodeId_LowValue_HighValue -ON dbo.QuantitySearchParam -( - ResourceTypeId, - SearchParamId, - QuantityCodeId, - LowValue, - HighValue, - ResourceSurrogateId -) -INCLUDE -( - SystemId -) -WHERE IsHistory = 0 AND LowValue IS NOT NULL -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_QuantitySearchParam_SearchParamId_QuantityCodeId_HighValue_LowValue -ON dbo.QuantitySearchParam -( - ResourceTypeId, - SearchParamId, - QuantityCodeId, - HighValue, - LowValue, - ResourceSurrogateId -) -INCLUDE -( - SystemId -) -WHERE IsHistory = 0 AND LowValue IS NOT NULL -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Date Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkDateTimeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - StartDateTime datetimeoffset(7) NOT NULL, - EndDateTime datetimeoffset(7) NOT NULL, - IsLongerThanADay bit NOT NULL -) - -CREATE TABLE dbo.DateTimeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - StartDateTime datetime2(7) NOT NULL, - EndDateTime datetime2(7) NOT NULL, - IsLongerThanADay bit NOT NULL, - IsHistory bit NOT NULL -) - -ALTER TABLE dbo.DateTimeSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_DateTimeSearchParam -ON dbo.DateTimeSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_DateTimeSearchParam_SearchParamId_StartDateTime_EndDateTime -ON dbo.DateTimeSearchParam -( - ResourceTypeId, - SearchParamId, - StartDateTime, - EndDateTime, - ResourceSurrogateId -) -INCLUDE -( - IsLongerThanADay -) -WHERE IsHistory = 0 -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_DateTimeSearchParam_SearchParamId_EndDateTime_StartDateTime -ON dbo.DateTimeSearchParam -( - ResourceTypeId, - SearchParamId, - EndDateTime, - StartDateTime, - ResourceSurrogateId -) -INCLUDE -( - IsLongerThanADay -) -WHERE IsHistory = 0 -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_DateTimeSearchParam_SearchParamId_StartDateTime_EndDateTime_Long -ON dbo.DateTimeSearchParam -( - ResourceTypeId, - SearchParamId, - StartDateTime, - EndDateTime, - ResourceSurrogateId -) -WHERE IsHistory = 0 AND IsLongerThanADay = 1 -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_DateTimeSearchParam_SearchParamId_EndDateTime_StartDateTime_Long -ON dbo.DateTimeSearchParam -( - ResourceTypeId, - SearchParamId, - EndDateTime, - StartDateTime, - ResourceSurrogateId -) -WHERE IsHistory = 0 AND IsLongerThanADay = 1 -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Reference$Token Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkReferenceTokenCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - BaseUri1 varchar(128) COLLATE Latin1_General_100_CS_AS NULL, - ReferenceResourceTypeId1 smallint NULL, - ReferenceResourceId1 varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ReferenceResourceVersion1 int NULL, - SystemId2 int NULL, - Code2 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.ReferenceTokenCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - BaseUri1 varchar(128) COLLATE Latin1_General_100_CS_AS NULL, - ReferenceResourceTypeId1 smallint NULL, - ReferenceResourceId1 varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ReferenceResourceVersion1 int NULL, - SystemId2 int NULL, - Code2 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL, -) - -ALTER TABLE dbo.ReferenceTokenCompositeSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_ReferenceTokenCompositeSearchParam -ON dbo.ReferenceTokenCompositeSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_ReferenceTokenCompositeSearchParam_ReferenceResourceId1_Code2 -ON dbo.ReferenceTokenCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - ReferenceResourceId1, - Code2, - ResourceSurrogateId -) -INCLUDE -( - ReferenceResourceTypeId1, - BaseUri1, - SystemId2 -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Token$Token Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkTokenTokenCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SystemId2 int NULL, - Code2 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL -) - -CREATE TABLE dbo.TokenTokenCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SystemId2 int NULL, - Code2 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - IsHistory bit NOT NULL -) - -ALTER TABLE dbo.TokenTokenCompositeSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_TokenTokenCompositeSearchParam -ON dbo.TokenTokenCompositeSearchParam -( - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenTokenCompositeSearchParam_Code1_Code2 -ON dbo.TokenTokenCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - Code2, - ResourceSurrogateId -) -INCLUDE -( - SystemId1, - SystemId2 -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Token$DateTime Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkTokenDateTimeCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - StartDateTime2 datetimeoffset(7) NOT NULL, - EndDateTime2 datetimeoffset(7) NOT NULL, - IsLongerThanADay2 bit NOT NULL -) - -CREATE TABLE dbo.TokenDateTimeCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - StartDateTime2 datetime2(7) NOT NULL, - EndDateTime2 datetime2(7) NOT NULL, - IsLongerThanADay2 bit NOT NULL, - IsHistory bit NOT NULL, -) - -ALTER TABLE dbo.TokenDateTimeCompositeSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_TokenDateTimeCompositeSearchParam -ON dbo.TokenDateTimeCompositeSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenDateTimeCompositeSearchParam_Code1_StartDateTime2_EndDateTime2 -ON dbo.TokenDateTimeCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - StartDateTime2, - EndDateTime2, - ResourceSurrogateId -) -INCLUDE -( - SystemId1, - IsLongerThanADay2 -) - -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenDateTimeCompositeSearchParam_Code1_EndDateTime2_StartDateTime2 -ON dbo.TokenDateTimeCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - EndDateTime2, - StartDateTime2, - ResourceSurrogateId -) -INCLUDE -( - SystemId1, - IsLongerThanADay2 -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenDateTimeCompositeSearchParam_Code1_StartDateTime2_EndDateTime2_Long -ON dbo.TokenDateTimeCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - StartDateTime2, - EndDateTime2, - ResourceSurrogateId -) -INCLUDE -( - SystemId1 -) - -WHERE IsHistory = 0 AND IsLongerThanADay2 = 1 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenDateTimeCompositeSearchParam_Code1_EndDateTime2_StartDateTime2_Long -ON dbo.TokenDateTimeCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - EndDateTime2, - StartDateTime2, - ResourceSurrogateId -) -INCLUDE -( - SystemId1 -) -WHERE IsHistory = 0 AND IsLongerThanADay2 = 1 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Token$Quantity Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkTokenQuantityCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SystemId2 int NULL, - QuantityCodeId2 int NULL, - SingleValue2 decimal(18,6) NULL, - LowValue2 decimal(18,6) NULL, - HighValue2 decimal(18,6) NULL -) - -CREATE TABLE dbo.TokenQuantityCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SystemId2 int NULL, - QuantityCodeId2 int NULL, - SingleValue2 decimal(18,6) NULL, - LowValue2 decimal(18,6) NULL, - HighValue2 decimal(18,6) NULL, - IsHistory bit NOT NULL, -) - -ALTER TABLE dbo.TokenQuantityCompositeSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_TokenQuantityCompositeSearchParam -ON dbo.TokenQuantityCompositeSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenQuantityCompositeSearchParam_SearchParamId_Code1_QuantityCodeId2_SingleValue2 -ON dbo.TokenQuantityCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - SingleValue2, - ResourceSurrogateId -) -INCLUDE -( - QuantityCodeId2, - SystemId1, - SystemId2 -) -WHERE IsHistory = 0 AND SingleValue2 IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenQuantityCompositeSearchParam_SearchParamId_Code1_QuantityCodeId2_LowValue2_HighValue2 -ON dbo.TokenQuantityCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - LowValue2, - HighValue2, - ResourceSurrogateId -) -INCLUDE -( - QuantityCodeId2, - SystemId1, - SystemId2 -) -WHERE IsHistory = 0 AND LowValue2 IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenQuantityCompositeSearchParam_SearchParamId_Code1_QuantityCodeId2_HighValue2_LowValue2 -ON dbo.TokenQuantityCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - HighValue2, - LowValue2, - ResourceSurrogateId -) -INCLUDE -( - QuantityCodeId2, - SystemId1, - SystemId2 -) -WHERE IsHistory = 0 AND LowValue2 IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Token$String Composite Search Param -**************************************************************/ - -CREATE TYPE dbo.BulkTokenStringCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - Text2 nvarchar(256) COLLATE Latin1_General_100_CI_AI_SC NOT NULL, - TextOverflow2 nvarchar(max) COLLATE Latin1_General_100_CI_AI_SC NULL -) - -CREATE TABLE dbo.TokenStringCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - Text2 nvarchar(256) COLLATE Latin1_General_CI_AI NOT NULL, - TextOverflow2 nvarchar(max) COLLATE Latin1_General_CI_AI NULL, - IsHistory bit NOT NULL, -) - -ALTER TABLE dbo.TokenStringCompositeSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_TokenStringCompositeSearchParam -ON dbo.TokenStringCompositeSearchParam -( - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenStringCompositeSearchParam_SearchParamId_Code1_Text2 -ON dbo.TokenStringCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - Text2, - ResourceSurrogateId -) -INCLUDE -( - SystemId1, - TextOverflow2 -- will not be needed when all servers are targeting at least this version. -) -WHERE IsHistory = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenStringCompositeSearchParam_SearchParamId_Code1_Text2WithOverflow -ON dbo.TokenStringCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - Text2, - ResourceSurrogateId -) -INCLUDE -( - SystemId1 -) -WHERE IsHistory = 0 AND TextOverflow2 IS NOT NULL -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - - -/************************************************************* - Token$Number$Number Composite Search Param -**************************************************************/ - --- See number search param for how we deal with null. We apply a similar pattern here, --- except that we pass in a HasRange bit though the TVP. The alternative would have --- for a computed column, but a computed column cannot be used in as a index filter --- (even if it is a persisted computed column). - -CREATE TYPE dbo.BulkTokenNumberNumberCompositeSearchParamTableType_1 AS TABLE -( - Offset int NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SingleValue2 decimal(18,6) NULL, - LowValue2 decimal(18,6) NULL, - HighValue2 decimal(18,6) NULL, - SingleValue3 decimal(18,6) NULL, - LowValue3 decimal(18,6) NULL, - HighValue3 decimal(18,6) NULL, - HasRange bit NOT NULL -) - -CREATE TABLE dbo.TokenNumberNumberCompositeSearchParam -( - ResourceTypeId smallint NOT NULL, - ResourceSurrogateId bigint NOT NULL, - SearchParamId smallint NOT NULL, - SystemId1 int NULL, - Code1 varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - SingleValue2 decimal(18,6) NULL, - LowValue2 decimal(18,6) NULL, - HighValue2 decimal(18,6) NULL, - SingleValue3 decimal(18,6) NULL, - LowValue3 decimal(18,6) NULL, - HighValue3 decimal(18,6) NULL, - HasRange bit NOT NULL, - IsHistory bit NOT NULL, -) - -ALTER TABLE dbo.TokenNumberNumberCompositeSearchParam SET ( LOCK_ESCALATION = AUTO ) - -CREATE CLUSTERED INDEX IXC_TokenNumberNumberCompositeSearchParam -ON dbo.TokenNumberNumberCompositeSearchParam -( - ResourceTypeId, - ResourceSurrogateId, - SearchParamId -) -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenNumberNumberCompositeSearchParam_SearchParamId_Code1_Text2 -ON dbo.TokenNumberNumberCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - SingleValue2, - SingleValue3, - ResourceSurrogateId -) -INCLUDE -( - SystemId1 -) -WHERE IsHistory = 0 AND HasRange = 0 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -CREATE NONCLUSTERED INDEX IX_TokenNumberNumberCompositeSearchParam_SearchParamId_Code1_LowValue2_HighValue2_LowValue3_HighValue3 -ON dbo.TokenNumberNumberCompositeSearchParam -( - ResourceTypeId, - SearchParamId, - Code1, - LowValue2, - HighValue2, - LowValue3, - HighValue3, - ResourceSurrogateId -) -INCLUDE -( - SystemId1 -) -WHERE IsHistory = 0 AND HasRange = 1 -WITH (DATA_COMPRESSION = PAGE) -ON PartitionScheme_ResourceTypeId(ResourceTypeId) - -GO - -/************************************************************* - Sequence for generating unique 12.5ns "tick" components that are added - to a base ID based on the timestamp to form a unique resource surrogate ID -**************************************************************/ - -CREATE SEQUENCE dbo.ResourceSurrogateIdUniquifierSequence - AS int - START WITH 0 - INCREMENT BY 1 - MINVALUE 0 - MAXVALUE 79999 - CYCLE - CACHE 1000000 -GO - -/************************************************************* - Stored procedures for creating and deleting -**************************************************************/ - --- --- STORED PROCEDURE --- UpsertResource_3 --- --- DESCRIPTION --- Creates or updates (including marking deleted) a FHIR resource --- --- PARAMETERS --- @baseResourceSurrogateId --- * A bigint to which a value between [0, 80000) is added, forming a unique ResourceSurrogateId. --- * This value should be the current UTC datetime, truncated to millisecond precision, with its 100ns ticks component bitshifted left by 3. --- @resourceTypeId --- * The ID of the resource type (See ResourceType table) --- @resourceId --- * The resource ID (must be the same as the in the resource itself) --- @etag --- * If specified, the version of the resource to update --- @allowCreate --- * If false, an error is thrown if the resource does not already exist --- @isDeleted --- * Whether this resource marks the resource as deleted --- @keepHistory --- * Whether the existing version of the resource should be preserved --- @requestMethod --- * The HTTP method/verb used for the request --- @searchParamHash --- * A hash of the resource's latest indexed search parameters --- @rawResource --- * A compressed UTF16-encoded JSON document --- @resourceWriteClaims --- * Claims on the principal that performed the write --- @compartmentAssignments --- * Compartments that the resource is part of --- @referenceSearchParams --- * Extracted reference search params --- @tokenSearchParams --- * Extracted token search params --- @tokenTextSearchParams --- * The text representation of extracted token search params --- @stringSearchParams --- * Extracted string search params --- @numberSearchParams --- * Extracted number search params --- @quantitySearchParams --- * Extracted quantity search params --- @uriSearchParams --- * Extracted URI search params --- @dateTimeSearchParms --- * Extracted datetime search params --- @referenceTokenCompositeSearchParams --- * Extracted reference$token search params --- @tokenTokenCompositeSearchParams --- * Extracted token$token tokensearch params --- @tokenDateTimeCompositeSearchParams --- * Extracted token$datetime search params --- @tokenQuantityCompositeSearchParams --- * Extracted token$quantity search params --- @tokenStringCompositeSearchParams --- * Extracted token$string search params --- @tokenNumberNumberCompositeSearchParams --- * Extracted token$number$number search params --- --- RETURN VALUE --- The version of the resource as a result set. Will be empty if no insertion was done. --- -CREATE PROCEDURE dbo.UpsertResource_3 - @baseResourceSurrogateId bigint, - @resourceTypeId smallint, - @resourceId varchar(64), - @eTag int = NULL, - @allowCreate bit, - @isDeleted bit, - @keepHistory bit, - @requestMethod varchar(10), - @searchParamHash varchar(64), - @rawResource varbinary(max), - @resourceWriteClaims dbo.BulkResourceWriteClaimTableType_1 READONLY, - @compartmentAssignments dbo.BulkCompartmentAssignmentTableType_1 READONLY, - @referenceSearchParams dbo.BulkReferenceSearchParamTableType_1 READONLY, - @tokenSearchParams dbo.BulkTokenSearchParamTableType_1 READONLY, - @tokenTextSearchParams dbo.BulkTokenTextTableType_1 READONLY, - @stringSearchParams dbo.BulkStringSearchParamTableType_1 READONLY, - @numberSearchParams dbo.BulkNumberSearchParamTableType_1 READONLY, - @quantitySearchParams dbo.BulkQuantitySearchParamTableType_1 READONLY, - @uriSearchParams dbo.BulkUriSearchParamTableType_1 READONLY, - @dateTimeSearchParms dbo.BulkDateTimeSearchParamTableType_1 READONLY, - @referenceTokenCompositeSearchParams dbo.BulkReferenceTokenCompositeSearchParamTableType_1 READONLY, - @tokenTokenCompositeSearchParams dbo.BulkTokenTokenCompositeSearchParamTableType_1 READONLY, - @tokenDateTimeCompositeSearchParams dbo.BulkTokenDateTimeCompositeSearchParamTableType_1 READONLY, - @tokenQuantityCompositeSearchParams dbo.BulkTokenQuantityCompositeSearchParamTableType_1 READONLY, - @tokenStringCompositeSearchParams dbo.BulkTokenStringCompositeSearchParamTableType_1 READONLY, - @tokenNumberNumberCompositeSearchParams dbo.BulkTokenNumberNumberCompositeSearchParamTableType_1 READONLY -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - -- variables for the existing version of the resource that will be replaced - DECLARE @previousResourceSurrogateId bigint - DECLARE @previousVersion bigint - DECLARE @previousIsDeleted bit - - -- This should place a range lock on a row in the IX_Resource_ResourceTypeId_ResourceId nonclustered filtered index - SELECT @previousResourceSurrogateId = ResourceSurrogateId, @previousVersion = Version, @previousIsDeleted = IsDeleted - FROM dbo.Resource WITH (UPDLOCK, HOLDLOCK) - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId AND IsHistory = 0 - - IF (@etag IS NOT NULL AND @etag <> @previousVersion) BEGIN - THROW 50412, 'Precondition failed', 1; - END - - DECLARE @version int -- the version of the resource being written - - IF (@previousResourceSurrogateId IS NULL) BEGIN - -- There is no previous version of this resource - - IF (@isDeleted = 1) BEGIN - -- Don't bother marking the resource as deleted since it already does not exist. - COMMIT TRANSACTION - RETURN - END - - IF (@etag IS NOT NULL) BEGIN - -- You can't update a resource with a specified version if the resource does not exist - THROW 50404, 'Resource with specified version not found', 1; - END - - IF (@allowCreate = 0) BEGIN - THROW 50405, 'Resource does not exist and create is not allowed', 1; - END - - SET @version = 1 - END - ELSE BEGIN - -- There is a previous version - - IF (@isDeleted = 1 AND @previousIsDeleted = 1) BEGIN - -- Already deleted - don't create a new version - COMMIT TRANSACTION - RETURN - END - - SET @version = @previousVersion + 1 - - IF (@keepHistory = 1) BEGIN - - -- Set the existing resource as history - UPDATE dbo.Resource - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - -- Set the indexes for this resource as history. - -- Note there is no IsHistory column on ResourceWriteClaim since we do not query it. - - UPDATE dbo.CompartmentAssignment - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.ReferenceSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenText - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.StringSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.UriSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.NumberSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.QuantitySearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.DateTimeSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.ReferenceTokenCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenTokenCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenDateTimeCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenQuantityCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenStringCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - UPDATE dbo.TokenNumberNumberCompositeSearchParam - SET IsHistory = 1 - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - END - ELSE BEGIN - - -- Not keeping history. Delete the current resource and all associated indexes. - - DELETE FROM dbo.Resource - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.ResourceWriteClaim - WHERE ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.CompartmentAssignment - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.ReferenceSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenText - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.StringSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.UriSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.NumberSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.QuantitySearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.DateTimeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.ReferenceTokenCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenTokenCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenDateTimeCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenQuantityCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenStringCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - DELETE FROM dbo.TokenNumberNumberCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @previousResourceSurrogateId - - END - END - - DECLARE @resourceSurrogateId bigint = @baseResourceSurrogateId + (NEXT VALUE FOR ResourceSurrogateIdUniquifierSequence) - DECLARE @isRawResourceMetaSet bit - - IF (@version = 1) BEGIN SET @isRawResourceMetaSet = 1 END ELSE BEGIN SET @isRawResourceMetaSet = 0 END - - INSERT INTO dbo.Resource - (ResourceTypeId, ResourceId, Version, IsHistory, ResourceSurrogateId, IsDeleted, RequestMethod, RawResource, IsRawResourceMetaSet, SearchParamHash) - VALUES - (@resourceTypeId, @resourceId, @version, 0, @resourceSurrogateId, @isDeleted, @requestMethod, @rawResource, @isRawResourceMetaSet, @searchParamHash) - - INSERT INTO dbo.ResourceWriteClaim - (ResourceSurrogateId, ClaimTypeId, ClaimValue) - SELECT @resourceSurrogateId, ClaimTypeId, ClaimValue - FROM @resourceWriteClaims - - INSERT INTO dbo.CompartmentAssignment - (ResourceTypeId, ResourceSurrogateId, CompartmentTypeId, ReferenceResourceId, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, CompartmentTypeId, ReferenceResourceId, 0 - FROM @compartmentAssignments - - INSERT INTO dbo.ReferenceSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri, ReferenceResourceTypeId, ReferenceResourceId, ReferenceResourceVersion, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, BaseUri, ReferenceResourceTypeId, ReferenceResourceId, ReferenceResourceVersion, 0 - FROM @referenceSearchParams - - INSERT INTO dbo.TokenSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, Code, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId, Code, 0 - FROM @tokenSearchParams - - INSERT INTO dbo.TokenText - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Text, 0 - FROM @tokenTextSearchParams - - INSERT INTO dbo.StringSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, TextOverflow, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Text, TextOverflow, 0 - FROM @stringSearchParams - - INSERT INTO dbo.UriSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Uri, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Uri, 0 - FROM @uriSearchParams - - INSERT INTO dbo.NumberSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SingleValue, LowValue, HighValue, 0 - FROM @numberSearchParams - - INSERT INTO dbo.QuantitySearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, QuantityCodeId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId, QuantityCodeId, SingleValue, LowValue, HighValue, 0 - FROM @quantitySearchParams - - INSERT INTO dbo.DateTimeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, StartDateTime, EndDateTime, IsLongerThanADay, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, StartDateTime, EndDateTime, IsLongerThanADay, 0 - FROM @dateTimeSearchParms - - INSERT INTO dbo.ReferenceTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri1, ReferenceResourceTypeId1, ReferenceResourceId1, ReferenceResourceVersion1, SystemId2, Code2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, BaseUri1, ReferenceResourceTypeId1, ReferenceResourceId1, ReferenceResourceVersion1, SystemId2, Code2, 0 - FROM @referenceTokenCompositeSearchParams - - INSERT INTO dbo.TokenTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SystemId2, Code2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SystemId2, Code2, 0 - FROM @tokenTokenCompositeSearchParams - - INSERT INTO dbo.TokenDateTimeCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, StartDateTime2, EndDateTime2, IsLongerThanADay2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, StartDateTime2, EndDateTime2, IsLongerThanADay2, 0 - FROM @tokenDateTimeCompositeSearchParams - - INSERT INTO dbo.TokenQuantityCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, SystemId2, QuantityCodeId2, LowValue2, HighValue2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, SystemId2, QuantityCodeId2, LowValue2, HighValue2, 0 - FROM @tokenQuantityCompositeSearchParams - - INSERT INTO dbo.TokenStringCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, Text2, TextOverflow2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, Text2, TextOverflow2, 0 - FROM @tokenStringCompositeSearchParams - - INSERT INTO dbo.TokenNumberNumberCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, LowValue2, HighValue2, SingleValue3, LowValue3, HighValue3, HasRange, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, LowValue2, HighValue2, SingleValue3, LowValue3, HighValue3, HasRange, 0 - FROM @tokenNumberNumberCompositeSearchParams - - SELECT @version - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- ReadResource --- --- DESCRIPTION --- Reads a single resource, optionally a specific version of the resource. --- --- PARAMETERS --- @resourceTypeId --- * The ID of the resource type (See ResourceType table) --- @resourceId --- * The resource ID --- @version --- * A specific version of the resource. If null, returns the latest version. --- RETURN VALUE --- A result set with 0 or 1 rows. --- -CREATE PROCEDURE dbo.ReadResource - @resourceTypeId smallint, - @resourceId varchar(64), - @version int = NULL -AS - SET NOCOUNT ON - - IF (@version IS NULL) BEGIN - SELECT ResourceSurrogateId, Version, IsDeleted, IsHistory, RawResource, IsRawResourceMetaSet, SearchParamHash - FROM dbo.Resource - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId AND IsHistory = 0 - END - ELSE BEGIN - SELECT ResourceSurrogateId, Version, IsDeleted, IsHistory, RawResource, IsRawResourceMetaSet, SearchParamHash - FROM dbo.Resource - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId AND Version = @version - END -GO - --- --- STORED PROCEDURE --- Deletes a single resource --- --- DESCRIPTION --- Permanently deletes all data related to a resource. --- Data remains recoverable from the transaction log, however. --- --- PARAMETERS --- @resourceTypeId --- * The ID of the resource type (See ResourceType table) --- @resourceId --- * The resource ID (must be the same as in the resource itself) --- -CREATE PROCEDURE dbo.HardDeleteResource - @resourceTypeId smallint, - @resourceId varchar(64) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @resourceSurrogateIds TABLE(ResourceSurrogateId bigint NOT NULL) - - DELETE FROM dbo.Resource - OUTPUT deleted.ResourceSurrogateId - INTO @resourceSurrogateIds - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId - - DELETE FROM dbo.ResourceWriteClaim - WHERE ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.CompartmentAssignment - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.ReferenceSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenText - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.StringSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.UriSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.NumberSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.QuantitySearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.DateTimeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.ReferenceTokenCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenTokenCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenDateTimeCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenQuantityCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenStringCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - DELETE FROM dbo.TokenNumberNumberCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId IN (SELECT ResourceSurrogateId FROM @resourceSurrogateIds) - - COMMIT TRANSACTION -GO - -/************************************************************* - Export Job -**************************************************************/ -CREATE TABLE dbo.ExportJob -( - Id varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - Hash varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - Status varchar(10) NOT NULL, - HeartbeatDateTime datetime2(7) NULL, - RawJobRecord varchar(max) NOT NULL, - JobVersion rowversion NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_ExportJob ON dbo.ExportJob -( - Id -) - -CREATE UNIQUE NONCLUSTERED INDEX IX_ExportJob_Hash_Status_HeartbeatDateTime ON dbo.ExportJob -( - Hash, - Status, - HeartbeatDateTime -) - -GO - -/************************************************************* - Stored procedures for exporting -**************************************************************/ --- --- STORED PROCEDURE --- Creates an export job. --- --- DESCRIPTION --- Creates a new row to the ExportJob table, adding a new job to the queue of jobs to be processed. --- --- PARAMETERS --- @id --- * The ID of the export job record --- @hash --- * The SHA256 hash of the export job record ID --- @status --- * The status of the export job --- @rawJobRecord --- * A JSON document --- --- RETURN VALUE --- The row version of the created export job. --- -CREATE PROCEDURE dbo.CreateExportJob - @id varchar(64), - @hash varchar(64), - @status varchar(10), - @rawJobRecord varchar(max) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - INSERT INTO dbo.ExportJob - (Id, Hash, Status, HeartbeatDateTime, RawJobRecord) - VALUES - (@id, @hash, @status, @heartbeatDateTime, @rawJobRecord) - - SELECT CAST(MIN_ACTIVE_ROWVERSION() AS INT) - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- Gets an export job given its ID. --- --- DESCRIPTION --- Retrieves the export job record from the ExportJob table that has the matching ID. --- --- PARAMETERS --- @id --- * The ID of the export job record to retrieve --- --- RETURN VALUE --- The matching export job. --- -CREATE PROCEDURE dbo.GetExportJobById - @id varchar(64) -AS - SET NOCOUNT ON - - SELECT RawJobRecord, JobVersion - FROM dbo.ExportJob - WHERE Id = @id -GO - --- --- STORED PROCEDURE --- Gets an export job given the hash of its ID. --- --- DESCRIPTION --- Retrieves the export job record from the ExportJob table that has the matching hash. --- --- PARAMETERS --- @hash --- * The SHA256 hash of the export job record ID --- --- RETURN VALUE --- The matching export job. --- -CREATE PROCEDURE dbo.GetExportJobByHash - @hash varchar(64) -AS - SET NOCOUNT ON - - SELECT TOP(1) RawJobRecord, JobVersion - FROM dbo.ExportJob - WHERE Hash = @hash AND (Status = 'Queued' OR Status = 'Running') - ORDER BY HeartbeatDateTime ASC -GO - --- --- STORED PROCEDURE --- Updates an export job. --- --- DESCRIPTION --- Modifies an existing job in the ExportJob table. --- --- PARAMETERS --- @id --- * The ID of the export job record --- @status --- * The status of the export job --- @rawJobRecord --- * A JSON document --- @jobVersion --- * The version of the job to update must match this --- --- RETURN VALUE --- The row version of the updated export job. --- -CREATE PROCEDURE dbo.UpdateExportJob - @id varchar(64), - @status varchar(10), - @rawJobRecord varchar(max), - @jobVersion binary(8) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @currentJobVersion binary(8) - - -- Acquire and hold an update lock on a row in the ExportJob table for the entire transaction. - -- This ensures the version check and update occur atomically. - SELECT @currentJobVersion = JobVersion - FROM dbo.ExportJob WITH (UPDLOCK, HOLDLOCK) - WHERE Id = @id - - IF (@currentJobVersion IS NULL) BEGIN - THROW 50404, 'Export job record not found', 1; - END - - IF (@jobVersion <> @currentJobVersion) BEGIN - THROW 50412, 'Precondition failed', 1; - END - - -- We will timestamp the jobs when we update them to track stale jobs. - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - UPDATE dbo.ExportJob - SET Status = @status, HeartbeatDateTime = @heartbeatDateTime, RawJobRecord = @rawJobRecord - WHERE Id = @id - - SELECT MIN_ACTIVE_ROWVERSION() - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- Acquires export jobs. --- --- DESCRIPTION --- Timestamps the available export jobs and sets their statuses to running. --- --- PARAMETERS --- @jobHeartbeatTimeoutThresholdInSeconds --- * The number of seconds that must pass before an export job is considered stale --- @maximumNumberOfConcurrentJobsAllowed --- * The maximum number of running jobs we can have at once --- --- RETURN VALUE --- The updated jobs that are now running. --- -CREATE PROCEDURE dbo.AcquireExportJobs - @jobHeartbeatTimeoutThresholdInSeconds bigint, - @maximumNumberOfConcurrentJobsAllowed int -AS - SET NOCOUNT ON - SET XACT_ABORT ON - - SET TRANSACTION ISOLATION LEVEL SERIALIZABLE - BEGIN TRANSACTION - - -- We will consider a job to be stale if its timestamp is smaller than or equal to this. - DECLARE @expirationDateTime dateTime2(7) - SELECT @expirationDateTime = DATEADD(second, -@jobHeartbeatTimeoutThresholdInSeconds, SYSUTCDATETIME()) - - -- Get the number of jobs that are running and not stale. - -- Acquire and hold an exclusive table lock for the entire transaction to prevent jobs from being created, updated or deleted during acquisitions. - DECLARE @numberOfRunningJobs int - SELECT @numberOfRunningJobs = COUNT(*) FROM dbo.ExportJob WITH (TABLOCKX) WHERE Status = 'Running' AND HeartbeatDateTime > @expirationDateTime - - -- Determine how many available jobs we can pick up. - DECLARE @limit int = @maximumNumberOfConcurrentJobsAllowed - @numberOfRunningJobs; - - DECLARE @availableJobs TABLE (Id varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, JobVersion binary(8) NOT NULL) - - -- Get the available jobs, which are export jobs that are queued or stale. - -- Older jobs will be prioritized over newer ones. - INSERT INTO @availableJobs - SELECT TOP(@limit) Id, JobVersion - FROM dbo.ExportJob - WHERE (Status = 'Queued' OR (Status = 'Running' AND HeartbeatDateTime <= @expirationDateTime)) - ORDER BY HeartbeatDateTime - - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - -- Update each available job's status to running both in the export table's status column and in the raw export job record JSON. - UPDATE dbo.ExportJob - SET Status = 'Running', HeartbeatDateTime = @heartbeatDateTime, RawJobRecord = JSON_MODIFY(RawJobRecord,'$.status', 'Running') - OUTPUT inserted.RawJobRecord, inserted.JobVersion - FROM dbo.ExportJob job INNER JOIN @availableJobs availableJob ON job.Id = availableJob.Id AND job.JobVersion = availableJob.JobVersion - - COMMIT TRANSACTION -GO - -/************************************************************* - Search Parameter Status Information -**************************************************************/ - --- We adopted this naming convention for table-valued parameters because they are immutable. -CREATE TYPE dbo.SearchParamTableType_1 AS TABLE -( - Uri varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, - Status varchar(10) NOT NULL, - IsPartiallySupported bit NOT NULL -) - -GO - -/************************************************************* - Stored procedures for search parameter information -**************************************************************/ --- --- STORED PROCEDURE --- GetSearchParamStatuses --- --- DESCRIPTION --- Gets all the search parameters and their statuses. --- --- RETURN VALUE --- The search parameters and their statuses. --- -CREATE PROCEDURE dbo.GetSearchParamStatuses -AS - SET NOCOUNT ON - - SELECT Uri, Status, LastUpdated, IsPartiallySupported FROM dbo.SearchParam -GO - --- --- STORED PROCEDURE --- UpsertSearchParams --- --- DESCRIPTION --- Given a set of search parameters, creates or updates the parameters. --- --- PARAMETERS --- @searchParams --- * The updated existing search parameters or the new search parameters --- --- RETURN VALUE --- The IDs and URIs of the search parameters that were inserted (not updated). --- -CREATE PROCEDURE dbo.UpsertSearchParams - @searchParams dbo.SearchParamTableType_1 READONLY -AS - SET NOCOUNT ON - SET XACT_ABORT ON - - SET TRANSACTION ISOLATION LEVEL SERIALIZABLE - BEGIN TRANSACTION - - DECLARE @lastUpdated datetimeoffset(7) = SYSDATETIMEOFFSET() - - DECLARE @summaryOfChanges TABLE(Uri varchar(128) COLLATE Latin1_General_100_CS_AS NOT NULL, Action varchar(20) NOT NULL) - - -- Acquire and hold an exclusive table lock for the entire transaction to prevent parameters from being added or modified during upsert. - MERGE INTO dbo.SearchParam WITH (TABLOCKX) AS target - USING @searchParams AS source - ON target.Uri = source.Uri - WHEN MATCHED THEN - UPDATE - SET Status = source.Status, LastUpdated = @lastUpdated, IsPartiallySupported = source.IsPartiallySupported - WHEN NOT MATCHED BY target THEN - INSERT - (Uri, Status, LastUpdated, IsPartiallySupported) - VALUES (source.Uri, source.Status, @lastUpdated, source.IsPartiallySupported) - OUTPUT source.Uri, $action INTO @summaryOfChanges; - - SELECT SearchParamId, SearchParam.Uri - FROM dbo.SearchParam searchParam - INNER JOIN @summaryOfChanges upsertedSearchParam - ON searchParam.Uri = upsertedSearchParam.Uri - WHERE upsertedSearchParam.Action = 'INSERT' - - COMMIT TRANSACTION -GO - -/************************************************************* - Reindex Job -**************************************************************/ -CREATE TABLE dbo.ReindexJob -( - Id varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - Status varchar(10) NOT NULL, - HeartbeatDateTime datetime2(7) NULL, - RawJobRecord varchar(max) NOT NULL, - JobVersion rowversion NOT NULL -) - -CREATE UNIQUE CLUSTERED INDEX IXC_ReindexJob ON dbo.ReindexJob -( - Id -) - -GO - -/************************************************************* - Stored procedures for reindexing -**************************************************************/ --- --- STORED PROCEDURE --- Creates an reindex job. --- --- DESCRIPTION --- Creates a new row to the ReindexJob table, adding a new job to the queue of jobs to be processed. --- --- PARAMETERS --- @id --- * The ID of the reindex job record --- @status --- * The status of the reindex job --- @rawJobRecord --- * A JSON document --- --- RETURN VALUE --- The row version of the created reindex job. --- -CREATE PROCEDURE dbo.CreateReindexJob - @id varchar(64), - @status varchar(10), - @rawJobRecord varchar(max) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - INSERT INTO dbo.ReindexJob - (Id, Status, HeartbeatDateTime, RawJobRecord) - VALUES - (@id, @status, @heartbeatDateTime, @rawJobRecord) - - SELECT CAST(MIN_ACTIVE_ROWVERSION() AS INT) - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- Gets an reindex job given its ID. --- --- DESCRIPTION --- Retrieves the reindex job record from the ReindexJob table that has the matching ID. --- --- PARAMETERS --- @id --- * The ID of the reindex job record to retrieve --- --- RETURN VALUE --- The matching reindex job. --- -CREATE PROCEDURE dbo.GetReindexJobById - @id varchar(64) -AS - SET NOCOUNT ON - - SELECT RawJobRecord, JobVersion - FROM dbo.ReindexJob - WHERE Id = @id -GO - --- --- STORED PROCEDURE --- Updates a reindex job. --- --- DESCRIPTION --- Modifies an existing job in the ReindexJob table. --- --- PARAMETERS --- @id --- * The ID of the reindex job record --- @status --- * The status of the reindex job --- @rawJobRecord --- * A JSON document --- @jobVersion --- * The version of the job to update must match this --- --- RETURN VALUE --- The row version of the updated reindex job. --- -CREATE PROCEDURE dbo.UpdateReindexJob - @id varchar(64), - @status varchar(10), - @rawJobRecord varchar(max), - @jobVersion binary(8) -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @currentJobVersion binary(8) - - -- Acquire and hold an update lock on a row in the ReindexJob table for the entire transaction. - -- This ensures the version check and update occur atomically. - SELECT @currentJobVersion = JobVersion - FROM dbo.ReindexJob WITH (UPDLOCK, HOLDLOCK) - WHERE Id = @id - - IF (@currentJobVersion IS NULL) BEGIN - THROW 50404, 'Reindex job record not found', 1; - END - - IF (@jobVersion <> @currentJobVersion) BEGIN - THROW 50412, 'Precondition failed', 1; - END - - -- We will timestamp the jobs when we update them to track stale jobs. - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - UPDATE dbo.ReindexJob - SET Status = @status, HeartbeatDateTime = @heartbeatDateTime, RawJobRecord = @rawJobRecord - WHERE Id = @id - - SELECT MIN_ACTIVE_ROWVERSION() - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- Acquires reindex jobs. --- --- DESCRIPTION --- Timestamps the available reindex jobs and sets their statuses to running. --- --- PARAMETERS --- @jobHeartbeatTimeoutThresholdInSeconds --- * The number of seconds that must pass before a reindex job is considered stale --- @maximumNumberOfConcurrentJobsAllowed --- * The maximum number of running jobs we can have at once --- --- RETURN VALUE --- The updated jobs that are now running. --- -CREATE PROCEDURE dbo.AcquireReindexJobs - @jobHeartbeatTimeoutThresholdInSeconds bigint, - @maximumNumberOfConcurrentJobsAllowed int -AS - SET NOCOUNT ON - SET XACT_ABORT ON - - SET TRANSACTION ISOLATION LEVEL SERIALIZABLE - BEGIN TRANSACTION - - -- We will consider a job to be stale if its timestamp is smaller than or equal to this. - DECLARE @expirationDateTime dateTime2(7) - SELECT @expirationDateTime = DATEADD(second, -@jobHeartbeatTimeoutThresholdInSeconds, SYSUTCDATETIME()) - - -- Get the number of jobs that are running and not stale. - -- Acquire and hold an exclusive table lock for the entire transaction to prevent jobs from being created, updated or deleted during acquisitions. - DECLARE @numberOfRunningJobs int - SELECT @numberOfRunningJobs = COUNT(*) FROM dbo.ReindexJob WITH (TABLOCKX) WHERE Status = 'Running' AND HeartbeatDateTime > @expirationDateTime - - -- Determine how many available jobs we can pick up. - DECLARE @limit int = @maximumNumberOfConcurrentJobsAllowed - @numberOfRunningJobs; - - IF (@limit > 0) BEGIN - - DECLARE @availableJobs TABLE (Id varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, JobVersion binary(8) NOT NULL) - - -- Get the available jobs, which are reindex jobs that are queued or stale. - -- Older jobs will be prioritized over newer ones. - INSERT INTO @availableJobs - SELECT TOP(@limit) Id, JobVersion - FROM dbo.ReindexJob - WHERE (Status = 'Queued' OR (Status = 'Running' AND HeartbeatDateTime <= @expirationDateTime)) - ORDER BY HeartbeatDateTime - - DECLARE @heartbeatDateTime datetime2(7) = SYSUTCDATETIME() - - -- Update each available job's status to running both in the reindex table's status column and in the raw reindex job record JSON. - UPDATE dbo.ReindexJob - SET Status = 'Running', HeartbeatDateTime = @heartbeatDateTime, RawJobRecord = JSON_MODIFY(RawJobRecord,'$.status', 'Running') - OUTPUT inserted.RawJobRecord, inserted.JobVersion - FROM dbo.ReindexJob job INNER JOIN @availableJobs availableJob ON job.Id = availableJob.Id AND job.JobVersion = availableJob.JobVersion - - END - - COMMIT TRANSACTION -GO - --- --- STORED PROCEDURE --- Checks if there are any active reindex jobs. --- --- DESCRIPTION --- Queries the datastore for any reindex job documents with a status of running, queued or paused. --- --- RETURN VALUE --- The job IDs of any active reindex jobs. --- -CREATE PROCEDURE dbo.CheckActiveReindexJobs -AS - SET NOCOUNT ON - - SELECT Id - FROM dbo.ReindexJob - WHERE Status = 'Running' OR Status = 'Queued' OR Status = 'Paused' -GO - --- --- STORED PROCEDURE --- ReindexResource --- --- DESCRIPTION --- Updates the search indices of a given resource --- --- PARAMETERS --- @resourceTypeId --- * The ID of the resource type (See ResourceType table) --- @resourceId --- * The resource ID (must be the same as the in the resource itself) --- @etag --- * If specified, the version of the resource to update --- @searchParamHash --- * A hash of the resource's latest indexed search parameters --- @resourceWriteClaims --- * Claims on the principal that performed the write --- @compartmentAssignments --- * Compartments that the resource is part of --- @referenceSearchParams --- * Extracted reference search params --- @tokenSearchParams --- * Extracted token search params --- @tokenTextSearchParams --- * The text representation of extracted token search params --- @stringSearchParams --- * Extracted string search params --- @numberSearchParams --- * Extracted number search params --- @quantitySearchParams --- * Extracted quantity search params --- @uriSearchParams --- * Extracted URI search params --- @dateTimeSearchParms --- * Extracted datetime search params --- @referenceTokenCompositeSearchParams --- * Extracted reference$token search params --- @tokenTokenCompositeSearchParams --- * Extracted token$token tokensearch params --- @tokenDateTimeCompositeSearchParams --- * Extracted token$datetime search params --- @tokenQuantityCompositeSearchParams --- * Extracted token$quantity search params --- @tokenStringCompositeSearchParams --- * Extracted token$string search params --- @tokenNumberNumberCompositeSearchParams --- * Extracted token$number$number search params --- -CREATE PROCEDURE dbo.ReindexResource - @resourceTypeId smallint, - @resourceId varchar(64), - @eTag int = NULL, - @searchParamHash varchar(64), - @resourceWriteClaims dbo.BulkResourceWriteClaimTableType_1 READONLY, - @compartmentAssignments dbo.BulkCompartmentAssignmentTableType_1 READONLY, - @referenceSearchParams dbo.BulkReferenceSearchParamTableType_1 READONLY, - @tokenSearchParams dbo.BulkTokenSearchParamTableType_1 READONLY, - @tokenTextSearchParams dbo.BulkTokenTextTableType_1 READONLY, - @stringSearchParams dbo.BulkStringSearchParamTableType_1 READONLY, - @numberSearchParams dbo.BulkNumberSearchParamTableType_1 READONLY, - @quantitySearchParams dbo.BulkQuantitySearchParamTableType_1 READONLY, - @uriSearchParams dbo.BulkUriSearchParamTableType_1 READONLY, - @dateTimeSearchParms dbo.BulkDateTimeSearchParamTableType_1 READONLY, - @referenceTokenCompositeSearchParams dbo.BulkReferenceTokenCompositeSearchParamTableType_1 READONLY, - @tokenTokenCompositeSearchParams dbo.BulkTokenTokenCompositeSearchParamTableType_1 READONLY, - @tokenDateTimeCompositeSearchParams dbo.BulkTokenDateTimeCompositeSearchParamTableType_1 READONLY, - @tokenQuantityCompositeSearchParams dbo.BulkTokenQuantityCompositeSearchParamTableType_1 READONLY, - @tokenStringCompositeSearchParams dbo.BulkTokenStringCompositeSearchParamTableType_1 READONLY, - @tokenNumberNumberCompositeSearchParams dbo.BulkTokenNumberNumberCompositeSearchParamTableType_1 READONLY -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @resourceSurrogateId bigint - DECLARE @version bigint - - -- This should place a range lock on a row in the IX_Resource_ResourceTypeId_ResourceId nonclustered filtered index - SELECT @resourceSurrogateId = ResourceSurrogateId, @version = Version - FROM dbo.Resource WITH (UPDLOCK, HOLDLOCK) - WHERE ResourceTypeId = @resourceTypeId AND ResourceId = @resourceId AND IsHistory = 0 - - IF (@etag IS NOT NULL AND @etag <> @version) BEGIN - THROW 50412, 'Precondition failed', 1; - END - - IF (@resourceSurrogateId IS NULL) BEGIN - -- You can't reindex a resource if the resource does not exist - THROW 50404, 'Resource not found', 1; - END - - UPDATE dbo.Resource - SET SearchParamHash = @searchParamHash - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - -- First, delete all the resource's indices. - DELETE FROM dbo.ResourceWriteClaim - WHERE ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.CompartmentAssignment - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.ReferenceSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenText - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.StringSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.UriSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.NumberSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.QuantitySearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.DateTimeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.ReferenceTokenCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenTokenCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenDateTimeCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenQuantityCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenStringCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - DELETE FROM dbo.TokenNumberNumberCompositeSearchParam - WHERE ResourceTypeId = @resourceTypeId AND ResourceSurrogateId = @resourceSurrogateId - - -- Next, insert all the new indices. - INSERT INTO dbo.ResourceWriteClaim - (ResourceSurrogateId, ClaimTypeId, ClaimValue) - SELECT @resourceSurrogateId, ClaimTypeId, ClaimValue - FROM @resourceWriteClaims - - INSERT INTO dbo.CompartmentAssignment - (ResourceTypeId, ResourceSurrogateId, CompartmentTypeId, ReferenceResourceId, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, CompartmentTypeId, ReferenceResourceId, 0 - FROM @compartmentAssignments - - INSERT INTO dbo.ReferenceSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri, ReferenceResourceTypeId, ReferenceResourceId, ReferenceResourceVersion, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, BaseUri, ReferenceResourceTypeId, ReferenceResourceId, ReferenceResourceVersion, 0 - FROM @referenceSearchParams - - INSERT INTO dbo.TokenSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, Code, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId, Code, 0 - FROM @tokenSearchParams - - INSERT INTO dbo.TokenText - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Text, 0 - FROM @tokenTextSearchParams - - INSERT INTO dbo.StringSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, TextOverflow, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Text, TextOverflow, 0 - FROM @stringSearchParams - - INSERT INTO dbo.UriSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Uri, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, Uri, 0 - FROM @uriSearchParams - - INSERT INTO dbo.NumberSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SingleValue, LowValue, HighValue, 0 - FROM @numberSearchParams - - INSERT INTO dbo.QuantitySearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, QuantityCodeId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId, QuantityCodeId, SingleValue, LowValue, HighValue, 0 - FROM @quantitySearchParams - - INSERT INTO dbo.DateTimeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, StartDateTime, EndDateTime, IsLongerThanADay, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, StartDateTime, EndDateTime, IsLongerThanADay, 0 - FROM @dateTimeSearchParms - - INSERT INTO dbo.ReferenceTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri1, ReferenceResourceTypeId1, ReferenceResourceId1, ReferenceResourceVersion1, SystemId2, Code2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, BaseUri1, ReferenceResourceTypeId1, ReferenceResourceId1, ReferenceResourceVersion1, SystemId2, Code2, 0 - FROM @referenceTokenCompositeSearchParams - - INSERT INTO dbo.TokenTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SystemId2, Code2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SystemId2, Code2, 0 - FROM @tokenTokenCompositeSearchParams - - INSERT INTO dbo.TokenDateTimeCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, StartDateTime2, EndDateTime2, IsLongerThanADay2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, StartDateTime2, EndDateTime2, IsLongerThanADay2, 0 - FROM @tokenDateTimeCompositeSearchParams - - INSERT INTO dbo.TokenQuantityCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, SystemId2, QuantityCodeId2, LowValue2, HighValue2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, SystemId2, QuantityCodeId2, LowValue2, HighValue2, 0 - FROM @tokenQuantityCompositeSearchParams - - INSERT INTO dbo.TokenStringCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, Text2, TextOverflow2, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, Text2, TextOverflow2, 0 - FROM @tokenStringCompositeSearchParams - - INSERT INTO dbo.TokenNumberNumberCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, LowValue2, HighValue2, SingleValue3, LowValue3, HighValue3, HasRange, IsHistory) - SELECT DISTINCT @resourceTypeId, @resourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, LowValue2, HighValue2, SingleValue3, LowValue3, HighValue3, HasRange, 0 - FROM @tokenNumberNumberCompositeSearchParams - - COMMIT TRANSACTION -GO - -CREATE TYPE dbo.BulkReindexResourceTableType_1 AS TABLE -( - Offset int NOT NULL, - ResourceTypeId smallint NOT NULL, - ResourceId varchar(64) COLLATE Latin1_General_100_CS_AS NOT NULL, - ETag int NULL, - SearchParamHash varchar(64) NOT NULL -) - -GO - --- --- STORED PROCEDURE --- BulkReindexResources --- --- DESCRIPTION --- Updates the search indices of a batch of resources --- --- PARAMETERS --- @resourcesToReindex --- * The type IDs, IDs, eTags and hashes of the resources to reindex --- @resourceWriteClaims --- * Claims on the principal that performed the write --- @compartmentAssignments --- * Compartments that the resource is part of --- @referenceSearchParams --- * Extracted reference search params --- @tokenSearchParams --- * Extracted token search params --- @tokenTextSearchParams --- * The text representation of extracted token search params --- @stringSearchParams --- * Extracted string search params --- @numberSearchParams --- * Extracted number search params --- @quantitySearchParams --- * Extracted quantity search params --- @uriSearchParams --- * Extracted URI search params --- @dateTimeSearchParms --- * Extracted datetime search params --- @referenceTokenCompositeSearchParams --- * Extracted reference$token search params --- @tokenTokenCompositeSearchParams --- * Extracted token$token tokensearch params --- @tokenDateTimeCompositeSearchParams --- * Extracted token$datetime search params --- @tokenQuantityCompositeSearchParams --- * Extracted token$quantity search params --- @tokenStringCompositeSearchParams --- * Extracted token$string search params --- @tokenNumberNumberCompositeSearchParams --- * Extracted token$number$number search params --- -CREATE PROCEDURE dbo.BulkReindexResources - @resourcesToReindex dbo.BulkReindexResourceTableType_1 READONLY, - @resourceWriteClaims dbo.BulkResourceWriteClaimTableType_1 READONLY, - @compartmentAssignments dbo.BulkCompartmentAssignmentTableType_1 READONLY, - @referenceSearchParams dbo.BulkReferenceSearchParamTableType_1 READONLY, - @tokenSearchParams dbo.BulkTokenSearchParamTableType_1 READONLY, - @tokenTextSearchParams dbo.BulkTokenTextTableType_1 READONLY, - @stringSearchParams dbo.BulkStringSearchParamTableType_1 READONLY, - @numberSearchParams dbo.BulkNumberSearchParamTableType_1 READONLY, - @quantitySearchParams dbo.BulkQuantitySearchParamTableType_1 READONLY, - @uriSearchParams dbo.BulkUriSearchParamTableType_1 READONLY, - @dateTimeSearchParms dbo.BulkDateTimeSearchParamTableType_1 READONLY, - @referenceTokenCompositeSearchParams dbo.BulkReferenceTokenCompositeSearchParamTableType_1 READONLY, - @tokenTokenCompositeSearchParams dbo.BulkTokenTokenCompositeSearchParamTableType_1 READONLY, - @tokenDateTimeCompositeSearchParams dbo.BulkTokenDateTimeCompositeSearchParamTableType_1 READONLY, - @tokenQuantityCompositeSearchParams dbo.BulkTokenQuantityCompositeSearchParamTableType_1 READONLY, - @tokenStringCompositeSearchParams dbo.BulkTokenStringCompositeSearchParamTableType_1 READONLY, - @tokenNumberNumberCompositeSearchParams dbo.BulkTokenNumberNumberCompositeSearchParamTableType_1 READONLY -AS - SET NOCOUNT ON - - SET XACT_ABORT ON - BEGIN TRANSACTION - - DECLARE @computedValues TABLE - ( - Offset int NOT NULL, - ResourceTypeId smallint NOT NULL, - VersionProvided bigint NULL, - SearchParamHash varchar(64) NOT NULL, - ResourceSurrogateId bigint NULL, - VersionInDatabase bigint NULL - ) - - INSERT INTO @computedValues - SELECT - resourceToReindex.Offset, - resourceToReindex.ResourceTypeId, - resourceToReindex.ETag, - resourceToReindex.SearchParamHash, - resourceInDB.ResourceSurrogateId, - resourceInDB.Version - FROM @resourcesToReindex resourceToReindex - LEFT OUTER JOIN dbo.Resource resourceInDB WITH (UPDLOCK, INDEX(IX_Resource_ResourceTypeId_ResourceId)) - ON resourceInDB.ResourceTypeId = resourceToReindex.ResourceTypeId - AND resourceInDB.ResourceId = resourceToReindex.ResourceId - AND resourceInDB.IsHistory = 0 - - DECLARE @resourcesNotInDatabase int - SET @resourcesNotInDatabase = (SELECT COUNT(*) FROM @computedValues WHERE ResourceSurrogateId IS NULL) - - IF (@resourcesNotInDatabase > 0) BEGIN - -- We can't reindex a resource if the resource does not exist - THROW 50404, 'One or more resources not found', 1; - END - - DECLARE @versionDiff int - SET @versionDiff = (SELECT COUNT(*) FROM @computedValues WHERE VersionProvided IS NOT NULL AND VersionProvided <> VersionInDatabase) - - IF (@versionDiff > 0) BEGIN - -- The resource has been updated since the reindex job kicked off - THROW 50412, 'Precondition failed', 1; - END - - -- Update the search parameter hash value in the main resource table - UPDATE resourceInDB - SET resourceInDB.SearchParamHash = resourceToReindex.SearchParamHash - FROM @computedValues resourceToReindex - INNER JOIN dbo.Resource resourceInDB - ON resourceInDB.ResourceTypeId = resourceToReindex.ResourceTypeId AND resourceInDB.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - -- First, delete all the indices of the resources to reindex. - DELETE searchIndex FROM dbo.ResourceWriteClaim searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.CompartmentAssignment searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.ReferenceSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenText searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.StringSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.UriSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.NumberSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.QuantitySearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.DateTimeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.ReferenceTokenCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenTokenCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenDateTimeCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenQuantityCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenStringCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - DELETE searchIndex FROM dbo.TokenNumberNumberCompositeSearchParam searchIndex - INNER JOIN @computedValues resourceToReindex - ON searchIndex.ResourceTypeId = resourceToReindex.ResourceTypeId AND searchIndex.ResourceSurrogateId = resourceToReindex.ResourceSurrogateId - - -- Next, insert all the new indices. - INSERT INTO dbo.ResourceWriteClaim - (ResourceSurrogateId, ClaimTypeId, ClaimValue) - SELECT DISTINCT resourceToReindex.ResourceSurrogateId, searchIndex.ClaimTypeId, searchIndex.ClaimValue - FROM @resourceWriteClaims searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.CompartmentAssignment - (ResourceTypeId, ResourceSurrogateId, CompartmentTypeId, ReferenceResourceId, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.CompartmentTypeId, searchIndex.ReferenceResourceId, 0 - FROM @compartmentAssignments searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.ReferenceSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri, ReferenceResourceTypeId, ReferenceResourceId, ReferenceResourceVersion, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.BaseUri, searchIndex.ReferenceResourceTypeId, searchIndex.ReferenceResourceId, searchIndex.ReferenceResourceVersion, 0 - FROM @referenceSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, Code, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId, searchIndex.Code, 0 - FROM @tokenSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenText - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.Text, 0 - FROM @tokenTextSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.StringSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Text, TextOverflow, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.Text, searchIndex.TextOverflow, 0 - FROM @stringSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.UriSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, Uri, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.Uri, 0 - FROM @uriSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.NumberSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SingleValue, searchIndex.LowValue, searchIndex.HighValue, 0 - FROM @numberSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.QuantitySearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId, QuantityCodeId, SingleValue, LowValue, HighValue, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId, searchIndex.QuantityCodeId, searchIndex.SingleValue, searchIndex.LowValue, searchIndex.HighValue, 0 - FROM @quantitySearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.DateTimeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, StartDateTime, EndDateTime, IsLongerThanADay, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.StartDateTime, searchIndex.EndDateTime, searchIndex.IsLongerThanADay, 0 - FROM @dateTimeSearchParms searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.ReferenceTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, BaseUri1, ReferenceResourceTypeId1, ReferenceResourceId1, ReferenceResourceVersion1, SystemId2, Code2, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.BaseUri1, searchIndex.ReferenceResourceTypeId1, searchIndex.ReferenceResourceId1, searchIndex.ReferenceResourceVersion1, searchIndex.SystemId2, searchIndex.Code2, 0 - FROM @referenceTokenCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenTokenCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SystemId2, Code2, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId1, searchIndex.Code1, searchIndex.SystemId2, searchIndex.Code2, 0 - FROM @tokenTokenCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenDateTimeCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, StartDateTime2, EndDateTime2, IsLongerThanADay2, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId1, searchIndex.Code1, searchIndex.StartDateTime2, searchIndex.EndDateTime2, searchIndex.IsLongerThanADay2, 0 - FROM @tokenDateTimeCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenQuantityCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, SystemId2, QuantityCodeId2, LowValue2, HighValue2, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId1, searchIndex.Code1, searchIndex.SingleValue2, searchIndex.SystemId2, searchIndex.QuantityCodeId2, searchIndex.LowValue2, searchIndex.HighValue2, 0 - FROM @tokenQuantityCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenStringCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, Text2, TextOverflow2, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId1, searchIndex.Code1, searchIndex.Text2, searchIndex.TextOverflow2, 0 - FROM @tokenStringCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - INSERT INTO dbo.TokenNumberNumberCompositeSearchParam - (ResourceTypeId, ResourceSurrogateId, SearchParamId, SystemId1, Code1, SingleValue2, LowValue2, HighValue2, SingleValue3, LowValue3, HighValue3, HasRange, IsHistory) - SELECT DISTINCT resourceToReindex.ResourceTypeId, resourceToReindex.ResourceSurrogateId, searchIndex.SearchParamId, searchIndex.SystemId1, searchIndex.Code1, searchIndex.SingleValue2, searchIndex.LowValue2, searchIndex.HighValue2, searchIndex.SingleValue3, searchIndex.LowValue3, searchIndex.HighValue3, searchIndex.HasRange, 0 - FROM @tokenNumberNumberCompositeSearchParams searchIndex - INNER JOIN @computedValues resourceToReindex ON searchIndex.Offset = resourceToReindex.Offset - - COMMIT TRANSACTION -GO diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/CompartmentAssignmentV1RowGenerator.cs b/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/CompartmentAssignmentV1RowGenerator.cs deleted file mode 100644 index 2f574dd2d0..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/CompartmentAssignmentV1RowGenerator.cs +++ /dev/null @@ -1,98 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using System.Collections.Generic; -using System.Threading; -using EnsureThat; -using Microsoft.Health.Fhir.Core.Models; -using Microsoft.Health.Fhir.SqlServer.Features.Schema.Model; -using Microsoft.Health.SqlServer.Features.Schema.Model; - -namespace Microsoft.Health.Fhir.SqlServer.Features.Storage.TvpRowGeneration -{ - internal class CompartmentAssignmentV1RowGenerator : ITableValuedParameterRowGenerator - { - private readonly ISqlServerFhirModel _model; - private bool _initialized; - private byte _patientCompartmentId; - private byte _encounterCompartmentId; - private byte _relatedPersonCompartmentId; - private byte _practitionerCompartmentId; - private byte _deviceCompartmentId; - - public CompartmentAssignmentV1RowGenerator(ISqlServerFhirModel model) - { - EnsureArg.IsNotNull(model, nameof(model)); - _model = model; - } - - public IEnumerable GenerateRows(ResourceMetadata resourceMetadata) - { - EnsureInitialized(); - - var compartments = resourceMetadata.Compartments; - if (compartments == null) - { - yield break; - } - - if (compartments.PatientCompartmentEntry != null) - { - foreach (var entry in compartments.PatientCompartmentEntry) - { - yield return new CompartmentAssignmentTableTypeV1Row(_patientCompartmentId, entry); - } - } - - if (compartments.EncounterCompartmentEntry != null) - { - foreach (var entry in compartments.EncounterCompartmentEntry) - { - yield return new CompartmentAssignmentTableTypeV1Row(_encounterCompartmentId, entry); - } - } - - if (compartments.RelatedPersonCompartmentEntry != null) - { - foreach (var entry in compartments.RelatedPersonCompartmentEntry) - { - yield return new CompartmentAssignmentTableTypeV1Row(_relatedPersonCompartmentId, entry); - } - } - - if (compartments.PractitionerCompartmentEntry != null) - { - foreach (var entry in compartments.PractitionerCompartmentEntry) - { - yield return new CompartmentAssignmentTableTypeV1Row(_practitionerCompartmentId, entry); - } - } - - if (compartments.DeviceCompartmentEntry != null) - { - foreach (var entry in compartments.DeviceCompartmentEntry) - { - yield return new CompartmentAssignmentTableTypeV1Row(_deviceCompartmentId, entry); - } - } - } - - private void EnsureInitialized() - { - if (Volatile.Read(ref _initialized)) - { - return; - } - - _patientCompartmentId = _model.GetCompartmentTypeId(KnownCompartmentTypes.Patient); - _encounterCompartmentId = _model.GetCompartmentTypeId(KnownCompartmentTypes.Encounter); - _relatedPersonCompartmentId = _model.GetCompartmentTypeId(KnownCompartmentTypes.RelatedPerson); - _practitionerCompartmentId = _model.GetCompartmentTypeId(KnownCompartmentTypes.Practitioner); - _deviceCompartmentId = _model.GetCompartmentTypeId(KnownCompartmentTypes.Device); - - Volatile.Write(ref _initialized, true); - } - } -} diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/DateTimeSearchParameterV1RowGenerator.cs b/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/DateTimeSearchParameterV1RowGenerator.cs deleted file mode 100644 index 339e4feea1..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/DateTimeSearchParameterV1RowGenerator.cs +++ /dev/null @@ -1,45 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using System; -using Microsoft.Health.Fhir.Core.Features.Search; -using Microsoft.Health.Fhir.Core.Features.Search.SearchValues; -using Microsoft.Health.Fhir.SqlServer.Features.Schema.Model; - -namespace Microsoft.Health.Fhir.SqlServer.Features.Storage.TvpRowGeneration -{ - internal class DateTimeSearchParameterV1RowGenerator : SearchParameterRowGenerator - { - private short _lastUpdatedSearchParamId; - - public DateTimeSearchParameterV1RowGenerator(SqlServerFhirModel model) - : base(model) - { - } - - internal override bool TryGenerateRow(short searchParamId, DateTimeSearchValue searchValue, out DateTimeSearchParamTableTypeV1Row row) - { - if (searchParamId == _lastUpdatedSearchParamId) - { - // this value is already stored on the Resource table. - row = default; - return false; - } - - row = new DateTimeSearchParamTableTypeV1Row( - searchParamId, - searchValue.Start, - searchValue.End, - (searchValue.Start - searchValue.End).Ticks > TimeSpan.TicksPerDay); - - return true; - } - - protected override void Initialize() - { - _lastUpdatedSearchParamId = Model.GetSearchParamId(SearchParameterNames.LastUpdatedUri); - } - } -} diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/NumberSearchParameterV1RowGenerator.cs b/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/NumberSearchParameterV1RowGenerator.cs deleted file mode 100644 index 5822d56da0..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/NumberSearchParameterV1RowGenerator.cs +++ /dev/null @@ -1,31 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using Microsoft.Health.Fhir.Core.Features.Search.SearchValues; -using Microsoft.Health.Fhir.SqlServer.Features.Schema.Model; - -namespace Microsoft.Health.Fhir.SqlServer.Features.Storage.TvpRowGeneration -{ - internal class NumberSearchParameterV1RowGenerator : SearchParameterRowGenerator - { - public NumberSearchParameterV1RowGenerator(SqlServerFhirModel model) - : base(model) - { - } - - internal override bool TryGenerateRow(short searchParamId, NumberSearchValue searchValue, out NumberSearchParamTableTypeV1Row row) - { - bool isSingleValue = searchValue.Low == searchValue.High; - - row = new NumberSearchParamTableTypeV1Row( - searchParamId, - isSingleValue ? searchValue.Low : null, - isSingleValue ? null : searchValue.Low ?? (decimal?)VLatest.NumberSearchParam.LowValue.MinValue, - isSingleValue ? null : searchValue.High ?? (decimal?)VLatest.NumberSearchParam.HighValue.MaxValue); - - return true; - } - } -} diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/QuantitySearchParameterV1RowGenerator.cs b/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/QuantitySearchParameterV1RowGenerator.cs deleted file mode 100644 index d84b50abad..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/QuantitySearchParameterV1RowGenerator.cs +++ /dev/null @@ -1,33 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using Microsoft.Health.Fhir.Core.Features.Search.SearchValues; -using Microsoft.Health.Fhir.SqlServer.Features.Schema.Model; - -namespace Microsoft.Health.Fhir.SqlServer.Features.Storage.TvpRowGeneration -{ - internal class QuantitySearchParameterV1RowGenerator : SearchParameterRowGenerator - { - public QuantitySearchParameterV1RowGenerator(SqlServerFhirModel model) - : base(model) - { - } - - internal override bool TryGenerateRow(short searchParamId, QuantitySearchValue searchValue, out QuantitySearchParamTableTypeV1Row row) - { - bool isSingleValue = searchValue.Low == searchValue.High; - - row = new QuantitySearchParamTableTypeV1Row( - searchParamId, - string.IsNullOrWhiteSpace(searchValue.System) ? default(int?) : Model.GetSystemId(searchValue.System), - string.IsNullOrWhiteSpace(searchValue.Code) ? default(int?) : Model.GetQuantityCodeId(searchValue.Code), - isSingleValue ? searchValue.Low : null, - isSingleValue ? null : searchValue.Low ?? (decimal?)VLatest.QuantitySearchParam.LowValue.MinValue, - isSingleValue ? null : searchValue.High ?? (decimal?)VLatest.QuantitySearchParam.HighValue.MaxValue); - - return true; - } - } -} diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/ReferenceSearchParameterV2RowGenerator.cs b/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/ReferenceSearchParameterV2RowGenerator.cs deleted file mode 100644 index 10dd545990..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/ReferenceSearchParameterV2RowGenerator.cs +++ /dev/null @@ -1,30 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using Microsoft.Health.Fhir.Core.Features.Search.SearchValues; -using Microsoft.Health.Fhir.SqlServer.Features.Schema.Model; - -namespace Microsoft.Health.Fhir.SqlServer.Features.Storage.TvpRowGeneration -{ - internal class ReferenceSearchParameterV2RowGenerator : SearchParameterRowGenerator - { - public ReferenceSearchParameterV2RowGenerator(SqlServerFhirModel model) - : base(model) - { - } - - internal override bool TryGenerateRow(short searchParamId, ReferenceSearchValue searchValue, out ReferenceSearchParamTableTypeV2Row row) - { - row = new ReferenceSearchParamTableTypeV2Row( - searchParamId, - searchValue.BaseUri?.ToString(), - searchValue.ResourceType == null ? null : Model.GetResourceTypeId(searchValue.ResourceType), - searchValue.ResourceId, - ReferenceResourceVersion: null); - - return true; - } - } -} diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/ReferenceTokenCompositeSearchParameterV2RowGenerator.cs b/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/ReferenceTokenCompositeSearchParameterV2RowGenerator.cs deleted file mode 100644 index cc36df5e66..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/ReferenceTokenCompositeSearchParameterV2RowGenerator.cs +++ /dev/null @@ -1,47 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using Microsoft.Health.Fhir.Core.Features.Search.SearchValues; -using Microsoft.Health.Fhir.SqlServer.Features.Schema.Model; - -namespace Microsoft.Health.Fhir.SqlServer.Features.Storage.TvpRowGeneration -{ - internal class ReferenceTokenCompositeSearchParameterV2RowGenerator : CompositeSearchParameterRowGenerator<(ReferenceSearchValue component1, TokenSearchValue component2), ReferenceTokenCompositeSearchParamTableTypeV2Row> - { - private readonly ReferenceSearchParameterV2RowGenerator _referenceRowGenerator; - private readonly TokenSearchParameterV1RowGenerator _tokenRowGenerator; - - public ReferenceTokenCompositeSearchParameterV2RowGenerator( - SqlServerFhirModel model, - ReferenceSearchParameterV2RowGenerator referenceRowGenerator, - TokenSearchParameterV1RowGenerator tokenRowGenerator) - : base(model) - { - _referenceRowGenerator = referenceRowGenerator; - _tokenRowGenerator = tokenRowGenerator; - } - - internal override bool TryGenerateRow(short searchParamId, (ReferenceSearchValue component1, TokenSearchValue component2) searchValue, out ReferenceTokenCompositeSearchParamTableTypeV2Row row) - { - if (_referenceRowGenerator.TryGenerateRow(default, searchValue.component1, out var reference1Row) && - _tokenRowGenerator.TryGenerateRow(default, searchValue.component2, out var token2Row)) - { - row = new ReferenceTokenCompositeSearchParamTableTypeV2Row( - searchParamId, - reference1Row.BaseUri, - reference1Row.ReferenceResourceTypeId, - reference1Row.ReferenceResourceId, - reference1Row.ReferenceResourceVersion, - token2Row.SystemId, - token2Row.Code); - - return true; - } - - row = default; - return false; - } - } -} diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/ResourceWriteClaimV1RowGenerator.cs b/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/ResourceWriteClaimV1RowGenerator.cs deleted file mode 100644 index fce6e2530b..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/ResourceWriteClaimV1RowGenerator.cs +++ /dev/null @@ -1,30 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using System.Collections.Generic; -using System.Linq; -using EnsureThat; -using Microsoft.Health.Fhir.SqlServer.Features.Schema.Model; -using Microsoft.Health.SqlServer.Features.Schema.Model; - -namespace Microsoft.Health.Fhir.SqlServer.Features.Storage.TvpRowGeneration -{ - internal class ResourceWriteClaimV1RowGenerator : ITableValuedParameterRowGenerator - { - private readonly ISqlServerFhirModel _model; - - public ResourceWriteClaimV1RowGenerator(ISqlServerFhirModel model) - { - EnsureArg.IsNotNull(model, nameof(model)); - _model = model; - } - - public IEnumerable GenerateRows(ResourceMetadata resourceMetadata) - { - return resourceMetadata.WriteClaims?.Select(c => - new ResourceWriteClaimTableTypeV1Row(_model.GetClaimTypeId(c.Key), c.Value)); - } - } -} diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/StringSearchParameterV1RowGenerator.cs b/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/StringSearchParameterV1RowGenerator.cs deleted file mode 100644 index 1cb1c69114..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/StringSearchParameterV1RowGenerator.cs +++ /dev/null @@ -1,40 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using Microsoft.Health.Fhir.Core.Features.Search.SearchValues; -using Microsoft.Health.Fhir.SqlServer.Features.Schema.Model; - -namespace Microsoft.Health.Fhir.SqlServer.Features.Storage.TvpRowGeneration -{ - internal class StringSearchParameterV1RowGenerator : SearchParameterRowGenerator - { - private readonly int _indexedTextMaxLength = (int)VLatest.StringSearchParam.Text.Metadata.MaxLength; - - public StringSearchParameterV1RowGenerator(SqlServerFhirModel model) - : base(model) - { - } - - internal override bool TryGenerateRow(short searchParamId, StringSearchValue searchValue, out StringSearchParamTableTypeV1Row row) - { - string indexedPrefix; - string overflow; - if (searchValue.String.Length > _indexedTextMaxLength) - { - // TODO: this truncation can break apart grapheme clusters. - indexedPrefix = searchValue.String.Substring(0, _indexedTextMaxLength); - overflow = searchValue.String; - } - else - { - indexedPrefix = searchValue.String; - overflow = null; - } - - row = new StringSearchParamTableTypeV1Row(searchParamId, indexedPrefix, overflow); - return true; - } - } -} diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenDateTimeCompositeSearchParameterV1RowGenerator.cs b/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenDateTimeCompositeSearchParameterV1RowGenerator.cs deleted file mode 100644 index 999b7be538..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenDateTimeCompositeSearchParameterV1RowGenerator.cs +++ /dev/null @@ -1,43 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using Microsoft.Health.Fhir.Core.Features.Search.SearchValues; -using Microsoft.Health.Fhir.SqlServer.Features.Schema.Model; - -namespace Microsoft.Health.Fhir.SqlServer.Features.Storage.TvpRowGeneration -{ - internal class TokenDateTimeCompositeSearchParameterV1RowGenerator : CompositeSearchParameterRowGenerator<(TokenSearchValue component1, DateTimeSearchValue component2), TokenDateTimeCompositeSearchParamTableTypeV1Row> - { - private readonly TokenSearchParameterV1RowGenerator _tokenRowGenerator; - private readonly DateTimeSearchParameterV1RowGenerator _dateTimeV1RowGenerator; - - public TokenDateTimeCompositeSearchParameterV1RowGenerator(SqlServerFhirModel model, TokenSearchParameterV1RowGenerator tokenRowGenerator, DateTimeSearchParameterV1RowGenerator dateTimeV1RowGenerator) - : base(model) - { - _tokenRowGenerator = tokenRowGenerator; - _dateTimeV1RowGenerator = dateTimeV1RowGenerator; - } - - internal override bool TryGenerateRow(short searchParamId, (TokenSearchValue component1, DateTimeSearchValue component2) searchValue, out TokenDateTimeCompositeSearchParamTableTypeV1Row row) - { - if (_tokenRowGenerator.TryGenerateRow(default, searchValue.component1, out var token1Row) && - _dateTimeV1RowGenerator.TryGenerateRow(default, searchValue.component2, out var token2Row)) - { - row = new TokenDateTimeCompositeSearchParamTableTypeV1Row( - searchParamId, - token1Row.SystemId, - token1Row.Code, - token2Row.StartDateTime, - token2Row.EndDateTime, - token2Row.IsLongerThanADay); - - return true; - } - - row = default; - return false; - } - } -} diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenNumberNumberCompositeSearchParameterV1RowGenerator.cs b/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenNumberNumberCompositeSearchParameterV1RowGenerator.cs deleted file mode 100644 index d119fdaa4f..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenNumberNumberCompositeSearchParameterV1RowGenerator.cs +++ /dev/null @@ -1,49 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using Microsoft.Health.Fhir.Core.Features.Search.SearchValues; -using Microsoft.Health.Fhir.SqlServer.Features.Schema.Model; - -namespace Microsoft.Health.Fhir.SqlServer.Features.Storage.TvpRowGeneration -{ - internal class TokenNumberNumberCompositeSearchParameterV1RowGenerator : CompositeSearchParameterRowGenerator<(TokenSearchValue component1, NumberSearchValue component2, NumberSearchValue component3), TokenNumberNumberCompositeSearchParamTableTypeV1Row> - { - private readonly TokenSearchParameterV1RowGenerator _tokenRowGenerator; - private readonly NumberSearchParameterV1RowGenerator _numberV1RowGenerator; - - public TokenNumberNumberCompositeSearchParameterV1RowGenerator(SqlServerFhirModel model, TokenSearchParameterV1RowGenerator tokenRowGenerator, NumberSearchParameterV1RowGenerator numberV1RowGenerator) - : base(model) - { - _tokenRowGenerator = tokenRowGenerator; - _numberV1RowGenerator = numberV1RowGenerator; - } - - internal override bool TryGenerateRow(short searchParamId, (TokenSearchValue component1, NumberSearchValue component2, NumberSearchValue component3) searchValue, out TokenNumberNumberCompositeSearchParamTableTypeV1Row row) - { - if (_tokenRowGenerator.TryGenerateRow(default, searchValue.component1, out var token1Row) && - _numberV1RowGenerator.TryGenerateRow(default, searchValue.component2, out var token2Row) && - _numberV1RowGenerator.TryGenerateRow(default, searchValue.component3, out var token3Row)) - { - bool hasRange = token2Row.SingleValue == null || token3Row.SingleValue == null; - row = new TokenNumberNumberCompositeSearchParamTableTypeV1Row( - searchParamId, - token1Row.SystemId, - token1Row.Code, - hasRange ? null : token2Row.SingleValue, - token2Row.LowValue ?? token2Row.SingleValue, - token2Row.HighValue ?? token2Row.SingleValue, - hasRange ? null : token3Row.SingleValue, - token3Row.LowValue ?? token3Row.SingleValue, - token3Row.HighValue ?? token3Row.SingleValue, - HasRange: hasRange); - - return true; - } - - row = default; - return false; - } - } -} diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenQuantityCompositeSearchParameterV1RowGenerator.cs b/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenQuantityCompositeSearchParameterV1RowGenerator.cs deleted file mode 100644 index 150b296bcb..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenQuantityCompositeSearchParameterV1RowGenerator.cs +++ /dev/null @@ -1,45 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using Microsoft.Health.Fhir.Core.Features.Search.SearchValues; -using Microsoft.Health.Fhir.SqlServer.Features.Schema.Model; - -namespace Microsoft.Health.Fhir.SqlServer.Features.Storage.TvpRowGeneration -{ - internal class TokenQuantityCompositeSearchParameterV1RowGenerator : CompositeSearchParameterRowGenerator<(TokenSearchValue component1, QuantitySearchValue component2), TokenQuantityCompositeSearchParamTableTypeV1Row> - { - private readonly TokenSearchParameterV1RowGenerator _tokenRowGenerator; - private readonly QuantitySearchParameterV1RowGenerator _quantityV1RowGenerator; - - public TokenQuantityCompositeSearchParameterV1RowGenerator(SqlServerFhirModel model, TokenSearchParameterV1RowGenerator tokenRowGenerator, QuantitySearchParameterV1RowGenerator quantityV1RowGenerator) - : base(model) - { - _tokenRowGenerator = tokenRowGenerator; - _quantityV1RowGenerator = quantityV1RowGenerator; - } - - internal override bool TryGenerateRow(short searchParamId, (TokenSearchValue component1, QuantitySearchValue component2) searchValue, out TokenQuantityCompositeSearchParamTableTypeV1Row row) - { - if (_tokenRowGenerator.TryGenerateRow(default, searchValue.component1, out var token1Row) && - _quantityV1RowGenerator.TryGenerateRow(default, searchValue.component2, out var token2Row)) - { - row = new TokenQuantityCompositeSearchParamTableTypeV1Row( - searchParamId, - token1Row.SystemId, - token1Row.Code, - token2Row.SystemId, - token2Row.QuantityCodeId, - token2Row.SingleValue, - token2Row.LowValue, - token2Row.HighValue); - - return true; - } - - row = default; - return false; - } - } -} diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenSearchParameterV1RowGenerator.cs b/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenSearchParameterV1RowGenerator.cs deleted file mode 100644 index eac0ad3a82..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenSearchParameterV1RowGenerator.cs +++ /dev/null @@ -1,41 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using Microsoft.Health.Fhir.Core.Features.Search; -using Microsoft.Health.Fhir.Core.Features.Search.SearchValues; -using Microsoft.Health.Fhir.SqlServer.Features.Schema.Model; - -namespace Microsoft.Health.Fhir.SqlServer.Features.Storage.TvpRowGeneration -{ - internal class TokenSearchParameterV1RowGenerator : SearchParameterRowGenerator - { - private short _resourceIdSearchParamId; - - public TokenSearchParameterV1RowGenerator(SqlServerFhirModel model) - : base(model) - { - } - - internal override bool TryGenerateRow(short searchParamId, TokenSearchValue searchValue, out TokenSearchParamTableTypeV1Row row) - { - // don't store if the code is empty or if this is the Resource _id parameter. The id is already maintained on the Resource table. - if (string.IsNullOrWhiteSpace(searchValue.Code) || - searchParamId == _resourceIdSearchParamId) - { - row = default; - return false; - } - - row = new TokenSearchParamTableTypeV1Row( - searchParamId, - searchValue.System == null ? null : Model.GetSystemId(searchValue.System), - searchValue.Code); - - return true; - } - - protected override void Initialize() => _resourceIdSearchParamId = Model.GetSearchParamId(SearchParameterNames.IdUri); - } -} diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenStringCompositeSearchParameterV1RowGenerator.cs b/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenStringCompositeSearchParameterV1RowGenerator.cs deleted file mode 100644 index 2f1b47e1c8..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenStringCompositeSearchParameterV1RowGenerator.cs +++ /dev/null @@ -1,42 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using Microsoft.Health.Fhir.Core.Features.Search.SearchValues; -using Microsoft.Health.Fhir.SqlServer.Features.Schema.Model; - -namespace Microsoft.Health.Fhir.SqlServer.Features.Storage.TvpRowGeneration -{ - internal class TokenStringCompositeSearchParameterV1RowGenerator : CompositeSearchParameterRowGenerator<(TokenSearchValue component1, StringSearchValue component2), TokenStringCompositeSearchParamTableTypeV1Row> - { - private readonly TokenSearchParameterV1RowGenerator _tokenRowGenerator; - private readonly StringSearchParameterV1RowGenerator _stringV1RowGenerator; - - public TokenStringCompositeSearchParameterV1RowGenerator(SqlServerFhirModel model, TokenSearchParameterV1RowGenerator tokenRowGenerator, StringSearchParameterV1RowGenerator stringV1RowGenerator) - : base(model) - { - _tokenRowGenerator = tokenRowGenerator; - _stringV1RowGenerator = stringV1RowGenerator; - } - - internal override bool TryGenerateRow(short searchParamId, (TokenSearchValue component1, StringSearchValue component2) searchValue, out TokenStringCompositeSearchParamTableTypeV1Row row) - { - if (_tokenRowGenerator.TryGenerateRow(default, searchValue.component1, out var token1Row) && - _stringV1RowGenerator.TryGenerateRow(default, searchValue.component2, out var string2Row)) - { - row = new TokenStringCompositeSearchParamTableTypeV1Row( - searchParamId, - token1Row.SystemId, - token1Row.Code, - string2Row.Text, - TextOverflow2: string2Row.TextOverflow); - - return true; - } - - row = default; - return false; - } - } -} diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenTextSearchParameterV1RowGenerator.cs b/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenTextSearchParameterV1RowGenerator.cs deleted file mode 100644 index a1016e285d..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenTextSearchParameterV1RowGenerator.cs +++ /dev/null @@ -1,30 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using Microsoft.Health.Fhir.Core.Features.Search.SearchValues; -using Microsoft.Health.Fhir.SqlServer.Features.Schema.Model; - -namespace Microsoft.Health.Fhir.SqlServer.Features.Storage.TvpRowGeneration -{ - internal class TokenTextSearchParameterV1RowGenerator : SearchParameterRowGenerator - { - public TokenTextSearchParameterV1RowGenerator(SqlServerFhirModel model) - : base(model) - { - } - - internal override bool TryGenerateRow(short searchParamId, TokenSearchValue searchValue, out TokenTextTableTypeV1Row row) - { - if (string.IsNullOrWhiteSpace(searchValue.Text)) - { - row = default; - return false; - } - - row = new TokenTextTableTypeV1Row(searchParamId, searchValue.Text); - return true; - } - } -} diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenTokenCompositeSearchParameterV1RowGenerator.cs b/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenTokenCompositeSearchParameterV1RowGenerator.cs deleted file mode 100644 index 261809ece1..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/TokenTokenCompositeSearchParameterV1RowGenerator.cs +++ /dev/null @@ -1,40 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using Microsoft.Health.Fhir.Core.Features.Search.SearchValues; -using Microsoft.Health.Fhir.SqlServer.Features.Schema.Model; - -namespace Microsoft.Health.Fhir.SqlServer.Features.Storage.TvpRowGeneration -{ - internal class TokenTokenCompositeSearchParameterV1RowGenerator : CompositeSearchParameterRowGenerator<(TokenSearchValue component1, TokenSearchValue component2), TokenTokenCompositeSearchParamTableTypeV1Row> - { - private readonly TokenSearchParameterV1RowGenerator _tokenRowGenerator; - - public TokenTokenCompositeSearchParameterV1RowGenerator(SqlServerFhirModel model, TokenSearchParameterV1RowGenerator tokenRowGenerator) - : base(model) - { - _tokenRowGenerator = tokenRowGenerator; - } - - internal override bool TryGenerateRow(short searchParamId, (TokenSearchValue component1, TokenSearchValue component2) searchValue, out TokenTokenCompositeSearchParamTableTypeV1Row row) - { - if (_tokenRowGenerator.TryGenerateRow(default, searchValue.component1, out var token1Row) && - _tokenRowGenerator.TryGenerateRow(default, searchValue.component2, out var token2Row)) - { - row = new TokenTokenCompositeSearchParamTableTypeV1Row( - searchParamId, - token1Row.SystemId, - token1Row.Code, - token2Row.SystemId, - token2Row.Code); - - return true; - } - - row = default; - return false; - } - } -} diff --git a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/UriSearchParameterV1RowGenerator.cs b/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/UriSearchParameterV1RowGenerator.cs deleted file mode 100644 index f7c8a6b664..0000000000 --- a/src/Microsoft.Health.Fhir.SqlServer/Features/Storage/TvpRowGeneration/UriSearchParameterV1RowGenerator.cs +++ /dev/null @@ -1,24 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. -// ------------------------------------------------------------------------------------------------- - -using Microsoft.Health.Fhir.Core.Features.Search.SearchValues; -using Microsoft.Health.Fhir.SqlServer.Features.Schema.Model; - -namespace Microsoft.Health.Fhir.SqlServer.Features.Storage.TvpRowGeneration -{ - internal class UriSearchParameterV1RowGenerator : SearchParameterRowGenerator - { - public UriSearchParameterV1RowGenerator(SqlServerFhirModel model) - : base(model) - { - } - - internal override bool TryGenerateRow(short searchParamId, UriSearchValue searchValue, out UriSearchParamTableTypeV1Row row) - { - row = new UriSearchParamTableTypeV1Row(searchParamId, searchValue.Uri); - return true; - } - } -}