Source/NuGetGallery.Operations/Scripts/NuGetDownloadsProcs_AddDownloadFact.sql (173 lines of code) (raw):
IF OBJECT_ID('[dbo].[AddDownloadFact]') IS NOT NULL
DROP PROCEDURE [dbo].[AddDownloadFact]
GO
CREATE PROCEDURE [dbo].[AddDownloadFact]
@PackageId NVARCHAR(128),
@PackageVersion NVARCHAR(64),
@PackageListed INT,
@PackageTitle NVARCHAR(256),
@PackageDescription NVARCHAR(MAX),
@PackageIconUrl NVARCHAR(MAX),
@DownloadUserAgent NVARCHAR(MAX),
@DownloadOperation NVARCHAR(18),
@DownloadTimestamp DATETIME,
@DownloadProjectTypes NVARCHAR(MAX),
@DownloadDependentPackageId NVARCHAR(128),
@OriginalKey INT
AS
BEGIN
IF EXISTS (SELECT * FROM ReplicationMarker WHERE @OriginalKey <= LastOriginalKey)
RETURN 0
BEGIN TRAN
-- you should be only able to add if the OriginalKey is greater than the max-original-key
-- lower key values have no effect but return success - making this proc idempotent
-- this presumes an incrementing external id in the nugetgallery database
DECLARE @Dimension_PackageId INT;
SELECT @Dimension_PackageId = Id
FROM Dimension_Package
WHERE PackageId = @PackageId
AND PackageVersion = @PackageVersion;
IF (@Dimension_PackageId IS NULL)
BEGIN
INSERT Dimension_Package
(
PackageId,
PackageVersion,
PackageListed,
PackageTitle,
PackageDescription,
PackageIconUrl
)
VALUES
(
@PackageId,
@PackageVersion,
@PackageListed,
@PackageTitle,
@PackageDescription,
@PackageIconUrl
);
SELECT @Dimension_PackageId = SCOPE_IDENTITY();
END
ELSE
BEGIN
UPDATE Dimension_Package
SET
PackageListed = @PackageListed,
PackageTitle = @PackageTitle,
PackageDescription = @PackageDescription,
PackageIconUrl = @PackageIconUrl
WHERE Id = @Dimension_PackageId
END
DECLARE @Dimension_UserAgentId INT;
SELECT @Dimension_UserAgentId = Id
FROM Dimension_UserAgent
WHERE Value = @DownloadUserAgent;
IF (@Dimension_UserAgentId IS NULL)
BEGIN
INSERT Dimension_UserAgent
(
Value,
Client,
ClientMajorVersion,
ClientMinorVersion,
ClientCategory
)
SELECT
@DownloadUserAgent,
[dbo].[UserAgentClient](@DownloadUserAgent),
[dbo].[UserAgentClientMajorVersion](@DownloadUserAgent),
[dbo].[UserAgentClientMinorVersion](@DownloadUserAgent),
[dbo].[UserAgentClientCategory](@DownloadUserAgent)
SELECT @Dimension_UserAgentId = SCOPE_IDENTITY();
END
DECLARE @Dimension_DateId INT;
SELECT @Dimension_DateId = [Id]
FROM [dbo].[Dimension_Date]
WHERE [Date] = CAST(@DownloadTimestamp AS DATE);
DECLARE @Dimension_TimeId INT;
SELECT @Dimension_TimeId = Id
FROM Dimension_Time
WHERE HourOfDay = DATEPART(HOUR, @DownloadTimestamp);
DECLARE @Dimension_OperationId INT;
SELECT @Dimension_OperationId = Id
FROM Dimension_Operation
WHERE Operation = @DownloadOperation;
IF (@Dimension_OperationId IS NULL)
BEGIN
SELECT @Dimension_OperationId = Id
FROM Dimension_Operation
WHERE Operation = '(unknown)';
END
DECLARE @Dimension_ProjectId INT;
IF (@DownloadProjectTypes IS NULL)
BEGIN
SELECT @DownloadProjectTypes = '(unknown)';
END
SELECT @Dimension_ProjectId = Id
FROM Dimension_Project
WHERE ProjectTypes = @DownloadProjectTypes;
IF (@Dimension_ProjectId IS NULL)
BEGIN
INSERT Dimension_Project
(
ProjectTypes
)
VALUES
(
@DownloadProjectTypes
);
SELECT @Dimension_ProjectId = SCOPE_IDENTITY();
END
IF EXISTS (SELECT * FROM Fact_Download
WHERE Dimension_Package_Id = @Dimension_PackageId
AND Dimension_UserAgent_Id = @Dimension_UserAgentId
AND Dimension_Date_Id = @Dimension_DateId
AND Dimension_Time_Id = @Dimension_TimeId
AND Dimension_Operation_Id = @Dimension_OperationId
AND Dimension_Project_Id = @Dimension_ProjectId)
BEGIN
UPDATE Fact_Download
SET DownloadCount = DownloadCount + 1
WHERE Dimension_Package_Id = @Dimension_PackageId
AND Dimension_UserAgent_Id = @Dimension_UserAgentId
AND Dimension_Date_Id = @Dimension_DateId
AND Dimension_Time_Id = @Dimension_TimeId
AND Dimension_Operation_Id = @Dimension_OperationId
AND Dimension_Project_Id = @Dimension_ProjectId
END
ELSE
BEGIN
INSERT INTO Fact_Download
(
Dimension_Package_Id,
Dimension_UserAgent_Id,
Dimension_Date_Id,
Dimension_Time_Id,
Dimension_Operation_Id,
Dimension_Project_Id,
DownloadCount
)
VALUES
(
@Dimension_PackageId,
@Dimension_UserAgentId,
@Dimension_DateId,
@Dimension_TimeId,
@Dimension_OperationId,
@Dimension_ProjectId,
1
)
END
DELETE ReplicationMarker;
INSERT INTO ReplicationMarker ( LastOriginalKey ) VALUES ( @OriginalKey );
IF EXISTS (SELECT * FROM PackageReportDirty WHERE PackageId = @PackageId)
BEGIN
UPDATE PackageReportDirty
SET DirtyCount = DirtyCount + 1
WHERE PackageId = @PackageId
END
ELSE
BEGIN
INSERT PackageReportDirty ( PackageId, DirtyCount ) VALUES ( @PackageId, 1 )
END
COMMIT TRAN
END
GO