Skip to content

Commit 8f06ecc

Browse files
author
Binon
committed
Merge branch 'RC' into RC-Search
2 parents 0418334 + 6c5e0e4 commit 8f06ecc

19 files changed

Lines changed: 1901 additions & 0 deletions

WebAPI/LearningHub.Nhs.Database/LearningHub.Nhs.Database.sqlproj

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@
103103
<Folder Include="Tables\Databricks" />
104104
<Folder Include="Stored Procedures\Adf" />
105105
<Folder Include="Tables\MIB" />
106+
<Folder Include="Stored Procedures\Readmodel" />
107+
<Folder Include="Tables\Readmodel" />
106108
</ItemGroup>
107109
<ItemGroup>
108110
<None Include="Scripts\learningHub_Data.sql" />
@@ -570,6 +572,23 @@
570572
<None Include="Scripts\Post-Deploy\Scripts\TD-7116-mib_new_env.sql" />
571573
<None Include="Scripts\Post-Deploy\Scripts\TD-7106-Resume-Databricks-Ingestion.sql" />
572574
<None Include="Scripts\Pre-Deploy\Scripts\ActivateChangeTracking.sql" />
575+
<Build Include="Stored Procedures\Resources\GetMyRecentCompletedDashboardResourcesRM.sql" />
576+
<Build Include="Stored Procedures\Resources\GetPopularDashboardResourcesRM.sql" />
577+
<Build Include="Stored Procedures\Resources\GetRatedDashboardResourcesRM.sql" />
578+
<Build Include="Stored Procedures\Resources\GetRecentDashboardResourcesRM.sql" />
579+
<None Include="Scripts\Post-Deploy\Scripts\TD-7078-supportingindexes.sql" />
580+
<Build Include="Stored Procedures\Readmodel\RefreshDashboardCatalogues.sql" />
581+
<Build Include="Stored Procedures\Readmodel\RefreshDashboardResources.sql" />
582+
<Build Include="Stored Procedures\Hierarchy\GetDashboardCataloguesRM.sql" />
583+
<Build Include="Schemas\readmodels.sql" />
584+
<Build Include="Tables\Readmodel\DashboardCatalogue.sql" />
585+
<Build Include="Tables\Readmodel\DashboardResource.sql" />
586+
<Build Include="Tables\Readmodel\UserCatalogueActivity.sql" />
587+
<Build Include="Tables\Readmodel\UserResourceActivity.sql" />
588+
<Build Include="Stored Procedures\Readmodel\ApplyUserResourceActivityChanges.sql" />
589+
<Build Include="Stored Procedures\Readmodel\ApplyUserCatalogueActivityChanges.sql" />
590+
<Build Include="Stored Procedures\Readmodel\RefreshDashboardReadModels.sql" />
591+
<None Include="Scripts\Post-Deploy\Scripts\TD-7078-PopulateReadModelHistoricUserActivities.sql" />
573592
</ItemGroup>
574593
<ItemGroup>
575594
<None Include="Scripts\Pre-Deploy\Scripts\Card5766_AuthorTableChanges.PreDeployment.sql" />
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CREATE SCHEMA [readmodels]
2+
AUTHORIZATION [dbo];
3+
4+
5+
6+
7+
GO

WebAPI/LearningHub.Nhs.Database/Scripts/Post-Deploy/Script.PostDeployment.sql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,6 @@ UPDATE [resources].[ResourceVersion] SET CertificateEnabled = 0 WHERE VersionSta
8888
:r .\Scripts\UpdateFileTypes.sql
8989
:r .\Scripts\TD-7116-mib_new_env.sql
9090
:r .\Scripts\TD-7106-Resume-Databricks-Ingestion.sql
91+
:r .\Scripts\TD-7078-supportingindexes.sql
92+
:r .\Scripts\TD-7078-PopulateReadModelHistoricUserActivities.sql
93+
Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
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

Comments
 (0)