TransformPowerActivityDayFactResource (Resource)

Element properties:

TypeResource
File NameTransformPowerActivityDayFact.sql
AccessibilityPublic

Source Code:

<Resource ID="TransformPowerActivityDayFactResource" Accessibility="Public" FileName="TransformPowerActivityDayFact.sql" HasNullStream="false"/>

File Content: TransformPowerActivityDayFact.sql

-- Creating Transform in dbo schema for now.  Should they be in a different schema?

IF NOT EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = N'TransformPowerActivityDayFactProc')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[TransformPowerActivityDayFactProc] @WaterMark xml AS RETURN 1')
END
GO

ALTER PROCEDURE [dbo].[TransformPowerActivityDayFactProc] (@WaterMark xml)
AS
BEGIN
SET NOCOUNT ON
SET XACT_ABORT ON

DECLARE @utc DATETIME = GETUTCDATE()
DECLARE @errorNumber INT, @errorSeverity INT, @errorState INT, @errorLine INT, @errorProcedure NVARCHAR(256), @errorMessage NVARCHAR(MAX), @task NVARCHAR(512)
DECLARE @BatchId INT, @Updated INT = 0, @Inserted INT = 0, @retval INT = -1, @err INT = 0, @startTranCount INT = @@TRANCOUNT, @source1WM DATETIME, @source1MaxWM DATETIME = GETUTCDATE()
DECLARE @rowsToProcess INT = 0, @rejectedRowCount INT = 0, @canContinue BIT = 1, @loopCount INT
DECLARE @isReconciled BIT = 1

BEGIN TRY
EXEC dbo.InitializeTransform
@transformName = 'TransformPowerActivityDayFactProc',
@transformTemplateType = 'CustomFact',
@waterMark = @WaterMark,
@warehouseEntityName = 'MTV_System$DeviceHasPowerActivity',
@waterMarkType = 'DateTime',
@sourceTableName = 'inbound.MTV_System$DeviceHasPowerActivity',
@utc = @utc,
@isOneToOneCardinality = 1,
@factGrain = Hourly,
@source1WM = @source1WM OUTPUT,
@source1MaxWM = @source1MaxWM OUTPUT,
@batchId = @batchId OUTPUT

WHILE(@canContinue = 1)
BEGIN
SELECT @task = 'Initializing Transform loop'
EXEC dbo.InitializeTransformLoop
@transformName = 'TransformPowerActivityDayFactProc',
@transformTemplateType = 'CustomFact',
@sourceTableName = 'inbound.MTV_System$DeviceHasPowerActivity',
@utc = @utc,
@targetClassCheck = '',
@batchId = @batchId,
@source1WM = @source1WM OUTPUT,
@source1MaxWM = @source1MaxWM OUTPUT,
@rowsToProcess = @rowsToProcess OUTPUT,
@loopCount = @loopCount OUTPUT

IF(@rowsToProcess = 0) BREAK;

IF OBJECT_ID('DWTemp.TransformPowerActivityDayFact_Temp') IS NOT NULL DROP TABLE DWTemp.TransformPowerActivityDayFact_Temp

SELECT @task = 'Creating temporary table with all the values that have to be inserted or updated'
SELECT DISTINCT
rel.DatasourceId as dsourceId,
rel.RelationshipId as relId,
rel.TargetEntityId as targetEntityId,
sourceDim.ComputerDimKey as ComputerDimKey,
eventType.PowerActivityRecordEventTypeId as PowerActivityRecordEventTypeId,
pr.[System.Power.ActivityRecord!Hour0] as Hour0,
pr.[System.Power.ActivityRecord!Hour1] as Hour1,
pr.[System.Power.ActivityRecord!Hour2] as Hour2,
pr.[System.Power.ActivityRecord!Hour3] as Hour3,
pr.[System.Power.ActivityRecord!Hour4] as Hour4,
pr.[System.Power.ActivityRecord!Hour5] as Hour5,
pr.[System.Power.ActivityRecord!Hour6] as Hour6,
pr.[System.Power.ActivityRecord!Hour7] as Hour7,
pr.[System.Power.ActivityRecord!Hour8] as Hour8,
pr.[System.Power.ActivityRecord!Hour9] as Hour9,
pr.[System.Power.ActivityRecord!Hour10] as Hour10,
pr.[System.Power.ActivityRecord!Hour11] as Hour11,
pr.[System.Power.ActivityRecord!Hour12] as Hour12,
pr.[System.Power.ActivityRecord!Hour13] as Hour13,
pr.[System.Power.ActivityRecord!Hour14] as Hour14,
pr.[System.Power.ActivityRecord!Hour15] as Hour15,
pr.[System.Power.ActivityRecord!Hour16] as Hour16,
pr.[System.Power.ActivityRecord!Hour17] as Hour17,
pr.[System.Power.ActivityRecord!Hour18] as Hour18,
pr.[System.Power.ActivityRecord!Hour19] as Hour19,
pr.[System.Power.ActivityRecord!Hour20] as Hour20,
pr.[System.Power.ActivityRecord!Hour21] as Hour21,
pr.[System.Power.ActivityRecord!Hour22] as Hour22,
pr.[System.Power.ActivityRecord!Hour23] as Hour23,
etl.GetDateKey(pr.[System.Power.ActivityRecord!Date]) as DateKey,
rel.TimeAdded as CreatedDate
INTO DWTemp.TransformPowerActivityDayFact_Temp
from DWTemp.TransformPowerActivityDayFactProc_Source1 rel
inner join inbound.MTV_System$Power$ActivityRecord pr on rel.TargetEntityId = pr.BaseManagedEntityId
inner join PowerActivityRecordEventType eventType on eventType.EnumTypeId = pr.[System.Power.ActivityRecord!EventType]
inner join ComputerDim sourceDim on rel.SourceEntityId = sourceDim.BaseManagedEntityId
WHERE pr.DWTimestamp >= @source1WM
AND pr.DWTimestamp < @source1MaxWM


SELECT @task = 'Rejecting Early Arriving Data'
UPDATE rel SET
DWTimeStamp = @source1MaxWM,
rel.RejectedCount = ISNULL(rel.RejectedCount, 0) + 1,
BatchId = @BatchId
FROM inbound.MTV_System$DeviceHasPowerActivity rel
LEFT JOIN DWTemp.TransformPowerActivityDayFact_Temp tmp1 ON
(tmp1.relId = rel.RelationshipId AND tmp1.dsourceId = rel.DatasourceId )
WHERE rel.DWTimestamp >= @source1WM
AND rel.DWTimestamp < @source1MaxWM
AND tmp1.relId IS NULL

SELECT @rejectedRowCount = @@ROWCOUNT

--Reject and update timestamp for all the rows in PowerActivityRecord which have *not* been transformed in this batch
-- and are within the WaterMark boundaries OR which have datekey in the future.
UPDATE source SET
DWTimeStamp = @source1MaxWM,
source.RejectedCount = ISNULL(source.RejectedCount, 0) + 1,
BatchId = @BatchId
FROM inbound.MTV_System$Power$ActivityRecord source
LEFT JOIN DWTemp.TransformPowerActivityDayFact_Temp transformedrecords
ON transformedrecords.dsourceId = source.DataSourceId
AND transformedrecords.targetEntityId = source.BaseManagedEntityId
AND source.DWTimestamp >= @source1WM
AND source.DWTimestamp < @source1MaxWM
AND ( transformedrecords.relId IS NULL OR transformedrecords.DateKey > etl.GetDateKey(DATEADD(month, 1, GETUTCDATE())) )


-- It appears we don't have any data to process for now
-- this is unlikely to happen. but if it does happen, then it is better to bail out now
IF(@rejectedRowCount = @rowsToProcess) BREAK;

--Delete those records from the records to be inserted which have been rejected because of datekey issues.
DELETE transformedrecords
FROM DWTemp.TransformPowerActivityDayFact_Temp transformedrecords
INNER JOIN inbound.MTV_System$Power$ActivityRecord source
ON transformedrecords.dsourceId = source.DataSourceId
AND transformedrecords.targetEntityId = source.BaseManagedEntityId
AND transformedrecords.DateKey > etl.GetDateKey(DATEADD(month, 1, GETUTCDATE()))
AND source.DWTimestamp >= @source1WM
AND source.DWTimestamp < @source1MaxWM


BEGIN TRANSACTION
SELECT @task = 'Updating destination fact'
UPDATE fact SET
fact.Hour0 =txTemp.Hour0,
fact.Hour1 =txTemp.Hour1,
fact.Hour2 =txTemp.Hour2,
fact.Hour3 =txTemp.Hour3,
fact.Hour4 =txTemp.Hour4,
fact.Hour5 =txTemp.Hour5,
fact.Hour6 =txTemp.Hour6,
fact.Hour7 =txTemp.Hour7,
fact.Hour8 =txTemp.Hour8,
fact.Hour9 =txTemp.Hour9,
fact.Hour10 =txTemp.Hour10,
fact.Hour11 =txTemp.Hour11,
fact.Hour12 =txTemp.Hour12,
fact.Hour13 =txTemp.Hour13,
fact.Hour14 =txTemp.Hour14,
fact.Hour15 =txTemp.Hour15,
fact.Hour16 =txTemp.Hour16,
fact.Hour17 =txTemp.Hour17,
fact.Hour18 =txTemp.Hour18,
fact.Hour19 =txTemp.Hour19,
fact.Hour20 =txTemp.Hour20,
fact.Hour21 =txTemp.Hour21,
fact.Hour22 =txTemp.Hour22,
fact.Hour23 =txTemp.Hour23,
UpdatedBatchId = @BatchId
FROM dbo.PowerActivityDayFactvw fact
INNER JOIN DWTemp.TransformPowerActivityDayFact_Temp txTemp ON
fact.DateKey = txTemp.DateKey
AND fact.ComputerDimKey = txTemp.ComputerDimKey
AND fact.PowerActivityRecordEventTypeId = txTemp.PowerActivityRecordEventTypeId
WHERE fact.CreatedDate <> txTemp.CreatedDate


SELECT @Updated = @Updated + @@RowCount

SELECT @task = 'Getting rid of unnecessary records'
DELETE txTemp
FROM DWTemp.TransformPowerActivityDayFact_Temp txTemp
INNER JOIN dbo.PowerActivityDayFactvw fact ON
fact.DateKey = txTemp.DateKey
AND fact.ComputerDimKey = txTemp.ComputerDimKey
AND fact.PowerActivityRecordEventTypeId = txTemp.PowerActivityRecordEventTypeId


SELECT @task = 'Inserting into destination Fact'
INSERT INTO dbo.PowerActivityDayFactvw (
ComputerDimKey,
PowerActivityRecordEventTypeId,
Hour0,
Hour1,
Hour2,
Hour3,
Hour4,
Hour5,
Hour6,
Hour7,
Hour8,
Hour9,
Hour10,
Hour11,
Hour12,
Hour13,
Hour14,
Hour15,
Hour16,
Hour17,
Hour18,
Hour19,
Hour20,
Hour21,
Hour22,
Hour23,
DateKey,
CreatedDate,
InsertedBatchId,
UpdatedBatchId
)
SELECT ComputerDimKey,
PowerActivityRecordEventTypeId,
Hour0,
Hour1,
Hour2,
Hour3,
Hour4,
Hour5,
Hour6,
Hour7,
Hour8,
Hour9,
Hour10,
Hour11,
Hour12,
Hour13,
Hour14,
Hour15,
Hour16,
Hour17,
Hour18,
Hour19,
Hour20,
Hour21,
Hour22,
Hour23,
DateKey,
CreatedDate,
@BatchId AS InsertedBatchId,
0 AS UpdatedBatchId
FROM DWTemp.TransformPowerActivityDayFact_Temp txTemp

SELECT @Inserted = @Inserted + @@RowCount

IF OBJECT_ID('DWTemp.TransformPowerActivityDayFact_Temp') IS NOT NULL DROP TABLE DWTemp.TransformPowerActivityDayFact_Temp



COMMIT TRANSACTION

EXEC dbo.UninitializeTransformLoop
@transformName = 'TransformPowerActivityDayFactProc',
@transformTemplateType = 'CustomFact',
@utc = @utc,
@inserted = @Inserted,
@updated = @Updated,
@loopCount = @loopCount,
@canContinue = @canContinue OUTPUT

END -- WHILE(@canContinue = 1)

EXEC dbo.UninitializeTransform
@transformName = 'TransformPowerActivityDayFactProc',
@transformTemplateType = 'CustomFact',
@waterMark = @WaterMark,
@warehouseEntityName = '%whEntName%',
@waterMarkType = 'DateTime',
@source1MaxWM = @source1MaxWM,
@batchId = @BatchId,
@inserted = @Inserted,
@updated = @Updated

END TRY
BEGIN CATCH
DECLARE @errorFmt VARCHAR(256)

SELECT @errorFmt = N'ErrorNumber="%d" Message="%s" Severity="%d" State="%d" ProcedureName="%s" LineNumber="%d" Task="%s"',
@errorNumber = ERROR_NUMBER(), @errorMessage = ERROR_MESSAGE(), @errorSeverity = ERROR_SEVERITY(), @errorState = ERROR_STATE(), @errorLine = ERROR_LINE(), @errorProcedure = ERROR_PROCEDURE()

IF(@@TRANCOUNT > @startTranCount) ROLLBACK TRANSACTION

RAISERROR (@errorFmt, 18, @errorState, @errorNumber, @errorMessage, @errorSeverity, @errorState, @errorProcedure, @errorLine, @task)
RETURN -1
END CATCH

SET XACT_ABORT OFF
SET NOCOUNT OFF
END



GO