1+ SET NOCOUNT ON ;
2+ SET XACT_ABORT ON ;
3+
4+ -- Backfill readmodels.UserResourceActivity
5+
6+
7+ IF NOT EXISTS (SELECT 1 FROM readmodels .UserResourceActivity )
8+ BEGIN
9+ IF OBJECT_ID(' tempdb..#URA_LatestIds' ) IS NOT NULL DROP TABLE # URA_LatestIds;
10+ IF OBJECT_ID(' tempdb..#URA_Latest' ) IS NOT NULL DROP TABLE # URA_Latest;
11+ IF OBJECT_ID(' tempdb..#URA_Ara' ) IS NOT NULL DROP TABLE # URA_Ara;
12+ IF OBJECT_ID(' tempdb..#URA_Mar' ) IS NOT NULL DROP TABLE # URA_Mar;
13+ IF OBJECT_ID(' tempdb..#URA_Sa' ) IS NOT NULL DROP TABLE # URA_Sa;
14+ IF OBJECT_ID(' tempdb..#URA_Completion' ) IS NOT NULL DROP TABLE # URA_Completion;
15+
16+ SELECT
17+ a .UserId ,
18+ a .ResourceId ,
19+ MAX (a .Id ) AS LatestActivityId
20+ INTO # URA_LatestIds
21+ FROM activity .ResourceActivity a
22+ WHERE a .UserId IS NOT NULL
23+ AND a .Deleted = 0
24+ GROUP BY
25+ a .UserId ,
26+ a .ResourceId ;
27+
28+ IF EXISTS (SELECT 1 FROM # URA_LatestIds)
29+ BEGIN
30+ CREATE CLUSTERED INDEX IX_URA_LatestIds
31+ ON # URA_LatestIds (UserId, ResourceId);
32+
33+ SELECT
34+ a .UserId ,
35+ a .ResourceId ,
36+ a .Id AS ActivityId,
37+ a .ResourceVersionId ,
38+ a .LaunchResourceActivityId ,
39+ a .ActivityStatusId ,
40+ a .ActivityStart ,
41+ a .ActivityEnd ,
42+ r .ResourceTypeId
43+ INTO # URA_Latest
44+ FROM # URA_LatestIds li
45+ JOIN activity .ResourceActivity a
46+ ON a .Id = li .LatestActivityId
47+ JOIN resources .Resource r
48+ ON r .Id = a .ResourceId ;
49+
50+ CREATE CLUSTERED INDEX IX_URA_Latest
51+ ON # URA_Latest (UserId, ResourceId);
52+
53+ SELECT
54+ ara .ResourceActivityId ,
55+ MAX (ara .Score ) AS Score
56+ INTO # URA_Ara
57+ FROM activity .AssessmentResourceActivity ara
58+ JOIN # URA_Latest l
59+ ON l .ResourceTypeId = 11
60+ AND ara .ResourceActivityId = COALESCE(l .LaunchResourceActivityId , l .ActivityId )
61+ WHERE ara .Score IS NOT NULL
62+ GROUP BY ara .ResourceActivityId ;
63+
64+ CREATE CLUSTERED INDEX IX_URA_Ara
65+ ON # URA_Ara (ResourceActivityId);
66+
67+ SELECT
68+ mar .ResourceActivityId ,
69+ MAX (mar .PercentComplete ) AS PercentComplete
70+ INTO # URA_Mar
71+ FROM activity .MediaResourceActivity mar
72+ JOIN # URA_Latest l
73+ ON l .ResourceTypeId IN (2 ,7 )
74+ AND mar .ResourceActivityId = COALESCE(l .LaunchResourceActivityId , l .ActivityId )
75+ WHERE mar .PercentComplete IS NOT NULL
76+ GROUP BY mar .ResourceActivityId ;
77+
78+ CREATE CLUSTERED INDEX IX_URA_Mar
79+ ON # URA_Mar (ResourceActivityId);
80+
81+ SELECT
82+ sa .ResourceActivityId ,
83+ MAX (sa .CmiCoreLesson_status ) AS CmiCoreLesson_status
84+ INTO # URA_Sa
85+ FROM activity .ScormActivity sa
86+ JOIN # URA_Latest l
87+ ON l .ResourceTypeId = 6
88+ AND sa .ResourceActivityId = l .ActivityId
89+ WHERE sa .CmiCoreLesson_status IS NOT NULL
90+ GROUP BY sa .ResourceActivityId ;
91+
92+ CREATE CLUSTERED INDEX IX_URA_Sa
93+ ON # URA_Sa (ResourceActivityId);
94+
95+ SELECT
96+ l .UserId ,
97+ l .ResourceId ,
98+ l .ActivityId AS LatestActivityId,
99+ CAST(COALESCE(l .ActivityStart , l .ActivityEnd ) AS DATETIME2) AS LastAccessedDate,
100+ CAST(
101+ CASE
102+ WHEN l .ResourceTypeId IN (2 ,7 )
103+ AND l .ActivityStatusId = 3
104+ AND (
105+ (mar .ResourceActivityId IS NOT NULL AND mar .PercentComplete = 100 )
106+ OR l .ActivityStart < ' 2020-09-07'
107+ )
108+ THEN 1
109+
110+ WHEN l .ResourceTypeId = 6
111+ AND (
112+ sa .CmiCoreLesson_status IN (3 ,5 )
113+ OR l .ActivityStatusId IN (3 ,5 )
114+ )
115+ THEN 1
116+
117+ WHEN l .ResourceTypeId = 11
118+ AND (
119+ ara .Score >= arv .PassMark
120+ OR l .ActivityStatusId IN (3 ,5 )
121+ )
122+ THEN 1
123+
124+ WHEN l .ResourceTypeId IN (1 ,5 ,8 ,9 ,10 ,12 )
125+ AND l .ActivityStatusId = 3
126+ THEN 1
127+
128+ ELSE 0
129+ END AS BIT
130+ ) AS IsCompleted
131+ INTO # URA_Completion
132+ FROM # URA_Latest l
133+ LEFT JOIN resources .AssessmentResourceVersion arv
134+ ON arv .ResourceVersionId = l .ResourceVersionId
135+ LEFT JOIN # URA_Ara ara
136+ ON ara .ResourceActivityId = COALESCE(l .LaunchResourceActivityId , l .ActivityId )
137+ LEFT JOIN # URA_Mar mar
138+ ON mar .ResourceActivityId = COALESCE(l .LaunchResourceActivityId , l .ActivityId )
139+ LEFT JOIN # URA_Sa sa
140+ ON sa .ResourceActivityId = l .ActivityId
141+ WHERE COALESCE(l .ActivityStart , l .ActivityEnd ) IS NOT NULL ;
142+
143+ CREATE CLUSTERED INDEX IX_URA_Completion
144+ ON # URA_Completion (UserId, ResourceId);
145+
146+ INSERT INTO readmodels .UserResourceActivity
147+ (
148+ UserId,
149+ ResourceId,
150+ LatestActivityId,
151+ IsCompleted,
152+ LastAccessedDate
153+ )
154+ SELECT
155+ c .UserId ,
156+ c .ResourceId ,
157+ c .LatestActivityId ,
158+ c .IsCompleted ,
159+ c .LastAccessedDate
160+ FROM # URA_Completion c;
161+ END
162+ END;
163+
164+
165+ -- Backfill readmodels.UserCatalogueActivity
166+
167+
168+ IF NOT EXISTS (SELECT 1 FROM readmodels .UserCatalogueActivity )
169+ BEGIN
170+ IF OBJECT_ID(' tempdb..#UCA_LatestIds' ) IS NOT NULL DROP TABLE # UCA_LatestIds;
171+ IF OBJECT_ID(' tempdb..#UCA_Latest' ) IS NOT NULL DROP TABLE # UCA_Latest;
172+
173+ SELECT
174+ ra .UserId ,
175+ np .CatalogueNodeId ,
176+ MAX (ra .Id ) AS LatestActivityId
177+ INTO # UCA_LatestIds
178+ FROM activity .ResourceActivity ra
179+ JOIN hierarchy .NodePath np
180+ ON np .Id = ra .NodePathId
181+ WHERE ra .UserId IS NOT NULL
182+ AND ra .Deleted = 0
183+ AND np .Deleted = 0
184+ GROUP BY
185+ ra .UserId ,
186+ np .CatalogueNodeId ;
187+
188+ IF EXISTS (SELECT 1 FROM # UCA_LatestIds)
189+ BEGIN
190+ CREATE CLUSTERED INDEX IX_UCA_LatestIds
191+ ON # UCA_LatestIds (UserId, CatalogueNodeId);
192+
193+ SELECT
194+ li .UserId ,
195+ li .CatalogueNodeId ,
196+ ra .Id AS LatestActivityId,
197+ CAST(COALESCE(ra .ActivityStart , ra .ActivityEnd ) AS DATETIME2) AS LastAccessedDate
198+ INTO # UCA_Latest
199+ FROM # UCA_LatestIds li
200+ JOIN activity .ResourceActivity ra
201+ ON ra .Id = li .LatestActivityId
202+ WHERE COALESCE(ra .ActivityStart , ra .ActivityEnd ) IS NOT NULL ;
203+
204+ CREATE CLUSTERED INDEX IX_UCA_Latest
205+ ON # UCA_Latest (UserId, CatalogueNodeId);
206+
207+ INSERT INTO readmodels .UserCatalogueActivity
208+ (
209+ UserId,
210+ CatalogueNodeId,
211+ LatestActivityId,
212+ LastAccessedDate
213+ )
214+ SELECT
215+ l .UserId ,
216+ l .CatalogueNodeId ,
217+ l .LatestActivityId ,
218+ l .LastAccessedDate
219+ FROM # UCA_Latest l;
220+ END
221+ END;
0 commit comments